X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_common.h;h=08c1f96c98bcf4e31012a69d332e5b48aafa5bd1;hb=83b19539f4d322b43683f5838b72e9ec2c8e6073;hp=2d13d0ecc1855f8de8fd24e4baa1646f177b48b0;hpb=07d97d6e0e24ea088d050d03014f05093bf2007b;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_common.h b/src/include/gnunet_common.h index 2d13d0ecc..08c1f96c9 100644 --- a/src/include/gnunet_common.h +++ b/src/include/gnunet_common.h @@ -36,11 +36,20 @@ #if HAVE_NETINET_IN_H #include #endif +#ifdef MINGW +#include "winproc.h" +#endif +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_STDARG_H +#include +#endif /** * Version of the API (for entire gnunetutil.so library). */ -#define GNUNET_UTIL_VERSION 0x00000000 +#define GNUNET_UTIL_VERSION 0x00089990 /** * Name used for "services" that are actually command-line @@ -129,6 +138,8 @@ typedef int (*GNUNET_FileNameCallback) (void *cls, const char *filename); */ enum GNUNET_ErrorType { + GNUNET_ERROR_TYPE_UNSPECIFIED = -1, + GNUNET_ERROR_TYPE_NONE = 0, GNUNET_ERROR_TYPE_ERROR = 1, GNUNET_ERROR_TYPE_WARNING = 2, GNUNET_ERROR_TYPE_INFO = 4, @@ -137,6 +148,7 @@ enum GNUNET_ErrorType GNUNET_ERROR_TYPE_BULK = 32 }; + /** * User-defined handler for log messages. * @@ -146,11 +158,21 @@ enum GNUNET_ErrorType * @param date when was the message logged? * @param message what is the message */ -typedef void (*GNUNET_Logger) (void *cls, - enum GNUNET_ErrorType kind, - const char *component, - const char *date, const char *message); +typedef void (*GNUNET_Logger) (void *cls, enum GNUNET_ErrorType kind, + const char *component, const char *date, + const char *message); + + +/** + * 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); +#endif /** * Main log function. * @@ -158,9 +180,30 @@ typedef void (*GNUNET_Logger) (void *cls, * @param message what is the message (format string) * @param ... arguments for format string */ -void GNUNET_log (enum GNUNET_ErrorType kind, const char *message, ...); - +void +GNUNET_log_nocheck (enum GNUNET_ErrorType kind, const char *message, ...); + +/* from glib */ +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +#define _GNUNET_BOOLEAN_EXPR(expr) \ + __extension__ ({ \ + int _gnunet_boolean_var_; \ + if (expr) \ + _gnunet_boolean_var_ = 1; \ + else \ + _gnunet_boolean_var_ = 0; \ + _gnunet_boolean_var_; \ +}) +#define GN_LIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR(expr), 1)) +#define GN_UNLIKELY(expr) (__builtin_expect (_GNUNET_BOOLEAN_EXPR(expr), 0)) +#else +#define GN_LIKELY(expr) (expr) +#define GN_UNLIKELY(expr) (expr) +#endif +#if !defined(GNUNET_LOG_CALL_STATUS) +#define GNUNET_LOG_CALL_STATUS -1 +#endif /** * Log function that specifies an alternative component. @@ -172,9 +215,35 @@ void GNUNET_log (enum GNUNET_ErrorType kind, const char *message, ...); * @param ... arguments for format string */ void -GNUNET_log_from (enum GNUNET_ErrorType kind, - const char *comp, const char *message, ...); - +GNUNET_log_from_nocheck (enum GNUNET_ErrorType kind, const char *comp, + const char *message, ...); + +#if !defined(GNUNET_CULL_LOGGING) +#define GNUNET_log_from(kind,comp,...) do { int log_line = __LINE__;\ + static int log_call_enabled = GNUNET_LOG_CALL_STATUS;\ + 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--;}\ + else {\ + if (GN_UNLIKELY(log_call_enabled))\ + GNUNET_log_from_nocheck (kind, comp, __VA_ARGS__);\ + }\ +} while (0) + +#define GNUNET_log(kind,...) do { int log_line = __LINE__;\ + static int log_call_enabled = GNUNET_LOG_CALL_STATUS;\ + 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--;}\ + else {\ + if (GN_UNLIKELY(log_call_enabled))\ + GNUNET_log_nocheck (kind, __VA_ARGS__);\ + }\ +} while (0) +#else +#define GNUNET_log(...) +#define GNUNET_log_from(...) +#endif /** * Ignore the next n calls to the log function. @@ -195,8 +264,8 @@ GNUNET_log_skip (unsigned int n, int check_reset); * @return GNUNET_OK on success, GNUNET_SYSERR if logfile could not be opened */ int -GNUNET_log_setup (const char *comp, - const char *loglevel, const char *logfile); +GNUNET_log_setup (const char *comp, const char *loglevel, const char *logfile); + /** * Add a custom logger. @@ -204,7 +273,9 @@ GNUNET_log_setup (const char *comp, * @param logger log function * @param logger_cls closure for logger */ -void GNUNET_logger_add (GNUNET_Logger logger, void *logger_cls); +void +GNUNET_logger_add (GNUNET_Logger logger, void *logger_cls); + /** * Remove a custom logger. @@ -212,7 +283,8 @@ void GNUNET_logger_add (GNUNET_Logger logger, void *logger_cls); * @param logger log function * @param logger_cls closure for logger */ -void GNUNET_logger_remove (GNUNET_Logger logger, void *logger_cls); +void +GNUNET_logger_remove (GNUNET_Logger logger, void *logger_cls); /** @@ -221,9 +293,23 @@ void GNUNET_logger_remove (GNUNET_Logger logger, void *logger_cls); * NOT reentrant! * * @param hc the hash code - * @return string + * @return string */ -const char *GNUNET_h2s (const GNUNET_HashCode *hc); +const char * +GNUNET_h2s (const GNUNET_HashCode * hc); + + +/** + * Convert a hash value to a string (for printing debug messages). + * This prints all 104 characters of a hashcode! + * This is one of the very few calls in the entire API that is + * NOT reentrant! + * + * @param hc the hash code + * @return string + */ +const char * +GNUNET_h2s_full (const GNUNET_HashCode * hc); /** @@ -235,7 +321,8 @@ const char *GNUNET_h2s (const GNUNET_HashCode *hc); * @return string form of the pid; will be overwritten by next * call to GNUNET_i2s. */ -const char *GNUNET_i2s (const struct GNUNET_PeerIdentity *pid); +const char * +GNUNET_i2s (const struct GNUNET_PeerIdentity *pid); /** @@ -248,8 +335,8 @@ const char *GNUNET_i2s (const struct GNUNET_PeerIdentity *pid); * @return nicely formatted string for the address * will be overwritten by next call to GNUNET_a2s. */ -const char *GNUNET_a2s (const struct sockaddr *addr, - socklen_t addrlen); +const char * +GNUNET_a2s (const struct sockaddr *addr, socklen_t addrlen); /** * Convert error type to string. @@ -257,7 +344,9 @@ const char *GNUNET_a2s (const struct sockaddr *addr, * @param kind type to convert * @return string corresponding to the type */ -const char *GNUNET_error_type_to_string (enum GNUNET_ErrorType kind); +const char * +GNUNET_error_type_to_string (enum GNUNET_ErrorType kind); + /** * Use this for fatal errors that cannot be handled @@ -292,6 +381,13 @@ const char *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 @@ -299,6 +395,13 @@ const char *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 ****************** */ /** @@ -306,14 +409,16 @@ const char *GNUNET_error_type_to_string (enum GNUNET_ErrorType kind); * @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); +unsigned long long +GNUNET_ntohll (unsigned long long n); /** * Convert a long long 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); +unsigned long long +GNUNET_htonll (unsigned long long n); /* ************************* allocation functions ****************** */ @@ -333,6 +438,15 @@ unsigned long long GNUNET_htonll (unsigned long long n); */ #define GNUNET_malloc(size) GNUNET_xmalloc_(size, __FILE__, __LINE__) +/** + * Allocate and initialize a block of memory. + * + * @param buf data to initalize the block with + * @param size the number of bytes in buf (and size of the allocation) + * @return pointer to size bytes of memory, never NULL (!) + */ +#define GNUNET_memdup(buf,size) GNUNET_xmemdup_(buf, size, __FILE__, __LINE__) + /** * Wrapper around malloc. Allocates size bytes of memory. * The memory will be zero'ed out. @@ -357,7 +471,7 @@ unsigned long long GNUNET_htonll (unsigned long long n); * allocated with GNUNET_array_grow using GNUNET_array_grow(mem, size, 0) instead of GNUNET_free. * * @param ptr location where to free the memory. ptr must have - * been returned by GNUNET_strdup, GNUNET_malloc or GNUNET_array_grow earlier. + * been returned by GNUNET_strdup, GNUNET_strndup, GNUNET_malloc or GNUNET_array_grow earlier. */ #define GNUNET_free(ptr) GNUNET_xfree_(ptr, __FILE__, __LINE__) @@ -378,6 +492,16 @@ unsigned long long GNUNET_htonll (unsigned long long n); */ #define GNUNET_strdup(a) GNUNET_xstrdup_(a,__FILE__,__LINE__) +/** + * Wrapper around GNUNET_strndup. Makes a partial copy of the string + * pointed to by a. + * + * @param a pointer to a string + * @param length of the string to duplicate + * @return a partial copy of the string including zero-termination + */ +#define GNUNET_strndup(a,length) GNUNET_xstrndup_(a,length,__FILE__,__LINE__) + /** * Grow a well-typed (!) array. This is a convenience * method to grow a vector arr of size size @@ -428,7 +552,8 @@ unsigned long long GNUNET_htonll (unsigned long long n); * @param ... data for format string * @return number of bytes written to buf or negative value on error */ -int GNUNET_snprintf (char *buf, size_t size, const char *format, ...); +int +GNUNET_snprintf (char *buf, size_t size, const char *format, ...); /** @@ -439,7 +564,8 @@ int GNUNET_snprintf (char *buf, size_t size, const char *format, ...); * @param ... data for format string * @return number of bytes in "*buf" excluding 0-termination */ -int GNUNET_asprintf (char **buf, const char *format, ...); +int +GNUNET_asprintf (char **buf, const char *format, ...); /* ************** internal implementations, use macros above! ************** */ @@ -455,7 +581,24 @@ int GNUNET_asprintf (char **buf, const char *format, ...); * @param linenumber line where this call is being made (for debugging) * @return allocated memory, never NULL */ -void *GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber); +void * +GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber); + + +/** + * Allocate and initialize memory. Checks the return value, aborts if no more + * memory is available. Don't use GNUNET_xmemdup_ directly. Use the + * GNUNET_memdup macro. + * + * @param buf buffer to initialize from (must contain size bytes) + * @param size number of bytes to allocate + * @param filename where is this call being made (for debugging) + * @param linenumber line where this call is being made (for debugging) + * @return allocated memory, never NULL + */ +void * +GNUNET_xmemdup_ (const void *buf, size_t size, const char *filename, + int linenumber); /** @@ -470,15 +613,15 @@ void *GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber); * @param linenumber line where this call is being made (for debugging) * @return pointer to size bytes of memory, NULL if we do not have enough memory */ -void *GNUNET_xmalloc_unchecked_ (size_t size, - const char *filename, int linenumber); +void * +GNUNET_xmalloc_unchecked_ (size_t size, const char *filename, int linenumber); /** * Reallocate memory. Checks the return value, aborts if no more * memory is available. */ -void *GNUNET_xrealloc_ (void *ptr, - const size_t n, const char *filename, int linenumber); +void * +GNUNET_xrealloc_ (void *ptr, size_t n, const char *filename, int linenumber); /** * Free memory. Merely a wrapper for the case that we @@ -489,7 +632,8 @@ void *GNUNET_xrealloc_ (void *ptr, * @param filename where is this call being made (for debugging) * @param linenumber line where this call is being made (for debugging) */ -void GNUNET_xfree_ (void *ptr, const char *filename, int linenumber); +void +GNUNET_xfree_ (void *ptr, const char *filename, int linenumber); /** @@ -499,7 +643,21 @@ void GNUNET_xfree_ (void *ptr, const char *filename, int linenumber); * @param linenumber line where this call is being made (for debugging) * @return the duplicated string */ -char *GNUNET_xstrdup_ (const char *str, const char *filename, int linenumber); +char * +GNUNET_xstrdup_ (const char *str, const char *filename, int linenumber); + +/** + * Dup partially a string. Don't call GNUNET_xstrndup_ directly. Use the GNUNET_strndup macro. + * + * @param str string to duplicate + * @param len length of the string to duplicate + * @param filename where is this call being made (for debugging) + * @param linenumber line where this call is being made (for debugging) + * @return the duplicated string + */ +char * +GNUNET_xstrndup_ (const char *str, size_t len, const char *filename, + int linenumber); /** * Grow an array, the new elements are zeroed out. @@ -516,21 +674,27 @@ char *GNUNET_xstrdup_ (const char *str, const char *filename, int linenumber); * @param filename where is this call being made (for debugging) * @param linenumber line where this call is being made (for debugging) */ -void GNUNET_xgrow_ (void **old, - size_t elementSize, - unsigned int *oldCount, - unsigned int newCount, - const char *filename, int linenumber); +void +GNUNET_xgrow_ (void **old, size_t elementSize, unsigned int *oldCount, + unsigned int newCount, const char *filename, int linenumber); +/** + * Create a copy of the given message. + * + * @param msg message to copy + * @return duplicate of the message + */ +struct GNUNET_MessageHeader * +GNUNET_copy_message (const struct GNUNET_MessageHeader *msg); #if __STDC_VERSION__ < 199901L -# if __GNUC__ >= 2 -# define __func__ __FUNCTION__ -# else -# define __func__ "" -# endif +#if __GNUC__ >= 2 +#define __func__ __FUNCTION__ +#else +#define __func__ "" +#endif #endif #endif /*GNUNET_COMMON_H_ */