9#ifndef __NILOREA_COMMONS__
10#define __NILOREA_COMMONS__
33#if defined(_WIN32) || defined(_WIN64)
38#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
41#define WIFEXITED(w) (((w) & 0xff) == 0)
48#if defined(__GNUC__) && __GNUC__ >= 7
50#define FALL_THROUGH __attribute__((fallthrough))
57#if defined(_WIN32) || defined(_WIN64)
67#if !defined(ENV_32BITS) || !defined(ENV_64BITS)
69#if defined(__x86_64__) || defined(__ppc64__)
71#define __ENVBITS __ENV_64BITS
74#define __ENVBITS __ENV_32BITS
80#define BYTEORDER_LITTLE_ENDIAN 0
82#define BYTEORDER_BIG_ENDIAN 1
84#ifndef BYTEORDER_ENDIAN
86#if defined(__BYTE_ORDER__)
87#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
88#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
89#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
90#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
92#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
93#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
94#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
97#elif defined(__GLIBC__)
99#if (__BYTE_ORDER == __LITTLE_ENDIAN)
100#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
101#elif (__BYTE_ORDER == __BIG_ENDIAN)
102#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
104#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
105#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
106#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
109#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
110#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
111#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
112#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
114#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
115#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
116#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__)
117#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
118#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
119#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
121#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
122#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
123#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
127#if defined(__windows__)
130typedef unsigned int uint;
132typedef unsigned long ulong;
134typedef unsigned short ushort;
136typedef unsigned char uchar;
141#define FORCE_INLINE __forceinline
142#elif defined(__linux__) || defined(__windows__)
143#define FORCE_INLINE static inline __attribute__((always_inline))
145#define FORCE_INLINE static inline __attribute__((always_inline))
160#define false (1 == 0)
174#define _str(__PTR) ((__PTR) ? (__PTR) : "NULL")
176#define _strp(__PTR) ((__PTR) ? (__PTR) : NULL)
178#define _strw(__PTR) ((__PTR) ? (__PTR) : " ")
180#define _nstr(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : "NULL")
182#define _nstrp(__PTR) ((__PTR && __PTR->data) ? (__PTR->data) : NULL)
185#define Malloc(__ptr, __struct, __size) \
189 __ptr = (__struct*)calloc(__size, sizeof(__struct)); \
192 n_log(LOG_ERR, "( %s *)calloc( %ld , sizeof( %s ) ) %s at line %d of %s", #__ptr, __size, #__struct, (__n_errno == 0) ? "malloc error" : strerror(__n_errno), __LINE__, __FILE__); \
197#define Alloca(__ptr, __size) \
201 __ptr = alloca(__size); \
204 n_log(LOG_ERR, "%s=alloca( %d ) %s at line %d of %s", #__ptr, __size, (__n_errno == 0) ? "alloca error" : strerror(__n_errno), __LINE__, __FILE__); \
206 memset(__ptr, 0, __size); \
211#define Realloc(__ptr, __struct, __size) \
215 void* __new_ptr = (__struct*)realloc(__ptr, __size * sizeof(__struct)); \
218 n_log(LOG_ERR, "( %s *)realloc( %s * sizeof( %d ) ) %s at line %d of %s", #__ptr, #__struct, __size, (__n_errno == 0) ? "realloc error" : strerror(__n_errno), __LINE__, __FILE__); \
225#define Reallocz(__ptr, __struct, __old_size, __size) \
229 void* __new_ptr = (__struct*)realloc(__ptr, __size); \
232 n_log(LOG_ERR, "( %s *)realloc( %s * sizeof( %d ) ) %s at line %d of %s", #__ptr, #__struct, __size, (__n_errno == 0) ? "realloc error" : strerror(__n_errno), __LINE__, __FILE__); \
235 if (__size > __old_size) memset((__ptr + __old_size), 0, __size - __old_size); \
245 n_log(LOG_DEBUG, "Free( %s ) already done or NULL at line %d of %s", #__ptr, __LINE__, __FILE__); \
249#define FreeNoLog(__ptr) \
256#define __n_assert(__ptr, __ret) \
258 n_log(LOG_DEBUG, "if( !(%s) ) assert at line %d of %s", #__ptr, __LINE__, __FILE__); \
263#define CALL_RETRY(__retvar, __expression, __max_tries, __delay) ({ \
264 int __nb_retries = 0; \
266 __retvar = (__expression); \
268 if (__retvar == -1 && errno == EINTR && __nb_retries < __max_tries) \
270 } while (__retvar == -1 && errno == EINTR && __nb_retries < __max_tries); \
275#define next_odd(__val) ((__val) % 2 == 0) ? (__val) : (__val + 1)
278#define next_even(__val) ((__val) % 2 == 0) ? (__val + 1) : (__val)
281#define init_error_check() \
282 static int ___error__check_flag = FALSE;
288#define ifzero if( 0 ==
291#define iffalse if( FALSE ==
294#define iftrue if( TRUE ==
297#define checkerror() \
298 if (___error__check_flag == TRUE) { \
299 n_log(LOG_ERR, "checkerror return false at line %d of %s", __LINE__, __FILE__); \
305 ___error__check_flag = TRUE; \
306 n_log(LOG_ERR, "First err was at line %d of %s", __LINE__, __FILE__); \
311 (___error__check_flag == TRUE)
314#define equal_if(__a, __cond, __b) \
315 if ((__a)__cond(__b)) { \
322#define RWLOCK_LOGLEVEL LOG_DEBUG
325#define RWLOCK_LOGLEVEL LOG_NULL
329#define init_lock(__rwlock_mutex) \
331 pthread_rwlockattr_t __attr; \
332 pthread_rwlockattr_init(&__attr); \
335 n_log(RWLOCK_LOGLEVEL, "init_lock %s", #__rwlock_mutex); \
336 __rwlock_mutex = (pthread_rwlock_t)PTHREAD_RWLOCK_INITIALIZER; \
337 __ret = pthread_rwlock_init(&(__rwlock_mutex), &__attr); \
339 n_log(LOG_ERR, "Error %s while initializing %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
341 pthread_rwlockattr_destroy(&__attr); \
347#define read_lock(__rwlock_mutex) \
351 n_log(RWLOCK_LOGLEVEL, "read lock %s", #__rwlock_mutex); \
352 __ret = pthread_rwlock_rdlock(&(__rwlock_mutex)); \
354 n_log(LOG_ERR, "Error %s while read locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
361#define write_lock(__rwlock_mutex) \
365 n_log(RWLOCK_LOGLEVEL, "write lock %s", #__rwlock_mutex); \
366 __ret = pthread_rwlock_wrlock(&(__rwlock_mutex)); \
368 n_log(LOG_ERR, "Error %s while write locking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
375#define unlock(__rwlock_mutex) \
379 n_log(RWLOCK_LOGLEVEL, "unlock lock %s", #__rwlock_mutex); \
380 __ret = pthread_rwlock_unlock(&(__rwlock_mutex)); \
382 n_log(LOG_ERR, "Error %s while unlocking %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
388#define rw_lock_destroy(__rwlock_mutex) \
392 n_log(RWLOCK_LOGLEVEL, "destroy lock %s", #__rwlock_mutex); \
393 __ret = pthread_rwlock_destroy(&(__rwlock_mutex)); \
395 n_log(LOG_ERR, "Error %s while destroying %s at %s:%s:%d", strerror(__ret), #__rwlock_mutex, __FILE__, __func__, __LINE__); \
410#define STOPWANTED 1002
419 srand((unsigned)time(NULL)); \
425#define MIN(a, b) (((a) < (b)) ? (a) : (b))
429#define MAX(a, b) (((a) > (b)) ? (a) : (b))
433#define CONCAT_BUILDER(a, b) a##b
435#define CONCAT(a, b) CONCAT_BUILDER(a, b)
437#if (BYTEORDER_ENDIAN == BYTEORDER_BIG_ENDIAN)
449#define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
453#define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
458void n_abort(
char const* format, ...);
472int n_popen(
char* cmd,
size_t read_buf_size,
void** nstr_output,
int* ret);
483#define N_DAEMON_NO_CLOSE 2
485#define N_DAEMON_NO_STD_REDIRECT 4
487#define N_DAEMON_NO_DOUBLE_FORK 8
489#define N_DAEMON_NO_SETSID 16
491#define N_DAEMON_NO_UMASK 32
493#define N_DAEMON_NO_CHDIR 64
495#define N_DAEMON_NO_SIGCHLD_IGN 128
497#define N_DAEMON_NO_SIGCHLD_HANDLER 256
503pid_t
system_nb(
const char* command,
int* infp,
int* outfp);
int mode
Network for managing conenctions.
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,...)
htonl for 64 bits numbers
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
int n_popen(char *cmd, size_t read_buf_size, void **nstr_output, int *ret)
launch a command abd return output and status
Macro to build enums and their tostring counterparts, a reduced version of https://github....