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)
96#define GNUNET_UTIL_VERSION 0x000A0104
115#define GNUNET_MIN(a, b) (((a) < (b)) ? (a) : (b))
117#define GNUNET_MAX(a, b) (((a) > (b)) ? (a) : (b))
122#define __BYTE_ORDER _BYTE_ORDER
125#define __BYTE_ORDER BYTE_ORDER
131#define __BIG_ENDIAN _BIG_ENDIAN
134#define __BIG_ENDIAN BIG_ENDIAN
138#ifndef __LITTLE_ENDIAN
140#define __LITTLE_ENDIAN _LITTLE_ENDIAN
143#define __LITTLE_ENDIAN LITTLE_ENDIAN
153#ifndef GNUNET_EXTRA_LOGGING
154#define GNUNET_EXTRA_LOGGING 1
161#if defined(bswap_16) || defined(bswap_32) || defined(bswap_64)
162#define BYTE_SWAP_16(x) bswap_16 (x)
163#define BYTE_SWAP_32(x) bswap_32 (x)
164#define BYTE_SWAP_64(x) bswap_64 (x)
166#define BYTE_SWAP_16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))
168#define BYTE_SWAP_32(x) \
169 ((((x) & 0x000000ffU) << 24) | (((x) & 0x0000ff00U) << 8) \
170 | (((x) & 0x00ff0000U) >> 8) | (((x) & 0xff000000U) >> 24))
172#define BYTE_SWAP_64(x) \
173 ((((x) & 0x00000000000000ffUL) << 56) | (((x) & 0x000000000000ff00UL) << 40) \
174 | (((x) & 0x0000000000ff0000UL) << 24) | (((x) & 0x00000000ff000000UL) << 8) \
175 | (((x) & 0x000000ff00000000UL) >> 8) | (((x) & 0x0000ff0000000000UL) >> 24) \
176 | (((x) & 0x00ff000000000000UL) >> 40) | (((x) & 0xff00000000000000UL) >> \
180#if __BYTE_ORDER == __LITTLE_ENDIAN
181#define GNUNET_htobe16(x) BYTE_SWAP_16 (x)
182#define GNUNET_htole16(x) (x)
183#define GNUNET_be16toh(x) BYTE_SWAP_16 (x)
184#define GNUNET_le16toh(x) (x)
186#define GNUNET_htobe32(x) BYTE_SWAP_32 (x)
187#define GNUNET_htole32(x) (x)
188#define GNUNET_be32toh(x) BYTE_SWAP_32 (x)
189#define GNUNET_le32toh(x) (x)
191#define GNUNET_htobe64(x) BYTE_SWAP_64 (x)
192#define GNUNET_htole64(x) (x)
193#define GNUNET_be64toh(x) BYTE_SWAP_64 (x)
194#define GNUNET_le64toh(x) (x)
196#if __BYTE_ORDER == __BIG_ENDIAN
197#define GNUNET_htobe16(x) (x)
198#define GNUNET_htole16(x) BYTE_SWAP_16 (x)
199#define GNUNET_be16toh(x) (x)
200#define GNUNET_le16toh(x) BYTE_SWAP_16 (x)
202#define GNUNET_htobe32(x) (x)
203#define GNUNET_htole32(x) BYTE_SWAP_32 (x)
204#define GNUNET_be32toh(x) (x)
205#define GNUNET_le32toh(x) BYTE_SWAP_32 (x)
207#define GNUNET_htobe64(x) (x)
208#define GNUNET_htole64(x) BYTE_SWAP_64 (x)
209#define GNUNET_be64toh(x) (x)
210#define GNUNET_le64toh(x) BYTE_SWAP_64 (x)
226#define GNUNET_NZL(l) GNUNET_MAX (1, l)
232#define GNUNET_PACKED __attribute__ ((packed))
237#define GNUNET_GCC_STRUCT_LAYOUT
244#ifdef __BIGGEST_ALIGNMENT__
245#define GNUNET_ALIGN __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)))
247#define GNUNET_ALIGN __attribute__ ((aligned (8)))
253#define GNUNET_UNUSED __attribute__ ((unused))
258#define GNUNET_NORETURN __attribute__ ((noreturn))
263#define GNUNET_NETWORK_STRUCT_BEGIN
268#define GNUNET_NETWORK_STRUCT_END
279 uint32_t
bits[512 / 8 /
sizeof(uint32_t)];
289 uint32_t
bits[256 / 8 /
sizeof(uint32_t)];
356 uint32_t
bits[16 /
sizeof(uint32_t)];
459 const char *message);
472#if ! defined(GNUNET_CULL_LOGGING)
477 const char *function,
496#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
497#define _GNUNET_BOOLEAN_EXPR(expr) \
499 int _gnunet_boolean_var_; \
501 _gnunet_boolean_var_ = 1; \
503 _gnunet_boolean_var_ = 0; \
504 _gnunet_boolean_var_; \
506#define GN_LIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR (expr), 1))
507#define GN_UNLIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR (expr), 0))
509#define GN_LIKELY(expr) (expr)
510#define GN_UNLIKELY(expr) (expr)
513#if ! defined(GNUNET_LOG_CALL_STATUS)
514#define GNUNET_LOG_CALL_STATUS -1
535#if ! defined(GNUNET_CULL_LOGGING)
536#define GNUNET_log_from(kind, comp, ...) \
539 static int log_call_enabled = GNUNET_LOG_CALL_STATUS; \
540 if ((GNUNET_EXTRA_LOGGING > 0) || \
541 ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) \
543 if (GN_UNLIKELY (log_call_enabled == -1)) \
545 GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), \
550 if (GN_UNLIKELY (GNUNET_get_log_skip () > 0)) \
552 GNUNET_log_skip (-1, GNUNET_NO); \
556 if (GN_UNLIKELY (log_call_enabled)) \
557 GNUNET_log_from_nocheck ((kind), comp, __VA_ARGS__); \
562#define GNUNET_log(kind, ...) \
565 static int log_call_enabled = GNUNET_LOG_CALL_STATUS; \
566 if ((GNUNET_EXTRA_LOGGING > 0) || \
567 ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) \
569 if (GN_UNLIKELY (log_call_enabled == -1)) \
571 GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), \
576 if (GN_UNLIKELY (GNUNET_get_log_skip () > 0)) \
578 GNUNET_log_skip (-1, GNUNET_NO); \
582 if (GN_UNLIKELY (log_call_enabled)) \
583 GNUNET_log_nocheck ((kind), __VA_ARGS__); \
588#define GNUNET_log(...)
589#define GNUNET_log_from(...)
620 const char *required);
655#define GNUNET_B2S(obj) GNUNET_b2s ((obj), sizeof (*(obj)))
679GNUNET_log_setup (
const char *comp,
const char *loglevel,
const char *logfile);
901GNUNET_a2s (
const struct sockaddr *addr, socklen_t addrlen);
919#if __GNUC__ >= 6 || __clang_major__ >= 6
920#define GNUNET_assert(cond) \
923 _Pragma("GCC diagnostic push") \
924 _Pragma("GCC diagnostic ignored \"-Wtautological-compare\"") \
927 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
928 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
933 _Pragma("GCC diagnostic pop") \
937#define GNUNET_assert(cond) \
942 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
943 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
955#define GNUNET_assert_at(cond, f, l) \
960 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
961 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
976#define GNUNET_assert_from(cond, comp) \
981 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, \
983 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
999#define GNUNET_static_assert(cond) _Static_assert (cond, "")
1009#define GNUNET_static_assert(cond) GNUNET_assert (cond)
1018#define GNUNET_break(cond) \
1023 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
1024 dgettext ("gnunet", "Assertion failed at %s:%d.\n"), \
1040#define GNUNET_break_op(cond) \
1045 GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, \
1046 dgettext ("gnunet", "External protocol violation detected at %s:%d.\n"), \
1059#define GNUNET_log_strerror(level, cmd) \
1062 GNUNET_log (level, \
1063 dgettext ("gnunet", "`%s' failed at %s:%d with error: %s\n"), \
1067 strerror (errno)); \
1077#define GNUNET_log_from_strerror(level, component, cmd) \
1080 GNUNET_log_from (level, \
1082 dgettext ("gnunet", "`%s' failed at %s:%d with error: %s\n"), \
1086 strerror (errno)); \
1096#define GNUNET_log_strerror_file(level, cmd, filename) \
1099 GNUNET_log (level, \
1100 dgettext ("gnunet", "`%s' failed on file `%s' at %s:%d with error: %s\n"), \
1105 strerror (errno)); \
1115#define GNUNET_log_from_strerror_file(level, component, cmd, filename) \
1118 GNUNET_log_from (level, \
1120 dgettext ("gnunet", "`%s' failed on file `%s' at %s:%d with error: %s\n"), \
1125 strerror (errno)); \
1132#define GNUNET_htonll(n) htobe64 (n)
1151#define GNUNET_ntohll(n) be64toh (n)
1198#define GNUNET_MAX_MALLOC_CHECKED (1024 * 1024 * 40)
1208#define GNUNET_new(type) (type *) GNUNET_malloc (sizeof(type))
1218#define GNUNET_memcmp(a, b) \
1220 const typeof (*b) * _a = (a); \
1221 const typeof (*a) * _b = (b); \
1222 memcmp (_a, _b, sizeof(*a)); \
1247#define GNUNET_memcmp_priv(a, b) \
1249 const typeof (*b) * _a = (a); \
1250 const typeof (*a) * _b = (b); \
1251 GNUNET_memcmp_ct_ (_a, _b, sizeof(*a)); \
1275#define GNUNET_is_zero(a) \
1276 GNUNET_is_zero_ ((a), sizeof (*(a)))
1288#define GNUNET_memcpy(dst, src, n) \
1293 (void) memcpy (dst, src, n); \
1307#define GNUNET_new_array(n, type) ({ \
1308 GNUNET_assert (SIZE_MAX / sizeof (type) >= n); \
1309 (type *) GNUNET_malloc ((n) * sizeof(type)); \
1321#define GNUNET_new_array_2d(n, m, type) \
1322 (type **) GNUNET_xnew_array_2d_ (n, m, sizeof(type), __FILE__, __LINE__)
1334#define GNUNET_new_array_3d(n, m, o, type) \
1335 (type ***) GNUNET_xnew_array_3d_ (n, m, o, sizeof(type), __FILE__, __LINE__)
1346#define GNUNET_malloc(size) GNUNET_xmalloc_ (size, __FILE__, __LINE__)
1356#define GNUNET_memdup(buf, size) GNUNET_xmemdup_ (buf, size, __FILE__, __LINE__)
1366#define GNUNET_malloc_large(size) \
1367 GNUNET_xmalloc_unchecked_ (size, __FILE__, __LINE__)
1379#define GNUNET_realloc(ptr, size) \
1380 GNUNET_xrealloc_ (ptr, size, __FILE__, __LINE__)
1392#define GNUNET_free_nz(ptr) GNUNET_xfree_ (ptr, __FILE__, __LINE__)
1406#define GNUNET_free(ptr) do { \
1407 GNUNET_xfree_ (ptr, __FILE__, __LINE__); \
1420#define GNUNET_strdup(a) GNUNET_xstrdup_ (a, __FILE__, __LINE__)
1431#define GNUNET_strndup(a, length) \
1432 GNUNET_xstrndup_ (a, length, __FILE__, __LINE__)
1469#define GNUNET_array_grow(arr, size, tsize) \
1470 GNUNET_xgrow_ ((void **) &(arr), \
1490#define GNUNET_array_append(arr, len, element) \
1493 GNUNET_assert ((len) + 1 > (len)); \
1494 GNUNET_array_grow (arr, len, len + 1); \
1495 (arr) [len - 1] = element; \
1522#define GNUNET_array_concatenate(arr1, len1, arr2, len2) \
1525 const typeof (*arr2) * _a1 = (arr1); \
1526 const typeof (*arr1) * _a2 = (arr2); \
1527 GNUNET_assert ((len1) + (len2) >= (len1)); \
1528 GNUNET_assert (SIZE_MAX / sizeof (*_a1) >= ((len1) + (len2))); \
1529 GNUNET_array_grow (arr1, len1, (len1) + (len2)); \
1530 memcpy (&(arr1) [(len1) - (len2)], _a2, (len2) * sizeof (*arr1)); \
1729 unsigned int *oldCount,
1730 unsigned int newCount,
1784#if __STDC_VERSION__ < 199901L
1786#define __func__ __FUNCTION__
1788#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 struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
static char * line
Desired phone line (string to be converted to a hash).
static char * data
The data to insert into the dht.
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__
enum GNUNET_GenericReturnValue GNUNET_is_zero_(const void *a, size_t n)
Check that memory in a is all zeros.
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.
#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.
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.
void ** GNUNET_xnew_array_2d_(size_t n, size_t m, size_t elementSize, const char *filename, int linenumber)
Allocate memory for a two dimensional array in one block and set up pointers.
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.
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.
void *** GNUNET_xnew_array_3d_(size_t n, size_t m, size_t o, size_t elementSize, const char *filename, int linenumber)
Allocate memory for a three dimensional array in one block and set up pointers.
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.
#define GNUNET_PACKED
gcc-ism to get packed structs.
@ 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).
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).
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.
uint32_t bits[16/sizeof(uint32_t)]
Saved async scope identifier or root scope.
int have_scope
GNUNET_YES unless this saved scope is the unnamed root scope.
struct GNUNET_AsyncScopeId scope_id
Saved 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...
uint32_t bits[512/8/sizeof(uint32_t)]
Answer from service to client about last operation.
struct GNUNET_MessageHeader header
uint64_t result_code
Status code for the operation.
uint64_t op_id
Operation ID.
The identity of the host (wraps the signing key of the peer).
uint32_t bits[256/8/sizeof(uint32_t)]
A UUID, a 128 bit "random" value.
uint32_t value[4]
128 random bits.