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 <[email protected]>
Date: Mon Aug 16 21:22:52 2010 +0200
dnsp: Add support for parsing HINFO records
Autobuild-User: Kai Blin <[email protected]>
Autobuild-Date: Mon Oct 4 19:41:38 UTC 2010 on sn-devel-104
commit 65d2cfdcf1517b2e99df0556eb5bcfbc0c49a453
Author: Kai Blin <[email protected]>
Date: Fri Aug 13 11:09:09 2010 +0200
dnsp: Parse TXT records
commit da21f78099884ce425dfbb99c8c246f6fcd98a3a
Author: Kai Blin <[email protected]>
Date: Thu Aug 12 15:46:42 2010 +0200
dnsp: Add MX record parsing
commit 8ff715c3d9ca2d6cc8880fa3040b1d1dbc942590
Author: Kai Blin <[email protected]>
Date: Tue Aug 10 15:34:27 2010 +0200
dnsp: Allow parsing of AAAA records
commit ee7ee2c4c2f4c75c355cc06ce29d1ef59b2ae581
Author: Kai Blin <[email protected]>
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 <[email protected]>
Date: Tue Aug 10 15:32:59 2010 +0200
ndr: Add support for pulling/printing an ipv6address type
commit 10a4ea7219bb8a1b880b1f0ae4fb39b5f479bab3
Author: Kai Blin <[email protected]>
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