summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/gnunet_common.h18
-rw-r--r--src/util/common_allocation.c20
2 files changed, 34 insertions, 4 deletions
diff --git a/src/include/gnunet_common.h b/src/include/gnunet_common.h
index 6e185c314..6d9652a16 100644
--- a/src/include/gnunet_common.h
+++ b/src/include/gnunet_common.h
@@ -1101,15 +1101,25 @@ GNUNET_ntoh_double (double d);
/**
* Check that memory in @a a is all zeros. @a a must be a pointer.
*
+ * @param a pointer to @a n bytes which should be tested for the
+ * entire memory being zero'ed out.
+ * @param n number of bytes in @a to be tested
+ * @return 0 if a is zero, non-zero otherwise
+ */
+int
+GNUNET_is_zero_ (const void *a,
+ size_t n);
+
+
+/**
+ * Check that memory in @a a is all zeros. @a a must be a pointer.
+ *
* @param a pointer to a struct which should be tested for the
* entire memory being zero'ed out.
* @return 0 if a is zero, non-zero otherwise
*/
#define GNUNET_is_zero(a) \
- ({ \
- static const typeof (*a) _z; \
- memcmp ((a), &_z, sizeof(_z)); \
- })
+ GNUNET_is_zero_ (a, sizeof (a))
/**
diff --git a/src/util/common_allocation.c b/src/util/common_allocation.c
index 35c557000..5945fdcde 100644
--- a/src/util/common_allocation.c
+++ b/src/util/common_allocation.c
@@ -533,4 +533,24 @@ GNUNET_copy_message (const struct GNUNET_MessageHeader *msg)
}
+/**
+ * Check that memory in @a a is all zeros. @a a must be a pointer.
+ *
+ * @param a pointer to @a n bytes which should be tested for the
+ * entire memory being zero'ed out.
+ * @param n number of bytes in @a to be tested
+ * @return 0 if a is zero, non-zero otherwise
+ */
+int
+GNUNET_is_zero_ (const void *a,
+ size_t n)
+{
+ const char *b = a;
+ for (size_t i = 0; i < n; i++)
+ if (b[i])
+ return 0;
+ return 1;
+}
+
+
/* end of common_allocation.c */