nbt: create standard ndr_pull/push interface for common netlogon samlogon replies.
authorGünther Deschner <gd@samba.org>
Wed, 12 Oct 2011 12:58:46 +0000 (14:58 +0200)
committerGünther Deschner <gd@samba.org>
Thu, 3 Nov 2011 17:35:09 +0000 (18:35 +0100)
Guenther

librpc/ndr/ndr_nbt.c
librpc/ndr/ndr_nbt.h

index aa0acd8619768fca091c1a43fc5dd7d7e5c74cb5..02297d3fdfa92f7f26007d9ca40f7dda9f7dc9af 100644 (file)
@@ -389,3 +389,59 @@ enum ndr_err_code ndr_pull_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(struct ndr_
        }
        return NDR_ERR_SUCCESS;
 }
+
+_PUBLIC_ enum ndr_err_code ndr_push_netlogon_samlogon_response(struct ndr_push *ndr, int ndr_flags, const struct netlogon_samlogon_response *r)
+{
+       if (r->ntver == NETLOGON_NT_VERSION_1) {
+               NDR_CHECK(ndr_push_NETLOGON_SAM_LOGON_RESPONSE_NT40(
+                       ndr, ndr_flags, &r->data.nt4));
+       } else if (r->ntver & NETLOGON_NT_VERSION_5EX) {
+               NDR_CHECK(ndr_push_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(
+                       ndr, ndr_flags, &r->data.nt5_ex));
+       } else if (r->ntver & NETLOGON_NT_VERSION_5) {
+               NDR_CHECK(ndr_push_NETLOGON_SAM_LOGON_RESPONSE(
+                       ndr, ndr_flags, &r->data.nt5));
+       } else {
+               return NDR_ERR_BAD_SWITCH;
+       }
+
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_netlogon_samlogon_response(struct ndr_pull *ndr, int ndr_flags, struct netlogon_samlogon_response *r)
+{
+       if (ndr->data_size < 8) {
+               return NDR_ERR_BUFSIZE;
+       }
+
+       /* lmnttoken */
+       if (SVAL(ndr->data, ndr->data_size - 4) != 0xffff) {
+               return NDR_ERR_TOKEN;
+       }
+       /* lm20token */
+       if (SVAL(ndr->data, ndr->data_size - 2) != 0xffff) {
+               return NDR_ERR_TOKEN;
+       }
+
+       r->ntver = IVAL(ndr->data, ndr->data_size - 8);
+
+       if (r->ntver == NETLOGON_NT_VERSION_1) {
+               NDR_CHECK(ndr_pull_NETLOGON_SAM_LOGON_RESPONSE_NT40(
+                       ndr, ndr_flags, &r->data.nt4));
+       } else if (r->ntver & NETLOGON_NT_VERSION_5EX) {
+               NDR_CHECK(ndr_pull_NETLOGON_SAM_LOGON_RESPONSE_EX_with_flags(
+                       ndr, ndr_flags, &r->data.nt5_ex, r->ntver));
+               if (ndr->offset < ndr->data_size) {
+                       return ndr_pull_error(ndr, NDR_ERR_UNREAD_BYTES,
+                                                "not all bytes consumed ofs[%u] size[%u]",
+                                                ndr->offset, ndr->data_size);
+               }
+       } else if (r->ntver & NETLOGON_NT_VERSION_5) {
+               NDR_CHECK(ndr_pull_NETLOGON_SAM_LOGON_RESPONSE(
+                       ndr, ndr_flags, &r->data.nt5));
+       } else {
+               return NDR_ERR_BAD_SWITCH;
+       }
+
+       return NDR_ERR_SUCCESS;
+}
index bda0e210cfe829fa307ce71ce86c2d36613f19cb..870ee434cebbecc28e41585d216af5e591183649 100644 (file)
@@ -1,10 +1,11 @@
 #/*
    Unix SMB/CIFS implementation.
 
-   CLDAP server structures
+   routines for marshalling/unmarshalling special netlogon types
 
    Copyright (C) Andrew Tridgell 2005
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
+   Copyright (C) Guenther Deschner 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
@@ -45,4 +46,7 @@ enum ndr_err_code ndr_pull_NETLOGON_SAM_LOGON_REQUEST(struct ndr_pull *ndr, int
 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);
 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);
+enum ndr_err_code ndr_push_netlogon_samlogon_response(struct ndr_push *ndr, int ndr_flags, const struct netlogon_samlogon_response *r);
+enum ndr_err_code ndr_pull_netlogon_samlogon_response(struct ndr_pull *ndr, int ndr_flags, struct netlogon_samlogon_response *r);
+
 #endif /* _LIBRPC_NDR_NDR_NBT_H */