8#ifndef __NILOREA_COMMONS__
9#define __NILOREA_COMMONS__
32#if defined(_WIN32) || defined(_WIN64)
37#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
40#define WIFEXITED(w) (((w) & 0xff) == 0)
50#if defined(__GNUC__) && __GNUC__ >= 7
52#define FALL_THROUGH __attribute__((fallthrough))
59#if defined(_WIN32) || defined(_WIN64)
69#if !defined(ENV_32BITS) || !defined(ENV_64BITS)
71#if defined(__x86_64__) || defined(__ppc64__)
73#define __ENVBITS __ENV_64BITS
76#define __ENVBITS __ENV_32BITS
82#define BYTEORDER_LITTLE_ENDIAN 0
84#define BYTEORDER_BIG_ENDIAN 1
86#ifndef BYTEORDER_ENDIAN
88#if defined(__BYTE_ORDER__)
89#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
90#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
91#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
92#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
94#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
95#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
96#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
99#elif defined(__GLIBC__)
101#if (__BYTE_ORDER == __LITTLE_ENDIAN)
102#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
103#elif (__BYTE_ORDER == __BIG_ENDIAN)
104#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
106#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
107#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
108#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
111#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
112#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
113#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
114#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
116#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
117#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
118#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__)
119#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
120#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
121#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_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"
129#if defined(__windows__)
132typedef unsigned int uint;
134typedef unsigned long ulong;
136typedef unsigned short ushort;
138typedef unsigned char uchar;
143#define FORCE_INLINE __forceinline
144#elif defined(__linux__) || defined(__windows__)
145#define FORCE_INLINE static inline __attribute__((always_inline))
147#define FORCE_INLINE static inline __attribute__((always_inline))
162#define false (1 == 0)
176#define _str(__PTR) ((__PTR) ? (__PTR) : "NULL")
178#define _strp(__PTR) ((__PTR) ? (__PTR) : NULL)
180#define _strw(__PTR) ((__PTR) ? (__PTR) : " ")
182#define _nstr(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : "NULL")
184#define _nstrp(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : NULL)
187#define Malloc(__ptr, __struct, __size) \
191 __ptr = (__struct*)calloc(__size, sizeof(__struct)); \
194 n_log(LOG_ERR, "( %s *)calloc( %ld , sizeof( %s ) ) %s at line %d of %s \n", #__ptr, __size, #__struct, (__n_errno == 0) ? "malloc error" : strerror(__n_errno), __LINE__, __FILE__); \
199#define Alloca(__ptr, __size) \
203 __ptr = alloca(__size); \
206 n_log(LOG_ERR, "%s=alloca( %d ) %s at line %d of %s \n", #__ptr, __size, (__n_errno == 0) ? "alloca error" : strerror(__n_errno), __LINE__, __FILE__); \
208 memset(__ptr, 0, __size); \
213#define Realloc(__ptr, __struct, __size) \
217 void* __new_ptr = (__struct*)realloc(__ptr, __size * sizeof(__struct)); \
220 n_log(LOG_ERR, "( %s *)realloc( %s * sizeof( %d ) ) %s at line %d of %s \n", #__ptr, #__struct, __size, (__n_errno == 0) ? "realloc error" : strerror(__n_errno), __LINE__, __FILE__); \
227#define Reallocz(__ptr, __struct, __old_size, __size) \
231 void* __new_ptr = (__struct*)realloc(__ptr, __size); \
234 n_log(LOG_ERR, "( %s *)realloc( %s * sizeof( %d ) ) %s at line %d of %s \n", #__ptr, #__struct, __size, (__n_errno == 0) ? "realloc error" : strerror(__n_errno), __LINE__, __FILE__); \
237 if (__size > __old_size) memset((__ptr + __old_size), 0, __size - __old_size); \
247 n_log(LOG_DEBUG, "Free( %s ) already done or NULL at line %d of %s \n", #__ptr, __LINE__, __FILE__); \
251#define FreeNoLog(__ptr) \
258#define __n_assert(__ptr, __ret) \
260 n_log(LOG_DEBUG, "if( !(%s) ) assert at line %d of %s", #__ptr, __LINE__, __FILE__); \
265#define CALL_RETRY(__retvar, __expression, __max_tries, __delay) ({ \
266 int __nb_retries = 0; \
268 __retvar = (__expression); \
270 if (__retvar == -1 && errno == EINTR && __nb_retries < __max_tries) \
272 } while (__retvar == -1 && errno == EINTR && __nb_retries < __max_tries); \
277#define next_odd(__val) ((__val) % 2 == 0) ? (__val) : (__val + 1)
280#define next_even(__val) ((__val) % 2 == 0) ? (__val + 1) : (__val)
283#define init_error_check() \
284 static int ___error__check_flag = FALSE;
290#define ifzero if( 0 ==
293#define iffalse if( FALSE ==
296#define iftrue if( TRUE ==
299#define checkerror() \
300 if (___error__check_flag == TRUE) { \
301 n_log(LOG_ERR, "checkerror return false at line %d of %s", __LINE__, __FILE__); \
307 ___error__check_flag = TRUE; \
308 n_log(LOG_ERR, "First err was at line %d of %s", __LINE__, __FILE__); \
313 (___error__check_flag == TRUE)
316#define equal_if(__a, __cond, __b) \
317 if ((__a)__cond(__b)) { \
324#define RWLOCK_LOGLEVEL LOG_DEBUG
327#define RWLOCK_LOGLEVEL LOG_NULL
331#define init_lock(__rwlock_mutex) \
333 pthread_rwlockattr_t __attr; \
334 pthread_rwlockattr_init(&__attr); \
337 n_log(RWLOCK_LOGLEVEL, "init_lock %s", #__rwlock_mutex); \
338 __rwlock_mutex = (pthread_rwlock_t)PTHREAD_RWLOCK_INITIALIZER; \
339 __ret = pthread_rwlock_init(&(__rwlock_mutex), &__attr); \
341 n_log(LOG_ERR, "Error %s while initializing %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
343 pthread_rwlockattr_destroy(&__attr); \
349#define read_lock(__rwlock_mutex) \
353 n_log(RWLOCK_LOGLEVEL, "read lock %s", #__rwlock_mutex); \
354 __ret = pthread_rwlock_rdlock(&(__rwlock_mutex)); \
356 n_log(LOG_ERR, "Error %s while read locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
363#define write_lock(__rwlock_mutex) \
367 n_log(RWLOCK_LOGLEVEL, "write lock %s", #__rwlock_mutex); \
368 __ret = pthread_rwlock_wrlock(&(__rwlock_mutex)); \
370 n_log(LOG_ERR, "Error %s while write locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
377#define unlock(__rwlock_mutex) \
381 n_log(RWLOCK_LOGLEVEL, "unlock lock %s", #__rwlock_mutex); \
382 __ret = pthread_rwlock_unlock(&(__rwlock_mutex)); \
384 n_log(LOG_ERR, "Error %s while unlocking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
390#define rw_lock_destroy(__rwlock_mutex) \
394 n_log(RWLOCK_LOGLEVEL, "destroy lock %s", #__rwlock_mutex); \
395 __ret = pthread_rwlock_destroy(&(__rwlock_mutex)); \
397 n_log(LOG_ERR, "Error %s while destroying %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
412#define STOPWANTED 1002
421 srand((unsigned)time(NULL)); \
427#define MIN(a, b) (((a) < (b)) ? (a) : (b))
431#define MAX(a, b) (((a) > (b)) ? (a) : (b))
435#define CONCAT_BUILDER(a, b) a##b
437#define CONCAT(a, b) CONCAT_BUILDER(a, b)
439#if (BYTEORDER_ENDIAN == BYTEORDER_LITTLE_ENDIAN)
446#define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
448#define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
452void n_abort(
char const* format, ...);
466int n_popen(
char* cmd,
size_t read_buf_size,
void** nstr_output,
int* ret);
477#define N_DAEMON_NO_CLOSE 2
479#define N_DAEMON_NO_STD_REDIRECT 4
481#define N_DAEMON_NO_DOUBLE_FORK 8
483#define N_DAEMON_NO_SETSID 16
485#define N_DAEMON_NO_UMASK 32
487#define N_DAEMON_NO_CHDIR 64
489#define N_DAEMON_NO_SIGCHLD_IGN 128
491#define N_DAEMON_NO_SIGCHLD_HANDLER 256
497pid_t
system_nb(
const char* command,
int* infp,
int* outfp);
void log_environment(int loglevel)
log environment variables in syslog
char * get_prog_name(void)
get current program name
void N_HIDE_STR(char *buf,...)
store a hidden version of a string
int get_computer_name(char *computer_name, size_t len)
abort program with a text
void sigchld_handler(int sig)
Handles SIGCHLD issues when forking.
pid_t system_nb(const char *command, int *infp, int *outfp)
Non blocking system call.
char * n_get_file_extension(char path[])
get extension of path+filename
char * get_prog_dir(void)
get current program running directory
int n_daemonize_ex(int mode)
Daemonize program.
void n_abort(char const *format,...)
abort program with a text
int sigchld_handler_installer()
install signal SIGCHLD handler to reap zombie processes
int n_daemonize(void)
Daemonize program.
int file_exist(const char *filename)
test if file exist and if it's readable
Macro to build enums and their tostring counterparts, a reduced version of https://github....