libcli/util: add NT_STATUS_NETWORK_SESSION_EXPIRED and NT_STATUS_ALL_SIDS_FILTERED
[mat/samba.git] / libcli / nbt / nbtname.c
index 136379a313f9e54ee562e59ef0b64a03f0d17b76..fd49334298055454485708ddfd2e4308f01ba36f 100644 (file)
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "system/locale.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;
-       uint_t 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, (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, "");
-               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);
-}
-
+#include "lib/util/util_net.h"
 
 /*
   decompress a 'compressed' name component
@@ -380,11 +204,11 @@ _PUBLIC_ NTSTATUS nbt_name_dup(TALLOC_CTX *mem_ctx, struct nbt_name *name, struc
 /**
   push a nbt name into a blob
 */
-_PUBLIC_ NTSTATUS nbt_name_to_blob(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, DATA_BLOB *blob, struct nbt_name *name)
+_PUBLIC_ NTSTATUS nbt_name_to_blob(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct nbt_name *name)
 {
        enum ndr_err_code ndr_err;
 
-       ndr_err = ndr_push_struct_blob(blob, mem_ctx, iconv_convenience, name, (ndr_push_flags_fn_t)ndr_push_nbt_name);
+       ndr_err = ndr_push_struct_blob(blob, mem_ctx, name, (ndr_push_flags_fn_t)ndr_push_nbt_name);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                return ndr_map_error2ntstatus(ndr_err);
        }
@@ -399,7 +223,7 @@ _PUBLIC_ NTSTATUS nbt_name_from_blob(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob,
 {
        enum ndr_err_code ndr_err;
 
-       ndr_err = ndr_pull_struct_blob(blob, mem_ctx, NULL, name,
+       ndr_err = ndr_pull_struct_blob(blob, mem_ctx, name,
                                       (ndr_pull_flags_fn_t)ndr_pull_nbt_name);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                return ndr_map_error2ntstatus(ndr_err);