nbt: move nbt_string ndr functions to ndr/ndr_nbt.c helper.
authorGünther Deschner <gd@samba.org>
Thu, 3 Nov 2011 13:39:50 +0000 (14:39 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 3 Nov 2011 17:35:08 +0000 (18:35 +0100)
Guenther

libcli/nbt/libnbt.h
libcli/nbt/nbtname.c
librpc/idl/schannel.idl
librpc/ndr/ndr_nbt.c
librpc/ndr/ndr_nbt.h

index 21fd8597fe4724d47a4a9c9a8fcbca7d83b5b61d..dcab112b90f20861c25b83838e940b43874b8d37 100644 (file)
@@ -335,7 +335,6 @@ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
 
 
 NDR_SCALAR_PROTO(wrepl_nbt_name, const struct nbt_name *)
-NDR_SCALAR_PROTO(nbt_string, const char *)
 NDR_BUFFER_PROTO(nbt_name, struct nbt_name)
 NTSTATUS nbt_rcode_to_ntstatus(uint8_t rcode);
 
index fec8e8e9b9af3adc206ea3928904e8502afa46ba..fd49334298055454485708ddfd2e4308f01ba36f 100644 (file)
 #include "system/locale.h"
 #include "lib/util/util_net.h"
 
-/* don't allow an unlimited number of name components */
-#define MAX_COMPONENTS 10
-
-/**
-  print a nbt string
-*/
-_PUBLIC_ void ndr_print_nbt_string(struct ndr_print *ndr, const char *name, const char *s)
-{
-       ndr_print_string(ndr, name, s);
-}
-
-/*
-  pull one component of a nbt_string
-*/
-static enum ndr_err_code ndr_pull_component(struct ndr_pull *ndr,
-                                           uint8_t **component,
-                                           uint32_t *offset,
-                                           uint32_t *max_offset)
-{
-       uint8_t len;
-       unsigned int loops = 0;
-       while (loops < 5) {
-               if (*offset >= ndr->data_size) {
-                       return ndr_pull_error(ndr, NDR_ERR_STRING,
-                                             "BAD NBT NAME component");
-               }
-               len = ndr->data[*offset];
-               if (len == 0) {
-                       *offset += 1;
-                       *max_offset = MAX(*max_offset, *offset);
-                       *component = NULL;
-                       return NDR_ERR_SUCCESS;
-               }
-               if ((len & 0xC0) == 0xC0) {
-                       /* its a label pointer */
-                       if (1 + *offset >= ndr->data_size) {
-                               return ndr_pull_error(ndr, NDR_ERR_STRING,
-                                                     "BAD NBT NAME component");
-                       }
-                       *max_offset = MAX(*max_offset, *offset + 2);
-                       *offset = ((len&0x3F)<<8) | ndr->data[1 + *offset];
-                       *max_offset = MAX(*max_offset, *offset);
-                       loops++;
-                       continue;
-               }
-               if ((len & 0xC0) != 0) {
-                       /* its a reserved length field */
-                       return ndr_pull_error(ndr, NDR_ERR_STRING,
-                                             "BAD NBT NAME component");
-               }
-               if (*offset + len + 2 > ndr->data_size) {
-                       return ndr_pull_error(ndr, NDR_ERR_STRING,
-                                             "BAD NBT NAME component");
-               }
-               *component = (uint8_t*)talloc_strndup(
-                       ndr->current_mem_ctx,
-                       (const char *)&ndr->data[1 + *offset], len);
-               NDR_ERR_HAVE_NO_MEMORY(*component);
-               *offset += len + 1;
-               *max_offset = MAX(*max_offset, *offset);
-               return NDR_ERR_SUCCESS;
-       }
-
-       /* too many pointers */
-       return ndr_pull_error(ndr, NDR_ERR_STRING, "BAD NBT NAME component");
-}
-
-/**
-  pull a nbt_string from the wire
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_nbt_string(struct ndr_pull *ndr, int ndr_flags, const char **s)
-{
-       uint32_t offset = ndr->offset;
-       uint32_t max_offset = offset;
-       unsigned num_components;
-       char *name;
-
-       if (!(ndr_flags & NDR_SCALARS)) {
-               return NDR_ERR_SUCCESS;
-       }
-
-       name = NULL;
-
-       /* break up name into a list of components */
-       for (num_components=0;num_components<MAX_COMPONENTS;num_components++) {
-               uint8_t *component = NULL;
-               NDR_CHECK(ndr_pull_component(ndr, &component, &offset, &max_offset));
-               if (component == NULL) break;
-               if (name) {
-                       name = talloc_asprintf_append_buffer(name, ".%s", component);
-                       NDR_ERR_HAVE_NO_MEMORY(name);
-               } else {
-                       name = (char *)component;
-               }
-       }
-       if (num_components == MAX_COMPONENTS) {
-               return ndr_pull_error(ndr, NDR_ERR_STRING,
-                                     "BAD NBT NAME too many components");
-       }
-       if (num_components == 0) {
-               name = talloc_strdup(ndr->current_mem_ctx, "");
-               NDR_ERR_HAVE_NO_MEMORY(name);
-       }
-
-       (*s) = name;
-       ndr->offset = max_offset;
-
-       return NDR_ERR_SUCCESS;
-}
-
-/**
-  push a nbt string to the wire
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_nbt_string(struct ndr_push *ndr, int ndr_flags, const char *s)
-{
-       if (!(ndr_flags & NDR_SCALARS)) {
-               return NDR_ERR_SUCCESS;
-       }
-
-       while (s && *s) {
-               enum ndr_err_code ndr_err;
-               char *compname;
-               size_t complen;
-               uint32_t offset;
-
-               /* see if we have pushed the remaing string allready,
-                * if so we use a label pointer to this string
-                */
-               ndr_err = ndr_token_retrieve_cmp_fn(&ndr->nbt_string_list, s, &offset, (comparison_fn_t)strcmp, false);
-               if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-                       uint8_t b[2];
-
-                       if (offset > 0x3FFF) {
-                               return ndr_push_error(ndr, NDR_ERR_STRING,
-                                                     "offset for nbt string label pointer %u[%08X] > 0x00003FFF",
-                                                     offset, offset);
-                       }
-
-                       b[0] = 0xC0 | (offset>>8);
-                       b[1] = (offset & 0xFF);
-
-                       return ndr_push_bytes(ndr, b, 2);
-               }
-
-               complen = strcspn(s, ".");
-
-               /* we need to make sure the length fits into 6 bytes */
-               if (complen > 0x3F) {
-                       return ndr_push_error(ndr, NDR_ERR_STRING,
-                                             "component length %u[%08X] > 0x0000003F",
-                                             (unsigned)complen, (unsigned)complen);
-               }
-
-               compname = talloc_asprintf(ndr, "%c%*.*s",
-                                               (unsigned char)complen,
-                                               (unsigned char)complen,
-                                               (unsigned char)complen, s);
-               NDR_ERR_HAVE_NO_MEMORY(compname);
-
-               /* remember the current componemt + the rest of the string
-                * so it can be reused later
-                */
-               NDR_CHECK(ndr_token_store(ndr, &ndr->nbt_string_list, s, ndr->offset));
-
-               /* push just this component into the blob */
-               NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)compname, complen+1));
-               talloc_free(compname);
-
-               s += complen;
-               if (*s == '.') s++;
-       }
-
-       /* if we reach the end of the string and have pushed the last component
-        * without using a label pointer, we need to terminate the string
-        */
-       return ndr_push_bytes(ndr, (const uint8_t *)"", 1);
-}
-
-
 /*
   decompress a 'compressed' name component
  */
index b597a4395d28d9d52554bb35b94a12e336206945..820e230a4b5be8648f6cb3dbf2e99aca4beced48 100644 (file)
@@ -8,7 +8,7 @@ import "netlogon.idl", "nbt.idl";
 
 [
        pointer_default(unique),
-       helper("../librpc/ndr/ndr_schannel.h")
+       helper("../librpc/ndr/ndr_schannel.h", "../librpc/ndr/ndr_nbt.h")
 ]
 interface schannel
 {
index cab159f3a3cf2fa53558393a900c28435d54c021..aa0acd8619768fca091c1a43fc5dd7d7e5c74cb5 100644 (file)
@@ -3,6 +3,7 @@
 
    CLDAP server structures
 
+   Copyright (C) Andrew Tridgell 2005
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
 
    This program is free software; you can redistribute it and/or modify
 /* parser auto-generated by pidl, then hand-modified by abartlet */
 
 #include "includes.h"
+#include "../libcli/nbt/libnbt.h"
 #include "../libcli/netlogon/netlogon.h"
 
+/* don't allow an unlimited number of name components */
+#define MAX_COMPONENTS 10
+
+/**
+  print a nbt string
+*/
+_PUBLIC_ void ndr_print_nbt_string(struct ndr_print *ndr, const char *name, const char *s)
+{
+       ndr_print_string(ndr, name, s);
+}
+
+/*
+  pull one component of a nbt_string
+*/
+static enum ndr_err_code ndr_pull_component(struct ndr_pull *ndr,
+                                           uint8_t **component,
+                                           uint32_t *offset,
+                                           uint32_t *max_offset)
+{
+       uint8_t len;
+       unsigned int loops = 0;
+       while (loops < 5) {
+               if (*offset >= ndr->data_size) {
+                       return ndr_pull_error(ndr, NDR_ERR_STRING,
+                                             "BAD NBT NAME component");
+               }
+               len = ndr->data[*offset];
+               if (len == 0) {
+                       *offset += 1;
+                       *max_offset = MAX(*max_offset, *offset);
+                       *component = NULL;
+                       return NDR_ERR_SUCCESS;
+               }
+               if ((len & 0xC0) == 0xC0) {
+                       /* its a label pointer */
+                       if (1 + *offset >= ndr->data_size) {
+                               return ndr_pull_error(ndr, NDR_ERR_STRING,
+                                                     "BAD NBT NAME component");
+                       }
+                       *max_offset = MAX(*max_offset, *offset + 2);
+                       *offset = ((len&0x3F)<<8) | ndr->data[1 + *offset];
+                       *max_offset = MAX(*max_offset, *offset);
+                       loops++;
+                       continue;
+               }
+               if ((len & 0xC0) != 0) {
+                       /* its a reserved length field */
+                       return ndr_pull_error(ndr, NDR_ERR_STRING,
+                                             "BAD NBT NAME component");
+               }
+               if (*offset + len + 2 > ndr->data_size) {
+                       return ndr_pull_error(ndr, NDR_ERR_STRING,
+                                             "BAD NBT NAME component");
+               }
+               *component = (uint8_t*)talloc_strndup(
+                       ndr->current_mem_ctx,
+                       (const char *)&ndr->data[1 + *offset], len);
+               NDR_ERR_HAVE_NO_MEMORY(*component);
+               *offset += len + 1;
+               *max_offset = MAX(*max_offset, *offset);
+               return NDR_ERR_SUCCESS;
+       }
+
+       /* too many pointers */
+       return ndr_pull_error(ndr, NDR_ERR_STRING, "BAD NBT NAME component");
+}
+
+/**
+  pull a nbt_string from the wire
+*/
+_PUBLIC_ enum ndr_err_code ndr_pull_nbt_string(struct ndr_pull *ndr, int ndr_flags, const char **s)
+{
+       uint32_t offset = ndr->offset;
+       uint32_t max_offset = offset;
+       unsigned num_components;
+       char *name;
+
+       if (!(ndr_flags & NDR_SCALARS)) {
+               return NDR_ERR_SUCCESS;
+       }
+
+       name = NULL;
+
+       /* break up name into a list of components */
+       for (num_components=0;num_components<MAX_COMPONENTS;num_components++) {
+               uint8_t *component = NULL;
+               NDR_CHECK(ndr_pull_component(ndr, &component, &offset, &max_offset));
+               if (component == NULL) break;
+               if (name) {
+                       name = talloc_asprintf_append_buffer(name, ".%s", component);
+                       NDR_ERR_HAVE_NO_MEMORY(name);
+               } else {
+                       name = (char *)component;
+               }
+       }
+       if (num_components == MAX_COMPONENTS) {
+               return ndr_pull_error(ndr, NDR_ERR_STRING,
+                                     "BAD NBT NAME too many components");
+       }
+       if (num_components == 0) {
+               name = talloc_strdup(ndr->current_mem_ctx, "");
+               NDR_ERR_HAVE_NO_MEMORY(name);
+       }
+
+       (*s) = name;
+       ndr->offset = max_offset;
+
+       return NDR_ERR_SUCCESS;
+}
+
+/**
+  push a nbt string to the wire
+*/
+_PUBLIC_ enum ndr_err_code ndr_push_nbt_string(struct ndr_push *ndr, int ndr_flags, const char *s)
+{
+       if (!(ndr_flags & NDR_SCALARS)) {
+               return NDR_ERR_SUCCESS;
+       }
+
+       while (s && *s) {
+               enum ndr_err_code ndr_err;
+               char *compname;
+               size_t complen;
+               uint32_t offset;
+
+               /* see if we have pushed the remaing string allready,
+                * if so we use a label pointer to this string
+                */
+               ndr_err = ndr_token_retrieve_cmp_fn(&ndr->nbt_string_list, s, &offset, (comparison_fn_t)strcmp, false);
+               if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       uint8_t b[2];
+
+                       if (offset > 0x3FFF) {
+                               return ndr_push_error(ndr, NDR_ERR_STRING,
+                                                     "offset for nbt string label pointer %u[%08X] > 0x00003FFF",
+                                                     offset, offset);
+                       }
+
+                       b[0] = 0xC0 | (offset>>8);
+                       b[1] = (offset & 0xFF);
+
+                       return ndr_push_bytes(ndr, b, 2);
+               }
+
+               complen = strcspn(s, ".");
+
+               /* we need to make sure the length fits into 6 bytes */
+               if (complen > 0x3F) {
+                       return ndr_push_error(ndr, NDR_ERR_STRING,
+                                             "component length %u[%08X] > 0x0000003F",
+                                             (unsigned)complen, (unsigned)complen);
+               }
+
+               compname = talloc_asprintf(ndr, "%c%*.*s",
+                                               (unsigned char)complen,
+                                               (unsigned char)complen,
+                                               (unsigned char)complen, s);
+               NDR_ERR_HAVE_NO_MEMORY(compname);
+
+               /* remember the current componemt + the rest of the string
+                * so it can be reused later
+                */
+               NDR_CHECK(ndr_token_store(ndr, &ndr->nbt_string_list, s, ndr->offset));
+
+               /* push just this component into the blob */
+               NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)compname, complen+1));
+               talloc_free(compname);
+
+               s += complen;
+               if (*s == '.') s++;
+       }
+
+       /* if we reach the end of the string and have pushed the last component
+        * without using a label pointer, we need to terminate the string
+        */
+       return ndr_push_bytes(ndr, (const uint8_t *)"", 1);
+}
+
+
 /* 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)
 {
index 69863f0209dba64e2b5549590fa149530a41200b..65975765cbfe5f4d132b9d931919eaaa4e88b1dc 100644 (file)
@@ -3,6 +3,7 @@
 
    CLDAP server structures
 
+   Copyright (C) Andrew Tridgell 2005
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
 
    This program is free software; you can redistribute it and/or modify
 #ifndef _LIBRPC_NDR_NDR_NBT_H
 #define _LIBRPC_NDR_NDR_NBT_H
 
+#include "librpc/gen_ndr/nbt.h"
+
+NDR_SCALAR_PROTO(nbt_string, const char *)
+
 enum ndr_err_code ndr_push_NETLOGON_SAM_LOGON_REQUEST(struct ndr_push *ndr, int ndr_flags, const struct NETLOGON_SAM_LOGON_REQUEST *r);
 enum ndr_err_code ndr_pull_NETLOGON_SAM_LOGON_REQUEST(struct ndr_pull *ndr, int ndr_flags, struct NETLOGON_SAM_LOGON_REQUEST *r);
 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);