diff options
author | Rob Landley <rob@landley.net> | 2016-09-04 17:26:34 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2016-09-04 17:26:34 -0500 |
commit | 299d43879d70de33f84eafab78fcd78d7befd827 (patch) | |
tree | 6294a1bf61e21553ac827d3ae31229d6ab1aaac1 /lib/xwrap.c | |
parent | 0c8a66ea44eae5eec4d0398a1f2a6d93a54b0fb0 (diff) | |
download | toybox-299d43879d70de33f84eafab78fcd78d7befd827.tar.gz |
Add openro() and WARN_ONLY flag so xopen() and friends can warn without exiting.
Diffstat (limited to 'lib/xwrap.c')
-rw-r--r-- | lib/xwrap.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/xwrap.c b/lib/xwrap.c index 48e02965..89488acf 100644 --- a/lib/xwrap.c +++ b/lib/xwrap.c @@ -318,11 +318,13 @@ void xunlink(char *path) } // Die unless we can open/create a file, returning file descriptor. +// The meaning of O_CLOEXEC is reversed (it defaults on, pass it to disable) +// and WARN_ONLY tells us not to exit. int xcreate_stdio(char *path, int flags, int mode) { - int fd = open(path, flags^O_CLOEXEC, mode); + int fd = open(path, (flags^O_CLOEXEC)&~WARN_ONLY, mode); - if (fd == -1) perror_exit_raw(path); + if (fd == -1) ((mode&WARN_ONLY) ? perror_msg_raw : perror_exit_raw)(path); return fd; } @@ -378,12 +380,18 @@ int xopen(char *path, int flags) return notstdio(xopen_stdio(path, flags)); } -// Open read only, treating "-" as a synonym for stdin. -int xopenro(char *path) +// Open read only, treating "-" as a synonym for stdin, defaulting to warn only +int openro(char *path, int flags) { if (!strcmp(path, "-")) return 0; - return xopen(path, O_RDONLY); + return xopen(path, flags^WARN_ONLY); +} + +// Open read only, treating "-" as a synonym for stdin. +int xopenro(char *path) +{ + return openro(path, O_RDONLY|WARN_ONLY); } FILE *xfdopen(int fd, char *mode) @@ -674,6 +682,8 @@ char *xreadfile(char *name, char *buf, off_t len) return buf; } +// The data argument to ioctl() is actually long, but it's usually used as +// a pointer. If you need to feed in a number, do (void *)(long) typecast. int xioctl(int fd, int request, void *data) { int rc; |