27#ifndef __NILOREA_COMMONS__
28#define __NILOREA_COMMONS__
51#if defined(_WIN32) || defined(_WIN64)
56#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
59#define WIFEXITED(w) (((w) & 0xff) == 0)
66#if defined(__GNUC__) && __GNUC__ >= 7
68#define FALL_THROUGH __attribute__((fallthrough))
75#if defined(_WIN32) || defined(_WIN64)
85#if !defined(ENV_32BITS) || !defined(ENV_64BITS)
87#if defined(__x86_64__) || defined(__ppc64__)
89#define __ENVBITS __ENV_64BITS
92#define __ENVBITS __ENV_32BITS
98#define BYTEORDER_LITTLE_ENDIAN 0
100#define BYTEORDER_BIG_ENDIAN 1
102#ifndef BYTEORDER_ENDIAN
104#if defined(__BYTE_ORDER__)
105#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
106#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
107#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
108#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
110#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
111#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
112#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
115#elif defined(__GLIBC__)
117#if (__BYTE_ORDER == __LITTLE_ENDIAN)
118#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
119#elif (__BYTE_ORDER == __BIG_ENDIAN)
120#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
122#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
123#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
124#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
127#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
128#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
129#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
130#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
132#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
133#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
134#elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__)
135#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
136#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
137#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
139#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
140#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
141#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
145#if defined(__windows__)
148typedef unsigned int uint;
150typedef unsigned long ulong;
152typedef unsigned short ushort;
154typedef unsigned char uchar;
159#define FORCE_INLINE __forceinline
160#elif defined(__linux__) || defined(__windows__)
161#define FORCE_INLINE static inline __attribute__((always_inline))
163#define FORCE_INLINE static inline __attribute__((always_inline))
178#define false (1 == 0)
192#define _str(__PTR) ((__PTR) ? (__PTR) : "NULL")
194#define _strp(__PTR) ((__PTR) ? (__PTR) : NULL)
196#define _strw(__PTR) ((__PTR) ? (__PTR) : " ")
198#define _nstr(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : "NULL")
200#define _nstrp(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : NULL)
203#define Malloc(__ptr, __struct, __size) \
207 __ptr = (__struct*)calloc(__size, sizeof(__struct)); \
210 n_log(LOG_ERR, "( %s *)calloc( %zu , sizeof( %s ) ) %s at line %d of %s", #__ptr, __size, #__struct, (__n_errno == 0) ? "malloc error" : strerror(__n_errno), __LINE__, __FILE__); \
215#define Alloca(__ptr, __size) \
219 __ptr = alloca(__size); \
222 n_log(LOG_ERR, "%s=alloca( %zu ) %s at line %d of %s", #__ptr, __size, (__n_errno == 0) ? "alloca error" : strerror(__n_errno), __LINE__, __FILE__); \
224 memset(__ptr, 0, __size); \
230#define Realloc(__ptr, __struct, __size) \
234 void* __new_ptr = ((__size) && (sizeof(__struct)) && ((__size) > SIZE_MAX / sizeof(__struct))) ? NULL : (__struct*)realloc(__ptr, (__size) * sizeof(__struct)); \
237 n_log(LOG_ERR, "( %s *)realloc( %s * sizeof( %zu ) ) %s at line %d of %s", #__ptr, #__struct, __size, (__n_errno == 0) ? "realloc error" : strerror(__n_errno), __LINE__, __FILE__); \
241 (__new_ptr != NULL) ? TRUE : FALSE; \
246#define Reallocz(__ptr, __struct, __old_size, __size) \
250 void* __new_ptr = ((__size) && (sizeof(__struct)) && ((__size) > SIZE_MAX / sizeof(__struct))) ? NULL : (__struct*)realloc(__ptr, __size); \
253 n_log(LOG_ERR, "( %s *)realloc( %s * sizeof( %zu ) ) %s at line %d of %s", #__ptr, #__struct, __size, (__n_errno == 0) ? "realloc error" : strerror(__n_errno), __LINE__, __FILE__); \
256 if (__size > __old_size) memset(((char*)__ptr + __old_size), 0, __size - __old_size); \
258 (__new_ptr != NULL) ? TRUE : FALSE; \
267 n_log(LOG_DEBUG, "Free( %s ) already done or NULL at line %d of %s", #__ptr, __LINE__, __FILE__); \
271#define FreeNoLog(__ptr) \
278#define __n_assert(__ptr, __ret) \
280 n_log(LOG_DEBUG, "if( !(%s) ) assert at line %d of %s", #__ptr, __LINE__, __FILE__); \
285#define CALL_RETRY(__retvar, __expression, __max_tries) \
287 int __nb_retries = 0; \
289 __retvar = (__expression); \
291 } while (__retvar == -1 && errno == EINTR && __nb_retries < (__max_tries)); \
295#define next_odd(__val) (((__val) % 2 == 0) ? ((__val) + 1) : (__val))
298#define next_even(__val) (((__val) % 2 == 0) ? (__val) : ((__val) + 1))
301#define init_error_check() \
302 static int ___error__check_flag = FALSE;
308#define ifzero if( 0 ==
311#define iffalse if( FALSE ==
314#define iftrue if( TRUE ==
317#define checkerror() \
318 if (___error__check_flag == TRUE) { \
319 n_log(LOG_ERR, "checkerror return false at line %d of %s", __LINE__, __FILE__); \
325 ___error__check_flag = TRUE; \
326 n_log(LOG_ERR, "First err was at line %d of %s", __LINE__, __FILE__); \
331 (___error__check_flag == TRUE)
334#define equal_if(__a, __cond, __b) \
335 if ((__a)__cond(__b)) { \
342#define RWLOCK_LOGLEVEL LOG_DEBUG
345#define RWLOCK_LOGLEVEL LOG_NULL
349#define init_lock(__rwlock_mutex) \
351 pthread_rwlockattr_t __attr; \
352 pthread_rwlockattr_init(&__attr); \
355 n_log(RWLOCK_LOGLEVEL, "init_lock %s", #__rwlock_mutex); \
356 __rwlock_mutex = (pthread_rwlock_t)PTHREAD_RWLOCK_INITIALIZER; \
357 __ret = pthread_rwlock_init(&(__rwlock_mutex), &__attr); \
359 n_log(LOG_ERR, "Error %s while initializing %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
361 pthread_rwlockattr_destroy(&__attr); \
367#define read_lock(__rwlock_mutex) \
371 n_log(RWLOCK_LOGLEVEL, "read lock %s", #__rwlock_mutex); \
372 __ret = pthread_rwlock_rdlock(&(__rwlock_mutex)); \
374 n_log(LOG_ERR, "Error %s while read locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
381#define write_lock(__rwlock_mutex) \
385 n_log(RWLOCK_LOGLEVEL, "write lock %s", #__rwlock_mutex); \
386 __ret = pthread_rwlock_wrlock(&(__rwlock_mutex)); \
388 n_log(LOG_ERR, "Error %s while write locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
395#define unlock(__rwlock_mutex) \
399 n_log(RWLOCK_LOGLEVEL, "unlock lock %s", #__rwlock_mutex); \
400 __ret = pthread_rwlock_unlock(&(__rwlock_mutex)); \
402 n_log(LOG_ERR, "Error %s while unlocking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
408#define rw_lock_destroy(__rwlock_mutex) \
412 n_log(RWLOCK_LOGLEVEL, "destroy lock %s", #__rwlock_mutex); \
413 __ret = pthread_rwlock_destroy(&(__rwlock_mutex)); \
415 n_log(LOG_ERR, "Error %s while destroying %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
430#define STOPWANTED 1002
439 srand((unsigned)time(NULL)); \
445#define MIN(a, b) (((a) < (b)) ? (a) : (b))
449#define MAX(a, b) (((a) > (b)) ? (a) : (b))
453#define CONCAT_BUILDER(a, b) a##b
455#define CONCAT(a, b) CONCAT_BUILDER(a, b)
457#if (BYTEORDER_ENDIAN == BYTEORDER_BIG_ENDIAN)
469#define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
473#define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
478void n_abort(
char const* format, ...);
493int n_popen(
char* cmd,
size_t read_buf_size,
void** nstr_output,
int* ret);
504#define N_DAEMON_NO_CLOSE 2
506#define N_DAEMON_NO_STD_REDIRECT 4
508#define N_DAEMON_NO_DOUBLE_FORK 8
510#define N_DAEMON_NO_SETSID 16
512#define N_DAEMON_NO_UMASK 32
514#define N_DAEMON_NO_CHDIR 64
516#define N_DAEMON_NO_SIGCHLD_IGN 128
518#define N_DAEMON_NO_SIGCHLD_HANDLER 256
524pid_t
system_nb(
const char* command,
int* infp,
int* outfp);
void log_environment(int loglevel)
log environment variables at the given log level
char * get_prog_name(void)
get running program name
void N_HIDE_STR(char *buf,...)
reconstruct hidden string from variadic char arguments
int get_computer_name(char *computer_name, size_t len)
get the computer name into the given buffer
void sigchld_handler(int sig)
reap zombie processes
pid_t system_nb(const char *command, int *infp, int *outfp)
non-blocking system call
char * n_get_file_extension(char path[])
get the file extension from a path
char * get_prog_dir(void)
get running program directory
int n_daemonize_ex(int mode)
daemonize the current process with the given mode flags
void n_abort(char const *format,...)
htonl for 64 bits numbers
int sigchld_handler_installer()
install signal SIGCHLD handler
int n_daemonize(void)
daemonize the current process
int file_exist(const char *filename)
test file presence
int n_popen(char *cmd, size_t read_buf_size, void **nstr_output, int *ret)
shortcut for popen usage
Macro to build enums and their tostring counterparts, a reduced version of https://github....