librpc: Add NDR_PRINT_DEBUGC to ndr print to a debug class
authorKai Blin <kai@samba.org>
Fri, 18 Jan 2013 17:35:15 +0000 (18:35 +0100)
committerKai Blin <kai@samba.org>
Fri, 18 Jan 2013 17:35:15 +0000 (18:35 +0100)
Signed-off-by: Kai Blin <kai@samba.org>
librpc/ndr/libndr.h
librpc/ndr/ndr.c
librpc/wscript_build

index 1bd284f798baa0325bf28d0f7be06426b4b590d7..a95051905709a8acf69ecb0cf526b842a720aceb 100644 (file)
@@ -162,6 +162,7 @@ struct ndr_print {
 
 /* 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_DEBUGC(dbgc_class, type, p) ndr_print_debugc(dbgc_class, (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)
 #define NDR_PRINT_BOTH_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_BOTH, p)
@@ -460,9 +461,11 @@ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx);
 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_debugc_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
 void ndr_print_printf_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_debugc(int dbgc_class, 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);
index b77bfae36b76a84fbbbc31c316d7ad201f8b0609..e86cf2f7635119e0e3e40865cc83d75074ec1fa4 100644 (file)
@@ -165,6 +165,38 @@ _PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...)
+{
+       va_list ap;
+       char *s = NULL;
+       uint32_t i;
+       int ret;
+       int dbgc_class;
+
+       va_start(ap, format);
+       ret = vasprintf(&s, format, ap);
+       va_end(ap);
+
+       if (ret == -1) {
+               return;
+       }
+
+       dbgc_class = *(int *)ndr->private_data;
+
+       if (ndr->no_newline) {
+               DEBUGADDC(dbgc_class, 1,("%s", s));
+               free(s);
+               return;
+       }
+
+       for (i=0;i<ndr->depth;i++) {
+               DEBUGADDC(dbgc_class, 1,("    "));
+       }
+
+       DEBUGADDC(dbgc_class, 1,("%s\n", s));
+       free(s);
+}
+
 _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) 
 {
        va_list ap;
@@ -235,6 +267,25 @@ _PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format,
        }
 }
 
+/*
+  a useful helper function for printing idl structures via DEBUGC()
+*/
+_PUBLIC_ void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr)
+{
+       struct ndr_print *ndr;
+
+       DEBUGC(dbgc_class, 1,(" "));
+
+       ndr = talloc_zero(NULL, struct ndr_print);
+       if (!ndr) return;
+       ndr->private_data = &dbgc_class;
+       ndr->print = ndr_print_debugc_helper;
+       ndr->depth = 1;
+       ndr->flags = 0;
+       fn(ndr, name, ptr);
+       talloc_free(ndr);
+}
+
 /*
   a useful helper function for printing idl structures via DEBUG()
 */
index 8a4c169d5af3f07ad12abe2f3c495120770547b0..7e95c955c4f12025f5637d9d9c2a50f268af1e5d 100644 (file)
@@ -637,7 +637,7 @@ bld.SAMBA_LIBRARY('ndr',
     public_deps='errors talloc samba-util',
     public_headers='gen_ndr/misc.h gen_ndr/ndr_misc.h ndr/libndr.h:ndr.h',
     header_path= [('*gen_ndr*', 'gen_ndr')],
-    vnum='0.0.1',
+    vnum='0.0.2',
     abi_directory='ABI',
     abi_match='ndr_* GUID_*',
     )