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