lib/util: add data_blob_check_diff() master4-ldb
authorStefan Metzmacher <metze@samba.org>
Fri, 10 Feb 2017 09:20:48 +0000 (10:20 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Jul 2017 15:45:13 +0000 (17:45 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
lib/util/samba_util.h
lib/util/util.c

index 0bb04b3567c529934cb64bb246afd044dd10d435..bbf8441e51c85aa9f7188d49c26a5832d476abc8 100644 (file)
@@ -490,6 +490,21 @@ _PUBLIC_ bool fcntl_lock(int fd, int op, off_t offset, off_t count, int type);
  */
 _PUBLIC_ void dump_data_skip_zeros(int level, const uint8_t *buf, int len);
 
+
+/**
+check if two data blobs are equal and may debug if there's a difference
+**/
+_PUBLIC_ int _data_blob_check_diff(int dbg_lvl,
+                                  const char *check_name,
+                                  const char *a_name,
+                                  const DATA_BLOB *a,
+                                  const char *b_name,
+                                  const DATA_BLOB *b,
+                                  const char *location, const char *func);
+#define data_blob_check_diff(dbg_lvl, check_name, a_name, a, b_name, b) \
+       _data_blob_check_diff(dbg_lvl, check_name, a_name, a, b_name, b, \
+                             __location__, _func__)
+
 /**
  malloc that aborts with smb_panic on fail or zero size.
 **/
index ef148e98d29d5cdd2ef7d164858bacda8ea6e8e2..5cd90a8aa421480047fa1e2aaf2845b4a105dd76 100644 (file)
@@ -560,6 +560,69 @@ void dump_data_file(const uint8_t *buf, int len, bool omit_zero_bytes,
        dump_data_cb(buf, len, omit_zero_bytes, fprintf_cb, f);
 }
 
+_PUBLIC_ int _data_blob_check_diff(int dbg_lvl,
+                                  const char *check_name,
+                                  const char *a_name,
+                                  const DATA_BLOB *a,
+                                  const char *b_name,
+                                  const DATA_BLOB *b,
+                                  const char *location, const char *func)
+{
+       int cmp;
+       size_t ofs;
+       bool differ = false;
+       uint8_t byte_a = 0x00;
+       uint8_t byte_b = 0x00;
+
+       cmp = data_blob_cmp(a, b);
+       if (cmp == 0) {
+               return 0;
+       }
+
+       if (dbg_lvl < 0) {
+               return cmp;
+       }
+
+       if (a->length != b->length) {
+               DEBUG(dbg_lvl, ("%s:%s(%s): "
+                               "%s->length=%zu (0x%zx) != %s->length=%zu (0x%zx)\n",
+                               location, func, check_name,
+                               a_name, a->length, a->length,
+                               b_name, b->length, b->length));
+       }
+
+       for (ofs = 0; ofs < a->length; ofs++) {
+               byte_a = a->data[ofs];
+
+               if (ofs == b->length) {
+                       byte_b = 0x00;
+                       differ = true;
+                       break;
+               }
+
+               byte_b = b->data[ofs];
+
+               if (byte_a != byte_b) {
+                       differ = true;
+                       break;
+               }
+       }
+
+       if (differ) {
+               DEBUG(dbg_lvl, ("%s:%s(%s): ofs=%zu (0x%zx) length=%zu (0x%zx) "
+                               "%s->data[]=0x%x %s->data[]=0x%x\n",
+                               location, func, check_name,
+                               ofs, ofs,
+                               a->length, a->length,
+                               a_name, byte_a,
+                               b_name, byte_b));
+       }
+
+       dump_data_skip_zeros(dbg_lvl, a->data, a->length);
+       dump_data_skip_zeros(dbg_lvl, b->data, b->length);
+       return cmp;
+}
+
 /**
  malloc that aborts with smb_panic on fail or zero size.
 **/