Manually handle the NETLOGON_SAM_LOGON_REQUEST too.
authorAndrew Bartlett <abartlet@samba.org>
Wed, 21 May 2008 04:26:38 +0000 (14:26 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 21 May 2008 04:26:38 +0000 (14:26 +1000)
With the sid structure being both optional and aligned, it was too
hard to do this in just IDL.

This requried moving some things around, as otherwise we would have a
dependency loop.

Andrew Bartlett

source/libcli/config.mk
source/libcli/ndr_netlogon.c [new file with mode: 0644]
source/libcli/netlogon.c
source/libcli/netlogon.h
source/librpc/config.mk
source/librpc/idl/nbt.idl

index f502091b0798118ff9e5aa3184202be3a85c15c9..16e23430d747c850b6446ddaeea0b3ec2046af34 100644 (file)
@@ -57,9 +57,17 @@ LIBCLI_NBT_OBJ_FILES = $(addprefix $(libclisrcdir)/nbt/, \
 
 $(eval $(call proto_header_template,$(libclisrcdir)/nbt/nbt_proto.h,$(LIBCLI_NBT_OBJ_FILES:.o=.c)))
 
+[SUBSYSTEM::LIBCLI_NDR_NETLOGON]
+PUBLIC_DEPENDENCIES = LIBNDR  \
+       NDR_SECURITY    
+
+LIBCLI_NDR_NETLOGON_OBJ_FILES = $(addprefix libcli/, \
+       ndr_netlogon.o)
+
+$(eval $(call proto_header_template,$(libclisrcdir)/ndr_netlogon_proto.h,$(LIBCLI_NDR_NETLOGON_OBJ_FILES:.o=.c)))
+
 [SUBSYSTEM::LIBCLI_NETLOGON]
-PUBLIC_DEPENDENCIES = LIBNDR NDR_NBT  \
-       NDR_SECURITY LIBSAMBA-UTIL
+PUBLIC_DEPENDENCIES = LIBSAMBA-UTIL LIBCLI_NDR_NETLOGON
 
 LIBCLI_NETLOGON_OBJ_FILES = $(addprefix libcli/, \
        netlogon.o)
diff --git a/source/libcli/ndr_netlogon.c b/source/libcli/ndr_netlogon.c
new file mode 100644 (file)
index 0000000..504b3b0
--- /dev/null
@@ -0,0 +1,209 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   CLDAP server structures
+
+   Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
+   
+   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/>.
+*/
+
+/* parser auto-generated by pidl, then hand-modified by abartlet */
+
+#include "includes.h"
+#include "libcli/netlogon.h"
+/* Manually modified to handle the dom_sid being optional based on if it is present or all zero */
+enum ndr_err_code ndr_push_NETLOGON_SAM_LOGON_REQUEST(struct ndr_push *ndr, int ndr_flags, const struct NETLOGON_SAM_LOGON_REQUEST *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->request_count));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->computer_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->user_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->mailslot_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_samr_AcctFlags(ndr, NDR_SCALARS, r->acct_control));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_dom_sid0(&r->sid, ndr->flags)));
+               if (ndr_size_dom_sid0(&r->sid, ndr->flags)) {
+                       struct ndr_push *_ndr_sid;
+                       uint32_t _flags_save_DATA_BLOB = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->_pad));
+                       ndr->flags = _flags_save_DATA_BLOB;
+                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_sid, 0, ndr_size_dom_sid0(&r->sid, ndr->flags)));
+                       NDR_CHECK(ndr_push_dom_sid0(_ndr_sid, NDR_SCALARS|NDR_BUFFERS, &r->sid));
+                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_sid, 0, ndr_size_dom_sid0(&r->sid, ndr->flags)));
+               }
+               NDR_CHECK(ndr_push_netlogon_nt_version_flags(ndr, NDR_SCALARS, r->nt_version));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lmnt_token));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lm20_token));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+/* Manually modified to handle the dom_sid being optional based on if it is present (size is non-zero) or not */
+enum ndr_err_code ndr_pull_NETLOGON_SAM_LOGON_REQUEST(struct ndr_pull *ndr, int ndr_flags, struct NETLOGON_SAM_LOGON_REQUEST *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->request_count));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->computer_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->user_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->mailslot_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_samr_AcctFlags(ndr, NDR_SCALARS, &r->acct_control));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sid_size));
+               if (r->sid_size) {
+                       uint32_t _flags_save_DATA_BLOB = ndr->flags;
+                       struct ndr_pull *_ndr_sid;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->_pad));
+                       ndr->flags = _flags_save_DATA_BLOB;
+                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_sid, 0, r->sid_size));
+                       NDR_CHECK(ndr_pull_dom_sid0(_ndr_sid, NDR_SCALARS|NDR_BUFFERS, &r->sid));
+                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_sid, 0, r->sid_size));
+               } else {
+                       ZERO_STRUCT(r->sid);
+               }
+               NDR_CHECK(ndr_pull_netlogon_nt_version_flags(ndr, NDR_SCALARS, &r->nt_version));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lmnt_token));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lm20_token));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+/* Manually modified to only push some parts of the structure if certain flags are set */
+enum ndr_err_code ndr_push_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(struct ndr_push *ndr, int ndr_flags, const struct NETLOGON_SAM_LOGON_RESPONSE_EX *r)
+{
+       {
+               uint32_t _flags_save_STRUCT = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_push_align(ndr, 4));
+                       NDR_CHECK(ndr_push_netlogon_command(ndr, NDR_SCALARS, r->command));
+                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->sbz));
+                       NDR_CHECK(ndr_push_nbt_server_type(ndr, NDR_SCALARS, r->server_type));
+                       NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->domain_uuid));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->forest));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->dns_domain));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->pdc_dns_name));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->domain));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->pdc_name));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->user_name));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->server_site));
+                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->client_site));
+                       if (r->nt_version & NETLOGON_NT_VERSION_5EX_WITH_IP) {
+                               NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, ndr_size_nbt_sockaddr(&r->sockaddr, ndr->flags)));
+                               {
+                                       struct ndr_push *_ndr_sockaddr;
+                                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_sockaddr, 0, ndr_size_nbt_sockaddr(&r->sockaddr, ndr->flags)));
+                                       NDR_CHECK(ndr_push_nbt_sockaddr(_ndr_sockaddr, NDR_SCALARS|NDR_BUFFERS, &r->sockaddr));
+                                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_sockaddr, 0, ndr_size_nbt_sockaddr(&r->sockaddr, ndr->flags)));
+                               }
+                       }
+                       if (r->nt_version & NETLOGON_NT_VERSION_WITH_CLOSEST_SITE) {
+                               NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->next_closest_site));
+                       }
+                       NDR_CHECK(ndr_push_netlogon_nt_version_flags(ndr, NDR_SCALARS, r->nt_version));
+                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lmnt_token));
+                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lm20_token));
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_push_GUID(ndr, NDR_BUFFERS, &r->domain_uuid));
+               }
+               ndr->flags = _flags_save_STRUCT;
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+/* Manually modified to only pull some parts of the structure if certain flags provided */
+enum ndr_err_code ndr_pull_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(struct ndr_pull *ndr, int ndr_flags, struct NETLOGON_SAM_LOGON_RESPONSE_EX *r,
+                                                                    uint32_t nt_version_flags)
+{
+       {
+               uint32_t _flags_save_STRUCT = ndr->flags;
+               ZERO_STRUCTP(r);
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_align(ndr, 4));
+                       NDR_CHECK(ndr_pull_netlogon_command(ndr, NDR_SCALARS, &r->command));
+                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->sbz));
+                       NDR_CHECK(ndr_pull_nbt_server_type(ndr, NDR_SCALARS, &r->server_type));
+                       NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->domain_uuid));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->forest));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->dns_domain));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->pdc_dns_name));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->domain));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->pdc_name));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->user_name));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->server_site));
+                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->client_site));
+                       if (nt_version_flags & NETLOGON_NT_VERSION_5EX_WITH_IP) {
+                               NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &r->sockaddr_size));
+                               {
+                                       struct ndr_pull *_ndr_sockaddr;
+                                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_sockaddr, 0, r->sockaddr_size));
+                                       NDR_CHECK(ndr_pull_nbt_sockaddr(_ndr_sockaddr, NDR_SCALARS|NDR_BUFFERS, &r->sockaddr));
+                                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_sockaddr, 0, r->sockaddr_size));
+                               }
+                       }
+                       if (nt_version_flags & NETLOGON_NT_VERSION_WITH_CLOSEST_SITE) {
+                               NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->next_closest_site));
+                       }
+                       NDR_CHECK(ndr_pull_netlogon_nt_version_flags(ndr, NDR_SCALARS, &r->nt_version));
+                       if (r->nt_version != nt_version_flags) {
+                               return NDR_ERR_VALIDATE;
+                       }
+                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lmnt_token));
+                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lm20_token));
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_GUID(ndr, NDR_BUFFERS, &r->domain_uuid));
+               }
+               ndr->flags = _flags_save_STRUCT;
+       }
+       return NDR_ERR_SUCCESS;
+}
index 3ef7cf63350e02d0e7f76283a5bdf5c504d363ff..052d7cbc1e381c6e212ba4d53f8034d592dd1099 100644 (file)
@@ -1,99 +1,27 @@
-/* parser auto-generated by pidl, then hand-modified by abartlet */
+/* 
+   Unix SMB/CIFS implementation.
+
+   CLDAP server structures
+
+   Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
+   
+   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 "libcli/netlogon.h"
 
-_PUBLIC_ enum ndr_err_code ndr_push_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(struct ndr_push *ndr, int ndr_flags, const struct NETLOGON_SAM_LOGON_RESPONSE_EX *r)
-{
-       {
-               uint32_t _flags_save_STRUCT = ndr->flags;
-               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
-               if (ndr_flags & NDR_SCALARS) {
-                       NDR_CHECK(ndr_push_align(ndr, 4));
-                       NDR_CHECK(ndr_push_netlogon_command(ndr, NDR_SCALARS, r->command));
-                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->sbz));
-                       NDR_CHECK(ndr_push_nbt_server_type(ndr, NDR_SCALARS, r->server_type));
-                       NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->domain_uuid));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->forest));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->dns_domain));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->pdc_dns_name));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->domain));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->pdc_name));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->user_name));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->server_site));
-                       NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->client_site));
-                       if (r->nt_version & NETLOGON_NT_VERSION_5EX_WITH_IP) {
-                               NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, ndr_size_nbt_sockaddr(&r->sockaddr, ndr->flags)));
-                               {
-                                       struct ndr_push *_ndr_sockaddr;
-                                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_sockaddr, 0, ndr_size_nbt_sockaddr(&r->sockaddr, ndr->flags)));
-                                       NDR_CHECK(ndr_push_nbt_sockaddr(_ndr_sockaddr, NDR_SCALARS|NDR_BUFFERS, &r->sockaddr));
-                                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_sockaddr, 0, ndr_size_nbt_sockaddr(&r->sockaddr, ndr->flags)));
-                               }
-                       }
-                       if (r->nt_version & NETLOGON_NT_VERSION_WITH_CLOSEST_SITE) {
-                               NDR_CHECK(ndr_push_nbt_string(ndr, NDR_SCALARS, r->next_closest_site));
-                       }
-                       NDR_CHECK(ndr_push_netlogon_nt_version_flags(ndr, NDR_SCALARS, r->nt_version));
-                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lmnt_token));
-                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lm20_token));
-               }
-               if (ndr_flags & NDR_BUFFERS) {
-                       NDR_CHECK(ndr_push_GUID(ndr, NDR_BUFFERS, &r->domain_uuid));
-               }
-               ndr->flags = _flags_save_STRUCT;
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(struct ndr_pull *ndr, int ndr_flags, struct NETLOGON_SAM_LOGON_RESPONSE_EX *r,
-                                                                           uint32_t nt_version_flags)
-{
-       {
-               uint32_t _flags_save_STRUCT = ndr->flags;
-               ZERO_STRUCTP(r);
-               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
-               if (ndr_flags & NDR_SCALARS) {
-                       NDR_CHECK(ndr_pull_align(ndr, 4));
-                       NDR_CHECK(ndr_pull_netlogon_command(ndr, NDR_SCALARS, &r->command));
-                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->sbz));
-                       NDR_CHECK(ndr_pull_nbt_server_type(ndr, NDR_SCALARS, &r->server_type));
-                       NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->domain_uuid));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->forest));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->dns_domain));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->pdc_dns_name));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->domain));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->pdc_name));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->user_name));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->server_site));
-                       NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->client_site));
-                       if (nt_version_flags & NETLOGON_NT_VERSION_5EX_WITH_IP) {
-                               NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &r->sockaddr_size));
-                               {
-                                       struct ndr_pull *_ndr_sockaddr;
-                                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_sockaddr, 0, r->sockaddr_size));
-                                       NDR_CHECK(ndr_pull_nbt_sockaddr(_ndr_sockaddr, NDR_SCALARS|NDR_BUFFERS, &r->sockaddr));
-                                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_sockaddr, 0, r->sockaddr_size));
-                               }
-                       }
-                       if (nt_version_flags & NETLOGON_NT_VERSION_WITH_CLOSEST_SITE) {
-                               NDR_CHECK(ndr_pull_nbt_string(ndr, NDR_SCALARS, &r->next_closest_site));
-                       }
-                       NDR_CHECK(ndr_pull_netlogon_nt_version_flags(ndr, NDR_SCALARS, &r->nt_version));
-                       if (r->nt_version != nt_version_flags) {
-                               return NDR_ERR_VALIDATE;
-                       }
-                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lmnt_token));
-                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lm20_token));
-               }
-               if (ndr_flags & NDR_BUFFERS) {
-                       NDR_CHECK(ndr_pull_GUID(ndr, NDR_BUFFERS, &r->domain_uuid));
-               }
-               ndr->flags = _flags_save_STRUCT;
-       }
-       return NDR_ERR_SUCCESS;
-}
-
 NTSTATUS push_netlogon_samlogon_response(DATA_BLOB *data, TALLOC_CTX *mem_ctx, 
                                         struct smb_iconv_convenience *iconv_convenience,
                                         struct netlogon_samlogon_response *response) 
index b8615b55a518582f1b3ace013eb685b8a16c47e9..177ed3a514e354ae33bfb1ce762e599c2b77e721 100644 (file)
@@ -50,4 +50,5 @@ struct nbt_netlogon_response
 };
 
 #include "libcli/netlogon_proto.h"
+#include "libcli/ndr_netlogon_proto.h"
 #endif /* __CLDAP_SERVER_PROTO_H__ */
index c2a8d536b212196814b00da82281ae93b2c830f7..69dafb34c6b76487f32fc3a60706242aea5327cb 100644 (file)
@@ -332,7 +332,7 @@ PUBLIC_DEPENDENCIES = LIBNDR NDR_NBT
 NDR_SCHANNEL_OBJ_FILES = $(gen_ndrsrcdir)/ndr_schannel.o
 
 [SUBSYSTEM::NDR_NBT]
-PUBLIC_DEPENDENCIES = LIBNDR NDR_MISC NDR_NBT_BUF NDR_SVCCTL NDR_SECURITY NDR_SAMR
+PUBLIC_DEPENDENCIES = LIBNDR NDR_MISC NDR_NBT_BUF NDR_SVCCTL NDR_SECURITY NDR_SAMR LIBCLI_NDR_NETLOGON
 
 NDR_NBT_OBJ_FILES = $(gen_ndrsrcdir)/ndr_nbt.o
 
index b82c19ca0b26463c974fe07fd5e10b9bece2667d..783f04eb4214d2cdf129718585a4bf1b3aa68b07 100644 (file)
@@ -10,7 +10,7 @@
 
 import "misc.idl", "security.idl", "svcctl.idl", "samr.idl";
 [
-helper("libcli/nbt/libnbt.h")
+       helper("libcli/netlogon.h", "libcli/nbt/libnbt.h")
 ]
 interface nbt
 {
@@ -391,7 +391,9 @@ interface nbt
 
        typedef bitmap samr_AcctFlags samr_AcctFlags;
 
-       typedef struct {
+       /* query to dc hand marshaled, as it has 'optional'
+        * parts */
+       typedef [nopull,nopush] struct {
                uint16               request_count;
                nstring              computer_name;
                nstring              user_name;
@@ -400,9 +402,12 @@ interface nbt
                [value(ndr_size_dom_sid0(&sid, ndr->flags))] uint32 sid_size;
                /* The manual alignment is required because this
                 * structure is marked flag(NDR_NOALIGN) via the
-                * nbt_netlogon_packet below */
-               [flag(NDR_ALIGN4)]   DATA_BLOB _pad;
-               [subcontext(0),subcontext_size(sid_size)] dom_sid0 sid;
+                * nbt_netlogon_packet below.  
+                *
+                * However, both MUST only be present if sid_size > 0 
+                */
+                [flag(NDR_ALIGN4)]   DATA_BLOB _pad;
+                [subcontext(0),subcontext_size(sid_size)] dom_sid0 sid;
                netlogon_nt_version_flags               nt_version;
                uint16               lmnt_token;
                uint16               lm20_token;