149 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _UTIL_STDLIB_H
 | |
| #define _UTIL_STDLIB_H
 | |
| 
 | |
| #include "util_def.h"
 | |
| 
 | |
| #include <string.h>
 | |
| 
 | |
| typedef struct util_stdlib_s {
 | |
|     int id;
 | |
|     char *name;
 | |
|     unsigned long flags;
 | |
| } util_stdlib_t;
 | |
| 
 | |
| typedef enum util_stdlib_id_e {
 | |
|     STDLIB_ACCEPT = 0,
 | |
|     STDLIB_ACCEPT4,
 | |
|     STDLIB_BIND,
 | |
|     STDLIB_BRK,
 | |
|     STDLIB_CALLOC,
 | |
|     STDLIB_EPOLL_CREATE,
 | |
|     STDLIB_EPOLL_CREATE1,
 | |
|     STDLIB_EPOLL_WAIT,
 | |
|     STDLIB_FREE,
 | |
|     STDLIB_GETSOCKOPT,
 | |
|     STDLIB_KILL,
 | |
|     STDLIB_LISTEN,
 | |
|     STDLIB_MALLOC,
 | |
|     STDLIB_MEMALIGN,
 | |
|     STDLIB_MMAP,
 | |
|     STDLIB_MMAP64,
 | |
|     STDLIB_MUNMAP,
 | |
|     STDLIB_POLL,
 | |
|     STDLIB_POSIX_MEMALIGN,
 | |
|     STDLIB_PPOLL,
 | |
|     STDLIB_PTHREAD_COND_WAIT,
 | |
|     STDLIB_PTHREAD_COND_TIMEDWAIT,
 | |
|     STDLIB_PTHREAD_JOIN,
 | |
|     STDLIB_READ,
 | |
|     STDLIB_REALLOC,
 | |
|     STDLIB_RECV,
 | |
|     STDLIB_RECVFROM,
 | |
|     STDLIB_RECVMSG,
 | |
|     STDLIB_SBRK,
 | |
|     STDLIB_SELECT,
 | |
|     STDLIB_SEMOP,
 | |
|     STDLIB_SEMTIMEDOP,
 | |
|     STDLIB_SETSOCKOPT,
 | |
|     STDLIB_SHMAT,
 | |
|     STDLIB_SHMDT,
 | |
|     STDLIB_SIGSUSPEND,
 | |
|     STDLIB_SIGTIMEDWAIT,
 | |
|     STDLIB_SIGWAITINFO,
 | |
|     STDLIB_SLEEP,
 | |
|     STDLIB_SOCKET,
 | |
|     STDLIB_USLEEP,
 | |
|     STDLIB_VALLOC,
 | |
|     STDLIB_WAITPID,
 | |
|     __NUM_STDLIBS_IDS
 | |
| } util_stdlib_id_t;
 | |
| 
 | |
| typedef enum util_stdlib_flag_e {
 | |
|     STLIB_BLOCK_EXT = 0,
 | |
|     STLIB_BLOCK_INT,
 | |
|     __NUM_STDLIBS_FLAGS
 | |
| } util_stdlib_flag_t;
 | |
| #define _UTIL_STLIB_FLAGS_STR    "ei"
 | |
| 
 | |
| #define _UTIL_STLIB_FLAG(F) (1 << (F))
 | |
| #define _UTIL_STLIB_BLOCK_MASK \
 | |
|     (_UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)|_UTIL_STLIB_FLAG(STLIB_BLOCK_INT))
 | |
| 
 | |
| #define _UTIL_STLIB_FLAGS_STR_BUFF_SIZE (__NUM_STDLIBS_FLAGS+1)
 | |
| #define _UTIL_STLIB_FLAG_C(F, E) \
 | |
|     (((F) & _UTIL_STLIB_FLAG(E)) ? _UTIL_STLIB_FLAGS_STR[E] : '-')
 | |
| 
 | |
| #define _UTIL_STDLIB_DEF(ID, N, F) { (ID), (N), (F) }
 | |
| #define _UTIL_STDLIBS_INITIALIZER { \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_ACCEPT,                 "accept",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_ACCEPT4,                "accept4",                _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_BIND,                   "bind",                   0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_BRK,                    "brk",                    0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_CALLOC,                 "calloc",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE,           "epoll_create",           0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE1,          "epoll_create1",          0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_EPOLL_WAIT,             "epoll_wait",             _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_FREE,                   "free",                   0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_GETSOCKOPT,             "getsockopt",             0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_KILL,                   "kill",                   0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_LISTEN,                 "listen",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_MALLOC,                 "malloc",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_MEMALIGN,               "memalign",               0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_MMAP,                   "mmap",                   0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_MMAP64,                 "mmap64",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_MUNMAP,                 "munmap",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_POLL,                   "poll",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_POSIX_MEMALIGN,         "posix_memalign",         0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_PPOLL,                  "ppoll",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_WAIT,      "pthread_cond_wait",      _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_TIMEDWAIT, "pthread_cond_timedwait", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_PTHREAD_JOIN,           "pthread_join",           _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_READ,                   "read",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_REALLOC,                "realloc",                0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_RECV,                   "recv",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_RECVFROM,               "recvfrom",               _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_RECVMSG,                "recvsmg",                _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SBRK,                   "sbrk",                   0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SELECT,                 "select",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SEMOP,                  "semop",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SEMTIMEDOP,             "semtimedop",             _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SETSOCKOPT,             "setsockopt",             0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SHMAT,                  "shmat",                  0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SHMDT,                  "shmdt",                  0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SIGSUSPEND,             "sigsuspend",             _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SIGTIMEDWAIT,           "sigtimedwait",           _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SIGWAITINFO,            "sigwaitinfo",            _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SLEEP,                  "sleep",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_SOCKET,                 "socket",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_USLEEP,                 "usleep",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_VALLOC,                 "valloc",                 0), \
 | |
|     _UTIL_STDLIB_DEF(STDLIB_WAITPID,                "waitpid",                _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)) \
 | |
| }
 | |
| 
 | |
| static inline util_stdlib_t* util_stdlib_lookup_by_name(const char *name, util_stdlib_t *stlib_arr)
 | |
| {
 | |
|     int i;
 | |
|     for (i=0;i<__NUM_STDLIBS_IDS;i++) {
 | |
|         if (!strcmp(name, stlib_arr[i].name)) {
 | |
|             return &stlib_arr[i];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| static inline char* util_stdlib_flags_to_str(unsigned long flags,
 | |
|     char* buffer)
 | |
| {
 | |
|     int i;
 | |
|     for(i=0;i<__NUM_STDLIBS_FLAGS;i++) {
 | |
|         buffer[i] = _UTIL_STLIB_FLAG_C(flags, i);
 | |
|     }
 | |
|     buffer[i] = '\0';
 | |
| 
 | |
|     return buffer;
 | |
| }
 | |
| 
 | |
| #endif /* _UTIL_STDLIB_H */
 | |
| 
 | 
