diff options
author | Andrew Tridgell <tridge@samba.org> | 2010-08-09 16:37:52 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2010-08-14 11:58:13 +1000 |
commit | 3828c76c76e4e9ce7bdb33bc4871f5cf571cc18b (patch) | |
tree | 835b1e9da49815679bc16d8606955f2b0214146e /librpc | |
parent | 7bb5d353e84fa2998ae03fb7ecff1c59685dd9b7 (diff) | |
download | samba-3828c76c76e4e9ce7bdb33bc4871f5cf571cc18b.tar.gz samba-3828c76c76e4e9ce7bdb33bc4871f5cf571cc18b.tar.xz samba-3828c76c76e4e9ce7bdb33bc4871f5cf571cc18b.zip |
ndr: allow ndr_print to print DATA_BLOB
this prints DATA_BLOB structures using the ndr->print() calls
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'librpc')
-rw-r--r-- | librpc/ndr/libndr.h | 1 | ||||
-rw-r--r-- | librpc/ndr/ndr.c | 20 | ||||
-rw-r--r-- | librpc/ndr/ndr_basic.c | 49 |
3 files changed, 64 insertions, 6 deletions
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index d5091a6619b..9134efa1749 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -105,6 +105,7 @@ struct ndr_print { struct ndr_token_list *switch_list; void (*print)(struct ndr_print *, const char *, ...) PRINTF_ATTRIBUTE(2,3); void *private_data; + bool no_newline; }; #define LIBNDR_FLAG_BIGENDIAN (1<<0) diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 1600d51c1c0..3f553a7cbc8 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -176,6 +176,12 @@ _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, return; } + if (ndr->no_newline) { + DEBUGADD(1,("%s", s)); + free(s); + return; + } + for (i=0;i<ndr->depth;i++) { DEBUGADD(1,(" ")); } @@ -189,17 +195,21 @@ _PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, va_list ap; int i; - for (i=0;i<ndr->depth;i++) { - ndr->private_data = talloc_asprintf_append_buffer( - (char *)ndr->private_data, " "); + if (!ndr->no_newline) { + for (i=0;i<ndr->depth;i++) { + ndr->private_data = talloc_asprintf_append_buffer( + (char *)ndr->private_data, " "); + } } va_start(ap, format); ndr->private_data = talloc_vasprintf_append_buffer((char *)ndr->private_data, format, ap); va_end(ap); - ndr->private_data = talloc_asprintf_append_buffer((char *)ndr->private_data, - "\n"); + if (!ndr->no_newline) { + ndr->private_data = talloc_asprintf_append_buffer((char *)ndr->private_data, + "\n"); + } } /* diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c index d0d58b08844..0becf38f7ba 100644 --- a/librpc/ndr/ndr_basic.c +++ b/librpc/ndr/ndr_basic.c @@ -1021,11 +1021,58 @@ _PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, ndr->depth--; } +static void ndr_print_asc(struct ndr_print *ndr, const uint8_t *buf, int len) +{ + int i; + for (i=0;i<len;i++) + ndr->print(ndr, "%c", isprint(buf[i])?buf[i]:'.'); +} + +/* + ndr_print version of dump_data() + */ +static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len) +{ + int i=0; + + ndr->no_newline = true; + + for (i=0;i<len;) { + if (i%16 == 0 && i<len) { + ndr->print(ndr, "[%04X] ",i); + } + + ndr->print(ndr, "%02X ",(int)buf[i]); + i++; + if (i%8 == 0) ndr->print(ndr," "); + if (i%16 == 0) { + ndr_print_asc(ndr,&buf[i-16],8); ndr->print(ndr," "); + ndr_print_asc(ndr,&buf[i-8],8); ndr->print(ndr, "\n"); + } + } + + if (i%16) { + int n; + n = 16 - (i%16); + ndr->print(ndr, " "); + if (n>8) ndr->print(ndr," "); + while (n--) ndr->print(ndr," "); + n = MIN(8,i%16); + ndr_print_asc(ndr,&buf[i-(i%16)],n); ndr->print(ndr, " "); + n = (i%16) - n; + if (n>0) ndr_print_asc(ndr,&buf[i-n],n); + ndr->print(ndr,"\n"); + } + + ndr->no_newline = false; +} + + _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); + ndr_dump_data(ndr, r.data, r.length); } } |