40 #ifndef GNUNET_COMMON_H
41 #define GNUNET_COMMON_H
47 #include <sys/socket.h>
49 #include <netinet/in.h>
50 #include <arpa/inet.h>
53 #include <sys/types.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
139 #ifdef _LITTLE_ENDIAN
140 #define __LITTLE_ENDIAN _LITTLE_ENDIAN
143 #define __LITTLE_ENDIAN LITTLE_ENDIAN
151 #define GNUNET_VA_ARG_ENUM(va, X) ((enum X) va_arg (va, int))
159 #ifndef GNUNET_EXTRA_LOGGING
160 #define GNUNET_EXTRA_LOGGING 1
167 #if defined(bswap_16) || defined(bswap_32) || defined(bswap_64)
168 #define BYTE_SWAP_16(x) bswap_16 (x)
169 #define BYTE_SWAP_32(x) bswap_32 (x)
170 #define BYTE_SWAP_64(x) bswap_64 (x)
172 #define BYTE_SWAP_16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))
174 #define BYTE_SWAP_32(x) \
175 ((((x) & 0x000000ffU) << 24) | (((x) & 0x0000ff00U) << 8) \
176 | (((x) & 0x00ff0000U) >> 8) | (((x) & 0xff000000U) >> 24))
178 #define BYTE_SWAP_64(x) \
179 ((((x) & 0x00000000000000ffUL) << 56) | (((x) & 0x000000000000ff00UL) << 40) \
180 | (((x) & 0x0000000000ff0000UL) << 24) | (((x) & 0x00000000ff000000UL) << 8) \
181 | (((x) & 0x000000ff00000000UL) >> 8) | (((x) & 0x0000ff0000000000UL) >> 24) \
182 | (((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)];
362 uint32_t
bits[16 /
sizeof(uint32_t)];
465 const char *message);
478 #if ! defined(GNUNET_CULL_LOGGING)
483 const char *
function,
502 #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
503 #define _GNUNET_BOOLEAN_EXPR(expr) \
505 int _gnunet_boolean_var_; \
507 _gnunet_boolean_var_ = 1; \
509 _gnunet_boolean_var_ = 0; \
510 _gnunet_boolean_var_; \
512 #define GN_LIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR (expr), 1))
513 #define GN_UNLIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR (expr), 0))
515 #define GN_LIKELY(expr) (expr)
516 #define GN_UNLIKELY(expr) (expr)
519 #if ! defined(GNUNET_LOG_CALL_STATUS)
520 #define GNUNET_LOG_CALL_STATUS -1
541 #if ! defined(GNUNET_CULL_LOGGING)
542 #define GNUNET_log_from(kind, comp, ...) \
545 static int log_call_enabled = GNUNET_LOG_CALL_STATUS; \
546 if ((GNUNET_EXTRA_LOGGING > 0) || \
547 ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) \
549 if (GN_UNLIKELY (log_call_enabled == -1)) \
551 GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), \
556 if (GN_UNLIKELY (GNUNET_get_log_skip () > 0)) \
558 GNUNET_log_skip (-1, GNUNET_NO); \
562 if (GN_UNLIKELY (log_call_enabled)) \
563 GNUNET_log_from_nocheck ((kind), comp, __VA_ARGS__); \
568 #define GNUNET_log(kind, ...) \
571 static int log_call_enabled = GNUNET_LOG_CALL_STATUS; \
572 if ((GNUNET_EXTRA_LOGGING > 0) || \
573 ((GNUNET_ERROR_TYPE_DEBUG & (kind)) == 0)) \
575 if (GN_UNLIKELY (log_call_enabled == -1)) \
577 GNUNET_get_log_call_status ((kind) & (~GNUNET_ERROR_TYPE_BULK), \
582 if (GN_UNLIKELY (GNUNET_get_log_skip () > 0)) \
584 GNUNET_log_skip (-1, GNUNET_NO); \
588 if (GN_UNLIKELY (log_call_enabled)) \
589 GNUNET_log_nocheck ((kind), __VA_ARGS__); \
594 #define GNUNET_log(...)
595 #define GNUNET_log_from(...)
626 const char *required);
661 #define GNUNET_B2S(obj) GNUNET_b2s ((obj), sizeof (*(obj)))
685 GNUNET_log_setup (
const char *comp,
const char *loglevel,
const char *logfile);
907 GNUNET_a2s (
const struct sockaddr *addr, socklen_t addrlen);
925 #if __GNUC__ >= 6 || __clang_major__ >= 6
926 #define GNUNET_assert(cond) \
929 _Pragma("GCC diagnostic push") \
930 _Pragma("GCC diagnostic ignored \"-Wtautological-compare\"") \
933 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
934 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
939 _Pragma("GCC diagnostic pop") \
943 #define GNUNET_assert(cond) \
948 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
949 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
961 #define GNUNET_assert_at(cond, f, l) \
966 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
967 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
982 #define GNUNET_assert_from(cond, comp) \
987 GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, \
989 dgettext ("gnunet", "Assertion failed at %s:%d. Aborting.\n"), \
997 #ifdef _Static_assert
1005 #define GNUNET_static_assert(cond) _Static_assert (cond, "")
1015 #define GNUNET_static_assert(cond) GNUNET_assert (cond)
1024 #define GNUNET_break(cond) \
1029 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, \
1030 dgettext ("gnunet", "Assertion failed at %s:%d.\n"), \
1046 #define GNUNET_break_op(cond) \
1051 GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, \
1052 dgettext ("gnunet", "External protocol violation detected at %s:%d.\n"), \
1065 #define GNUNET_log_strerror(level, cmd) \
1068 GNUNET_log (level, \
1069 dgettext ("gnunet", "`%s' failed at %s:%d with error: %s\n"), \
1073 strerror (errno)); \
1083 #define GNUNET_log_from_strerror(level, component, cmd) \
1086 GNUNET_log_from (level, \
1088 dgettext ("gnunet", "`%s' failed at %s:%d with error: %s\n"), \
1092 strerror (errno)); \
1102 #define GNUNET_log_strerror_file(level, cmd, filename) \
1105 GNUNET_log (level, \
1106 dgettext ("gnunet", "`%s' failed on file `%s' at %s:%d with error: %s\n"), \
1111 strerror (errno)); \
1121 #define GNUNET_log_from_strerror_file(level, component, cmd, filename) \
1124 GNUNET_log_from (level, \
1126 dgettext ("gnunet", "`%s' failed on file `%s' at %s:%d with error: %s\n"), \
1131 strerror (errno)); \
1138 #define GNUNET_htonll(n) htobe64 (n)
1157 #define GNUNET_ntohll(n) be64toh (n)
1204 #define GNUNET_MAX_MALLOC_CHECKED (1024 * 1024 * 40)
1214 #define GNUNET_new(type) (type *) GNUNET_malloc (sizeof(type))
1224 #define GNUNET_memcmp(a, b) \
1226 const typeof (*b) * _a = (a); \
1227 const typeof (*a) * _b = (b); \
1228 memcmp (_a, _b, sizeof(*a)); \
1253 #define GNUNET_memcmp_priv(a, b) \
1255 const typeof (*b) * _a = (a); \
1256 const typeof (*a) * _b = (b); \
1257 GNUNET_memcmp_ct_ (_a, _b, sizeof(*a)); \
1281 #define GNUNET_is_zero(a) \
1282 GNUNET_is_zero_ ((a), sizeof (*(a)))
1294 #define GNUNET_memcpy(dst, src, n) \
1299 (void) memcpy (dst, src, n); \
1313 #define GNUNET_new_array(n, type) ({ \
1314 GNUNET_assert (SIZE_MAX / sizeof (type) >= n); \
1315 (type *) GNUNET_malloc ((n) * sizeof(type)); \
1327 #define GNUNET_new_array_2d(n, m, type) \
1328 (type **) GNUNET_xnew_array_2d_ (n, m, sizeof(type), __FILE__, __LINE__)
1340 #define GNUNET_new_array_3d(n, m, o, type) \
1341 (type ***) GNUNET_xnew_array_3d_ (n, m, o, sizeof(type), __FILE__, __LINE__)
1352 #define GNUNET_malloc(size) GNUNET_xmalloc_ (size, __FILE__, __LINE__)
1362 #define GNUNET_memdup(buf, size) GNUNET_xmemdup_ (buf, size, __FILE__, __LINE__)
1372 #define GNUNET_malloc_large(size) \
1373 GNUNET_xmalloc_unchecked_ (size, __FILE__, __LINE__)
1385 #define GNUNET_realloc(ptr, size) \
1386 GNUNET_xrealloc_ (ptr, size, __FILE__, __LINE__)
1398 #define GNUNET_free_nz(ptr) GNUNET_xfree_ (ptr, __FILE__, __LINE__)
1412 #define GNUNET_free(ptr) do { \
1413 GNUNET_xfree_ (ptr, __FILE__, __LINE__); \
1426 #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)); \
1735 unsigned int *oldCount,
1736 unsigned int newCount,
1790 #if __STDC_VERSION__ < 199901L
1792 #define __func__ __FUNCTION__
1794 #define __func__ "<unknown>"
struct GNUNET_MessageHeader * msg
static char * component
Running component.
static size_t data_size
Number of bytes in data.
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
static char * line
Desired phone line (string to be converted to a hash).
uint32_t data
The data value.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
static struct GNUNET_OS_Process * p
Helper process we started.
const char * GNUNET_b2s(const void *buf, size_t buf_size)
Convert a buffer to an 8-character string representative of the contents.
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.
char * GNUNET_xstrdup_(const char *str, const char *filename, int linenumber)
Dup a string.
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.
void * GNUNET_xrealloc_(void *ptr, size_t n, const char *filename, int linenumber)
Reallocate memory.
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.
#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.
void(* GNUNET_ContinuationCallback)(void *cls)
Generic continuation callback.
int int void * GNUNET_xmalloc_(size_t size, const char *filename, int linenumber)
Allocate memory.
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_xfree_(void *ptr, const char *filename, int linenumber)
Free 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;.
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_xmemdup_(const void *buf, size_t size, const char *filename, int linenumber)
Allocate and initialize memory.
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_async_scope_restore(struct GNUNET_AsyncScopeSave *old_scope)
Clear the current thread's async scope.
char * GNUNET_xstrndup_(const char *str, size_t len, const char *filename, int linenumber)
Dup partially a string.
GNUNET_GenericReturnValue
Named constants for return values.
#define GNUNET_PACKED
gcc-ism to get packed structs.
void * GNUNET_xmalloc_unchecked_(size_t size, const char *filename, int linenumber)
Allocate memory.
@ 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...
const char * GNUNET_h2s2(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
GNUNET_ErrorType
Types of errors.
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).
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
void GNUNET_log_nocheck(enum GNUNET_ErrorType kind, const char *message,...) __attribute__((format(printf
Main log function.
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_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
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_i2s2(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).
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value 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).
const char * GNUNET_e2s2(const struct GNUNET_CRYPTO_EcdhePublicKey *p)
Convert a public key value 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.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
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_i2s_full(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity 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.
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_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.
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.
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.
struct GNUNET_MessageHeader * GNUNET_copy_message(const struct GNUNET_MessageHeader *msg)
Create a copy of the given message.
static unsigned int size
Size of the "table".
enum array_types __attribute__
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.