Add dump_data_cb()
authorVolker Lendecke <vl@samba.org>
Sun, 24 Oct 2010 13:42:45 +0000 (15:42 +0200)
committerVolker Lendecke <vlendec@samba.org>
Sun, 24 Oct 2010 20:46:28 +0000 (20:46 +0000)
lib/util/util.c
lib/util/util.h

index a01b47da15d1faa6df229bb5dd6bf380d5c176b0..42beed4bcb65321cc9aaf8154ec75744d9a80c5d 100644 (file)
@@ -326,21 +326,20 @@ void print_asc(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.
+ * Write dump of binary data to a callback
  */
-static void _dump_data(int level, const uint8_t *buf, int len,
-                      bool omit_zero_bytes)
+void dump_data_cb(const uint8_t *buf, int len,
+                 bool omit_zero_bytes,
+                 void (*cb)(const char *buf, void *private_data),
+                 void *private_data)
 {
        int i=0;
        static const uint8_t empty[16] = { 0, };
        bool skipped = false;
+       char tmp[16];
 
        if (len<=0) return;
 
-       if (!DEBUGLVL(level)) return;
-
        for (i=0;i<len;) {
 
                if (i%16 == 0) {
@@ -354,23 +353,30 @@ static void _dump_data(int level, const uint8_t *buf, int len,
                        }
 
                        if (i<len)  {
-                               DEBUGADD(level,("[%04X] ",i));
+                               snprintf(tmp, sizeof(tmp), "[%04X] ", i);
+                               cb(tmp, private_data);
                        }
                }
 
-               DEBUGADD(level,("%02X ",(int)buf[i]));
+               snprintf(tmp, sizeof(tmp), "%02X ", (int)buf[i]);
+               cb(tmp, private_data);
                i++;
-               if (i%8 == 0) DEBUGADD(level,("  "));
+               if (i%8 == 0) {
+                       cb("  ", private_data);
+               }
                if (i%16 == 0) {
 
-                       print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
-                       print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
+                       print_asc_cb(&buf[i-16], 8, cb, private_data);
+                       cb(" ", private_data);
+                       print_asc_cb(&buf[i-8], 8, cb, private_data);
+                       cb("\n", private_data);
 
                        if ((omit_zero_bytes == true) &&
                            (len > i+16) &&
                            (memcmp(&buf[i], &empty, 16) == 0)) {
                                if (!skipped) {
-                                       DEBUGADD(level,("skipping zero buffer bytes\n"));
+                                       cb("skipping zero buffer bytes\n",
+                                          private_data);
                                        skipped = true;
                                }
                        }
@@ -380,14 +386,21 @@ static void _dump_data(int level, const uint8_t *buf, int len,
        if (i%16) {
                int n;
                n = 16 - (i%16);
-               DEBUGADD(level,(" "));
-               if (n>8) DEBUGADD(level,(" "));
-               while (n--) DEBUGADD(level,("   "));
+               cb(" ", private_data);
+               if (n>8) {
+                       cb(" ", private_data);
+               }
+               while (n--) {
+                       cb("   ", private_data);
+               }
                n = MIN(8,i%16);
-               print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
+               print_asc_cb(&buf[i-(i%16)], n, cb, private_data);
+               cb(" ", private_data);
                n = (i%16) - n;
-               if (n>0) print_asc(level,&buf[i-n],n);
-               DEBUGADD(level,("\n"));
+               if (n>0) {
+                       print_asc_cb(&buf[i-n], n, cb, private_data);
+               }
+               cb("\n", private_data);
        }
 
 }
@@ -399,7 +412,10 @@ static void _dump_data(int level, const uint8_t *buf, int len,
  */
 _PUBLIC_ void dump_data(int level, const uint8_t *buf, int len)
 {
-       _dump_data(level, buf, len, false);
+       if (!DEBUGLVL(level)) {
+               return;
+       }
+       dump_data_cb(buf, len, false, debugadd_cb, &level);
 }
 
 /**
@@ -410,7 +426,10 @@ _PUBLIC_ void dump_data(int level, const uint8_t *buf, int len)
  */
 _PUBLIC_ void dump_data_skip_zeros(int level, const uint8_t *buf, int len)
 {
-       _dump_data(level, buf, len, true);
+       if (!DEBUGLVL(level)) {
+               return;
+       }
+       dump_data_cb(buf, len, true, debugadd_cb, &level);
 }
 
 
index 261acea88c9506da3135ed4b56b70e35dac9edbf..c407d606a9081829a9d5a2915cbc61c44a29a7d1 100644 (file)
@@ -673,6 +673,14 @@ _PUBLIC_ bool process_exists_by_pid(pid_t pid);
 **/
 _PUBLIC_ bool fcntl_lock(int fd, int op, off_t offset, off_t count, int type);
 
+/**
+ * Write dump of binary data to a callback
+ */
+void dump_data_cb(const uint8_t *buf, int len,
+                 bool omit_zero_bytes,
+                 void (*cb)(const char *buf, void *private_data),
+                 void *private_data);
+
 /**
  * Write dump of binary data to the log file.
  *