28#ifndef __NILOREA_COMMONS__
29#define __NILOREA_COMMONS__
52#if defined(_WIN32) || defined(_WIN64)
57#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
60#define WIFEXITED(w) (((w) & 0xff) == 0)
67#if defined(__GNUC__) && __GNUC__ >= 7
69#define FALL_THROUGH __attribute__((fallthrough))
76#if defined(_WIN32) || defined(_WIN64)
86#if !defined(ENV_32BITS) || !defined(ENV_64BITS)
88#if defined(__x86_64__) || defined(__ppc64__)
90#define __ENVBITS __ENV_64BITS
93#define __ENVBITS __ENV_32BITS
99#define BYTEORDER_LITTLE_ENDIAN 0
101#define BYTEORDER_BIG_ENDIAN 1
103#ifndef BYTEORDER_ENDIAN
105#if defined(__BYTE_ORDER__)
106#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
107#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
108#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
109#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
111#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
112#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
113#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
116#elif defined(__GLIBC__)
118#if (__BYTE_ORDER == __LITTLE_ENDIAN)
119#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
120#elif (__BYTE_ORDER == __BIG_ENDIAN)
121#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
123#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
124#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
125#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
128#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
129#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
130#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
131#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
133#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
134#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
135#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__)
136#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
137#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
138#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
140#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
141#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
142#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
146#if defined(__windows__)
149typedef unsigned int uint;
151typedef unsigned long ulong;
153typedef unsigned short ushort;
155typedef unsigned char uchar;
160#define FORCE_INLINE __forceinline
161#elif defined(__linux__) || defined(__windows__)
162#define FORCE_INLINE static inline __attribute__((always_inline))
164#define FORCE_INLINE static inline __attribute__((always_inline))
179#define false (1 == 0)
193#define _str(__PTR) ((__PTR) ? (__PTR) : "NULL")
195#define _strp(__PTR) ((__PTR) ? (__PTR) : NULL)
197#define _strw(__PTR) ((__PTR) ? (__PTR) : " ")
199#define _nstr(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : "NULL")
201#define _nstrp(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : NULL)
204#define Malloc(__ptr, __struct, __size) \
208 __ptr = (__struct*)calloc(__size, sizeof(__struct)); \
211 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__); \
216#define Alloca(__ptr, __size) \
220 __ptr = alloca(__size); \
223 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__); \
225 memset(__ptr, 0, __size); \
231#define Realloc(__ptr, __struct, __size) \
235 void* __new_ptr = ((__size) && (sizeof(__struct)) && ((__size) > SIZE_MAX / sizeof(__struct))) ? NULL : (__struct*)realloc(__ptr, (__size) * sizeof(__struct)); \
238 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__); \
242 (__new_ptr != NULL) ? TRUE : FALSE; \
247#define Reallocz(__ptr, __struct, __old_size, __size) \
251 void* __new_ptr = ((__size) && (sizeof(__struct)) && ((__size) > SIZE_MAX / sizeof(__struct))) ? NULL : (__struct*)realloc(__ptr, __size); \
254 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__); \
257 if (__size > __old_size) memset(((char*)__ptr + __old_size), 0, __size - __old_size); \
259 (__new_ptr != NULL) ? TRUE : FALSE; \
268 n_log(LOG_DEBUG, "Free( %s ) already done or NULL at line %d of %s", #__ptr, __LINE__, __FILE__); \
272#define FreeNoLog(__ptr) \
279#define __n_assert(__ptr, __ret) \
281 n_log(LOG_DEBUG, "if( !(%s) ) assert at line %d of %s", #__ptr, __LINE__, __FILE__); \
286#define CALL_RETRY(__retvar, __expression, __max_tries) \
288 int __nb_retries = 0; \
290 __retvar = (__expression); \
292 } while (__retvar == -1 && errno == EINTR && __nb_retries < (__max_tries)); \
296#define next_odd(__val) (((__val) % 2 == 0) ? ((__val) + 1) : (__val))
299#define next_even(__val) (((__val) % 2 == 0) ? (__val) : ((__val) + 1))
302#define init_error_check() \
303 static int ___error__check_flag = FALSE;
309#define ifzero if( 0 ==
312#define iffalse if( FALSE ==
315#define iftrue if( TRUE ==
318#define checkerror() \
319 if (___error__check_flag == TRUE) { \
320 n_log(LOG_ERR, "checkerror return false at line %d of %s", __LINE__, __FILE__); \
326 ___error__check_flag = TRUE; \
327 n_log(LOG_ERR, "First err was at line %d of %s", __LINE__, __FILE__); \
332 (___error__check_flag == TRUE)
335#define equal_if(__a, __cond, __b) \
336 if ((__a)__cond(__b)) { \
343#define RWLOCK_LOGLEVEL LOG_DEBUG
346#define RWLOCK_LOGLEVEL LOG_NULL
350#define init_lock(__rwlock_mutex) \
352 pthread_rwlockattr_t __attr; \
353 pthread_rwlockattr_init(&__attr); \
356 n_log(RWLOCK_LOGLEVEL, "init_lock %s", #__rwlock_mutex); \
357 __rwlock_mutex = (pthread_rwlock_t)PTHREAD_RWLOCK_INITIALIZER; \
358 __ret = pthread_rwlock_init(&(__rwlock_mutex), &__attr); \
360 n_log(LOG_ERR, "Error %s while initializing %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
362 pthread_rwlockattr_destroy(&__attr); \
368#define read_lock(__rwlock_mutex) \
372 n_log(RWLOCK_LOGLEVEL, "read lock %s", #__rwlock_mutex); \
373 __ret = pthread_rwlock_rdlock(&(__rwlock_mutex)); \
375 n_log(LOG_ERR, "Error %s while read locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
382#define write_lock(__rwlock_mutex) \
386 n_log(RWLOCK_LOGLEVEL, "write lock %s", #__rwlock_mutex); \
387 __ret = pthread_rwlock_wrlock(&(__rwlock_mutex)); \
389 n_log(LOG_ERR, "Error %s while write locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
396#define unlock(__rwlock_mutex) \
400 n_log(RWLOCK_LOGLEVEL, "unlock lock %s", #__rwlock_mutex); \
401 __ret = pthread_rwlock_unlock(&(__rwlock_mutex)); \
403 n_log(LOG_ERR, "Error %s while unlocking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
409#define rw_lock_destroy(__rwlock_mutex) \
413 n_log(RWLOCK_LOGLEVEL, "destroy lock %s", #__rwlock_mutex); \
414 __ret = pthread_rwlock_destroy(&(__rwlock_mutex)); \
416 n_log(LOG_ERR, "Error %s while destroying %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
431#define STOPWANTED 1002
440 srand((unsigned)time(NULL)); \
446#define MIN(a, b) (((a) < (b)) ? (a) : (b))
450#define MAX(a, b) (((a) > (b)) ? (a) : (b))
454#define CONCAT_BUILDER(a, b) a##b
456#define CONCAT(a, b) CONCAT_BUILDER(a, b)
463#if (BYTEORDER_ENDIAN == BYTEORDER_BIG_ENDIAN)
475#define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
479#define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
485void n_abort(
char const* format, ...);
500int n_popen(
char* cmd,
size_t read_buf_size,
void** nstr_output,
int* ret);
511#define N_DAEMON_NO_CLOSE 2
513#define N_DAEMON_NO_STD_REDIRECT 4
515#define N_DAEMON_NO_DOUBLE_FORK 8
517#define N_DAEMON_NO_SETSID 16
519#define N_DAEMON_NO_UMASK 32
521#define N_DAEMON_NO_CHDIR 64
523#define N_DAEMON_NO_SIGCHLD_IGN 128
525#define N_DAEMON_NO_SIGCHLD_HANDLER 256
531pid_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....