aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2016-09-04 17:26:34 -0500
committerRob Landley <rob@landley.net>2016-09-04 17:26:34 -0500
commit299d43879d70de33f84eafab78fcd78d7befd827 (patch)
tree6294a1bf61e21553ac827d3ae31229d6ab1aaac1 /lib
parent0c8a66ea44eae5eec4d0398a1f2a6d93a54b0fb0 (diff)
downloadtoybox-299d43879d70de33f84eafab78fcd78d7befd827.tar.gz
Add openro() and WARN_ONLY flag so xopen() and friends can warn without exiting.
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.h6
-rw-r--r--lib/xwrap.c20
2 files changed, 21 insertions, 5 deletions
diff --git a/lib/lib.h b/lib/lib.h
index 5cd991c9..3c5adb43 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -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;