Merge branch 'master' of ssh://git.samba.org/data/git/samba
authorJelmer Vernooij <jelmer@samba.org>
Mon, 13 Oct 2008 14:30:40 +0000 (16:30 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 13 Oct 2008 14:30:40 +0000 (16:30 +0200)
26 files changed:
librpc/ndr/ndr.c [moved from source4/librpc/ndr/ndr.c with 98% similarity]
librpc/ndr/ndr_basic.c [moved from source4/librpc/ndr/ndr_basic.c with 100% similarity]
librpc/ndr/ndr_misc.c [moved from source4/librpc/ndr/ndr_misc.c with 100% similarity]
librpc/ndr/uuid.c [moved from source4/librpc/ndr/uuid.c with 100% similarity]
librpc/tools/ndrdump.1.xml [moved from source4/librpc/tools/ndrdump.1.xml with 100% similarity]
librpc/tools/ndrdump.c [moved from source4/librpc/tools/ndrdump.c with 99% similarity]
source3/Makefile.in
source3/include/proto.h
source3/lib/util.c
source3/librpc/ndr/libndr.h
source3/librpc/ndr/ndr.c
source3/librpc/ndr/ndr_basic.c [deleted file]
source3/librpc/ndr/ndr_krb5pac.c
source3/librpc/ndr/ndr_misc.c [deleted file]
source3/librpc/ndr/ndr_string.c
source3/librpc/ndr/util.c [new file with mode: 0644]
source3/librpc/ndr/uuid.c [deleted file]
source3/libsmb/clidgram.c
source4/dsdb/samdb/ldb_modules/kludge_acl.c
source4/dsdb/samdb/ldb_modules/proxy.c
source4/dsdb/samdb/ldb_modules/repl_meta_data.c
source4/dsdb/samdb/ldb_modules/schema_fsmo.c
source4/lib/ldb-samba/ldif_handlers.c
source4/librpc/config.mk
source4/librpc/ndr/libndr.h
source4/librpc/ndr/ndr_string.c

similarity index 98%
rename from source4/librpc/ndr/ndr.c
rename to librpc/ndr/ndr.c
index e19a1eb9badf5ff530fe97e557d9f1c1a902fdbc..2f1daeaeb5ac2982aec61787d99d7ecad0b9c0a2 100644 (file)
@@ -29,8 +29,9 @@
 #include "includes.h"
 #include "librpc/ndr/libndr.h"
 #include "../lib/util/dlinklist.h"
-#include "librpc/gen_ndr/dcerpc.h"
+#if _SAMBA_BUILD_ == 4
 #include "param/param.h"
+#endif
 
 #define NDR_BASE_MARSHALL_SIZE 1024
 
@@ -163,16 +164,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
+_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) 
 {
        va_list ap;
        char *s = NULL;
-       int i;
+       int i, ret;
 
        va_start(ap, format);
-       vasprintf(&s, format, ap);
+       ret = vasprintf(&s, format, ap);
        va_end(ap);
 
+       if (ret == -1) {
+               return;
+       }
+
        for (i=0;i<ndr->depth;i++) {
                DEBUGADD(0,("    "));
        }
@@ -350,12 +355,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
 {
        char *s=NULL;
        va_list ap;
+       int ret;
 
        va_start(ap, format);
-       vasprintf(&s, format, ap);
+       ret = vasprintf(&s, format, ap);
        va_end(ap);
 
-       DEBUG(3,("ndr_pull_error(%u): %s\n", ndr_err, s));
+       if (ret == -1) {
+               return NDR_ERR_ALLOC;
+       }
+
+       DEBUG(1,("ndr_pull_error(%u): %s\n", ndr_err, s));
 
        free(s);
 
@@ -367,16 +377,21 @@ _PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
 */
 _PUBLIC_ enum ndr_err_code ndr_push_error(struct ndr_push *ndr,
                                 enum ndr_err_code ndr_err,
-                                const char *format, ...)
+                                const char *format, ...) 
 {
        char *s=NULL;
        va_list ap;
+       int ret;
 
        va_start(ap, format);
-       vasprintf(&s, format, ap);
+       ret = vasprintf(&s, format, ap);
        va_end(ap);
 
-       DEBUG(3,("ndr_push_error(%u): %s\n", ndr_err, s));
+       if (ret == -1) {
+               return NDR_ERR_ALLOC;
+       }
+
+       DEBUG(1,("ndr_push_error(%u): %s\n", ndr_err, s));
 
        free(s);
 
similarity index 100%
rename from source4/librpc/ndr/uuid.c
rename to librpc/ndr/uuid.c
similarity index 99%
rename from source4/librpc/tools/ndrdump.c
rename to librpc/tools/ndrdump.c
index b24868eaced3a9c8b79aa040cef207d648b27d9b..3ecf10a167bd53edff17e0e98856a6bf8c6ac90f 100644 (file)
@@ -26,6 +26,8 @@
 #include "librpc/ndr/libndr.h"
 #include "librpc/ndr/ndr_table.h"
 #include "param/param.h"
+#else
+#define _NORETURN_
 #endif
 
 static const struct ndr_interface_call *find_function(
index 97e8ccb0d5cb365b13bc9a9f482361f039ccd34c..cc9efb3918b0d042b1aa45e4ca9ef4dceebd8b3f 100644 (file)
@@ -256,15 +256,16 @@ COMPRESSION_OBJ = ../lib/compression/mszip.o
 DRSUAPI_OBJ = $(LIBNDR_DRSUAPI_OBJ) \
              $(COMPRESSION_OBJ)
 
-LIBNDR_OBJ = librpc/ndr/ndr_basic.o \
-            librpc/ndr/ndr.o \
-            librpc/ndr/ndr_misc.o \
+LIBNDR_OBJ = ../librpc/ndr/ndr_basic.o \
+            ../librpc/ndr/ndr.o \
+            ../librpc/ndr/ndr_misc.o \
             librpc/gen_ndr/ndr_misc.o \
             librpc/gen_ndr/ndr_security.o \
             librpc/ndr/ndr_sec_helper.o \
             librpc/ndr/ndr_string.o \
             librpc/ndr/sid.o \
-            librpc/ndr/uuid.o
+            ../librpc/ndr/uuid.o \
+                librpc/ndr/util.o
 
 RPCCLIENT_NDR_OBJ = rpc_client/ndr.o
 
@@ -967,7 +968,7 @@ REPLACETORT_OBJ = @libreplacedir@/test/testsuite.o \
                @libreplacedir@/test/main.o \
                $(LIBREPLACE_OBJ)
 
-NDRDUMP_OBJ = librpc/tools/ndrdump.o \
+NDRDUMP_OBJ = ../librpc/tools/ndrdump.o \
              $(PARAM_OBJ) $(LIBNDR_GEN_OBJ) \
              $(LIBSAMBA_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
              librpc/gen_ndr/ndr_svcctl.o
index cc931ff3214c429f0e7d4450e29e706d9185c2bc..7dc0319e7d317c72e673d7b173f3eb3c6bfaf84e 100644 (file)
@@ -1291,6 +1291,7 @@ enum remote_arch_types get_remote_arch(void);
 void print_asc(int level, const unsigned char *buf,int len);
 void dump_data(int level, const unsigned char *buf1,int len);
 void dump_data_pw(const char *msg, const uchar * data, size_t len);
+void dump_data_skip_zeros(int level, const uint8_t *buf, int len);
 const char *tab_depth(int level, int depth);
 int str_checksum(const char *s);
 void zero_free(void *p, size_t size);
@@ -3758,8 +3759,6 @@ NTSTATUS rpc_wkssvc_init(void);
 _PUBLIC_ size_t ndr_align_size(uint32_t offset, size_t n);
 _PUBLIC_ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
 _PUBLIC_ enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size);
-_PUBLIC_ void ndr_pull_save(struct ndr_pull *ndr, struct ndr_pull_save *save);
-_PUBLIC_ void ndr_pull_restore(struct ndr_pull *ndr, struct ndr_pull_save *save);
 _PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
 _PUBLIC_ DATA_BLOB ndr_push_blob(struct ndr_push *ndr);
 _PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size);
@@ -3822,13 +3821,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CT
 _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
                                                    struct smb_iconv_convenience *iconv_convenience,
                                                    void *p, ndr_pull_flags_fn_t fn);
-_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
-                            uint32_t level, ndr_pull_flags_fn_t fn);
-_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
-                            uint32_t level, ndr_pull_flags_fn_t fn);
 _PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn);
-_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
-                            uint32_t level, ndr_push_flags_fn_t fn);
 _PUBLIC_ size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push);
 _PUBLIC_ size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_flags_fn_t push);
 _PUBLIC_ uint32_t ndr_push_get_relative_base_offset(struct ndr_push *ndr);
@@ -3884,8 +3877,6 @@ _PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size);
 _PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n);
 _PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n);
 _PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n);
-_PUBLIC_ void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save);
-_PUBLIC_ void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save);
 _PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p);
 _PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p);
 _PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr);
index ec43ea7037dc73aa05e0c81447b89906992f9a10..418ae41392b2d83ef1e262a064bf360f2efc5a90 100644 (file)
@@ -2217,25 +2217,60 @@ void print_asc(int level, const unsigned char *buf,int len)
                DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
 }
 
-void dump_data(int level, const unsigned char *buf1,int len)
+/**
+ * Write dump of binary data to the log file.
+ *
+ * The data is only written if the log level is at least level.
+ */
+static void _dump_data(int level, const uint8_t *buf, int len,
+                      bool omit_zero_bytes)
 {
-       const unsigned char *buf = (const unsigned char *)buf1;
        int i=0;
+       const uint8_t empty[16];
+       bool skipped = false;
+
        if (len<=0) return;
 
        if (!DEBUGLVL(level)) return;
-       
-       DEBUGADD(level,("[%03X] ",i));
+
+       memset(&empty, '\0', 16);
+
        for (i=0;i<len;) {
+
+               if (i%16 == 0) {
+                       if ((omit_zero_bytes == true) &&
+                           (i > 0) &&
+                           (len > i+16) &&
+                           (memcmp(&buf[i], &empty, 16) == 0))
+                       {
+                               i +=16;
+                               continue;
+                       }
+
+                       if (i<len)  {
+                               DEBUGADD(level,("[%04X] ",i));
+                       }
+               }
+
                DEBUGADD(level,("%02X ",(int)buf[i]));
                i++;
-               if (i%8 == 0) DEBUGADD(level,(" "));
-               if (i%16 == 0) {      
+               if (i%8 == 0) DEBUGADD(level,("  "));
+               if (i%16 == 0) {
+
                        print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
                        print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
-                       if (i<len) DEBUGADD(level,("[%03X] ",i));
+
+                       if ((omit_zero_bytes == true) &&
+                           (len > i+16) &&
+                           (memcmp(&buf[i], &empty, 16) == 0)) {
+                               if (!skipped) {
+                                       DEBUGADD(level,("skipping zero buffer bytes\n"));
+                                       skipped = true;
+                               }
+                       }
                }
        }
+
        if (i%16) {
                int n;
                n = 16 - (i%16);
@@ -2248,8 +2283,32 @@ void dump_data(int level, const unsigned char *buf1,int len)
                if (n>0) print_asc(level,&buf[i-n],n);
                DEBUGADD(level,("\n"));
        }
+
+}
+
+/**
+ * Write dump of binary data to the log file.
+ *
+ * The data is only written if the log level is at least level.
+ */
+_PUBLIC_ void dump_data(int level, const uint8_t *buf, int len)
+{
+       _dump_data(level, buf, len, false);
 }
 
+/**
+ * Write dump of binary data to the log file.
+ *
+ * The data is only written if the log level is at least level.
+ * 16 zero bytes in a row are ommited
+ */
+_PUBLIC_ void dump_data_skip_zeros(int level, const uint8_t *buf, int len)
+{
+       _dump_data(level, buf, len, true);
+}
+
+
+
 void dump_data_pw(const char *msg, const uchar * data, size_t len)
 {
 #ifdef DEBUG_PASSWORD
index 155f5f1f7d6fb0e8eaf0bb97a7b05048d52ec62d..e25a7b8abd2055e2f9d28c0a96178ea1d749922f 100644 (file)
@@ -1,6 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    rpc interface definitions
+
    Copyright (C) Andrew Tridgell 2003
    
    This program is free software; you can redistribute it and/or modify
 #include "librpc/gen_ndr/misc.h"
 #include "librpc/gen_ndr/security.h"
 
+/* Samba 3 doesn't use iconv_convenience: */
+extern void *global_loadparm;
+extern void *cmdline_lp_ctx;
+struct smb_iconv_convenience *lp_iconv_convenience(void *lp_ctx);
+
 /*
   this provides definitions for the libcli/rpc/ MSRPC library
 */
@@ -53,6 +59,8 @@ struct ndr_pull {
        uint32_t data_size;
        uint32_t offset;
 
+       struct smb_iconv_convenience *iconv_convenience;
+
        uint32_t relative_base_offset;
        struct ndr_token_list *relative_base_list;
 
@@ -68,12 +76,6 @@ struct ndr_pull {
        uint32_t ptr_count;
 };
 
-struct ndr_pull_save {
-       uint32_t data_size;
-       uint32_t offset;
-       struct ndr_pull_save *next;
-};
-
 /* structure passed to functions that generate NDR formatted data */
 struct ndr_push {
        uint32_t flags; /* LIBNDR_FLAG_* */
@@ -91,14 +93,10 @@ struct ndr_push {
 
        /* this is used to ensure we generate unique reference IDs */
        uint32_t ptr_count;
-};
 
-struct ndr_push_save {
-       uint32_t offset;
-       struct ndr_push_save *next;
+       struct smb_iconv_convenience *iconv_convenience;
 };
 
-
 /* structure passed to functions that print IDL structures */
 struct ndr_print {
        uint32_t flags; /* LIBNDR_FLAG_* */
@@ -118,11 +116,9 @@ struct ndr_print {
 #define LIBNDR_FLAG_STR_NULLTERM       (1<<6)
 #define LIBNDR_FLAG_STR_SIZE2          (1<<7)
 #define LIBNDR_FLAG_STR_BYTESIZE       (1<<8)
-#define LIBNDR_FLAG_STR_FIXLEN32       (1<<9)
 #define LIBNDR_FLAG_STR_CONFORMANT     (1<<10)
 #define LIBNDR_FLAG_STR_CHARLEN                (1<<11)
 #define LIBNDR_FLAG_STR_UTF8           (1<<12)
-#define LIBNDR_FLAG_STR_FIXLEN15       (1<<13)
 #define LIBNDR_STRING_FLAGS            (0x7FFC)
 
 
@@ -149,7 +145,7 @@ struct ndr_print {
 /* set to avoid recursion in ndr_size_*() calculation */
 #define LIBNDR_FLAG_NO_NDR_SIZE                (1<<31)
 
-/* useful macro for debugging with DEBUG */
+/* useful macro for debugging */
 #define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p)
 #define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_fn_t)ndr_print_ ##type, #p, level, p)
 #define NDR_PRINT_FUNCTION_DEBUG(type, flags, p) ndr_print_function_debug((ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
@@ -337,18 +333,183 @@ struct ndr_interface_list {
        const struct ndr_interface_table *table;
 };
 
+/* FIXME: Use represent_as instead */
+struct dom_sid;
+enum ndr_err_code ndr_push_dom_sid2(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *sid);
+enum ndr_err_code ndr_pull_dom_sid2(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
+void ndr_print_dom_sid2(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
+enum ndr_err_code ndr_push_dom_sid28(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *sid);
+enum ndr_err_code ndr_pull_dom_sid28(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
+void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
+size_t ndr_size_dom_sid28(const struct dom_sid *sid, int flags);
+enum ndr_err_code ndr_push_dom_sid0(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *sid);
+enum ndr_err_code ndr_pull_dom_sid0(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
+void ndr_print_dom_sid0(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
+size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags);
+void ndr_print_ipv4_addr(struct ndr_print *ndr, const char *name, const struct in_addr *_ip);
+void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid);
+bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2); 
+enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn);
+enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_push_flags_fn_t fn);
+size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push);
+size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_flags_fn_t push);
+uint32_t ndr_push_get_relative_base_offset(struct ndr_push *ndr);
+void ndr_push_restore_relative_base_offset(struct ndr_push *ndr, uint32_t offset);
+enum ndr_err_code ndr_push_setup_relative_base_offset1(struct ndr_push *ndr, const void *p, uint32_t offset);
+enum ndr_err_code ndr_push_setup_relative_base_offset2(struct ndr_push *ndr, const void *p);
+enum ndr_err_code ndr_push_relative_ptr1(struct ndr_push *ndr, const void *p);
+enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const void *p);
+uint32_t ndr_pull_get_relative_base_offset(struct ndr_pull *ndr);
+void ndr_pull_restore_relative_base_offset(struct ndr_pull *ndr, uint32_t offset);
+enum ndr_err_code ndr_pull_setup_relative_base_offset1(struct ndr_pull *ndr, const void *p, uint32_t offset);
+enum ndr_err_code ndr_pull_setup_relative_base_offset2(struct ndr_pull *ndr, const void *p);
+enum ndr_err_code ndr_pull_relative_ptr1(struct ndr_pull *ndr, const void *p, uint32_t rel_offset);
+enum ndr_err_code ndr_pull_relative_ptr2(struct ndr_pull *ndr, const void *p);
+size_t ndr_align_size(uint32_t offset, size_t n);
+struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
+enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size);
+struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
+DATA_BLOB ndr_push_blob(struct ndr_push *ndr);
+enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size);
+void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
+void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
+void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr);
+void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr);
+void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr);
+char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr);
+char *ndr_print_union_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr);
+char *ndr_print_function_string(TALLOC_CTX *mem_ctx,
+                               ndr_print_function_t fn, const char *name, 
+                               int flags, void *ptr);
+void ndr_set_flags(uint32_t *pflags, uint32_t new_flags);
+enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
+                                enum ndr_err_code ndr_err,
+                                const char *format, ...) PRINTF_ATTRIBUTE(3,4);
+enum ndr_err_code ndr_push_error(struct ndr_push *ndr,
+                                enum ndr_err_code ndr_err,
+                                const char *format, ...)  PRINTF_ATTRIBUTE(3,4);
+enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
+                                  struct ndr_pull **_subndr,
+                                  size_t header_size,
+                                  ssize_t size_is);
+enum ndr_err_code ndr_pull_subcontext_end(struct ndr_pull *ndr,
+                                struct ndr_pull *subndr,
+                                size_t header_size,
+                                ssize_t size_is);
+enum ndr_err_code ndr_push_subcontext_start(struct ndr_push *ndr,
+                                  struct ndr_push **_subndr,
+                                  size_t header_size,
+                                  ssize_t size_is);
+enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr,
+                                struct ndr_push *subndr,
+                                size_t header_size,
+                                ssize_t size_is);
+enum ndr_err_code ndr_token_store(TALLOC_CTX *mem_ctx,
+                        struct ndr_token_list **list, 
+                        const void *key, 
+                        uint32_t value);
+enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list **list, const void *key, uint32_t *v, comparison_fn_t _cmp_fn, bool _remove_tok);
+enum ndr_err_code ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v);
+uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key);
+enum ndr_err_code ndr_pull_array_size(struct ndr_pull *ndr, const void *p);
+uint32_t ndr_get_array_size(struct ndr_pull *ndr, const void *p);
+enum ndr_err_code ndr_check_array_size(struct ndr_pull *ndr, void *p, uint32_t size);
+enum ndr_err_code ndr_pull_array_length(struct ndr_pull *ndr, const void *p);
+uint32_t ndr_get_array_length(struct ndr_pull *ndr, const void *p);
+enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length);
+enum ndr_err_code ndr_push_set_switch_value(struct ndr_push *ndr, const void *p, uint32_t val);
+enum ndr_err_code ndr_pull_set_switch_value(struct ndr_pull *ndr, const void *p, uint32_t val);
+enum ndr_err_code ndr_print_set_switch_value(struct ndr_print *ndr, const void *p, uint32_t val);
+uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p);
+uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p);
+uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p);
+enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, ndr_pull_flags_fn_t fn);
+enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, ndr_pull_flags_fn_t fn);
+enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_pull_flags_fn_t fn);
+enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_pull_flags_fn_t fn);
+
+/* from libndr_basic.h */
 #define NDR_SCALAR_PROTO(name, type) \
 enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, type v); \
 enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type *v); \
-void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v);
+void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v); 
 
 #define NDR_BUFFER_PROTO(name, type) \
 enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, const type *v); \
 enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type *v); \
-void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v);
-
-
-void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
-size_t ndr_size_dom_sid28(const struct dom_sid *sid, int flags);
+void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v); 
+
+NDR_SCALAR_PROTO(uint8, uint8_t)
+NDR_SCALAR_PROTO(int8, int8_t)
+NDR_SCALAR_PROTO(uint16, uint16_t)
+NDR_SCALAR_PROTO(int16, int16_t)
+NDR_SCALAR_PROTO(uint32, uint32_t)
+NDR_SCALAR_PROTO(int32, int32_t)
+NDR_SCALAR_PROTO(udlong, uint64_t)
+NDR_SCALAR_PROTO(udlongr, uint64_t)
+NDR_SCALAR_PROTO(dlong, int64_t)
+NDR_SCALAR_PROTO(hyper, uint64_t)
+NDR_SCALAR_PROTO(pointer, void *)
+NDR_SCALAR_PROTO(time_t, time_t)
+NDR_SCALAR_PROTO(NTSTATUS, NTSTATUS)
+NDR_SCALAR_PROTO(WERROR, WERROR)
+NDR_SCALAR_PROTO(NTTIME, NTTIME)
+NDR_SCALAR_PROTO(NTTIME_1sec, NTTIME)
+NDR_SCALAR_PROTO(NTTIME_hyper, NTTIME)
+NDR_SCALAR_PROTO(DATA_BLOB, DATA_BLOB)
+NDR_SCALAR_PROTO(ipv4address, const char *)
+NDR_SCALAR_PROTO(string, const char *)
+
+enum ndr_err_code ndr_pull_policy_handle(struct ndr_pull *ndr, int ndr_flags, struct policy_handle *r);
+enum ndr_err_code ndr_push_policy_handle(struct ndr_push *ndr, int ndr_flags, const struct policy_handle *r);
+void ndr_print_policy_handle(struct ndr_print *ndr, const char *name, const struct policy_handle *r);
+bool policy_handle_empty(struct policy_handle *h);
+
+void ndr_check_padding(struct ndr_pull *ndr, size_t n);
+enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v);
+enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v);
+enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n);
+enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n);
+enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size);
+enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size);
+enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n);
+enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n);
+enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n);
+enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p);
+enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p);
+enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr);
+void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type);
+void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, const char *val, uint32_t value);
+void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value);
+void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value);
+void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p);
+void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type);
+void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level);
+void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, const uint8_t *data, uint32_t count);
+uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags);
+
+/* strings */
+uint32_t ndr_charset_length(const void *var, charset_t chset);
+size_t ndr_string_array_size(struct ndr_push *ndr, const char *s);
+uint32_t ndr_size_string(int ret, const char * const* string, int flags);
+enum ndr_err_code ndr_pull_string_array(struct ndr_pull *ndr, int ndr_flags, const char ***_a);
+enum ndr_err_code ndr_push_string_array(struct ndr_push *ndr, int ndr_flags, const char **a);
+void ndr_print_string_array(struct ndr_print *ndr, const char *name, const char **a);
+uint32_t ndr_string_length(const void *_var, uint32_t element_size);
+enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t count, uint32_t element_size);
+enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset);
+enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset);
+
+/* GUIDs */
+bool GUID_equal(const struct GUID *u1, const struct GUID *u2);
+NTSTATUS GUID_from_string(const char *s, struct GUID *guid);
+NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid);
+struct GUID GUID_zero(void);
+bool GUID_all_zero(const struct GUID *u);
+int GUID_compare(const struct GUID *u1, const struct GUID *u2);
+char *GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid);
+char *GUID_string2(TALLOC_CTX *mem_ctx, const struct GUID *guid);
+char *NS_GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid);
+struct GUID GUID_random(void);
 
 #endif /* __LIBNDR_H__ */
index f7beed5e1e9599932217f23baf98e14487f39c1f..d19e861145b0e7c5d29d6b9d129641771b34d41e 100644 (file)
@@ -63,6 +63,7 @@ _PUBLIC_ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *
 
        ndr->data = blob->data;
        ndr->data_size = blob->length;
+       ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience);
 
        return ndr;
 }
@@ -95,21 +96,6 @@ static enum ndr_err_code ndr_pull_set_offset(struct ndr_pull *ndr, uint32_t ofs)
        return NDR_ERR_SUCCESS;
 }
 
-/* save the offset/size of the current ndr state */
-_PUBLIC_ void ndr_pull_save(struct ndr_pull *ndr, struct ndr_pull_save *save)
-{
-       save->offset = ndr->offset;
-       save->data_size = ndr->data_size;
-}
-
-/* restore the size/offset of a ndr structure */
-_PUBLIC_ void ndr_pull_restore(struct ndr_pull *ndr, struct ndr_pull_save *save)
-{
-       ndr->offset = save->offset;
-       ndr->data_size = save->data_size;
-}
-
-
 /* create a ndr_push structure, ready for some marshalling */
 _PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience)
 {
@@ -126,6 +112,7 @@ _PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_icon
        if (!ndr->data) {
                return NULL;
        }
+       ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience);
 
        return ndr;
 }
@@ -194,7 +181,7 @@ _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format,
        free(s);
 }
 
-_PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) _PRINTF_ATTRIBUTE(2,3)
+_PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...)
 {
        va_list ap;
        int i;
@@ -354,97 +341,6 @@ _PUBLIC_ void ndr_set_flags(uint32_t *pflags, uint32_t new_flags)
        (*pflags) |= new_flags;
 }
 
-NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
-{
-       switch (ndr_err) {
-       case NDR_ERR_SUCCESS:
-               return NT_STATUS_OK;
-       case NDR_ERR_BUFSIZE:
-               return NT_STATUS_BUFFER_TOO_SMALL;
-       case NDR_ERR_TOKEN:
-               return NT_STATUS_INTERNAL_ERROR;
-       case NDR_ERR_ALLOC:
-               return NT_STATUS_NO_MEMORY;
-       case NDR_ERR_ARRAY_SIZE:
-               return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
-       case NDR_ERR_INVALID_POINTER:
-               return NT_STATUS_INVALID_PARAMETER_MIX;
-       case NDR_ERR_UNREAD_BYTES:
-               return NT_STATUS_PORT_MESSAGE_TOO_LONG;
-       default:
-               break;
-       }
-
-       /* we should map all error codes to different status codes */
-       return NT_STATUS_INVALID_PARAMETER;
-}
-
-/*
- * Convert an ndr error to string
- */
-
-const char *ndr_errstr(enum ndr_err_code err)
-{
-       switch (err) {
-       case NDR_ERR_SUCCESS:
-               return "NDR_ERR_SUCCESS";
-               break;
-       case NDR_ERR_ARRAY_SIZE:
-               return "NDR_ERR_ARRAY_SIZE";
-               break;
-       case NDR_ERR_BAD_SWITCH:
-               return "NDR_ERR_BAD_SWITCH";
-               break;
-       case NDR_ERR_OFFSET:
-               return "NDR_ERR_OFFSET";
-               break;
-       case NDR_ERR_RELATIVE:
-               return "NDR_ERR_RELATIVE";
-               break;
-       case NDR_ERR_CHARCNV:
-               return "NDR_ERR_CHARCNV";
-               break;
-       case NDR_ERR_LENGTH:
-               return "NDR_ERR_LENGTH";
-               break;
-       case NDR_ERR_SUBCONTEXT:
-               return "NDR_ERR_SUBCONTEXT";
-               break;
-       case NDR_ERR_COMPRESSION:
-               return "NDR_ERR_COMPRESSION";
-               break;
-       case NDR_ERR_STRING:
-               return "NDR_ERR_STRING";
-               break;
-       case NDR_ERR_VALIDATE:
-               return "NDR_ERR_VALIDATE";
-               break;
-       case NDR_ERR_BUFSIZE:
-               return "NDR_ERR_BUFSIZE";
-               break;
-       case NDR_ERR_ALLOC:
-               return "NDR_ERR_ALLOC";
-               break;
-       case NDR_ERR_RANGE:
-               return "NDR_ERR_RANGE";
-               break;
-       case NDR_ERR_TOKEN:
-               return "NDR_ERR_TOKEN";
-               break;
-       case NDR_ERR_IPV4ADDRESS:
-               return "NDR_ERR_IPV4ADDRESS";
-               break;
-       case NDR_ERR_INVALID_POINTER:
-               return "NDR_ERR_INVALID_POINTER";
-               break;
-       case NDR_ERR_UNREAD_BYTES:
-               return "NDR_ERR_UNREAD_BYTES";
-               break;
-       }
-
-       return talloc_asprintf(talloc_tos(), "Unknown NDR error: %d", err);
-}
-
 /*
   return and possibly log an NDR error
 */
@@ -508,6 +404,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
 {
        struct ndr_pull *subndr;
        uint32_t r_content_size;
+       bool force_le = false;
+       bool force_be = false;
 
        switch (header_size) {
        case 0: {
@@ -540,6 +438,74 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
                r_content_size = content_size;
                break;
        }
+       case 0xFFFFFC01: {
+               /*
+                * Common Type Header for the Serialization Stream
+                * See [MS-RPCE] 2.2.6 Type Serialization Version 1
+                */
+               uint8_t version;
+               uint8_t drep;
+               uint16_t hdrlen;
+               uint32_t filler;
+               uint32_t content_size;
+               uint32_t reserved;
+
+               /* version */
+               NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &version));
+
+               if (version != 1) {
+                       return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+                                             "Bad subcontext (PULL) Common Type Header version %d != 1",
+                                             (int)version);
+               }
+
+               /*
+                * 0x10 little endian
+                * 0x00 big endian
+                */
+               NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &drep));
+               if (drep == 0x10) {
+                       force_le = true;
+               } else if (drep == 0x00) {
+                       force_be = true;
+               } else {
+                       return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+                                             "Bad subcontext (PULL) Common Type Header invalid drep 0x%02X",
+                                             (unsigned int)drep);
+               }
+
+               /* length of the "Private Header for Constructed Type" */
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &hdrlen));
+               if (hdrlen != 8) {
+                       return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+                                             "Bad subcontext (PULL) Common Type Header length %d != 8",
+                                             (int)hdrlen);
+               }
+
+               /* filler should be ignored */
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &filler));
+
+               /*
+                * Private Header for Constructed Type
+                */
+               /* length - will be updated latter */
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &content_size));
+               if (size_is >= 0 && size_is != content_size) {
+                       return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d",
+                                             (int)size_is, (int)content_size);
+               }
+               /* the content size must be a multiple of 8 */
+               if ((content_size % 8) != 0) {
+                       return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+                                             "Bad subcontext (PULL) size_is(%d) not padded to 8 content_size %d",
+                                             (int)size_is, (int)content_size);
+               }
+               r_content_size = content_size;
+
+               /* reserved */
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &reserved));
+               break;
+       }
        default:
                return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", 
                                      (int)header_size);
@@ -555,6 +521,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
        subndr->data = ndr->data + ndr->offset;
        subndr->offset = 0;
        subndr->data_size = r_content_size;
+       subndr->iconv_convenience = talloc_reference(subndr, ndr->iconv_convenience);
+
+       if (force_le) {
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+       } else if (force_be) {
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN);
+       }
 
        *_subndr = subndr;
        return NDR_ERR_SUCCESS;
@@ -584,7 +557,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_start(struct ndr_push *ndr,
 {
        struct ndr_push *subndr;
 
-       subndr = ndr_push_init_ctx(ndr, NULL);
+       subndr = ndr_push_init_ctx(ndr, ndr->iconv_convenience);
        NDR_ERR_HAVE_NO_MEMORY(subndr);
        subndr->flags   = ndr->flags;
 
@@ -600,8 +573,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr,
                                 size_t header_size,
                                 ssize_t size_is)
 {
+       ssize_t padding_len;
+
        if (size_is >= 0) {
-               ssize_t padding_len = size_is - subndr->offset;
+               padding_len = size_is - subndr->offset;
                if (padding_len > 0) {
                        NDR_CHECK(ndr_push_zero(subndr, padding_len));
                } else if (padding_len < 0) {
@@ -622,6 +597,41 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset));
                break;
 
+       case 0xFFFFFC01:
+               /*
+                * Common Type Header for the Serialization Stream
+                * See [MS-RPCE] 2.2.6 Type Serialization Version 1
+                */
+               padding_len = NDR_ROUND(subndr->offset, 8) - subndr->offset;
+               if (padding_len > 0) {
+                       NDR_CHECK(ndr_push_zero(subndr, padding_len));
+               }
+
+               /* version */
+               NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, 1));
+
+               /*
+                * 0x10 little endian
+                * 0x00 big endian
+                */
+               NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, NDR_BE(ndr)?0x00:0x10));
+
+               /* length of the "Private Header for Constructed Type" */
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, 8));
+
+               /* filler */
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0xCCCCCCCC));
+
+               /*
+                * Private Header for Constructed Type
+                */
+               /* length - will be updated latter */
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset));
+
+               /* reserved */
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+               break;
+
        default:
                return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext header size %d", 
                                      (int)header_size);
@@ -803,11 +813,8 @@ _PUBLIC_ uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *
 /*
   pull a struct from a blob using NDR
 */
-_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob,
-                                               TALLOC_CTX *mem_ctx,
-                                               struct smb_iconv_convenience *iconv_convenience,
-                                               void *p,
-                                               ndr_pull_flags_fn_t fn)
+_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p,
+                             ndr_pull_flags_fn_t fn)
 {
        struct ndr_pull *ndr;
        ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience);
@@ -819,7 +826,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob,
 /*
   pull a struct from a blob using NDR - failing if all bytes are not consumed
 */
-_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
+_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, 
                                                    struct smb_iconv_convenience *iconv_convenience,
                                                    void *p, ndr_pull_flags_fn_t fn)
 {
@@ -838,11 +845,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLO
 /*
   pull a union from a blob using NDR, given the union discriminator
 */
-_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
+_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, 
+                                              struct smb_iconv_convenience *iconv_convenience, void *p,
                             uint32_t level, ndr_pull_flags_fn_t fn)
 {
        struct ndr_pull *ndr;
-       ndr = ndr_pull_init_blob(blob, mem_ctx, NULL);
+       ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience);
        NDR_ERR_HAVE_NO_MEMORY(ndr);
        NDR_CHECK(ndr_pull_set_switch_value(ndr, p, level));
        NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p));
@@ -853,11 +861,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX
   pull a union from a blob using NDR, given the union discriminator,
   failing if all bytes are not consumed
 */
-_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
+_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, 
+                                                  struct smb_iconv_convenience *iconv_convenience, void *p,
                             uint32_t level, ndr_pull_flags_fn_t fn)
 {
        struct ndr_pull *ndr;
-       ndr = ndr_pull_init_blob(blob, mem_ctx, NULL);
+       ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience);
        NDR_ERR_HAVE_NO_MEMORY(ndr);
        NDR_CHECK(ndr_pull_set_switch_value(ndr, p, level));
        NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p));
@@ -872,11 +881,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC
 /*
   push a struct to a blob using NDR
 */
-_PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob,
-                                               TALLOC_CTX *mem_ctx,
-                                               struct smb_iconv_convenience *iconv_convenience,
-                                               const void *p,
-                                               ndr_push_flags_fn_t fn)
+_PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn)
 {
        struct ndr_push *ndr;
        ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience);
@@ -894,11 +899,11 @@ _PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob,
 /*
   push a union to a blob using NDR
 */
-_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
+_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p,
                             uint32_t level, ndr_push_flags_fn_t fn)
 {
        struct ndr_push *ndr;
-       ndr = ndr_push_init_ctx(mem_ctx, NULL);
+       ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience);
        NDR_ERR_HAVE_NO_MEMORY(ndr);
 
        NDR_CHECK(ndr_push_set_switch_value(ndr, p, level));
@@ -1023,12 +1028,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr1(struct ndr_push *ndr, const vo
 */
 _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const void *p)
 {
-       struct ndr_push_save save;
+       uint32_t save_offset;
        uint32_t ptr_offset = 0xFFFFFFFF;
        if (p == NULL) {
                return NDR_ERR_SUCCESS;
        }
-       ndr_push_save(ndr, &save);
+       save_offset = ndr->offset;
        NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &ptr_offset));
        if (ptr_offset > ndr->offset) {
                return ndr_push_error(ndr, NDR_ERR_BUFSIZE, 
@@ -1036,13 +1041,13 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const vo
                                      ptr_offset, ndr->offset);
        }
        ndr->offset = ptr_offset;
-       if (save.offset < ndr->relative_base_offset) {
+       if (save_offset < ndr->relative_base_offset) {
                return ndr_push_error(ndr, NDR_ERR_BUFSIZE, 
-                                     "ndr_push_relative_ptr2 save.offset(%u) < ndr->relative_base_offset(%u)",
-                                     save.offset, ndr->relative_base_offset);
+                                     "ndr_push_relative_ptr2 save_offset(%u) < ndr->relative_base_offset(%u)",
+                                     save_offset, ndr->relative_base_offset);
        }       
-       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, save.offset - ndr->relative_base_offset));
-       ndr_push_restore(ndr, &save);
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, save_offset - ndr->relative_base_offset));
+       ndr->offset = save_offset;
        return NDR_ERR_SUCCESS;
 }
 
diff --git a/source3/librpc/ndr/ndr_basic.c b/source3/librpc/ndr/ndr_basic.c
deleted file mode 100644 (file)
index c8fa70b..0000000
+++ /dev/null
@@ -1,859 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-
-   routines for marshalling/unmarshalling basic types
-
-   Copyright (C) Andrew Tridgell 2003
-   
-   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 "system/network.h"
-#include "librpc/ndr/libndr.h"
-
-#define NDR_SVAL(ndr, ofs) (NDR_BE(ndr)?RSVAL(ndr->data,ofs):SVAL(ndr->data,ofs))
-#define NDR_IVAL(ndr, ofs) (NDR_BE(ndr)?RIVAL(ndr->data,ofs):IVAL(ndr->data,ofs))
-#define NDR_IVALS(ndr, ofs) (NDR_BE(ndr)?RIVALS(ndr->data,ofs):IVALS(ndr->data,ofs))
-#define NDR_SSVAL(ndr, ofs, v) do { if (NDR_BE(ndr))  { RSSVAL(ndr->data,ofs,v); } else SSVAL(ndr->data,ofs,v); } while (0)
-#define NDR_SIVAL(ndr, ofs, v) do { if (NDR_BE(ndr))  { RSIVAL(ndr->data,ofs,v); } else SIVAL(ndr->data,ofs,v); } while (0)
-#define NDR_SIVALS(ndr, ofs, v) do { if (NDR_BE(ndr))  { RSIVALS(ndr->data,ofs,v); } else SIVALS(ndr->data,ofs,v); } while (0)
-
-
-/*
-  check for data leaks from the server by looking for non-zero pad bytes
-  these could also indicate that real structure elements have been
-  mistaken for padding in the IDL
-*/
-_PUBLIC_ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
-{
-       size_t ofs2 = (ndr->offset + (n-1)) & ~(n-1);
-       int i;
-       for (i=ndr->offset;i<ofs2;i++) {
-               if (ndr->data[i] != 0) {
-                       break;
-               }
-       }
-       if (i<ofs2) {
-               DEBUG(0,("WARNING: Non-zero padding to %d: ", (int)n));
-               for (i=ndr->offset;i<ofs2;i++) {
-                       DEBUG(0,("%02x ", ndr->data[i]));
-               }
-               DEBUG(0,("\n"));
-       }
-
-}
-
-/*
-  parse a int8_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v)
-{
-       NDR_PULL_NEED_BYTES(ndr, 1);
-       *v = (int8_t)CVAL(ndr->data, ndr->offset);
-       ndr->offset += 1;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a uint8_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v)
-{
-       NDR_PULL_NEED_BYTES(ndr, 1);
-       *v = CVAL(ndr->data, ndr->offset);
-       ndr->offset += 1;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a int16_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 2);
-       NDR_PULL_NEED_BYTES(ndr, 2);
-       *v = (uint16_t)NDR_SVAL(ndr, ndr->offset);
-       ndr->offset += 2;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a uint16_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 2);
-       NDR_PULL_NEED_BYTES(ndr, 2);
-       *v = NDR_SVAL(ndr, ndr->offset);
-       ndr->offset += 2;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a int32_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 4);
-       NDR_PULL_NEED_BYTES(ndr, 4);
-       *v = NDR_IVALS(ndr, ndr->offset);
-       ndr->offset += 4;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a uint32_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 4);
-       NDR_PULL_NEED_BYTES(ndr, 4);
-       *v = NDR_IVAL(ndr, ndr->offset);
-       ndr->offset += 4;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a pointer referent identifier
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
-{
-       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
-       if (*v != 0) {
-               ndr->ptr_count++;
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a ref pointer referent identifier
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
-{
-       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
-       /* ref pointers always point to data */
-       *v = 1;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a udlong
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 4);
-       NDR_PULL_NEED_BYTES(ndr, 8);
-       *v = NDR_IVAL(ndr, ndr->offset);
-       *v |= (uint64_t)(NDR_IVAL(ndr, ndr->offset+4)) << 32;
-       ndr->offset += 8;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a udlongr
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 4);
-       NDR_PULL_NEED_BYTES(ndr, 8);
-       *v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32;
-       *v |= NDR_IVAL(ndr, ndr->offset+4);
-       ndr->offset += 8;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  parse a dlong
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v)
-{
-       return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
-}
-
-/*
-  parse a hyper
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
-{
-       NDR_PULL_ALIGN(ndr, 8);
-       return ndr_pull_udlong(ndr, ndr_flags, v);
-}
-
-/*
-  parse a pointer
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
-{
-       uintptr_t h;
-       NDR_PULL_ALIGN(ndr, sizeof(h));
-       NDR_PULL_NEED_BYTES(ndr, sizeof(h));
-       memcpy(&h, ndr->data+ndr->offset, sizeof(h));
-       ndr->offset += sizeof(h);
-       *v = (void *)h;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  pull a NTSTATUS
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status)
-{
-       uint32_t v;
-       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
-       *status = NT_STATUS(v);
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a NTSTATUS
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, int ndr_flags, NTSTATUS status)
-{
-       return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
-}
-
-_PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
-{
-       ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
-}
-
-/*
-  pull a WERROR
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status)
-{
-       uint32_t v;
-       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
-       *status = W_ERROR(v);
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a WERROR
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, int ndr_flags, WERROR status)
-{
-       return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
-}
-
-_PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
-{
-       ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
-}
-
-/*
-  parse a set of bytes
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
-{
-       NDR_PULL_NEED_BYTES(ndr, n);
-       memcpy(data, ndr->data + ndr->offset, n);
-       ndr->offset += n;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  pull an array of uint8
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n)
-{
-       if (!(ndr_flags & NDR_SCALARS)) {
-               return NDR_ERR_SUCCESS;
-       }
-       return ndr_pull_bytes(ndr, data, n);
-}
-
-/*
-  push a int8_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v)
-{
-       NDR_PUSH_NEED_BYTES(ndr, 1);
-       SCVAL(ndr->data, ndr->offset, (uint8_t)v);
-       ndr->offset += 1;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a uint8_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v)
-{
-       NDR_PUSH_NEED_BYTES(ndr, 1);
-       SCVAL(ndr->data, ndr->offset, v);
-       ndr->offset += 1;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a int16_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 2);
-       NDR_PUSH_NEED_BYTES(ndr, 2);
-       NDR_SSVAL(ndr, ndr->offset, (uint16_t)v);
-       ndr->offset += 2;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a uint16_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 2);
-       NDR_PUSH_NEED_BYTES(ndr, 2);
-       NDR_SSVAL(ndr, ndr->offset, v);
-       ndr->offset += 2;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a int32_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 4);
-       NDR_PUSH_NEED_BYTES(ndr, 4);
-       NDR_SIVALS(ndr, ndr->offset, v);
-       ndr->offset += 4;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a uint32_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 4);
-       NDR_PUSH_NEED_BYTES(ndr, 4);
-       NDR_SIVAL(ndr, ndr->offset, v);
-       ndr->offset += 4;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a udlong
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 4);
-       NDR_PUSH_NEED_BYTES(ndr, 8);
-       NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF));
-       NDR_SIVAL(ndr, ndr->offset+4, (v>>32));
-       ndr->offset += 8;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a udlongr
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 4);
-       NDR_PUSH_NEED_BYTES(ndr, 8);
-       NDR_SIVAL(ndr, ndr->offset, (v>>32));
-       NDR_SIVAL(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
-       ndr->offset += 8;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a dlong
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v)
-{
-       return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
-}
-
-/*
-  push a hyper
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v)
-{
-       NDR_PUSH_ALIGN(ndr, 8);
-       return ndr_push_udlong(ndr, NDR_SCALARS, v);
-}
-
-/*
-  push a pointer
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
-{
-       uintptr_t h = (intptr_t)v;
-       NDR_PUSH_ALIGN(ndr, sizeof(h));
-       NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
-       memcpy(ndr->data+ndr->offset, &h, sizeof(h));
-       ndr->offset += sizeof(h);
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size)
-{
-       NDR_PUSH_ALIGN(ndr, size);
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size)
-{
-       NDR_PULL_ALIGN(ndr, size);
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push some bytes
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
-{
-       NDR_PUSH_NEED_BYTES(ndr, n);
-       memcpy(ndr->data + ndr->offset, data, n);
-       ndr->offset += n;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push some zero bytes
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
-{
-       NDR_PUSH_NEED_BYTES(ndr, n);
-       memset(ndr->data + ndr->offset, 0, n);
-       ndr->offset += n;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push an array of uint8
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n)
-{
-       if (!(ndr_flags & NDR_SCALARS)) {
-               return NDR_ERR_SUCCESS;
-       }
-       return ndr_push_bytes(ndr, data, n);
-}
-
-/*
-  save the current position
- */
-_PUBLIC_ void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save)
-{
-       save->offset = ndr->offset;
-}
-
-/*
-  restore the position
- */
-_PUBLIC_ void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save)
-{
-       ndr->offset = save->offset;
-}
-
-/*
-  push a unique non-zero value if a pointer is non-NULL, otherwise 0
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
-{
-       uint32_t ptr = 0;
-       if (p) {
-               ptr = ndr->ptr_count * 4;
-               ptr |= 0x00020000;
-               ndr->ptr_count++;
-       }
-       return ndr_push_uint32(ndr, NDR_SCALARS, ptr);
-}
-
-/*
-  push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
-{
-       uint32_t ptr = 0;
-       if (p) {
-               /* Check if the pointer already exists and has an id */
-               ptr = ndr_token_peek(&ndr->full_ptr_list, p);
-               if (ptr == 0) {
-                       ndr->ptr_count++;
-                       ptr = ndr->ptr_count;
-                       ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
-               }
-       }
-       return ndr_push_uint32(ndr, NDR_SCALARS, ptr);
-}
-
-/*
-  push always a 0, if a pointer is NULL it's a fatal error
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
-{
-       return ndr_push_uint32(ndr, NDR_SCALARS, 0xAEF1AEF1);
-}
-
-
-/*
-  push a NTTIME
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t)
-{
-       NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  pull a NTTIME
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
-{
-       NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a NTTIME
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t)
-{
-       t /= 10000000;
-       NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  pull a NTTIME_1sec
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
-{
-       NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
-       (*t) *= 10000000;
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  pull a NTTIME_hyper
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
-{
-       NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a NTTIME_hyper
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t)
-{
-       NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a time_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, int ndr_flags, time_t t)
-{
-       return ndr_push_uint32(ndr, ndr_flags, t);
-}
-
-/*
-  pull a time_t
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_time_t(struct ndr_pull *ndr, int ndr_flags, time_t *t)
-{
-       uint32_t tt;
-       NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
-       *t = tt;
-       return NDR_ERR_SUCCESS;
-}
-
-
-/*
-  pull a ipv4address
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_ipv4address(struct ndr_pull *ndr, int ndr_flags, const char **address)
-{
-       struct in_addr in;
-       NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &in.s_addr));
-       in.s_addr = htonl(in.s_addr);
-       *address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
-       NDR_ERR_HAVE_NO_MEMORY(*address);
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  push a ipv4address
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, int ndr_flags, const char *address)
-{
-       uint32_t addr;
-       if (!is_ipaddress(address)) {
-               return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
-                                     "Invalid IPv4 address: '%s'", 
-                                     address);
-       }
-       addr = inet_addr(address);
-       NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  print a ipv4address
-*/
-_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name, 
-                          const char *address)
-{
-       ndr->print(ndr, "%-25s: %s", name, address);
-}
-
-
-_PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
-{
-       ndr->print(ndr, "%s: struct %s", name, type);
-}
-
-_PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, 
-                   const char *val, uint32_t value)
-{
-       if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
-               ndr->print(ndr, "%-25s: %s (0x%X)", name, val?val:"UNKNOWN_ENUM_VALUE", value);
-       } else {
-               ndr->print(ndr, "%-25s: %s (%d)", name, val?val:"UNKNOWN_ENUM_VALUE", value);
-       }
-}
-
-_PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
-{
-       /* this is an attempt to support multi-bit bitmap masks */
-       value &= flag;
-
-       while (!(flag & 1)) {
-               flag >>= 1;
-               value >>= 1;
-       }       
-       if (flag == 1) {
-               ndr->print(ndr, "   %d: %-25s", value, flag_name);
-       } else {
-               ndr->print(ndr, "0x%02x: %-25s (%d)", value, flag_name, value);
-       }
-}
-
-_PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
-{
-       ndr->print(ndr, "%-25s: %d", name, v);
-}
-
-_PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
-{
-       ndr->print(ndr, "%-25s: 0x%02x (%u)", name, v, v);
-}
-
-_PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
-{
-       ndr->print(ndr, "%-25s: %d", name, v);
-}
-
-_PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
-{
-       ndr->print(ndr, "%-25s: 0x%04x (%u)", name, v, v);
-}
-
-_PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
-{
-       ndr->print(ndr, "%-25s: %d", name, v);
-}
-
-_PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
-{
-       ndr->print(ndr, "%-25s: 0x%08x (%u)", name, v, v);
-}
-
-_PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
-{
-       ndr->print(ndr, "%-25s: 0x%016llx (%llu)", name, (unsigned long long)v, (unsigned long long)v);
-}
-
-_PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
-{
-       ndr_print_udlong(ndr, name, v);
-}
-
-_PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
-{
-       ndr->print(ndr, "%-25s: 0x%016llx (%lld)", name, (unsigned long long)v, (long long)v);
-}
-
-_PUBLIC_ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
-{
-       ndr_print_dlong(ndr, name, v);
-}
-
-_PUBLIC_ void ndr_print_pointer(struct ndr_print *ndr, const char *name, void *v)
-{
-       ndr->print(ndr, "%-25s: %p", name, v);
-}
-
-_PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
-{
-       if (p) {
-               ndr->print(ndr, "%-25s: *", name);
-       } else {
-               ndr->print(ndr, "%-25s: NULL", name);
-       }
-}
-
-_PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
-{
-       ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t));
-}
-
-_PUBLIC_ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
-{
-       /* this is a standard NTTIME here
-        * as it's already converted in the pull/push code
-        */
-       ndr_print_NTTIME(ndr, name, t);
-}
-
-_PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
-{
-       ndr_print_NTTIME(ndr, name, t);
-}
-
-_PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
-{
-       if (t == (time_t)-1 || t == 0) {
-               ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t);
-       } else {
-               ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t));
-       }
-}
-
-_PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
-{
-       if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
-               ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
-       } else {
-               ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level);
-       }
-}
-
-_PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
-{
-       ndr->print(ndr, "UNKNOWN LEVEL %u", level);
-}
-
-_PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, 
-                          const uint8_t *data, uint32_t count)
-{
-       int i;
-
-       if (count <= 600 && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
-               char s[1202];
-               for (i=0;i<count;i++) {
-                       snprintf(&s[i*2], 3, "%02x", data[i]);
-               }
-               s[i*2] = 0;
-               ndr->print(ndr, "%-25s: %s", name, s);
-               return;
-       }
-
-       ndr->print(ndr, "%s: ARRAY(%d)", name, count);
-       ndr->depth++;
-       for (i=0;i<count;i++) {
-               char *idx=NULL;
-               if (asprintf(&idx, "[%d]", i) != -1) {
-                       ndr_print_uint8(ndr, idx, data[i]);
-                       free(idx);
-               }
-       }
-       ndr->depth--;   
-}
-
-_PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
-{
-       ndr->print(ndr, "%-25s: DATA_BLOB length=%u", name, (unsigned)r.length);
-       if (r.length) {
-               dump_data(10, r.data, r.length);
-       }
-}
-
-
-/*
-  push a DATA_BLOB onto the wire. 
-*/
-_PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flags, DATA_BLOB blob)
-{
-       if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
-               if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
-                       blob.length = NDR_ALIGN(ndr, 2);
-               } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
-                       blob.length = NDR_ALIGN(ndr, 4);
-               } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
-                       blob.length = NDR_ALIGN(ndr, 8);
-               }
-               NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length);
-               data_blob_clear(&blob);
-       } else if (!(ndr->flags & LIBNDR_FLAG_REMAINING)) {
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length));
-       }
-       NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
-       return NDR_ERR_SUCCESS;
-}
-
-/*
-  pull a DATA_BLOB from the wire. 
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flags, DATA_BLOB *blob)
-{
-       uint32_t length = 0;
-
-       if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
-               if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
-                       length = NDR_ALIGN(ndr, 2);
-               } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
-                       length = NDR_ALIGN(ndr, 4);
-               } else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
-                       length = NDR_ALIGN(ndr, 8);
-               }
-               if (ndr->data_size - ndr->offset < length) {
-                       length = ndr->data_size - ndr->offset;
-               }
-       } else if (ndr->flags & LIBNDR_FLAG_REMAINING) {
-               length = ndr->data_size - ndr->offset;
-       } else {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length));
-       }
-       NDR_PULL_NEED_BYTES(ndr, length);
-       *blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
-       ndr->offset += length;
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags)
-{
-       if (!data) return ret;
-       return ret + data->length;
-}
-
-_PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
-{
-       ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
-}
-
-_PUBLIC_ void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss)
-{
-       char addr[INET6_ADDRSTRLEN];
-       ndr->print(ndr, "%-25s: %s", name, print_sockaddr(addr, sizeof(addr), ss));
-}
index b0eab4401205feafc5681d629e0c9e2b45d30a16..1b32df4c628620656473c5e61183293be1bc0eaf 100644 (file)
@@ -1,27 +1,26 @@
-/*
+/* 
    Unix SMB/CIFS implementation.
 
    routines for marshalling/unmarshalling spoolss subcontext buffer structures
 
    Copyright (C) Stefan Metzmacher 2005
-
+   
    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_krb5pac.h"
 
 static size_t _ndr_size_PAC_INFO(const union PAC_INFO *r, uint32_t level, int flags)
diff --git a/source3/librpc/ndr/ndr_misc.c b/source3/librpc/ndr/ndr_misc.c
deleted file mode 100644 (file)
index e868425..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-
-   UUID/GUID/policy_handle functions
-
-   Copyright (C) Theodore Ts'o               1996, 1997,
-   Copyright (C) Jim McDonough                     2002.
-   Copyright (C) Andrew Tridgell                   2003.
-   Copyright (C) Stefan (metze) Metzmacher         2004.
-   
-   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"
-
-/**
- * see if a range of memory is all zero. A NULL pointer is considered
- * to be all zero 
- */
-bool all_zero(const uint8_t *ptr, size_t size)
-{
-       int i;
-       if (!ptr) return True;
-       for (i=0;i<size;i++) {
-               if (ptr[i]) return False;
-       }
-       return True;
-}
-
-void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid)
-{
-       ndr->print(ndr, "%-25s: %s", name, GUID_string(ndr, guid));
-}
-
-bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1,
-                        const struct ndr_syntax_id *i2)
-{
-       return GUID_equal(&i1->uuid, &i2->uuid)
-               && (i1->if_version == i2->if_version);
-}
-
-enum ndr_err_code ndr_push_server_id(struct ndr_push *ndr, int ndr_flags, const struct server_id *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
-                                         (uint32_t)r->pid));
-#ifdef CLUSTER_SUPPORT
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
-                                         (uint32_t)r->vnn));
-#endif
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-enum ndr_err_code ndr_pull_server_id(struct ndr_pull *ndr, int ndr_flags, struct server_id *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               uint32_t pid;
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &pid));
-#ifdef CLUSTER_SUPPORT
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->vnn));
-#endif
-               r->pid = (pid_t)pid;
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-void ndr_print_server_id(struct ndr_print *ndr, const char *name, const struct server_id *r)
-{
-       ndr_print_struct(ndr, name, "server_id");
-       ndr->depth++;
-       ndr_print_uint32(ndr, "id", (uint32_t)r->pid);
-#ifdef CLUSTER_SUPPORT
-       ndr_print_uint32(ndr, "vnn", (uint32_t)r->vnn);
-#endif
-       ndr->depth--;
-}
index e2c9ed59466035abe6831ca9d951e0b53cb96f04..86d7b265863d6198f3a7a7b148d2e2aa5cef8daa 100644 (file)
@@ -89,7 +89,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                                   &converted_size, false))
                        {
                                return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
-                                                     "Bad char conversion");
+                                                     "Bad character conversion");
                        }
                }
                NDR_CHECK(ndr_pull_advance(ndr, (len2 + c_len_term)*byte_mul));
@@ -127,7 +127,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                                   &converted_size, false))
                        {
                                return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                                     "Bad char conversion");
+                                                     "Bad character conversion");
                        }
                }
                NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
@@ -166,7 +166,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                                   &converted_size, false))
                        {
                                return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                                     "Bad char conversion");
+                                                     "Bad character conversion");
                        }
                }
                NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
@@ -201,7 +201,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                                   &converted_size, false))
                        {
                                return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                                     "Bad char conversion");
+                                                     "Bad character conversion");
                        }
                }
                NDR_CHECK(ndr_pull_advance(ndr, (len3 + c_len_term)*byte_mul));
@@ -233,7 +233,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                                   &converted_size, false))
                        {
                                return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                                     "Bad char conversion");
+                                                     "Bad character conversion");
                        }
                }
                NDR_CHECK(ndr_pull_advance(ndr, len3));
@@ -252,28 +252,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                           &converted_size, false))
                {
                        return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                             "Bad char conversion");
+                                             "Bad character conversion");
                }
                NDR_CHECK(ndr_pull_advance(ndr, len1));
                *s = as;
                break;
 
-       case LIBNDR_FLAG_STR_FIXLEN15:
-       case LIBNDR_FLAG_STR_FIXLEN32:
-               len1 = (flags & LIBNDR_FLAG_STR_FIXLEN32)?32:15;
-               NDR_PULL_NEED_BYTES(ndr, len1*byte_mul);
-               if (!convert_string_talloc(ndr->current_mem_ctx, chset, CH_UNIX,
-                                          ndr->data+ndr->offset, len1*byte_mul,
-                                          (void **)(void *)&as,
-                                          &converted_size, false))
-               {
-                       return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                             "Bad char conversion");
-               }
-               NDR_CHECK(ndr_pull_advance(ndr, len1*byte_mul));
-               *s = as;
-               break;
-
        case LIBNDR_FLAG_STR_NOTERM:
                if (!(ndr->flags & LIBNDR_FLAG_REMAINING)) {
                        return ndr_pull_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x (missing NDR_REMAINING)\n",
@@ -293,7 +277,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
                                                   &converted_size, false))
                        {
                                return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                                     "Bad char conversion");
+                                                     "Bad character conversion");
                        }
                }
                NDR_CHECK(ndr_pull_advance(ndr, len1));
@@ -346,17 +330,14 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, int ndr_flags,
 
        flags &= ~LIBNDR_FLAG_STR_CONFORMANT;
 
-       if (!(flags & 
-             (LIBNDR_FLAG_STR_NOTERM |
-              LIBNDR_FLAG_STR_FIXLEN15 |
-              LIBNDR_FLAG_STR_FIXLEN32))) {
+       if (!(flags & LIBNDR_FLAG_STR_NOTERM)) {
                s_len++;
        }
        if (!convert_string_talloc(ndr, CH_UNIX, chset, s, s_len,
                                   (void **)(void *)&dest, &d_len, false))
        {
                return ndr_push_error(ndr, NDR_ERR_CHARCNV, 
-                                     "Bad char conversion");
+                                     "Bad character conversion");
        }
 
        if (flags & LIBNDR_FLAG_STR_BYTESIZE) {
@@ -397,21 +378,6 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, int ndr_flags,
                NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
                break;
 
-       case LIBNDR_FLAG_STR_FIXLEN15:
-       case LIBNDR_FLAG_STR_FIXLEN32: {
-               ssize_t fix_len = (flags & LIBNDR_FLAG_STR_FIXLEN32)?32:15;
-               uint32_t pad_len = fix_len - d_len;
-               if (d_len > fix_len) {
-                       return ndr_push_error(ndr, NDR_ERR_CHARCNV, 
-                                             "Bad char conversion");
-               }
-               NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
-               if (pad_len != 0) {
-                       NDR_CHECK(ndr_push_zero(ndr, pad_len));
-               }
-               break;
-       }
-
        default:
                if (ndr->flags & LIBNDR_FLAG_REMAINING) {
                        NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
@@ -437,13 +403,6 @@ _PUBLIC_ size_t ndr_string_array_size(struct ndr_push *ndr, const char *s)
        unsigned byte_mul = 2;
        unsigned c_len_term = 1;
 
-       if (flags & LIBNDR_FLAG_STR_FIXLEN32) {
-               return 32;
-       }
-       if (flags & LIBNDR_FLAG_STR_FIXLEN15) {
-               return 15;
-       }
-       
        c_len = s?strlen_m(s):0;
 
        if (flags & (LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_UTF8)) {
@@ -653,21 +612,21 @@ _PUBLIC_ uint32_t ndr_string_length(const void *_var, uint32_t element_size)
 _PUBLIC_ enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t count, uint32_t element_size)
 {
        uint32_t i;
-       struct ndr_pull_save save_offset;
+       uint32_t save_offset;
 
-       ndr_pull_save(ndr, &save_offset);
+       save_offset = ndr->offset;
        ndr_pull_advance(ndr, (count - 1) * element_size);
        NDR_PULL_NEED_BYTES(ndr, element_size);
 
        for (i = 0; i < element_size; i++) {
                 if (ndr->data[ndr->offset+i] != 0) {
-                       ndr_pull_restore(ndr, &save_offset);
+                       ndr->offset = save_offset;
 
                        return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "String terminator not present or outside string boundaries");
                 }
        }
 
-       ndr_pull_restore(ndr, &save_offset);
+       ndr->offset = save_offset;
 
        return NDR_ERR_SUCCESS;
 }
@@ -693,7 +652,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags,
                                   &converted_size, false))
        {
                return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-                                     "Bad char conversion");
+                                     "Bad character conversion");
        }
        NDR_CHECK(ndr_pull_advance(ndr, length*byte_mul));
 
@@ -716,7 +675,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags,
                             ndr->data+ndr->offset, required, false);
        if (ret == -1) {
                return ndr_push_error(ndr, NDR_ERR_CHARCNV, 
-                                     "Bad char conversion");
+                                     "Bad character conversion");
        }
 
        /* Make sure the remaining part of the string is filled with zeroes */
diff --git a/source3/librpc/ndr/util.c b/source3/librpc/ndr/util.c
new file mode 100644 (file)
index 0000000..427292a
--- /dev/null
@@ -0,0 +1,188 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   libndr interface
+
+   Copyright (C) Andrew Tridgell 2003
+   
+   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"
+
+NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
+{
+       switch (ndr_err) {
+       case NDR_ERR_SUCCESS:
+               return NT_STATUS_OK;
+       case NDR_ERR_BUFSIZE:
+               return NT_STATUS_BUFFER_TOO_SMALL;
+       case NDR_ERR_TOKEN:
+               return NT_STATUS_INTERNAL_ERROR;
+       case NDR_ERR_ALLOC:
+               return NT_STATUS_NO_MEMORY;
+       case NDR_ERR_ARRAY_SIZE:
+               return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
+       case NDR_ERR_INVALID_POINTER:
+               return NT_STATUS_INVALID_PARAMETER_MIX;
+       case NDR_ERR_UNREAD_BYTES:
+               return NT_STATUS_PORT_MESSAGE_TOO_LONG;
+       default:
+               break;
+       }
+
+       /* we should map all error codes to different status codes */
+       return NT_STATUS_INVALID_PARAMETER;
+}
+
+/*
+ * Convert an ndr error to string
+ */
+
+const char *ndr_errstr(enum ndr_err_code err)
+{
+       switch (err) {
+       case NDR_ERR_SUCCESS:
+               return "NDR_ERR_SUCCESS";
+               break;
+       case NDR_ERR_ARRAY_SIZE:
+               return "NDR_ERR_ARRAY_SIZE";
+               break;
+       case NDR_ERR_BAD_SWITCH:
+               return "NDR_ERR_BAD_SWITCH";
+               break;
+       case NDR_ERR_OFFSET:
+               return "NDR_ERR_OFFSET";
+               break;
+       case NDR_ERR_RELATIVE:
+               return "NDR_ERR_RELATIVE";
+               break;
+       case NDR_ERR_CHARCNV:
+               return "NDR_ERR_CHARCNV";
+               break;
+       case NDR_ERR_LENGTH:
+               return "NDR_ERR_LENGTH";
+               break;
+       case NDR_ERR_SUBCONTEXT:
+               return "NDR_ERR_SUBCONTEXT";
+               break;
+       case NDR_ERR_COMPRESSION:
+               return "NDR_ERR_COMPRESSION";
+               break;
+       case NDR_ERR_STRING:
+               return "NDR_ERR_STRING";
+               break;
+       case NDR_ERR_VALIDATE:
+               return "NDR_ERR_VALIDATE";
+               break;
+       case NDR_ERR_BUFSIZE:
+               return "NDR_ERR_BUFSIZE";
+               break;
+       case NDR_ERR_ALLOC:
+               return "NDR_ERR_ALLOC";
+               break;
+       case NDR_ERR_RANGE:
+               return "NDR_ERR_RANGE";
+               break;
+       case NDR_ERR_TOKEN:
+               return "NDR_ERR_TOKEN";
+               break;
+       case NDR_ERR_IPV4ADDRESS:
+               return "NDR_ERR_IPV4ADDRESS";
+               break;
+       case NDR_ERR_INVALID_POINTER:
+               return "NDR_ERR_INVALID_POINTER";
+               break;
+       case NDR_ERR_UNREAD_BYTES:
+               return "NDR_ERR_UNREAD_BYTES";
+               break;
+       }
+
+       return talloc_asprintf(talloc_tos(), "Unknown NDR error: %d", err);
+}
+
+enum ndr_err_code ndr_push_server_id(struct ndr_push *ndr, int ndr_flags, const struct server_id *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
+                                         (uint32_t)r->pid));
+#ifdef CLUSTER_SUPPORT
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
+                                         (uint32_t)r->vnn));
+#endif
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_pull_server_id(struct ndr_pull *ndr, int ndr_flags, struct server_id *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               uint32_t pid;
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &pid));
+#ifdef CLUSTER_SUPPORT
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->vnn));
+#endif
+               r->pid = (pid_t)pid;
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+void ndr_print_server_id(struct ndr_print *ndr, const char *name, const struct server_id *r)
+{
+       ndr_print_struct(ndr, name, "server_id");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "id", (uint32_t)r->pid);
+#ifdef CLUSTER_SUPPORT
+       ndr_print_uint32(ndr, "vnn", (uint32_t)r->vnn);
+#endif
+       ndr->depth--;
+}
+
+/**
+ * see if a range of memory is all zero. A NULL pointer is considered
+ * to be all zero 
+ */
+bool all_zero(const uint8_t *ptr, size_t size)
+ {
+       int i;
+       if (!ptr) return True;
+       for (i=0;i<size;i++) {
+               if (ptr[i]) return False;
+       }
+       return True;
+}
+
+_PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
+{
+       ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
+}
+
+_PUBLIC_ void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss)
+{
+       char addr[INET6_ADDRSTRLEN];
+       ndr->print(ndr, "%-25s: %s", name, print_sockaddr(addr, sizeof(addr), ss));
+}
+
+void *global_loadparm;
+void *cmdline_lp_ctx;
+struct smb_iconv_convenience *lp_iconv_convenience(void *lp_ctx)
+{
+       return NULL;
+}
diff --git a/source3/librpc/ndr/uuid.c b/source3/librpc/ndr/uuid.c
deleted file mode 100644 (file)
index e92df22..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-
-   UUID/GUID functions
-
-   Copyright (C) Theodore Ts'o               1996, 1997,
-   Copyright (C) Jim McDonough                     2002.
-   Copyright (C) Andrew Tridgell                   2003.
-   
-   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/ndr/libndr.h"
-
-/**
-  build a GUID from a string
-*/
-_PUBLIC_ NTSTATUS GUID_from_string(const char *s, struct GUID *guid)
-{
-       NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
-       uint32_t time_low;
-       uint32_t time_mid, time_hi_and_version;
-       uint32_t clock_seq[2];
-       uint32_t node[6];
-       int i;
-
-       if (s == NULL) {
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       if (11 == sscanf(s, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                        &time_low, &time_mid, &time_hi_and_version, 
-                        &clock_seq[0], &clock_seq[1],
-                        &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
-               status = NT_STATUS_OK;
-       } else if (11 == sscanf(s, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-                               &time_low, &time_mid, &time_hi_and_version, 
-                               &clock_seq[0], &clock_seq[1],
-                               &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
-               status = NT_STATUS_OK;
-       }
-
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       guid->time_low = time_low;
-       guid->time_mid = time_mid;
-       guid->time_hi_and_version = time_hi_and_version;
-       guid->clock_seq[0] = clock_seq[0];
-       guid->clock_seq[1] = clock_seq[1];
-       for (i=0;i<6;i++) {
-               guid->node[i] = node[i];
-       }
-
-       return NT_STATUS_OK;
-}
-
-/**
-  build a GUID from a string
-*/
-_PUBLIC_ NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid)
-{
-       NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
-       uint32_t time_low;
-       uint32_t time_mid, time_hi_and_version;
-       uint32_t clock_seq[2];
-       uint32_t node[6];
-       int i;
-
-       if (s == NULL) {
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
-       if (11 == sscanf(s, "%08x-%04x%04x-%02x%02x%02x%02x-%02x%02x%02x%02x",
-                        &time_low, &time_mid, &time_hi_and_version, 
-                        &clock_seq[0], &clock_seq[1],
-                        &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
-               status = NT_STATUS_OK;
-       }
-
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       guid->time_low = time_low;
-       guid->time_mid = time_mid;
-       guid->time_hi_and_version = time_hi_and_version;
-       guid->clock_seq[0] = clock_seq[0];
-       guid->clock_seq[1] = clock_seq[1];
-       for (i=0;i<6;i++) {
-               guid->node[i] = node[i];
-       }
-
-       return NT_STATUS_OK;
-}
-
-/**
- * generate a random GUID
- */
-struct GUID GUID_random(void)
-{
-       struct GUID guid;
-
-       generate_random_buffer((uint8_t *)&guid, sizeof(guid));
-       guid.clock_seq[0] = (guid.clock_seq[0] & 0x3F) | 0x80;
-       guid.time_hi_and_version = (guid.time_hi_and_version & 0x0FFF) | 0x4000;
-
-       return guid;
-}
-
-/**
- * generate an empty GUID 
- */
-_PUBLIC_ struct GUID GUID_zero(void)
-{
-       struct GUID guid;
-
-       ZERO_STRUCT(guid);
-
-       return guid;
-}
-
-_PUBLIC_ bool GUID_all_zero(const struct GUID *u)
-{
-       if (u->time_low != 0 ||
-           u->time_mid != 0 ||
-           u->time_hi_and_version != 0 ||
-           u->clock_seq[0] != 0 ||
-           u->clock_seq[1] != 0 ||
-           !all_zero(u->node, 6)) {
-               return false;
-       }
-       return true;
-}
-
-_PUBLIC_ bool GUID_equal(const struct GUID *u1, const struct GUID *u2)
-{
-       if (u1->time_low != u2->time_low ||
-           u1->time_mid != u2->time_mid ||
-           u1->time_hi_and_version != u2->time_hi_and_version ||
-           u1->clock_seq[0] != u2->clock_seq[0] ||
-           u1->clock_seq[1] != u2->clock_seq[1] ||
-           memcmp(u1->node, u2->node, 6) != 0) {
-               return false;
-       }
-       return true;
-}
-
-_PUBLIC_ int GUID_compare(const struct GUID *u1, const struct GUID *u2)
-{
-       if (u1->time_low != u2->time_low) {
-               return u1->time_low - u2->time_low;
-       }
-
-       if (u1->time_mid != u2->time_mid) {
-               return u1->time_mid - u2->time_mid;
-       }
-
-       if (u1->time_hi_and_version != u2->time_hi_and_version) {
-               return u1->time_hi_and_version - u2->time_hi_and_version;
-       }
-
-       if (u1->clock_seq[0] != u2->clock_seq[0]) {
-               return u1->clock_seq[0] - u2->clock_seq[0];
-       }
-
-       if (u1->clock_seq[1] != u2->clock_seq[1]) {
-               return u1->clock_seq[1] - u2->clock_seq[1];
-       }
-
-       return memcmp(u1->node, u2->node, 6);
-}
-
-/**
-  its useful to be able to display these in debugging messages
-*/
-_PUBLIC_ char *GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid)
-{
-       return talloc_asprintf(mem_ctx, 
-                              "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                              guid->time_low, guid->time_mid,
-                              guid->time_hi_and_version,
-                              guid->clock_seq[0],
-                              guid->clock_seq[1],
-                              guid->node[0], guid->node[1],
-                              guid->node[2], guid->node[3],
-                              guid->node[4], guid->node[5]);
-}
-
-_PUBLIC_ char *GUID_string2(TALLOC_CTX *mem_ctx, const struct GUID *guid)
-{
-       char *ret, *s = GUID_string(mem_ctx, guid);
-       ret = talloc_asprintf(mem_ctx, "{%s}", s);
-       talloc_free(s);
-       return ret;
-}
-
-_PUBLIC_ char *NS_GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid)
-{
-       return talloc_asprintf(mem_ctx, 
-                              "%08x-%04x%04x-%02x%02x%02x%02x-%02x%02x%02x%02x",
-                              guid->time_low, guid->time_mid,
-                              guid->time_hi_and_version,
-                              guid->clock_seq[0],
-                              guid->clock_seq[1],
-                              guid->node[0], guid->node[1],
-                              guid->node[2], guid->node[3],
-                              guid->node[4], guid->node[5]);
-}
-
-_PUBLIC_ bool policy_handle_empty(struct policy_handle *h) 
-{
-       return (h->handle_type == 0 && GUID_all_zero(&h->uuid));
-}
index 611ae0870c4f2bf6e8eb3a683dea3f8e87d1b364..349a8331b47c97e2091800d66245aeb28d4deb5d 100644 (file)
@@ -249,7 +249,7 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
        blob.data += 4;
        blob.length -= 4;
 
-       ndr_err = ndr_pull_union_blob_all(&blob, mem_ctx, &p, DGRAM_SMB,
+       ndr_err = ndr_pull_union_blob_all(&blob, mem_ctx, NULL, &p, DGRAM_SMB,
                       (ndr_pull_flags_fn_t)ndr_pull_dgram_smb_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                DEBUG(0,("failed to parse packet\n"));
index 6e6da5581d628488fc2b5d44f607f3abf91b778b..865e1c7286823bdbd61c5607a97f9c26dc426151 100644 (file)
@@ -141,7 +141,7 @@ static int kludge_acl_allowedAttributes(struct ldb_context *ldb, struct ldb_mess
                ldb_msg_add_string(msg, attrName, attr_list[i]);
        }
        talloc_free(mem_ctx);
-       return 0;
+       return LDB_SUCCESS;
 
 }
 /* read all objectClasses */
@@ -201,7 +201,7 @@ static int kludge_acl_childClasses(struct ldb_context *ldb, struct ldb_message *
                }
        }
 
-       return 0;
+       return LDB_SUCCESS;
 
 }
 
index 18b0649dda90a35d0fec7331a3302469b61c0c17..932fd3bcb6b284dbb2711de37225b89b32320d1c 100644 (file)
@@ -73,7 +73,7 @@ static int load_proxy_info(struct ldb_module *module)
 
        /* see if we have already loaded it */
        if (proxy->upstream != NULL) {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        dn = ldb_dn_new(proxy, module->ldb, "@PROXYINFO");
@@ -152,7 +152,7 @@ static int load_proxy_info(struct ldb_module *module)
 
        talloc_free(res);
 
-       return 0;
+       return LDB_SUCCESS;
 
 failed:
        talloc_free(res);
@@ -160,7 +160,7 @@ failed:
        talloc_free(proxy->newdn);
        talloc_free(proxy->upstream);
        proxy->upstream = NULL;
-       return -1;
+       return LDB_ERR_OPERATIONS_ERROR;
 }
 
 
index 13a979b6f808fe5a2bbd95abd7ff0efd538b3c6a..d10c95eacb382302203840910db927a6705cc45f 100644 (file)
@@ -90,16 +90,16 @@ static int add_time_element(struct ldb_message *msg, const char *attr, time_t t)
        char *s;
 
        if (ldb_msg_find_element(msg, attr) != NULL) {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        s = ldb_timestring(msg, t);
        if (s == NULL) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        if (ldb_msg_add_string(msg, attr, s) != 0) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        el = ldb_msg_find_element(msg, attr);
@@ -107,7 +107,7 @@ static int add_time_element(struct ldb_message *msg, const char *attr, time_t t)
           is ignored */
        el->flags = LDB_FLAG_MOD_REPLACE;
 
-       return 0;
+       return LDB_SUCCESS;
 }
 
 /*
@@ -118,11 +118,11 @@ static int add_uint64_element(struct ldb_message *msg, const char *attr, uint64_
        struct ldb_message_element *el;
 
        if (ldb_msg_find_element(msg, attr) != NULL) {
-               return 0;
+               return LDB_SUCCESS;
        }
 
        if (ldb_msg_add_fmt(msg, attr, "%llu", (unsigned long long)v) != 0) {
-               return -1;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        el = ldb_msg_find_element(msg, attr);
@@ -130,7 +130,7 @@ static int add_uint64_element(struct ldb_message *msg, const char *attr, uint64_
           is ignored */
        el->flags = LDB_FLAG_MOD_REPLACE;
 
-       return 0;
+       return LDB_SUCCESS;
 }
 
 static int replmd_replPropertyMetaData1_attid_sort(const struct replPropertyMetaData1 *m1,
index 1c0dccf3705c4aa905c55f62c2ab9b23e524c691..0266654811ffd511deb71d994447c6b11a13b3dc 100644 (file)
@@ -319,7 +319,7 @@ static int generate_dITContentRules(struct ldb_context *ldb, struct ldb_message
                        }
                }
        }
-       return 0;
+       return LDB_SUCCESS;
 }
 
 
index a16582d29458a1e0b23cfa7e822c0e1e8fecf4a1..46ea09554dc610880012d4510ae42c2b1d791c0b 100644 (file)
@@ -134,7 +134,7 @@ static int ldb_canonicalise_objectSid(struct ldb_context *ldb, void *mem_ctx,
                        /* Perhaps not a string after all */
                        return ldb_handler_copy(ldb, mem_ctx, in, out);
                }
-               return 0;
+               return LDB_SUCCESS;
        }
        return ldb_handler_copy(ldb, mem_ctx, in, out);
 }
index 05041e73da7af137c86fc43284cc17ab4ba9dd70..9f1d5df96fadc3bd2df749d95e0d68a2bb4e6c2d 100644 (file)
@@ -8,7 +8,7 @@ dcerpcsrcdir = $(librpcsrcdir)/rpc
 PUBLIC_DEPENDENCIES = LIBSAMBA-ERRORS LIBTALLOC LIBSAMBA-UTIL CHARSET \
                                          LIBSAMBA-HOSTCONFIG
 
-LIBNDR_OBJ_FILES = $(addprefix $(ndrsrcdir)/, ndr.o ndr_basic.o ndr_string.o uuid.o)
+LIBNDR_OBJ_FILES = $(addprefix $(ndrsrcdir)/, ndr_string.o) ../librpc/ndr/ndr_basic.o ../librpc/ndr/uuid.o ../librpc/ndr/ndr.o
 
 $(eval $(call proto_header_template,$(ndrsrcdir)/libndr_proto.h,$(LIBNDR_OBJ_FILES:.o=.c)))
 
@@ -36,9 +36,9 @@ PRIVATE_DEPENDENCIES = \
 # End BINARY ndrdump
 #################################
 
-ndrdump_OBJ_FILES = $(librpcsrcdir)/tools/ndrdump.o
+ndrdump_OBJ_FILES = ../librpc/tools/ndrdump.o
 
-MANPAGES += $(librpcsrcdir)/tools/ndrdump.1
+MANPAGES += ../librpc/tools/ndrdump.1
 
 ################################################
 # Start SUBSYSTEM NDR_COMPRESSION
@@ -107,7 +107,7 @@ NDR_EFS_OBJ_FILES = $(gen_ndrsrcdir)/ndr_efs.o
 [SUBSYSTEM::NDR_MISC]
 PUBLIC_DEPENDENCIES = LIBNDR
 
-NDR_MISC_OBJ_FILES = $(gen_ndrsrcdir)/ndr_misc.o $(ndrsrcdir)/ndr_misc.o
+NDR_MISC_OBJ_FILES = $(gen_ndrsrcdir)/ndr_misc.o ../librpc/ndr/ndr_misc.o
 
 PUBLIC_HEADERS += $(gen_ndrsrcdir)/misc.h $(gen_ndrsrcdir)/ndr_misc.h
 
index 1be1a5404577c0d353f2e40e072e10368f746c7b..335383d0330c13ef172b4d6db35debdcf890902d 100644 (file)
@@ -152,6 +152,14 @@ struct ndr_print {
 #define NDR_PRINT_OUT_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_OUT, p)
 #define NDR_PRINT_IN_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_IN | NDR_SET_VALUES, p)
 
+/* useful macro for debugging in strings */
+#define NDR_PRINT_STRUCT_STRING(ctx, type, p) ndr_print_struct_string(ctx, (ndr_print_fn_t)ndr_print_ ##type, #p, p)
+#define NDR_PRINT_UNION_STRING(ctx, type, level, p) ndr_print_union_string(ctx, (ndr_print_fn_t)ndr_print_ ##type, #p, level, p)
+#define NDR_PRINT_FUNCTION_STRING(ctx, type, flags, p) ndr_print_function_string(ctx, (ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
+#define NDR_PRINT_BOTH_STRING(ctx, type, p) NDR_PRINT_FUNCTION_STRING(ctx, type, NDR_BOTH, p)
+#define NDR_PRINT_OUT_STRING(ctx, type, p) NDR_PRINT_FUNCTION_STRING(ctx, type, NDR_OUT, p)
+#define NDR_PRINT_IN_STRING(ctx, type, p) NDR_PRINT_FUNCTION_STRING(ctx, type, NDR_IN | NDR_SET_VALUES, p)
+
 #define NDR_BE(ndr) (((ndr)->flags & (LIBNDR_FLAG_BIGENDIAN|LIBNDR_FLAG_LITTLE_ENDIAN)) == LIBNDR_FLAG_BIGENDIAN)
 
 enum ndr_err_code {
index 79548f81bcd9da1045603230abfec83aa2b4c2f6..a143284f1787f8ea2c4181ee62cc088ff2ece68e 100644 (file)
@@ -587,8 +587,7 @@ _PUBLIC_ void ndr_print_string_array(struct ndr_print *ndr, const char *name, co
        ndr->depth++;
        for (i=0;i<count;i++) {
                char *idx=NULL;
-               asprintf(&idx, "[%d]", i);
-               if (idx) {
+               if (asprintf(&idx, "[%d]", i) != -1) {
                        ndr_print_string(ndr, idx, a[i]);
                        free(idx);
                }