summaryrefslogtreecommitdiff
path: root/source4/lib
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2007-11-02 11:33:53 +0100
committerStefan Metzmacher <metze@samba.org>2007-12-21 05:44:04 +0100
commitc4b9283bbb69e7754555ce7dc21c769ca205dd08 (patch)
tree6bb36e337c9d95284e90e1b644cd23606fffab6e /source4/lib
parent602461bfa60db593f7a2f6876ebbef5c880b1f04 (diff)
downloadsamba-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.c72
-rw-r--r--source4/lib/util/util.h8
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);