r25799: Add dump_data_skip_zeros() which omits 16 zero bytes in a row (if not at the
authorGünther Deschner <gd@samba.org>
Fri, 2 Nov 2007 10:33:53 +0000 (11:33 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Dec 2007 04:44:04 +0000 (05:44 +0100)
beginning or the end of a blob). Usefull when inspecting protocols that
exchange huge mostly empty blobs.

Guenther
(This used to be commit c96047d022555678dabe08c0de94f0913bb4d047)

source4/lib/util/util.c
source4/lib/util/util.h

index 2a2813f9af565f71874f62830eb24e46915a36fe..ac9ae779a00af3dd44436a1c95511df6467ff4e0 100644 (file)
@@ -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,11 +451,34 @@ _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.
 **/
index fc9cb1e57a3ac56ce4951757a25a51e48ad58750..f3adbb33338c8e8f920a6821b09aeba5861710fb 100644 (file)
@@ -655,6 +655,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.
 **/