The branch, master has been updated via b5f2633 dnsp: Add support for parsing HINFO records via 65d2cfd dnsp: Parse TXT records via da21f78 dnsp: Add MX record parsing via 8ff715c dnsp: Allow parsing of AAAA records via ee7ee2c ndr: Implement push function for IPv6 addresses via 013780b ndr: Add support for pulling/printing an ipv6address type via 10a4ea7 IDL: More types for the DNSP IDL file from 6320cfa s4:dsdb/common/util.c - change the usage of the RECYCLED control
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit b5f2633f7aca375c597a88bcb061563c94efb7ca Author: Kai Blin <k...@samba.org> Date: Mon Aug 16 21:22:52 2010 +0200 dnsp: Add support for parsing HINFO records Autobuild-User: Kai Blin <k...@samba.org> Autobuild-Date: Mon Oct 4 19:41:38 UTC 2010 on sn-devel-104 commit 65d2cfdcf1517b2e99df0556eb5bcfbc0c49a453 Author: Kai Blin <k...@samba.org> Date: Fri Aug 13 11:09:09 2010 +0200 dnsp: Parse TXT records commit da21f78099884ce425dfbb99c8c246f6fcd98a3a Author: Kai Blin <k...@samba.org> Date: Thu Aug 12 15:46:42 2010 +0200 dnsp: Add MX record parsing commit 8ff715c3d9ca2d6cc8880fa3040b1d1dbc942590 Author: Kai Blin <k...@samba.org> Date: Tue Aug 10 15:34:27 2010 +0200 dnsp: Allow parsing of AAAA records commit ee7ee2c4c2f4c75c355cc06ce29d1ef59b2ae581 Author: Kai Blin <k...@samba.org> Date: Tue Sep 28 20:33:54 2010 -0700 ndr: Implement push function for IPv6 addresses Thanks to Julien Kerihuel for providing the patch that pushed me to finish my own IPv6 patches. commit 013780b1e1942522dfee59d973a341b5f18ace67 Author: Kai Blin <k...@samba.org> Date: Tue Aug 10 15:32:59 2010 +0200 ndr: Add support for pulling/printing an ipv6address type commit 10a4ea7219bb8a1b880b1f0ae4fb39b5f479bab3 Author: Kai Blin <k...@samba.org> Date: Mon Aug 9 07:26:16 2010 +0200 IDL: More types for the DNSP IDL file ----------------------------------------------------------------------- Summary of changes: librpc/idl/dnsp.idl | 40 ++++++++++++++++++++++- librpc/ndr/libndr.h | 2 + librpc/ndr/ndr_basic.c | 59 ++++++++++++++++++++++++++++++++- librpc/ndr/ndr_dnsp.c | 52 ++++++++++++++++++++++++++++++ librpc/ndr/ndr_dnsp.h | 4 ++ pidl/lib/Parse/Pidl/NDR.pm | 4 ++- pidl/lib/Parse/Pidl/Samba4/Python.pm | 11 ++++++ pidl/lib/Parse/Pidl/Typelist.pm | 6 ++- 8 files changed, 171 insertions(+), 7 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/idl/dnsp.idl b/librpc/idl/dnsp.idl index 1f0629c..7c013db 100644 --- a/librpc/idl/dnsp.idl +++ b/librpc/idl/dnsp.idl @@ -40,6 +40,7 @@ interface dnsp DNS_TYPE_HINFO = 0xD, DNS_TYPE_MINFO = 0xE, DNS_TYPE_MX = 0xF, + DNS_TYPE_TXT = 0x10, DNS_TYPE_RP = 0x11, DNS_TYPE_AFSDB = 0x12, DNS_TYPE_X25 = 0x13, @@ -64,9 +65,44 @@ interface dnsp DNS_TYPE_WINSR = 0xFF02 } dns_record_type; + typedef [public] struct { + uint32 serial; + uint32 refresh; + uint32 retry; + uint32 expire; + uint32 minimum; + dnsp_name mname; + dnsp_name rname; + } dnsp_soa; + + typedef [public] struct { + uint16 wPriority; + dnsp_name nameTarget; + } dnsp_mx; + + typedef [public] struct { + dnsp_string cpu; + dnsp_string os; + } dnsp_hinfo; + + typedef [public] struct { + uint16 wPriority; + uint16 wWeight; + uint16 wPort; + dnsp_name nameTarget; + } dnsp_srv; + typedef [nodiscriminant] union { - [case(DNS_TYPE_A)] [flag(NDR_BIG_ENDIAN)] ipv4address ip; - [case(DNS_TYPE_NS)] dnsp_name ns; + [case(DNS_TYPE_A)] [flag(NDR_BIG_ENDIAN)] ipv4address ip; + [case(DNS_TYPE_NS)] dnsp_name ns; + [case(DNS_TYPE_CNAME)] dnsp_name cname; + [case(DNS_TYPE_SOA)] [flag(NDR_BIG_ENDIAN)] dnsp_soa soa; + [case(DNS_TYPE_MX)] [flag(NDR_BIG_ENDIAN)] dnsp_mx mx; + [case(DNS_TYPE_TXT)] dnsp_string txt; + [case(DNS_TYPE_PTR)] dnsp_name ptr; + [case(DNS_TYPE_HINFO)] dnsp_hinfo hinfo; + [case(DNS_TYPE_AAAA)] ipv6address ip; + [case(DNS_TYPE_SRV)] [flag(NDR_BIG_ENDIAN)] dnsp_srv srv; [default] [flag(NDR_REMAINING)] DATA_BLOB data; } dnsRecordData; diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index bd39cf4..c110b76 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -189,6 +189,7 @@ enum ndr_err_code { NDR_ERR_RANGE, NDR_ERR_TOKEN, NDR_ERR_IPV4ADDRESS, + NDR_ERR_IPV6ADDRESS, NDR_ERR_INVALID_POINTER, NDR_ERR_UNREAD_BYTES, NDR_ERR_NDR64 @@ -493,6 +494,7 @@ NDR_SCALAR_PROTO(NTTIME_1sec, NTTIME) NDR_SCALAR_PROTO(NTTIME_hyper, NTTIME) NDR_SCALAR_PROTO(DATA_BLOB, DATA_BLOB) NDR_SCALAR_PROTO(ipv4address, const char *) +NDR_SCALAR_PROTO(ipv6address, const char *) NDR_SCALAR_PROTO(string, const char *) NDR_SCALAR_PROTO(double, double) diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c index c27faa2..31a8b9d 100644 --- a/librpc/ndr/ndr_basic.c +++ b/librpc/ndr/ndr_basic.c @@ -831,7 +831,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, int ndr_fl uint32_t addr; if (!is_ipaddress(address)) { return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS, - "Invalid IPv4 address: '%s'", + "Invalid IPv4 address: '%s'", address); } addr = inet_addr(address); @@ -842,12 +842,67 @@ _PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, int ndr_fl /* print a ipv4address */ -_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name, +_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name, const char *address) { ndr->print(ndr, "%-25s: %s", name, address); } +/* + pull a ipv6address +*/ +#define IPV6_BYTES 16 +#define IPV6_ADDR_STR_LEN 39 +_PUBLIC_ enum ndr_err_code ndr_pull_ipv6address(struct ndr_pull *ndr, int ndr_flags, const char **address) +{ + uint8_t addr[IPV6_BYTES]; + char *addr_str = talloc_strdup(ndr->current_mem_ctx, ""); + int i; + NDR_CHECK(ndr_pull_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES)); + for (i = 0; i < IPV6_BYTES; ++i) { + addr_str = talloc_asprintf_append(addr_str, "%02x", addr[i]); + /* We need a ':' every second byte but the last one */ + if (i%2 == 1 && i != (IPV6_BYTES - 1)) { + addr_str = talloc_strdup_append(addr_str, ":"); + } + } + *address = addr_str; + NDR_ERR_HAVE_NO_MEMORY(*address); + return NDR_ERR_SUCCESS; +} + +/* + push a ipv6address +*/ +_PUBLIC_ enum ndr_err_code ndr_push_ipv6address(struct ndr_push *ndr, int ndr_flags, const char *address) +{ + uint8_t addr[IPV6_BYTES]; + int ret; + + if (!is_ipaddress(address)) { + return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS, + "Invalid IPv6 address: '%s'", + address); + } + ret = inet_pton(AF_INET6, address, addr); + if (ret <= 0) { + return NDR_ERR_IPV6ADDRESS; + } + + NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES)); + + return NDR_ERR_SUCCESS; +} + +/* + print a ipv6address +*/ +_PUBLIC_ void ndr_print_ipv6address(struct ndr_print *ndr, const char *name, + const char *address) +{ + ndr->print(ndr, "%-25s: %s", name, address); +} +#undef IPV6_BYTES _PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type) { diff --git a/librpc/ndr/ndr_dnsp.c b/librpc/ndr/ndr_dnsp.c index f777591..256638a 100644 --- a/librpc/ndr/ndr_dnsp.c +++ b/librpc/ndr/ndr_dnsp.c @@ -98,3 +98,55 @@ enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, int ndr_flags, const return NDR_ERR_SUCCESS; } + +/* + print a dnsp_string +*/ +_PUBLIC_ void ndr_print_dnsp_string(struct ndr_print *ndr, const char *name, + const char *dns_string) +{ + ndr->print(ndr, "%-25s: %s", name, dns_string); +} + +/* + pull a dnsp_string +*/ +_PUBLIC_ enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_flags, const char **string) +{ + uint8_t len; + uint32_t total_len; + char *ret; + + NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &len)); + + ret = talloc_strdup(ndr->current_mem_ctx, ""); + if (!ret) { + return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp"); + } + total_len = 1; + ret = talloc_zero_array(ndr->current_mem_ctx, char, len+1); + if (!ret) { + return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp"); + } + NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)&ret[total_len-1], len)); + total_len = len; + + (*string) = ret; + NDR_PULL_ALIGN(ndr, 1); + return NDR_ERR_SUCCESS; +} + +enum ndr_err_code ndr_push_dnsp_string(struct ndr_push *ndr, int ndr_flags, const char *string) +{ + int total_len; + total_len = strlen(string) + 1; + if (total_len > 255) { + return ndr_push_error(ndr, NDR_ERR_BUFSIZE, + "dns_name of length %d larger than 255", total_len); + } + NDR_CHECK(ndr_push_uint8(ndr, ndr_flags, (uint8_t)total_len)); + NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)string, total_len - 1)); + NDR_PUSH_ALIGN(ndr, 1); + + return NDR_ERR_SUCCESS; +} diff --git a/librpc/ndr/ndr_dnsp.h b/librpc/ndr/ndr_dnsp.h index 07952cb..67f952c 100644 --- a/librpc/ndr/ndr_dnsp.h +++ b/librpc/ndr/ndr_dnsp.h @@ -23,3 +23,7 @@ void ndr_print_dnsp_name(struct ndr_print *ndr, const char *name, const char *dns_name); enum ndr_err_code ndr_pull_dnsp_name(struct ndr_pull *ndr, int ndr_flags, const char **name); enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, int ndr_flags, const char *name); +void ndr_print_dnsp_string(struct ndr_print *ndr, const char *name, + const char *dns_string); +enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_flags, const char **string); +enum ndr_err_code ndr_push_dnsp_string(struct ndr_push *ndr, int ndr_flags, const char *string); diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm index f079fbc..b5dd2aa 100644 --- a/pidl/lib/Parse/Pidl/NDR.pm +++ b/pidl/lib/Parse/Pidl/NDR.pm @@ -75,7 +75,9 @@ my $scalar_alignment = { 'nbt_string' => 4, 'wrepl_nbt_name' => 4, 'ipv4address' => 4, - 'dnsp_name' => 1 + 'ipv6address' => 4, #16? + 'dnsp_name' => 1, + 'dnsp_string' => 1 }; sub GetElementLevelTable($$) diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index b494ec9..cf554f5 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -921,11 +921,20 @@ sub ConvertObjectFromPythonData($$$$$$;$) return; } + if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "ipv6address") { + $self->pidl("$target = PyString_AsString($cvar);"); + return; + } + if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "dnsp_name") { $self->pidl("$target = PyString_AS_STRING($cvar);"); return; } + if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "dnsp_string") { + $self->pidl("$target = PyString_AS_STRING($cvar);"); + return; + } if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "NTSTATUS") { $self->pidl("$target = NT_STATUS(PyInt_AsLong($cvar));"); @@ -1088,7 +1097,9 @@ sub ConvertScalarToPython($$$) # Not yet supported if ($ctypename eq "string_array") { return "PyCObject_FromTallocPtr($cvar)"; } if ($ctypename eq "ipv4address") { return "PyString_FromString_check_null($cvar)"; } + if ($ctypename eq "ipv6address") { return "PyString_FromString_check_null($cvar)"; } if ($ctypename eq "dnsp_name") { return "PyString_FromString_check_null($cvar)"; } + if ($ctypename eq "dnsp_string") { return "PyString_FromString_check_null($cvar)"; } if ($ctypename eq "pointer") { return "PyCObject_FromTallocPtr($cvar)"; } diff --git a/pidl/lib/Parse/Pidl/Typelist.pm b/pidl/lib/Parse/Pidl/Typelist.pm index 238ad83..00204a3 100644 --- a/pidl/lib/Parse/Pidl/Typelist.pm +++ b/pidl/lib/Parse/Pidl/Typelist.pm @@ -20,8 +20,8 @@ use strict; my %types = (); my @reference_scalars = ( - "string", "string_array", "nbt_string", - "wrepl_nbt_name", "ipv4address" + "string", "string_array", "nbt_string", + "wrepl_nbt_name", "ipv4address", "ipv6address" ); # a list of known scalar types @@ -57,7 +57,9 @@ my %scalars = ( "nbt_string" => "const char *", "wrepl_nbt_name"=> "struct nbt_name *", "ipv4address" => "const char *", + "ipv6address" => "const char *", "dnsp_name" => "const char *", + "dnsp_string" => "const char *", ); my %aliases = ( -- Samba Shared Repository