8#ifndef __NILOREA_COMMONS__
9#define __NILOREA_COMMONS__
33#if defined( _WIN32 ) || defined( _WIN64 )
38#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
41#define WIFEXITED(w) (((w) & 0xff) == 0)
51#if defined(__GNUC__) && __GNUC__ >= 7
53#define FALL_THROUGH __attribute__ ((fallthrough))
60#if defined( _WIN32 ) || defined( _WIN64 )
70#if !defined( ENV_32BITS ) || !defined( ENV_64BITS )
71#if defined( __GNUC__ )
72#if defined( __x86_64__ ) || defined( __ppc64__ )
74#define __ENVBITS __ENV_64BITS
77#define __ENVBITS __ENV_32BITS
83#define BYTEORDER_LITTLE_ENDIAN 0
85#define BYTEORDER_BIG_ENDIAN 1
88#ifndef BYTEORDER_ENDIAN
90#if defined(__BYTE_ORDER__)
91#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
92#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
93#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
94#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
96#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
97#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
98#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
101#elif defined(__GLIBC__)
103#if (__BYTE_ORDER == __LITTLE_ENDIAN)
104#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
105#elif (__BYTE_ORDER == __BIG_ENDIAN)
106#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
108#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
109#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
110#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
113#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
114#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
115#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
116#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
118#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
119#define BYTEORDER_ENDIAN BYTEORDER_BIG_ENDIAN
120#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__)
121#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
122#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
123#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
125#define BYTEORDER_ENDIAN BYTEORDER_LITTLE_ENDIAN
126#warning "Unknown machine byteorder endianness detected. User needs to define BYTEORDER_ENDIAN."
127#warning "Setting default to BYTEORDER_LITTLE_ENDIAN"
131#if defined( __windows__ )
134 typedef unsigned int uint;
136 typedef unsigned long ulong;
138 typedef unsigned short ushort;
140 typedef unsigned char uchar;
145#define FORCE_INLINE __forceinline
146#elif defined( __linux__ ) || defined( __windows__ )
147#define FORCE_INLINE static inline __attribute__((always_inline))
149#define FORCE_INLINE static inline __attribute__((always_inline))
180#define _str( __PTR ) ((__PTR)?(__PTR):"NULL")
182#define _strp( __PTR ) ((__PTR)?(__PTR):NULL)
184#define _strw( __PTR ) ((__PTR)?(__PTR):" ")
186#define _nstr( __PTR ) ((__PTR&&__PTR->data)?(__PTR->data):"NULL")
188#define _nstrp( __PTR ) ((__PTR&&__PTR->data)?(__PTR->data):NULL)
191#define Malloc( __ptr , __struct , __size ) \
193 int __n_errno = 0 ; \
194 int64_t __byte_size = __size ; \
195 if( __byte_size <= 0 ) __byte_size = 16; \
197 __ptr = ( __struct *)calloc( __byte_size , sizeof( __struct ) ); \
201 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__); \
206#define Alloca( __ptr , __size ) \
208 int __n_errno = 0 ; \
209 int64_t __byte_size = __size ; \
210 if( __byte_size <= 0 ) __byte_size = 16 ; \
212 __ptr = alloca( __byte_size ); \
216 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__); \
220 memset( __ptr , 0 , __byte_size ); \
225#define Realloc( __ptr, __struct , __size ) \
227 int __n_errno = 0 ; \
228 int64_t __byte_size = __size * sizeof( __struct ); \
229 if( __byte_size <= 0 ) __byte_size = 16 ; \
231 void *__new_ptr = ( __struct *)realloc( __ptr , __byte_size ); \
232 __n_errno = errno ; \
235 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__);\
239 __ptr = __new_ptr ; \
244#define Reallocz( __ptr, __struct , __old_size , __size ) \
246 int __n_errno = 0 ; \
247 size_t __byte_size = __size * sizeof( __struct ); \
248 if( __byte_size <= 0 ) __byte_size = 16 ; \
250 void *__new_ptr = ( __struct *)realloc( __ptr , __byte_size ); \
251 __n_errno = errno ; \
254 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__);\
258 __ptr = __new_ptr ; \
259 if( __byte_size > __old_size ) memset( ( __ptr + __old_size ) , 0 , __byte_size - __old_size ); \
264#define Free( __ptr ) \
272 n_log( LOG_DEBUG , "Free( %s ) already done or NULL at line %d of %s \n", #__ptr , __LINE__ , __FILE__ );\
276#define FreeNoLog( __ptr )\
284#define __n_assert( __ptr , __ret ) \
287 n_log( LOG_DEBUG , "if( !(%s) ) assert at line %d of %s" , #__ptr , __LINE__ , __FILE__ ); \
292#define CALL_RETRY(retvar, expression) do { \
293 retvar = (expression); \
294} while (retvar == -1 && errno == EINTR);
297#define next_odd( __val ) ( (__val)%2 == 0 ) ? (__val) : ( __val + 1 )
300#define next_even( __val ) ( (__val)%2 == 0 ) ? (__val + 1) : ( __val )
304#define init_error_check() \
305 static int ___error__check_flag = FALSE ;
311#define ifzero if( 0 ==
314#define iffalse if( FALSE ==
317#define iftrue if( TRUE ==
320#define checkerror() if( ___error__check_flag == TRUE ) \
321{ n_log( LOG_ERR , "checkerror return false at line %d of %s" , __LINE__ , __FILE__ ); \
326#define endif ){ ___error__check_flag = TRUE ; n_log( LOG_ERR , "First err was at line %d of %s" , __LINE__ , __FILE__ );}
330(___error__check_flag == TRUE)
333#define equal_if( __a , __cond , __b ) if( (__a) __cond (__b) ){ __a = __b ; }
338#define RWLOCK_LOGLEVEL LOG_DEBUG
341#define RWLOCK_LOGLEVEL LOG_NULL
345#define init_lock( __rwlock_mutex ) \
347 pthread_rwlockattr_t __attr ; \
348 pthread_rwlockattr_init( &__attr ); \
352 n_log( RWLOCK_LOGLEVEL , "init_lock %s" , #__rwlock_mutex ); \
353 __rwlock_mutex = (pthread_rwlock_t)PTHREAD_RWLOCK_INITIALIZER ; \
354 __ret = pthread_rwlock_init( &(__rwlock_mutex) , &__attr ); \
357 n_log( LOG_ERR , "Error %s while initializing %s at %s:%s:%d" , strerror( __ret ) , #__rwlock_mutex , __FILE__ , __func__ , __LINE__ ); \
359 pthread_rwlockattr_destroy( &__attr ); \
365#define read_lock( __rwlock_mutex ) \
370 n_log( RWLOCK_LOGLEVEL , "read lock %s" , #__rwlock_mutex ); \
371 __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 ) \
386 n_log( RWLOCK_LOGLEVEL , "write lock %s" , #__rwlock_mutex ); \
387 __ret = pthread_rwlock_wrlock( &(__rwlock_mutex) ); \
390 n_log( LOG_ERR , "Error %s while write locking %s at %s:%s:%d" , strerror( __ret ) , #__rwlock_mutex , __FILE__ , __func__ , __LINE__ ); \
397#define unlock( __rwlock_mutex ) \
402 n_log( RWLOCK_LOGLEVEL , "unlock lock %s" , #__rwlock_mutex ); \
403 __ret = pthread_rwlock_unlock( &(__rwlock_mutex) ); \
406 n_log( LOG_ERR , "Error %s while unlocking %s at %s:%s:%d" , strerror( __ret ) , #__rwlock_mutex , __FILE__ , __func__ , __LINE__ ); \
412#define rw_lock_destroy( __rwlock_mutex ) \
417 n_log( RWLOCK_LOGLEVEL , "destroy lock %s" , #__rwlock_mutex ); \
418 __ret = pthread_rwlock_destroy( &(__rwlock_mutex) ); \
421 n_log( LOG_ERR , "Error %s while destroying %s at %s:%s:%d" , strerror( __ret ) , #__rwlock_mutex , __FILE__ , __func__ , __LINE__ ); \
436#define STOPWANTED 1002
443#define randomize() { srand((unsigned)time(NULL)); rand(); }
447#define MIN(a,b) (((a)<(b))?(a):(b))
451#define MAX(a,b) (((a)>(b))?(a):(b))
456#define CONCAT_BUILDER(a, b) a ## b
458#define CONCAT(a, b) CONCAT_BUILDER(a, b)
460#if( BYTEORDER_ENDIAN == BYTEORDER_LITTLE_ENDIAN )
462# define htonll(x) (x)
464# define ntohll(x) (x)
467# define htonll(x) ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
469# define ntohll(x) ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
473 void n_abort(
char const *format, ... );
487 int n_popen(
char *cmd,
int read_buf_size,
void **nstr_output,
int *ret );
498#define N_DAEMON_NO_CLOSE 2
500#define N_DAEMON_NO_STD_REDIRECT 4
502#define N_DAEMON_NO_DOUBLE_FORK 8
504#define N_DAEMON_NO_SETSID 16
506#define N_DAEMON_NO_UMASK 32
508#define N_DAEMON_NO_CHDIR 64
510#define N_DAEMON_NO_SIGCHLD_IGN 128
512#define N_DAEMON_NO_SIGCHLD_HANDLER 256
518 pid_t
system_nb(
const char * command,
int * infp,
int * outfp);
void log_environment(int loglevel)
log environment 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
int n_popen(char *cmd, int read_buf_size, void **nstr_output, int *ret)
launch a command abd return output and status
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....