diff options
-rw-r--r-- | lib/lib.h | 6 | ||||
-rw-r--r-- | lib/xwrap.c | 20 |
2 files changed, 21 insertions, 5 deletions
@@ -102,6 +102,11 @@ struct dirtree *dirtree_read(char *path, int (*callback)(struct dirtree *node)); void show_help(FILE *out); +// Tell xopen and friends to print warnings but return -1 as necessary +// The largest O_BLAH flag so far is arch/alpha's O_PATH at 0x800000 so +// plenty of headroom. +#define WARN_ONLY (1<<31) + // xwrap.c void xstrncpy(char *dest, char *src, size_t size); void xstrncat(char *dest, char *src, size_t size); @@ -132,6 +137,7 @@ int xcreate(char *path, int flags, int mode); int xopen(char *path, int flags); int xcreate_stdio(char *path, int flags, int mode); int xopen_stdio(char *path, int flags); +int openro(char *path, int flags); int xopenro(char *path); void xpipe(int *pp); void xclose(int fd); 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; |