1 /* See LICENSE for licence details. */
2 /* error functions */
3 enum loglevel_t {
4 DEBUG = 0,
5 WARN,
6 ERROR,
7 FATAL,
8 };
9
logging(enum loglevel_t loglevel,char * format,...)10 void logging(enum loglevel_t loglevel, char *format, ...)
11 {
12 va_list arg;
13 static const char *loglevel2str[] = {
14 [DEBUG] = "DEBUG",
15 [WARN] = "WARN",
16 [ERROR] = "ERROR",
17 [FATAL] = "FATAL",
18 };
19
20 if (loglevel == DEBUG && !VERBOSE)
21 return;
22
23 fprintf(stderr, ">>%s<<\t", loglevel2str[loglevel]);
24 va_start(arg, format);
25 vfprintf(stderr, format, arg);
26 va_end(arg);
27 }
28
29 /* wrapper of C functions */
eopen(const char * path,int flag)30 int eopen(const char *path, int flag)
31 {
32 int fd;
33 errno = 0;
34
35 if ((fd = open(path, flag)) < 0) {
36 logging(ERROR, "couldn't open \"%s\"\n", path);
37 logging(ERROR, "open: %s\n", strerror(errno));
38 }
39 return fd;
40 }
41
eclose(int fd)42 int eclose(int fd)
43 {
44 int ret = 0;
45 errno = 0;
46
47 if ((ret = close(fd)) < 0)
48 logging(ERROR, "close: %s\n", strerror(errno));
49
50 return ret;
51 }
52
efopen(const char * path,char * mode)53 FILE *efopen(const char *path, char *mode)
54 {
55 FILE *fp;
56 errno = 0;
57
58 if ((fp = fopen(path, mode)) == NULL) {
59 logging(ERROR, "couldn't open \"%s\"\n", path);
60 logging(ERROR, "fopen: %s\n", strerror(errno));
61 }
62 return fp;
63 }
64
efclose(FILE * fp)65 int efclose(FILE *fp)
66 {
67 int ret;
68 errno = 0;
69
70 if ((ret = fclose(fp)) < 0)
71 logging(ERROR, "fclose: %s\n", strerror(errno));
72
73 return ret;
74 }
75
ecalloc(size_t nmemb,size_t size)76 void *ecalloc(size_t nmemb, size_t size)
77 {
78 void *ptr;
79 errno = 0;
80
81 if ((ptr = calloc(nmemb, size)) == NULL)
82 logging(ERROR, "calloc: %s\n", strerror(errno));
83
84 return ptr;
85 }
86
estrtol(const char * nptr,char ** endptr,int base)87 long int estrtol(const char *nptr, char **endptr, int base)
88 {
89 long int ret;
90 errno = 0;
91
92 ret = strtol(nptr, endptr, base);
93 if (ret == LONG_MIN || ret == LONG_MAX) {
94 logging(ERROR, "strtol: %s\n", strerror(errno));
95 return 0;
96 }
97
98 return ret;
99 }
100
emkstemp(char * template)101 int emkstemp(char *template)
102 {
103 int ret;
104 errno = 0;
105
106 if ((ret = mkstemp(template)) < 0) {
107 logging(ERROR, "couldn't open \"%s\"\n", template);
108 logging(ERROR, "mkstemp: %s\n", strerror(errno));
109 }
110
111 return ret;
112 }
113
eselect(int max_fd,fd_set * readfds,fd_set * writefds,fd_set * errorfds,struct timeval * tv)114 int eselect(int max_fd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tv)
115 {
116 int ret;
117 errno = 0;
118
119 if ((ret = select(max_fd, readfds, writefds, errorfds, tv)) < 0) {
120 if (errno == EINTR)
121 return eselect(max_fd, readfds, writefds, errorfds, tv);
122 else
123 logging(ERROR, "select: %s\n", strerror(errno));
124 }
125 return ret;
126 }
127
ewrite(int fd,const void * buf,size_t size)128 ssize_t ewrite(int fd, const void *buf, size_t size)
129 {
130 ssize_t ret;
131 errno = 0;
132
133 if ((ret = write(fd, buf, size)) < 0) {
134 if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
135 return ewrite(fd, buf, size);
136 else
137 logging(ERROR, "write: %s\n", strerror(errno));
138 } else if (ret < (ssize_t) size) {
139 return ret + ewrite(fd, (char *) buf + ret, size - ret);
140 }
141 return ret;
142 }
143
esigaction(int signo,struct sigaction * act,struct sigaction * oact)144 int esigaction(int signo, struct sigaction *act, struct sigaction *oact)
145 {
146 int ret;
147 errno = 0;
148
149 if ((ret = sigaction(signo, act, oact)) < 0)
150 logging(ERROR, "sigaction: %s\n", strerror(errno));
151
152 return ret;
153 }
154
155 /*
156 int estat(const char *restrict path, struct stat *restrict buf)
157 {
158 int ret;
159 errno = 0;
160
161 if ((ret = stat(path, buf)) < 0)
162 logging(ERROR, "stat: %s\n", strerror(errno));
163
164 return ret;
165 }
166
167 void *emmap(void *addr, size_t len, int prot, int flag, int fd, off_t offset)
168 {
169 uint32_t *fp;
170 errno = 0;
171
172 if ((fp = (uint32_t *) mmap(addr, len, prot, flag, fd, offset)) == MAP_FAILED)
173 logging(ERROR, "mmap: %s\n", strerror(errno));
174
175 return fp;
176 }
177
178 int emunmap(void *ptr, size_t len)
179 {
180 int ret;
181 errno = 0;
182
183 if ((ret = munmap(ptr, len)) < 0)
184 logging(ERROR, "munmap: %s\n", strerror(errno));
185
186 return ret;
187 }
188 */
189
190 /* some useful functions */
str2num(char * str)191 int str2num(char *str)
192 {
193 if (str == NULL)
194 return 0;
195
196 return estrtol(str, NULL, 10);
197 }
198
199 /*
200 static inline void swapint(int *a, int *b)
201 {
202 int tmp = *a;
203 *a = *b;
204 *b = tmp;
205 }
206
207 static inline int my_ceil(int val, int div)
208 {
209 return (val + div - 1) / div;
210 }
211
212 static inline uint32_t bit_reverse(uint32_t val, int bits)
213 {
214 uint32_t ret = val;
215 int shift = bits - 1;
216
217 for (val >>= 1; val; val >>= 1) {
218 ret <<= 1;
219 ret |= val & 1;
220 shift--;
221 }
222
223 return ret <<= shift;
224 }
225 */
226