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