extend API to enalbe exclusive port ranges to be specified for testing-system objects
[oweals/gnunet.git] / src / include / gnunet_common.h
index 3221ad868fe0c10cc84003df8b1eb36df89dc25c..dae3d4945aed75b348e5391d6a7bd58e940a0d69 100644 (file)
 #include <stdarg.h>
 #endif
 
+#ifdef __cplusplus
+extern "C"
+{
+#if 0                           /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
 /**
  * Version of the API (for entire gnunetutil.so library).
  */
-#define GNUNET_UTIL_VERSION 0x00090100
+#define GNUNET_UTIL_VERSION 0x00090200
 
 /**
  * Named constants for return values.  The following
  */
 #define GNUNET_PACKED __attribute__((packed))
 
+/**
+ * gcc-ism to get gcc bitfield layout when compiling with -mms-bitfields
+ */
+#if MINGW
+#define GNUNET_GCC_STRUCT_LAYOUT __attribute__((gcc_struct))
+#else
+#define GNUNET_GCC_STRUCT_LAYOUT
+#endif
+
+/**
+ * gcc-ism to force alignment; we use this to align char-arrays
+ * that may then be cast to 'struct's.  See also gcc
+ * bug #33594.
+ */
+#ifdef __BIGGEST_ALIGNMENT__
+#define GNUNET_ALIGN __attribute__((aligned (__BIGGEST_ALIGNMENT__)))
+#else
+#define GNUNET_ALIGN __attribute__((aligned (8)))
+#endif
+
 /**
  * gcc-ism to document unused arguments
  */
  */
 #define GNUNET_NORETURN __attribute__((noreturn))
 
+#if MINGW
 #if __GNUC__ > 3
 /**
- * gcc 4.x-ism to pack structures even on W32 (to be used before structs)
+ * gcc 4.x-ism to pack structures even on W32 (to be used before structs);
+ * Using this would cause structs to be unaligned on the stack on Sparc,
+ * so we *only* use this on W32 (see #670578 from Debian); fortunately,
+ * W32 doesn't run on sparc anyway.
  */
 #define GNUNET_NETWORK_STRUCT_BEGIN \
   _Pragma("pack(push)") \
 
 /**
  * gcc 4.x-ism to pack structures even on W32 (to be used after structs)
+ * Using this would cause structs to be unaligned on the stack on Sparc,
+ * so we *only* use this on W32 (see #670578 from Debian); fortunately,
+ * W32 doesn't run on sparc anyway.
  */
 #define GNUNET_NETWORK_STRUCT_END _Pragma("pack(pop)")
+
 #else
-#ifdef MINGW
 #error gcc 4.x or higher required on W32 systems
 #endif
+#else
 /**
- * Good luck, GNUNET_PACKED should suffice, but this won't work on W32
+ * Define as empty, GNUNET_PACKED should suffice, but this won't work on W32
  */
 #define GNUNET_NETWORK_STRUCT_BEGIN 
 
 /**
- * Good luck, GNUNET_PACKED should suffice, but this won't work on W32
+ * Define as empty, GNUNET_PACKED should suffice, but this won't work on W32;
  */
 #define GNUNET_NETWORK_STRUCT_END
 #endif
@@ -199,19 +235,16 @@ struct GNUNET_MessageHeader
   uint16_t type GNUNET_PACKED;
 
 };
-GNUNET_NETWORK_STRUCT_END
+
 
 /**
  * @brief 512-bit hashcode
  */
-typedef struct
+struct GNUNET_HashCode
 {
   uint32_t bits[512 / 8 / sizeof (uint32_t)];   /* = 16 */
-}
-GNUNET_HashCode;
-
+};
 
-GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
  * The identity of the host (basically the SHA-512 hashcode of
@@ -219,7 +252,7 @@ GNUNET_NETWORK_STRUCT_BEGIN
  */
 struct GNUNET_PeerIdentity
 {
-  GNUNET_HashCode hashPubKey GNUNET_PACKED;
+  struct GNUNET_HashCode hashPubKey;
 };
 GNUNET_NETWORK_STRUCT_END
 
@@ -267,9 +300,12 @@ typedef void (*GNUNET_Logger) (void *cls, enum GNUNET_ErrorType kind,
 
 
 /**
- * Number of log calls to ignore.
+ * Get the number of log calls that are going to be skipped
+ *
+ * @return number of log calls to be ignored
  */
-extern unsigned int skip_log;
+int
+GNUNET_get_log_skip ();
 
 #if !defined(GNUNET_CULL_LOGGING)
 int
@@ -327,7 +363,7 @@ GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind, const char *comp,
   if ((GNUNET_EXTRA_LOGGING > 0) || ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) { \
     if (GN_UNLIKELY(log_call_enabled == -1))\
       log_call_enabled = GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), (comp), __FILE__, __FUNCTION__, log_line); \
-    if (GN_UNLIKELY(skip_log > 0)) {skip_log--;}\
+    if (GN_UNLIKELY(GNUNET_get_log_skip () > 0)) { GNUNET_log_skip (-1, GNUNET_NO); }\
     else {\
       if (GN_UNLIKELY(log_call_enabled))\
         GNUNET_log_from_nocheck ((kind), comp, __VA_ARGS__);   \
@@ -340,7 +376,7 @@ GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind, const char *comp,
   if ((GNUNET_EXTRA_LOGGING > 0) || ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) { \
     if (GN_UNLIKELY(log_call_enabled == -1))\
       log_call_enabled = GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), NULL, __FILE__, __FUNCTION__, log_line);\
-    if (GN_UNLIKELY(skip_log > 0)) {skip_log--;}\
+    if (GN_UNLIKELY(GNUNET_get_log_skip () > 0)) { GNUNET_log_skip (-1, GNUNET_NO); }\
     else {\
       if (GN_UNLIKELY(log_call_enabled))\
         GNUNET_log_nocheck ((kind), __VA_ARGS__);      \
@@ -362,11 +398,11 @@ GNUNET_abort (void) GNUNET_NORETURN;
 /**
  * Ignore the next n calls to the log function.
  *
- * @param n number of log calls to ignore
+ * @param n number of log calls to ignore (could be negative)
  * @param check_reset GNUNET_YES to assert that the log skip counter is currently zero
  */
 void
-GNUNET_log_skip (unsigned int n, int check_reset);
+GNUNET_log_skip (int n, int check_reset);
 
 
 /**
@@ -410,7 +446,7 @@ GNUNET_logger_remove (GNUNET_Logger logger, void *logger_cls);
  * @return string
  */
 const char *
-GNUNET_h2s (const GNUNET_HashCode * hc);
+GNUNET_h2s (const struct GNUNET_HashCode * hc);
 
 
 /**
@@ -423,7 +459,7 @@ GNUNET_h2s (const GNUNET_HashCode * hc);
  * @return string
  */
 const char *
-GNUNET_h2s_full (const GNUNET_HashCode * hc);
+GNUNET_h2s_full (const struct GNUNET_HashCode * hc);
 
 
 /**
@@ -837,4 +873,17 @@ GNUNET_copy_message (const struct GNUNET_MessageHeader *msg);
 #endif
 #endif
 
+
+
+
+#if 0                           /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
 #endif /*GNUNET_COMMON_H_ */