40#ifndef GNUNET_COMMON_H
41#define GNUNET_COMMON_H
47#include <sys/socket.h>
49#include <netinet/in.h>
55#if defined(__FreeBSD__)
57#include <sys/endian.h>
58#define bswap_32(x) bswap32 (x)
59#define bswap_64(x) bswap64 (x)
61#elif defined(__OpenBSD__)
63#define bswap_32(x) swap32 (x)
64#define bswap_64(x) swap64 (x)
66#elif defined(__NetBSD__)
68#include <machine/bswap.h>
69#if defined(__BSWAP_RENAME) && ! defined(__bswap_32)
70#define bswap_32(x) bswap32 (x)
71#define bswap_64(x) bswap64 (x)
74#elif defined(__linux__) || defined(GNU)
98#define GNUNET_UTIL_VERSION 0x000A0104
117#define GNUNET_MIN(a, b) (((a) < (b)) ? (a) : (b))
119#define GNUNET_MAX(a, b) (((a) > (b)) ? (a) : (b))
124#define __BYTE_ORDER _BYTE_ORDER
127#define __BYTE_ORDER BYTE_ORDER
133#define __BIG_ENDIAN _BIG_ENDIAN
136#define __BIG_ENDIAN BIG_ENDIAN
140#ifndef __LITTLE_ENDIAN
142#define __LITTLE_ENDIAN _LITTLE_ENDIAN
145#define __LITTLE_ENDIAN LITTLE_ENDIAN
155#ifndef GNUNET_EXTRA_LOGGING
156#define GNUNET_EXTRA_LOGGING 1
163#if defined(bswap_16) || defined(bswap_32) || defined(bswap_64)
164#define BYTE_SWAP_16(x) bswap_16 (x)
165#define BYTE_SWAP_32(x) bswap_32 (x)
166#define BYTE_SWAP_64(x) bswap_64 (x)
168#define BYTE_SWAP_16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))
170#define BYTE_SWAP_32(x) \
171 ((((x) & 0x000000ffU) << 24) | (((x) & 0x0000ff00U) << 8) \
172 | (((x) & 0x00ff0000U) >> 8) | (((x) & 0xff000000U) >> 24))
174#define BYTE_SWAP_64(x) \
175 ((((x) & 0x00000000000000ffUL) << 56) | (((x) & 0x000000000000ff00UL) << \
177 | (((x) & 0x0000000000ff0000UL) << 24) | (((x) & 0x00000000ff000000UL) \
179 | (((x) & 0x000000ff00000000UL) >> 8) | (((x) & 0x0000ff0000000000UL) \
181 | (((x) & 0x00ff000000000000UL) >> 40) | (((x) & 0xff00000000000000UL) \
186#if __BYTE_ORDER == __LITTLE_ENDIAN
187#define GNUNET_htobe16(x) BYTE_SWAP_16 (x)
188#define GNUNET_htole16(x) (x)
189#define GNUNET_be16toh(x) BYTE_SWAP_16 (x)
190#define GNUNET_le16toh(x) (x)
192#define GNUNET_htobe32(x) BYTE_SWAP_32 (x)
193#define GNUNET_htole32(x) (x)
194#define GNUNET_be32toh(x) BYTE_SWAP_32 (x)
195#define GNUNET_le32toh(x) (x)
197#define GNUNET_htobe64(x) BYTE_SWAP_64 (x)
198#define GNUNET_htole64(x) (x)
199#define GNUNET_be64toh(x) BYTE_SWAP_64 (x)
200#define GNUNET_le64toh(x) (x)
202#if __BYTE_ORDER == __BIG_ENDIAN
203#define GNUNET_htobe16(x) (x)
204#define GNUNET_htole16(x) BYTE_SWAP_16 (x)
205#define GNUNET_be16toh(x) (x)
206#define GNUNET_le16toh(x) BYTE_SWAP_16 (x)
208#define GNUNET_htobe32(x) (x)
209#define GNUNET_htole32(x) BYTE_SWAP_32 (x)
210#define GNUNET_be32toh(x) (x)
211#define GNUNET_le32toh(x) BYTE_SWAP_32 (x)
213#define GNUNET_htobe64(x) (x)
214#define GNUNET_htole64(x) BYTE_SWAP_64 (x)
215#define GNUNET_be64toh(x) (x)
216#define GNUNET_le64toh(x) BYTE_SWAP_64 (x)
232#define GNUNET_NZL(l) GNUNET_MAX (1, l)
238#define GNUNET_PACKED __attribute__ ((packed))
243#define GNUNET_GCC_STRUCT_LAYOUT
250#ifdef __BIGGEST_ALIGNMENT__
251#define GNUNET_ALIGN __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)))
253#define GNUNET_ALIGN __attribute__ ((aligned (8)))
259#define GNUNET_UNUSED __attribute__ ((unused))
264#define GNUNET_NORETURN __attribute__ ((noreturn))
269#define GNUNET_NETWORK_STRUCT_BEGIN
274#define GNUNET_NETWORK_STRUCT_END
285 uint32_t
bits[512 / 8 /
sizeof(uint32_t)];
295 uint32_t
bits[256 / 8 /
sizeof(uint32_t)];
339 uint32_t
bits[16 /
sizeof(uint32_t)];
442 const char *message);
455#if ! defined(GNUNET_CULL_LOGGING)
460 const char *function,
481#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
482#define _GNUNET_BOOLEAN_EXPR(expr) \
484 int _gnunet_boolean_var_; \
486 _gnunet_boolean_var_ = 1; \
488 _gnunet_boolean_var_ = 0; \
489 _gnunet_boolean_var_; \
491#define GN_LIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR (expr), 1))
492#define GN_UNLIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR (expr), 0))
494#define GN_LIKELY(expr) (expr)
495#define GN_UNLIKELY(expr) (expr)
498#if ! defined(GNUNET_LOG_CALL_STATUS)
499#define GNUNET_LOG_CALL_STATUS -1
521#if ! defined(GNUNET_CULL_LOGGING)
522#define GNUNET_log_from(kind, comp, ...) \
525 static int log_call_enabled = GNUNET_LOG_CALL_STATUS; \
526 if ((GNUNET_EXTRA_LOGGING > 0) || \
527 ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) \
529 if (GN_UNLIKELY (log_call_enabled == -1)) \
531 GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), \
536 if (GN_UNLIKELY (GNUNET_get_log_skip () > 0)) \
538 GNUNET_log_skip (-1, GNUNET_NO); \
542 if (GN_UNLIKELY (log_call_enabled)) \
543 GNUNET_log_from_nocheck ((kind), comp, __VA_ARGS__); \
548#define GNUNET_log(kind, ...) \
551 static int log_call_enabled = GNUNET_LOG_CALL_STATUS; \
552 if ((GNUNET_EXTRA_LOGGING > 0) || \
553 ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) \
555 if (GN_UNLIKELY (log_call_enabled == -1)) \
557 GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), \
562 if (GN_UNLIKELY (GNUNET_get_log_skip () > 0)) \
564 GNUNET_log_skip (-1, GNUNET_NO); \
568 if (GN_UNLIKELY (log_call_enabled)) \
569 GNUNET_log_nocheck ((kind), __VA_ARGS__); \
574#define GNUNET_log(...)
575#define GNUNET_log_from(...)
606 const char *required);
641#define GNUNET_B2S(obj) GNUNET_b2s ((obj), sizeof (*(obj)))
666 const char *loglevel,
667 const char *logfile);
891GNUNET_a2s (
const struct sockaddr *addr, socklen_t addrlen);
906GNUNET_hex2b (
const char *src,
void *dst,
size_t dstlen,
int invert);
938#if __GNUC__ >= 6 || __clang_major__ >= 6
939#define GNUNET_assert(cond) \
942 _Pragma("GCC diagnostic push") \
943 _Pragma("GCC diagnostic ignored \"-Wtautological-compare\"") \
946 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
947 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
952 _Pragma("GCC diagnostic pop") \
956#define GNUNET_assert(cond) \
961 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
962 dgettext ("gnunet", \
963 "Assertion failed at %s:%d. Aborting.\n"), \
975#define GNUNET_assert_at(cond, f, l) \
980 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
981 dgettext ("gnunet", \
982 "Assertion failed at %s:%d. Aborting.\n"), \
997#define GNUNET_assert_from(cond, comp) \
1002 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, \
1004 dgettext ("gnunet", \
1005 "Assertion failed at %s:%d. Aborting.\n") \
1014#ifdef _Static_assert
1022#define GNUNET_static_assert(cond) _Static_assert (cond, "")
1032#define GNUNET_static_assert(cond) GNUNET_assert (cond)
1041#define GNUNET_break(cond) \
1046 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
1047 dgettext ("gnunet", "Assertion failed at %s:%d.\n"), \
1063#define GNUNET_break_op(cond) \
1068 GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, \
1069 dgettext ("gnunet", \
1070 "External protocol violation detected at %s:%d.\n"), \
1083#define GNUNET_log_strerror(level, cmd) \
1086 GNUNET_log (level, \
1087 dgettext ("gnunet", \
1088 "`%s' failed at %s:%d with error: %s\n"), \
1092 strerror (errno)); \
1102#define GNUNET_log_from_strerror(level, component, cmd) \
1105 GNUNET_log_from (level, \
1107 dgettext ("gnunet", \
1108 "`%s' failed at %s:%d with error: %s\n"), \
1112 strerror (errno)); \
1122#define GNUNET_log_strerror_file(level, cmd, filename) \
1125 GNUNET_log (level, \
1126 dgettext ("gnunet", \
1127 "`%s' failed on file `%s' at %s:%d with error: %s\n"), \
1132 strerror (errno)); \
1142#define GNUNET_log_from_strerror_file(level, component, cmd, filename) \
1145 GNUNET_log_from (level, \
1147 dgettext ("gnunet", \
1148 "`%s' failed on file `%s' at %s:%d with error: %s\n"), \
1153 strerror (errno)); \
1160#define GNUNET_htonll(n) htobe64 (n)
1179#define GNUNET_ntohll(n) be64toh (n)
1226#define GNUNET_MAX_MALLOC_CHECKED (1024 * 1024 * 40)
1236#define GNUNET_new(type) (type *) GNUNET_malloc (sizeof(type))
1246#define GNUNET_memcmp(a, b) \
1248 const typeof (*b) * _a = (a); \
1249 const typeof (*a) * _b = (b); \
1250 memcmp (_a, _b, sizeof(*a)); \
1275#define GNUNET_memcmp_priv(a, b) \
1277 const typeof (*b) * _a = (a); \
1278 const typeof (*a) * _b = (b); \
1279 GNUNET_memcmp_ct_ (_a, _b, sizeof(*a)); \
1303#define GNUNET_is_zero(a) \
1304 GNUNET_is_zero_ ((a), sizeof (*(a)))
1316#define GNUNET_memcpy(dst, src, n) \
1321 (void) memcpy (dst, src, n); \
1336#define GNUNET_new_array(n, type) ({ \
1337 GNUNET_assert (SIZE_MAX / sizeof (type) >= n); \
1338 (type *) GNUNET_malloc ((n) * sizeof(type)); \
1351#define GNUNET_malloc(size) GNUNET_xmalloc_ (size, __FILE__, __LINE__)
1361#define GNUNET_memdup(buf, size) GNUNET_xmemdup_ (buf, size, __FILE__, __LINE__)
1371#define GNUNET_malloc_large(size) \
1372 GNUNET_xmalloc_unchecked_ (size, __FILE__, __LINE__)
1384#define GNUNET_realloc(ptr, size) \
1385 GNUNET_xrealloc_ (ptr, size, __FILE__, __LINE__)
1397#define GNUNET_free_nz(ptr) GNUNET_xfree_ (ptr, __FILE__, __LINE__)
1411#define GNUNET_free(ptr) do { \
1412 GNUNET_xfree_ (ptr, __FILE__, __LINE__); \
1425#define GNUNET_strdup(a) GNUNET_xstrdup_ (a, __FILE__, __LINE__)
1437#define GNUNET_strndup(a, length) \
1438 GNUNET_xstrndup_ (a, length, __FILE__, __LINE__)
1475#define GNUNET_array_grow(arr, size, tsize) \
1476 GNUNET_xgrow_ ((void **) &(arr), \
1496#define GNUNET_array_append(arr, len, element) \
1499 GNUNET_assert ((len) + 1 > (len)); \
1500 GNUNET_array_grow (arr, len, len + 1); \
1501 (arr) [len - 1] = element; \
1528#define GNUNET_array_concatenate(arr1, len1, arr2, len2) \
1531 const typeof (*arr2) * _a1 = (arr1); \
1532 const typeof (*arr1) * _a2 = (arr2); \
1533 GNUNET_assert ((len1) + (len2) >= (len1)); \
1534 GNUNET_assert (SIZE_MAX / sizeof (*_a1) >= ((len1) + (len2))); \
1535 GNUNET_array_grow (arr1, len1, (len1) + (len2)); \
1536 memcpy (&(arr1) [(len1) - (len2)], _a2, (len2) * sizeof (*arr1)); \
1700 unsigned int *oldCount,
1701 unsigned int newCount,
1755#if __STDC_VERSION__ < 199901L
1757#define __func__ __FUNCTION__
1759#define __func__ "<unknown>"
struct GNUNET_MessageHeader * msg
static char * component
Running component.
static mp_limb_t d[(((256)+GMP_NUMB_BITS - 1)/GMP_NUMB_BITS)]
static char * line
Desired phone line (string to be converted to a hash).
static char * data
The data to insert into the dht.
static struct GNUNET_PEERSTORE_StoreHelloContext * shc
HELLO store context handle.
static size_t data_size
Number of bytes in data.
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
static struct GNUNET_OS_Process * p
Helper process we started.
struct GNUNET_PQ_ResultSpec __attribute__
int GNUNET_memcmp_ct_(const void *b1, const void *b2, size_t len)
Compare memory in b1 and b2 in constant time, suitable for private data.
void(* GNUNET_ResultCallback)(void *cls, int64_t result_code, const void *data, uint16_t data_size)
Function called with the result of an asynchronous operation.
uint32_t bits[256/8/sizeof(uint32_t)]
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32.
double GNUNET_ntoh_double(double d)
Convert double to host byte order.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
enum GNUNET_GenericReturnValue(* GNUNET_FileNameCallback)(void *cls, const char *filename)
Function called with a filename.
char * GNUNET_xstrndup_(const char *str, size_t len, const char *filename, int linenumber)
Dup partially a string.
const char * GNUNET_b2s(const void *buf, size_t buf_size)
Convert a buffer to an 8-character string representative of the contents.
#define GNUNET_NORETURN
gcc-ism to document functions that don't return
void GNUNET_xgrow_(void **old, size_t elementSize, unsigned int *oldCount, unsigned int newCount, const char *filename, int linenumber)
Grow an array, the new elements are zeroed out.
char * GNUNET_xstrdup_(const char *str, const char *filename, int linenumber)
Dup a string.
void(* GNUNET_ContinuationCallback)(void *cls)
Generic continuation callback.
uint32_t bits[16/sizeof(uint32_t)]
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
int GNUNET_get_log_call_status(int caller_level, const char *comp, const char *file, const char *function, int line)
Decides whether a particular logging call should or should not be allowed to be made.
void * GNUNET_xmalloc_unchecked_(size_t size, const char *filename, int linenumber)
Allocate memory.
void GNUNET_xfree_(void *ptr, const char *filename, int linenumber)
Free memory.
void * GNUNET_xrealloc_(void *ptr, size_t n, const char *filename, int linenumber)
Reallocate memory.
GNUNET_SCHEDULER_Priority
Valid task priorities.
void GNUNET_async_scope_enter(const struct GNUNET_AsyncScopeId *aid, struct GNUNET_AsyncScopeSave *old_scope)
Set the async scope for the current thread.
#define GNUNET_NETWORK_STRUCT_END
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32;.
int int void * GNUNET_xmalloc_(size_t size, const char *filename, int linenumber)
Allocate memory.
int have_scope
GNUNET_YES unless this saved scope is the unnamed root scope.
double GNUNET_hton_double(double d)
Convert double to network byte order.
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
void GNUNET_async_scope_get(struct GNUNET_AsyncScopeSave *scope_ret)
Get the current async scope.
bool GNUNET_is_zero_(const void *a, size_t n)
Check that memory in a is all zeros.
void GNUNET_async_scope_fresh(struct GNUNET_AsyncScopeId *aid_ret)
Generate a fresh async scope identifier.
void * GNUNET_xmemdup_(const void *buf, size_t size, const char *filename, int linenumber)
Allocate and initialize memory.
void GNUNET_async_scope_restore(struct GNUNET_AsyncScopeSave *old_scope)
Clear the current thread's async scope.
GNUNET_GenericReturnValue
Named constants for return values.
struct GNUNET_AsyncScopeId scope_id
Saved scope.
uint32_t value[4]
128 random bits.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
#define GNUNET_PACKED
gcc-ism to get packed structs.
uint32_t bits[512/8/sizeof(uint32_t)]
@ GNUNET_SCHEDULER_PRIORITY_UI
Run with priority for interactive tasks.
@ GNUNET_SCHEDULER_PRIORITY_IDLE
Run when otherwise idle.
@ GNUNET_SCHEDULER_PRIORITY_HIGH
Run with high priority (important requests).
@ GNUNET_SCHEDULER_PRIORITY_URGENT
Run with priority for urgent tasks.
@ GNUNET_SCHEDULER_PRIORITY_BACKGROUND
Run as background job (higher than idle, lower than default).
@ GNUNET_SCHEDULER_PRIORITY_COUNT
Number of priorities (must be the last priority).
@ GNUNET_SCHEDULER_PRIORITY_KEEP
Run with the same priority as the current job.
@ GNUNET_SCHEDULER_PRIORITY_DEFAULT
Run with the default priority (normal P2P operations).
@ GNUNET_SCHEDULER_PRIORITY_SHUTDOWN
This is an internal priority level that is only used for tasks that are being triggered due to shutdo...
GNUNET_ErrorType
Types of errors.
const char * GNUNET_e2s2(const struct GNUNET_CRYPTO_EcdhePublicKey *p)
Convert a public key value to a string (for printing debug messages).
const char * GNUNET_p2s2(const struct GNUNET_CRYPTO_EddsaPublicKey *p)
Convert a public key value to a string (for printing debug messages).
const char * GNUNET_uuid2s(const struct GNUNET_Uuid *uuid)
Convert a UUID to a string (for printing debug messages).
void GNUNET_print_bytes(const void *buf, size_t buf_len, int fold, int in_be)
Print a byte string in hexadecimal ascii notation.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
const char * GNUNET_h2s_full(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_log_nocheck(enum GNUNET_ErrorType kind, const char *message,...) __attribute__((format(printf
Main log function.
const char * GNUNET_error_type_to_string(enum GNUNET_ErrorType kind)
Convert error type to string.
int GNUNET_get_log_skip(void)
Get the number of log calls that are going to be skipped.
const char * GNUNET_e2s(const struct GNUNET_CRYPTO_EcdhePublicKey *p)
Convert a public key value to a string (for printing debug messages).
size_t GNUNET_hex2b(const char *src, void *dst, size_t dstlen, int invert)
Parse an ascii-encoded hexadecimal string into the buffer.
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value to a string (for printing debug messages).
const char * GNUNET_i2s_full(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
enum GNUNET_GenericReturnValue GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
const char * GNUNET_a2s(const struct sockaddr *addr, socklen_t addrlen)
Convert a "struct sockaddr*" (IPv4 or IPv6 address) to a string (for printing debug messages).
void GNUNET_log_skip(int n, int check_reset)
Ignore the next n calls to the log function.
void GNUNET_log_config_invalid(enum GNUNET_ErrorType kind, const char *section, const char *option, const char *required)
Log error message about invalid configuration option value.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
const char * GNUNET_h2s2(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_log_from_nocheck(enum GNUNET_ErrorType kind, const char *comp, const char *message,...) __attribute__((format(printf
Log function that specifies an alternative component.
void GNUNET_abort_(void) __attribute__((noreturn))
Abort the process, generate a core dump if possible.
void GNUNET_logger_add(GNUNET_Logger logger, void *logger_cls)
Add a custom logger.
void(* GNUNET_Logger)(void *cls, enum GNUNET_ErrorType kind, const char *component, const char *date, const char *message)
User-defined handler for log messages.
const char * GNUNET_i2s2(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
const char * GNUNET_p2s(const struct GNUNET_CRYPTO_EddsaPublicKey *p)
Convert a public key value to a string (for printing debug messages).
void GNUNET_logger_remove(GNUNET_Logger logger, void *logger_cls)
Remove a custom logger.
@ GNUNET_ERROR_TYPE_UNSPECIFIED
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_INVALID
@ GNUNET_ERROR_TYPE_MESSAGE
@ GNUNET_ERROR_TYPE_DEBUG
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
struct GNUNET_MessageHeader * GNUNET_copy_message(const struct GNUNET_MessageHeader *msg)
Create a copy of the given message.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
static unsigned int size
Size of the "table".
Identifier for an asynchronous execution context.
Saved async scope identifier or root scope.
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and encr...
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...
The identity of the host (wraps the signing key of the peer).
A UUID, a 128 bit "random" value.