adding crc16 to gnunet_crypto_lib.h
[oweals/gnunet.git] / src / include / gnunet_common.h
index ec54aece4c2597160d292232ef19b2adca1c4c9e..cecc94c9edc5787b9aee02b2ea2bf5e1d5bd97f1 100644 (file)
 /**
  * Version of the API (for entire gnunetutil.so library).
  */
-#define GNUNET_UTIL_VERSION 0x00089900
-
-/**
- * Name used for "services" that are actually command-line
- * programs invoked by the end user.
- */
-#define GNUNET_CLIENT_SERVICE_NAME "client"
+#define GNUNET_UTIL_VERSION 0x00090100
 
 /**
  * Named constants for return values.  The following
 
 #define GNUNET_MAX(a,b) (((a) > (b)) ? (a) : (b))
 
+/**
+ * Endian operations
+ */
+
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+#  define GNUNET_htobe16(x) __bswap_16 (x)
+#  define GNUNET_htole16(x) (x)
+#  define GNUNET_be16toh(x) __bswap_16 (x)
+#  define GNUNET_le16toh(x) (x)
+
+#  define GNUNET_htobe32(x) __bswap_32 (x)
+#  define GNUNET_htole32(x) (x)
+#  define GNUNET_be32toh(x) __bswap_32 (x)
+#  define GNUNET_le32toh(x) (x)
+
+#  define GNUNET_htobe64(x) __bswap_64 (x)
+#  define GNUNET_htole64(x) (x)
+#  define GNUNET_be64toh(x) __bswap_64 (x)
+#  define GNUNET_le64toh(x) (x)
+#endif
+# if __BYTE_ORDER == __BIG_ENDIAN
+#  define GNUNET_htobe16(x) (x)
+#  define GNUNET_htole16(x) __bswap_16 (x)
+#  define GNUNET_be16toh(x) (x)
+#  define GNUNET_le16toh(x) __bswap_16 (x)
+
+#  define GNUNET_htobe32(x) (x)
+#  define GNUNET_htole32(x) __bswap_32 (x)
+#  define GNUNET_be32toh(x) (x)
+#  define GNUNET_le32toh(x) __bswap_32 (x)
+
+#  define GNUNET_htobe64(x) (x)
+#  define GNUNET_htole64(x) __bswap_64 (x)
+#  define GNUNET_be64toh(x) (x)
+#  define GNUNET_le64toh(x) __bswap_64 (x)
+#endif
+
+
+
+
 /**
  * gcc-ism to get packed structs.
  */
 #define GNUNET_PACKED __attribute__((packed))
 
+/**
+ * gcc-ism to document unused arguments
+ */
+#define GNUNET_UNUSED __attribute__((unused))
+
+#if __GNUC__ > 3
+/**
+ * gcc 4.x-ism to pack structures even on W32 (to be used before structs)
+ */
+#define GNUNET_NETWORK_STRUCT_BEGIN \
+  _Pragma("pack(push)") \
+  _Pragma("pack(1)")
+
+/**
+ * gcc 4.x-ism to pack structures even on W32 (to be used after structs)
+ */
+#define GNUNET_NETWORK_STRUCT_END _Pragma("pack(pop)")
+#else
+#ifdef MINGW
+#error gcc 4.x or higher required on W32 systems
+#endif
+/**
+ * Good luck, 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 GNUNET_NETWORK_STRUCT_END
+#endif
 
 /* ************************ super-general types *********************** */
 
+GNUNET_NETWORK_STRUCT_BEGIN
+
 /**
  * Header for all communications.
  */
@@ -98,7 +165,7 @@ struct GNUNET_MessageHeader
   uint16_t type GNUNET_PACKED;
 
 };
-
+GNUNET_NETWORK_STRUCT_END
 
 /**
  * @brief 512-bit hashcode
@@ -110,6 +177,8 @@ typedef struct
 GNUNET_HashCode;
 
 
+GNUNET_NETWORK_STRUCT_BEGIN
+
 /**
  * The identity of the host (basically the SHA-512 hashcode of
  * it's public key).
@@ -118,7 +187,7 @@ struct GNUNET_PeerIdentity
 {
   GNUNET_HashCode hashPubKey GNUNET_PACKED;
 };
-
+GNUNET_NETWORK_STRUCT_END
 
 /**
  * Function called with a filename.
@@ -167,9 +236,11 @@ typedef void (*GNUNET_Logger) (void *cls, enum GNUNET_ErrorType kind,
  * Number of log calls to ignore.
  */
 extern unsigned int skip_log;
+
 #if !defined(GNUNET_CULL_LOGGING)
-int 
-GNUNET_get_log_call_status (int caller_level, const char *comp, const char *file, const char *function, int line);
+int
+GNUNET_get_log_call_status (int caller_level, const char *comp,
+                            const char *file, const char *function, int line);
 #endif
 /**
  * Main log function.
@@ -214,7 +285,7 @@ GNUNET_log_nocheck (enum GNUNET_ErrorType kind, const char *message, ...);
  */
 void
 GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind, const char *comp,
-                 const char *message, ...);
+                         const char *message, ...);
 
 #if !defined(GNUNET_CULL_LOGGING)
 #define GNUNET_log_from(kind,comp,...) do { int log_line = __LINE__;\
@@ -243,6 +314,13 @@ GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind, const char *comp,
 #define GNUNET_log_from(...)
 #endif
 
+
+/**
+ * Abort the process, generate a core dump if possible.
+ */
+void
+GNUNET_abort (void);
+
 /**
  * Ignore the next n calls to the log function.
  *
@@ -349,12 +427,12 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind);
 /**
  * Use this for fatal errors that cannot be handled
  */
-#define GNUNET_assert(cond) do { if (! (cond)) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Assertion failed at %s:%d.\n"), __FILE__, __LINE__); abort(); } } while(0)
+#define GNUNET_assert(cond) do { if (! (cond)) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Assertion failed at %s:%d.\n"), __FILE__, __LINE__); GNUNET_abort(); } } while(0)
 
 /**
  * Use this for fatal errors that cannot be handled
  */
-#define GNUNET_assert_at(cond, f, l) do { if (! (cond)) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Assertion failed at %s:%d.\n"), f, l); abort(); } } while(0)
+#define GNUNET_assert_at(cond, f, l) do { if (! (cond)) { GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Assertion failed at %s:%d.\n"), f, l); GNUNET_abort(); } } while(0)
 
 /**
  * Use this for internal assertion violations that are
@@ -370,7 +448,7 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind);
  * we still want to see these problems during
  * development and testing.  "OP == other peer".
  */
-#define GNUNET_break_op(cond)  do { if (! (cond)) { GNUNET_log(GNUNET_ERROR_TYPE_WARNING, _("External protocol violation detected at %s:%d.\n"), __FILE__, __LINE__); } } while(0)
+#define GNUNET_break_op(cond)  do { if (! (cond)) { GNUNET_log(GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, _("External protocol violation detected at %s:%d.\n"), __FILE__, __LINE__); } } while(0)
 
 /**
  * Log an error message at log-level 'level' that indicates
@@ -379,6 +457,13 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind);
  */
 #define GNUNET_log_strerror(level, cmd) do { GNUNET_log(level, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, STRERROR(errno)); } while(0)
 
+/**
+ * Log an error message at log-level 'level' that indicates
+ * a failure of the command 'cmd' with the message given
+ * by strerror(errno).
+ */
+#define GNUNET_log_from_strerror(level, component, cmd) do { GNUNET_log_from (level, component, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, STRERROR(errno)); } while(0)
+
 /**
  * Log an error message at log-level 'level' that indicates
  * a failure of the command 'cmd' with the message given
@@ -386,23 +471,30 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind);
  */
 #define GNUNET_log_strerror_file(level, cmd, filename) do { GNUNET_log(level, _("`%s' failed on file `%s' at %s:%d with error: %s\n"), cmd, filename,__FILE__, __LINE__, STRERROR(errno)); } while(0)
 
+/**
+ * Log an error message at log-level 'level' that indicates
+ * a failure of the command 'cmd' with the message given
+ * by strerror(errno).
+ */
+#define GNUNET_log_from_strerror_file(level, component, cmd, filename) do { GNUNET_log_from (level, component, _("`%s' failed on file `%s' at %s:%d with error: %s\n"), cmd, filename,__FILE__, __LINE__, STRERROR(errno)); } while(0)
+
 /* ************************* endianess conversion ****************** */
 
 /**
- * Convert a long-long to host-byte-order.
+ * Convert unsigned 64-bit integer to host-byte-order.
  * @param n the value in network byte order
  * @return the same value in host byte order
  */
-unsigned long long
-GNUNET_ntohll (unsigned long long n);
+uint64_t
+GNUNET_ntohll (uint64_t n);
 
 /**
- * Convert a long long to network-byte-order.
+ * Convert unsigned 64-bit integer to network-byte-order.
  * @param n the value in host byte order
  * @return the same value in network byte order
  */
-unsigned long long
-GNUNET_htonll (unsigned long long n);
+uint64_t
+GNUNET_htonll (uint64_t n);
 
 
 /* ************************* allocation functions ****************** */