1 /* See LICENSE file for copyright and license details. */
2 #include <sys/wait.h>
3 #include <unistd.h>
4 
5 #define eexecvp(F, ...) (execvp(F, __VA_ARGS__), eprintf("exec %s:", F))
6 #define eexeclp(F, ...) (execlp(F, __VA_ARGS__), eprintf("exec %s:", F))
7 
8 static inline void
epipe(int fds[2])9 epipe(int fds[2])
10 {
11 	if (pipe(fds))
12 		eprintf("pipe:");
13 }
14 
15 static inline pid_t
efork(void)16 efork(void)
17 {
18 	pid_t ret = fork();
19 	if (ret < 0)
20 		eprintf("fork:");
21 	return ret;
22 }
23 
24 static inline void
edup2(int old,int new)25 edup2(int old, int new)
26 {
27 	if (dup2(old, new) < 0)
28 		eprintf("dup2:");
29 }
30 
31 static inline int
edup(int fd)32 edup(int fd)
33 {
34 	int ret = dup(fd);
35 	if (ret < 0)
36 		eprintf("dup:");
37 	return ret;
38 }
39 
40 static inline pid_t
ewaitpid(pid_t pid,int * status,int flags)41 ewaitpid(pid_t pid, int *status, int flags)
42 {
43 	pid_t ret = waitpid(pid, status, flags);
44 	if (ret < 0)
45 		eprintf("waitpid:");
46 	return ret;
47 }
48 
49 static inline size_t
eread(int fd,void * buf,size_t n,const char * fname)50 eread(int fd, void *buf, size_t n, const char *fname)
51 {
52 	ssize_t ret = read(fd, buf, n);
53 	if (ret < 0)
54 		eprintf("read %s:", fname);
55 	return (size_t)ret;
56 }
57 
58 static inline size_t
epread(int fd,void * buf,size_t n,off_t off,const char * fname)59 epread(int fd, void *buf, size_t n, off_t off, const char *fname)
60 {
61 	ssize_t ret = pread(fd, buf, n, off);
62 	if (ret < 0)
63 		eprintf("pread %s:", fname);
64 	return (size_t)ret;
65 }
66 
67 static inline off_t
elseek(int fd,off_t offset,int whence,const char * fname)68 elseek(int fd, off_t offset, int whence, const char *fname)
69 {
70 	off_t ret = lseek(fd, offset, whence);
71 	if (ret < 0)
72 		eprintf("lseek %s:", fname);
73 	return ret;
74 }
75