1*3e457fe3SDavid van Moolenbroek #ifndef _UTIL_STDLIB_H
2*3e457fe3SDavid van Moolenbroek #define _UTIL_STDLIB_H
3*3e457fe3SDavid van Moolenbroek
4*3e457fe3SDavid van Moolenbroek #include "util_def.h"
5*3e457fe3SDavid van Moolenbroek
6*3e457fe3SDavid van Moolenbroek #include <string.h>
7*3e457fe3SDavid van Moolenbroek
8*3e457fe3SDavid van Moolenbroek typedef struct util_stdlib_s {
9*3e457fe3SDavid van Moolenbroek int id;
10*3e457fe3SDavid van Moolenbroek char *name;
11*3e457fe3SDavid van Moolenbroek unsigned long flags;
12*3e457fe3SDavid van Moolenbroek } util_stdlib_t;
13*3e457fe3SDavid van Moolenbroek
14*3e457fe3SDavid van Moolenbroek typedef enum util_stdlib_id_e {
15*3e457fe3SDavid van Moolenbroek STDLIB_ACCEPT = 0,
16*3e457fe3SDavid van Moolenbroek STDLIB_ACCEPT4,
17*3e457fe3SDavid van Moolenbroek STDLIB_BIND,
18*3e457fe3SDavid van Moolenbroek STDLIB_BRK,
19*3e457fe3SDavid van Moolenbroek STDLIB_CALLOC,
20*3e457fe3SDavid van Moolenbroek STDLIB_EPOLL_CREATE,
21*3e457fe3SDavid van Moolenbroek STDLIB_EPOLL_CREATE1,
22*3e457fe3SDavid van Moolenbroek STDLIB_EPOLL_WAIT,
23*3e457fe3SDavid van Moolenbroek STDLIB_FREE,
24*3e457fe3SDavid van Moolenbroek STDLIB_GETSOCKOPT,
25*3e457fe3SDavid van Moolenbroek STDLIB_KILL,
26*3e457fe3SDavid van Moolenbroek STDLIB_LISTEN,
27*3e457fe3SDavid van Moolenbroek STDLIB_MALLOC,
28*3e457fe3SDavid van Moolenbroek STDLIB_MEMALIGN,
29*3e457fe3SDavid van Moolenbroek STDLIB_MMAP,
30*3e457fe3SDavid van Moolenbroek STDLIB_MMAP64,
31*3e457fe3SDavid van Moolenbroek STDLIB_MUNMAP,
32*3e457fe3SDavid van Moolenbroek STDLIB_POLL,
33*3e457fe3SDavid van Moolenbroek STDLIB_POSIX_MEMALIGN,
34*3e457fe3SDavid van Moolenbroek STDLIB_PPOLL,
35*3e457fe3SDavid van Moolenbroek STDLIB_PTHREAD_COND_WAIT,
36*3e457fe3SDavid van Moolenbroek STDLIB_PTHREAD_COND_TIMEDWAIT,
37*3e457fe3SDavid van Moolenbroek STDLIB_PTHREAD_JOIN,
38*3e457fe3SDavid van Moolenbroek STDLIB_READ,
39*3e457fe3SDavid van Moolenbroek STDLIB_REALLOC,
40*3e457fe3SDavid van Moolenbroek STDLIB_RECV,
41*3e457fe3SDavid van Moolenbroek STDLIB_RECVFROM,
42*3e457fe3SDavid van Moolenbroek STDLIB_RECVMSG,
43*3e457fe3SDavid van Moolenbroek STDLIB_SBRK,
44*3e457fe3SDavid van Moolenbroek STDLIB_SELECT,
45*3e457fe3SDavid van Moolenbroek STDLIB_SEMOP,
46*3e457fe3SDavid van Moolenbroek STDLIB_SEMTIMEDOP,
47*3e457fe3SDavid van Moolenbroek STDLIB_SETSOCKOPT,
48*3e457fe3SDavid van Moolenbroek STDLIB_SHMAT,
49*3e457fe3SDavid van Moolenbroek STDLIB_SHMDT,
50*3e457fe3SDavid van Moolenbroek STDLIB_SIGSUSPEND,
51*3e457fe3SDavid van Moolenbroek STDLIB_SIGTIMEDWAIT,
52*3e457fe3SDavid van Moolenbroek STDLIB_SIGWAITINFO,
53*3e457fe3SDavid van Moolenbroek STDLIB_SLEEP,
54*3e457fe3SDavid van Moolenbroek STDLIB_SOCKET,
55*3e457fe3SDavid van Moolenbroek STDLIB_USLEEP,
56*3e457fe3SDavid van Moolenbroek STDLIB_VALLOC,
57*3e457fe3SDavid van Moolenbroek STDLIB_WAITPID,
58*3e457fe3SDavid van Moolenbroek __NUM_STDLIBS_IDS
59*3e457fe3SDavid van Moolenbroek } util_stdlib_id_t;
60*3e457fe3SDavid van Moolenbroek
61*3e457fe3SDavid van Moolenbroek typedef enum util_stdlib_flag_e {
62*3e457fe3SDavid van Moolenbroek STLIB_BLOCK_EXT = 0,
63*3e457fe3SDavid van Moolenbroek STLIB_BLOCK_INT,
64*3e457fe3SDavid van Moolenbroek __NUM_STDLIBS_FLAGS
65*3e457fe3SDavid van Moolenbroek } util_stdlib_flag_t;
66*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAGS_STR "ei"
67*3e457fe3SDavid van Moolenbroek
68*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAG(F) (1 << (F))
69*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_BLOCK_MASK \
70*3e457fe3SDavid van Moolenbroek (_UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)|_UTIL_STLIB_FLAG(STLIB_BLOCK_INT))
71*3e457fe3SDavid van Moolenbroek
72*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAGS_STR_BUFF_SIZE (__NUM_STDLIBS_FLAGS+1)
73*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAG_C(F, E) \
74*3e457fe3SDavid van Moolenbroek (((F) & _UTIL_STLIB_FLAG(E)) ? _UTIL_STLIB_FLAGS_STR[E] : '-')
75*3e457fe3SDavid van Moolenbroek
76*3e457fe3SDavid van Moolenbroek #define _UTIL_STDLIB_DEF(ID, N, F) { (ID), (N), (F) }
77*3e457fe3SDavid van Moolenbroek #define _UTIL_STDLIBS_INITIALIZER { \
78*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_ACCEPT, "accept", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
79*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_ACCEPT4, "accept4", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
80*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_BIND, "bind", 0), \
81*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_BRK, "brk", 0), \
82*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_CALLOC, "calloc", 0), \
83*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE, "epoll_create", 0), \
84*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE1, "epoll_create1", 0), \
85*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_EPOLL_WAIT, "epoll_wait", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
86*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_FREE, "free", 0), \
87*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_GETSOCKOPT, "getsockopt", 0), \
88*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_KILL, "kill", 0), \
89*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_LISTEN, "listen", 0), \
90*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_MALLOC, "malloc", 0), \
91*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_MEMALIGN, "memalign", 0), \
92*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_MMAP, "mmap", 0), \
93*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_MMAP64, "mmap64", 0), \
94*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_MUNMAP, "munmap", 0), \
95*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_POLL, "poll", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
96*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_POSIX_MEMALIGN, "posix_memalign", 0), \
97*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_PPOLL, "ppoll", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
98*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_WAIT, "pthread_cond_wait", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
99*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_TIMEDWAIT, "pthread_cond_timedwait", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
100*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_PTHREAD_JOIN, "pthread_join", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
101*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_READ, "read", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
102*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_REALLOC, "realloc", 0), \
103*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_RECV, "recv", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
104*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_RECVFROM, "recvfrom", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
105*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_RECVMSG, "recvsmg", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
106*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SBRK, "sbrk", 0), \
107*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SELECT, "select", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
108*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SEMOP, "semop", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
109*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SEMTIMEDOP, "semtimedop", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
110*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SETSOCKOPT, "setsockopt", 0), \
111*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SHMAT, "shmat", 0), \
112*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SHMDT, "shmdt", 0), \
113*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SIGSUSPEND, "sigsuspend", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
114*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SIGTIMEDWAIT, "sigtimedwait", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
115*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SIGWAITINFO, "sigwaitinfo", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
116*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SLEEP, "sleep", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
117*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_SOCKET, "socket", 0), \
118*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_USLEEP, "usleep", _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
119*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_VALLOC, "valloc", 0), \
120*3e457fe3SDavid van Moolenbroek _UTIL_STDLIB_DEF(STDLIB_WAITPID, "waitpid", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)) \
121*3e457fe3SDavid van Moolenbroek }
122*3e457fe3SDavid van Moolenbroek
util_stdlib_lookup_by_name(const char * name,util_stdlib_t * stlib_arr)123*3e457fe3SDavid van Moolenbroek static inline util_stdlib_t* util_stdlib_lookup_by_name(const char *name, util_stdlib_t *stlib_arr)
124*3e457fe3SDavid van Moolenbroek {
125*3e457fe3SDavid van Moolenbroek int i;
126*3e457fe3SDavid van Moolenbroek for (i=0;i<__NUM_STDLIBS_IDS;i++) {
127*3e457fe3SDavid van Moolenbroek if (!strcmp(name, stlib_arr[i].name)) {
128*3e457fe3SDavid van Moolenbroek return &stlib_arr[i];
129*3e457fe3SDavid van Moolenbroek }
130*3e457fe3SDavid van Moolenbroek }
131*3e457fe3SDavid van Moolenbroek
132*3e457fe3SDavid van Moolenbroek return NULL;
133*3e457fe3SDavid van Moolenbroek }
134*3e457fe3SDavid van Moolenbroek
util_stdlib_flags_to_str(unsigned long flags,char * buffer)135*3e457fe3SDavid van Moolenbroek static inline char* util_stdlib_flags_to_str(unsigned long flags,
136*3e457fe3SDavid van Moolenbroek char* buffer)
137*3e457fe3SDavid van Moolenbroek {
138*3e457fe3SDavid van Moolenbroek int i;
139*3e457fe3SDavid van Moolenbroek for(i=0;i<__NUM_STDLIBS_FLAGS;i++) {
140*3e457fe3SDavid van Moolenbroek buffer[i] = _UTIL_STLIB_FLAG_C(flags, i);
141*3e457fe3SDavid van Moolenbroek }
142*3e457fe3SDavid van Moolenbroek buffer[i] = '\0';
143*3e457fe3SDavid van Moolenbroek
144*3e457fe3SDavid van Moolenbroek return buffer;
145*3e457fe3SDavid van Moolenbroek }
146*3e457fe3SDavid van Moolenbroek
147*3e457fe3SDavid van Moolenbroek #endif /* _UTIL_STDLIB_H */
148*3e457fe3SDavid van Moolenbroek
149