s4-dns: Added support for multiple DNS_RPC_RECORDS structures
authorAmitay Isaacs <amitay@gmail.com>
Tue, 27 Sep 2011 07:10:14 +0000 (17:10 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 20 Oct 2011 03:53:05 +0000 (05:53 +0200)
Windows returns multiple DNS_RPC_RECORDS structures, but there is
no well defined structure in [MS-DNSP] doc. Added hand-written
code to parse ndr.

Pair-Programmed-With: Andrew Tridgell <tridge@samba.org>

Signed-off-by: Andrew Tridgell <tridge@samba.org>
librpc/idl/dnsserver.idl
librpc/ndr/ndr_dnsserver.c [new file with mode: 0644]
librpc/ndr/ndr_dnsserver.h [new file with mode: 0644]
librpc/wscript_build

index 0868d6fb6a5bb517996ca4106add48a967a7188f..306414e9798fc5acee2279f1a52c92708ab75803 100644 (file)
@@ -9,7 +9,9 @@ import "misc.idl", "dnsp.idl";
 [ uuid("50abc2a4-574d-40b3-9d66-ee4fd5fba076"),
   version(5.0),
   pointer_default(unique),
-  helpstring("DNS Server")
+  endpoint("ncacn_ip_tcp:", "ncacn_np:[\\pipe\\dnsserver]"),
+  helper("../librpc/ndr/ndr_dnsserver.h"),
+  helpstring("DNS Management Server")
 ] interface dnsserver
 {
 
@@ -1499,7 +1501,7 @@ import "misc.idl", "dnsp.idl";
                [in,unique,string,charset(UTF8)]  uint8                *pszFilterStart,
                [in,unique,string,charset(UTF8)]  uint8                *pszFilterStop,
                [out]                             uint32               *pdwBufferLength,
-               [out,unique,subcontext(4),subcontext_size(*pdwBufferLength)] DNS_RPC_RECORDS *pBuffer
+               [out,ref,subcontext(4),subcontext_size(*pdwBufferLength)] DNS_RPC_RECORDS_ARRAY **pBuffer
         );
 
        WERROR DnssrvUpdateRecord2(
diff --git a/librpc/ndr/ndr_dnsserver.c b/librpc/ndr/ndr_dnsserver.c
new file mode 100644 (file)
index 0000000..5eaa7ca
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Manually parsed structures for DNSSERVER
+
+   Copyright (C) Amitay Isaacs 2011
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "librpc/gen_ndr/ndr_dnsp.h"
+#include "librpc/gen_ndr/ndr_dnsserver.h"
+
+/*
+ * parsing DNS_RPC_RECORDS_ARRAY
+ */
+
+enum ndr_err_code ndr_pull_DNS_RPC_RECORDS_ARRAY(struct ndr_pull *ndr,
+               int ndr_flags, struct DNS_RPC_RECORDS_ARRAY *rec)
+{
+       rec->count = 0;
+       rec->rec = talloc_array(ndr->current_mem_ctx, struct DNS_RPC_RECORDS, rec->count);
+       if (! rec->rec) {
+               return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORDS_ARRAY");
+       }
+
+       while (ndr->offset < ndr->data_size) {
+               rec->rec = talloc_realloc(ndr->current_mem_ctx, rec->rec, struct DNS_RPC_RECORDS, rec->count+1);
+               if (! rec->rec) {
+                       return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull DNS_RPC_RECORDS_ARRAY");
+               }
+               NDR_CHECK(ndr_pull_DNS_RPC_RECORDS(ndr, ndr_flags, &rec->rec[rec->count]));
+               NDR_PULL_ALIGN(ndr, 4);
+               rec->count++;
+       }
+
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_push_DNS_RPC_RECORDS_ARRAY(struct ndr_push *ndr,
+               int ndr_flags, const struct DNS_RPC_RECORDS_ARRAY *rec)
+{
+       int i;
+
+       for (i=0; i<rec->count; i++) {
+               NDR_CHECK(ndr_push_DNS_RPC_RECORDS(ndr, ndr_flags, &rec->rec[i]));
+               NDR_PUSH_ALIGN(ndr, 4);
+       }
+
+       return NDR_ERR_SUCCESS;
+}
diff --git a/librpc/ndr/ndr_dnsserver.h b/librpc/ndr/ndr_dnsserver.h
new file mode 100644 (file)
index 0000000..68eb863
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Manually parsed structures for DNSSERVER
+
+   Copyright (C) Amitay Isaacs 2011
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+enum ndr_err_code ndr_pull_DNS_RPC_RECORDS_ARRAY(struct ndr_pull *ndr,
+               int ndr_flags, struct DNS_RPC_RECORDS_ARRAY *rec);
+enum ndr_err_code ndr_push_DNS_RPC_RECORDS_ARRAY(struct ndr_push *ndr,
+               int ndr_flags, const struct DNS_RPC_RECORDS_ARRAY *rec);
index 2019a0429f6a9167e322aade8b207877593b0944..14289a1e9132b156c31c0b3232db617b5f8a2072 100644 (file)
@@ -26,7 +26,7 @@ bld.SAMBA_SUBSYSTEM('NDR_NAMED_PIPE_AUTH',
        )
 
 bld.SAMBA_SUBSYSTEM('NDR_DNSSERVER',
-       source='gen_ndr/ndr_dnsserver.c',
+       source='gen_ndr/ndr_dnsserver.c ndr/ndr_dnsserver.c',
        public_deps='ndr'
        )