diff options
author | Günther Deschner <gd@samba.org> | 2007-11-02 11:33:53 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2007-12-21 05:44:04 +0100 |
commit | c4b9283bbb69e7754555ce7dc21c769ca205dd08 (patch) | |
tree | 6bb36e337c9d95284e90e1b644cd23606fffab6e /source4/lib | |
parent | 602461bfa60db593f7a2f6876ebbef5c880b1f04 (diff) | |
download | samba-c4b9283bbb69e7754555ce7dc21c769ca205dd08.tar.gz samba-c4b9283bbb69e7754555ce7dc21c769ca205dd08.tar.bz2 samba-c4b9283bbb69e7754555ce7dc21c769ca205dd08.zip |
r25799: Add dump_data_skip_zeros() which omits 16 zero bytes in a row (if not at the
beginning or the end of a blob). Usefull when inspecting protocols that
exchange huge mostly empty blobs.
Guenther
(This used to be commit c96047d022555678dabe08c0de94f0913bb4d047)
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/util/util.c | 72 | ||||
-rw-r--r-- | source4/lib/util/util.h | 8 |
2 files changed, 71 insertions, 9 deletions
diff --git a/source4/lib/util/util.c b/source4/lib/util/util.c index 2a2813f9af..ac9ae779a0 100644 --- a/source4/lib/util/util.c +++ b/source4/lib/util/util.c @@ -393,24 +393,55 @@ static void print_asc(int level, const uint8_t *buf,int len) * * 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) +static void _dump_data(int level, const uint8_t *buf, int len, + bool omit_zero_bytes) { 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); @@ -420,12 +451,35 @@ _PUBLIC_ void dump_data(int level, const uint8_t *buf,int len) n = MIN(8,i%16); print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " )); n = (i%16) - n; - if (n>0) print_asc(level,&buf[i-n],n); - DEBUGADD(level,("\n")); - } + 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) +{ + return _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) +{ + return _dump_data(level, buf, len, true); +} + + +/** malloc that aborts with smb_panic on fail or zero size. **/ diff --git a/source4/lib/util/util.h b/source4/lib/util/util.h index fc9cb1e57a..f3adbb3333 100644 --- a/source4/lib/util/util.h +++ b/source4/lib/util/util.h @@ -656,6 +656,14 @@ _PUBLIC_ bool fcntl_lock(int fd, int op, off_t offset, off_t count, int type); _PUBLIC_ void dump_data(int level, const uint8_t *buf,int len); /** + * 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); + +/** malloc that aborts with smb_panic on fail or zero size. **/ _PUBLIC_ void *smb_xmalloc(size_t size); |