[SCM] Samba Shared Repository - branch master updated

Kai Blin kai at samba.org
Mon Oct 4 13:42:01 MDT 2010


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 <kai at samba.org>
Date:   Mon Aug 16 21:22:52 2010 +0200

    dnsp: Add support for parsing HINFO records
    
    Autobuild-User: Kai Blin <kai at samba.org>
    Autobuild-Date: Mon Oct  4 19:41:38 UTC 2010 on sn-devel-104

commit 65d2cfdcf1517b2e99df0556eb5bcfbc0c49a453
Author: Kai Blin <kai at samba.org>
Date:   Fri Aug 13 11:09:09 2010 +0200

    dnsp: Parse TXT records

commit da21f78099884ce425dfbb99c8c246f6fcd98a3a
Author: Kai Blin <kai at samba.org>
Date:   Thu Aug 12 15:46:42 2010 +0200

    dnsp: Add MX record parsing

commit 8ff715c3d9ca2d6cc8880fa3040b1d1dbc942590
Author: Kai Blin <kai at samba.org>
Date:   Tue Aug 10 15:34:27 2010 +0200

    dnsp: Allow parsing of AAAA records

commit ee7ee2c4c2f4c75c355cc06ce29d1ef59b2ae581
Author: Kai Blin <kai at 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 <kai at 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 <kai at 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


More information about the samba-cvs mailing list