diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2021-09-21 18:47:28 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2021-09-21 18:47:28 -0400 |
commit | 2e918d33be152c1a57ffb3ff53e344cafb161a8c (patch) | |
tree | 1549a3e1be09d4e565bfa58de0c03191e3d4e718 | |
parent | 10cb15e914bcf9257f14e09302fb4ab5b0aaf348 (diff) | |
download | bfs-2e918d33be152c1a57ffb3ff53e344cafb161a8c.tar.xz |
util: New xfopen() utility
And use it to pass O_CLOEXEC to all FILE*'s, so the files opened for
-fprint etc. don't get passed to the programs run by -exec etc.
-rw-r--r-- | color.c | 2 | ||||
-rw-r--r-- | mtab.c | 2 | ||||
-rw-r--r-- | parse.c | 2 | ||||
-rw-r--r-- | util.c | 45 | ||||
-rw-r--r-- | util.h | 10 |
5 files changed, 58 insertions, 3 deletions
@@ -526,7 +526,7 @@ CFILE *cfopen(const char *path, const struct colors *colors) { return NULL; } - cfile->file = fopen(path, "wb"); + cfile->file = xfopen(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC); if (!cfile->file) { cfclose(cfile); return NULL; @@ -162,7 +162,7 @@ struct bfs_mtab *bfs_mtab_parse() { #elif BFS_MNTTAB - FILE *file = fopen(MNTTAB, "r"); + FILE *file = xfopen(MNTTAB, O_RDONLY | O_CLOEXEC); if (!file) { error = errno; goto fail; @@ -1278,7 +1278,7 @@ static struct expr *parse_files0_from(struct parser_state *state, int arg1, int if (strcmp(from, "-") == 0) { file = stdin; } else { - file = fopen(from, "rb"); + file = xfopen(from, O_RDONLY | O_CLOEXEC); } if (!file) { parse_error(state, "${blu}%s${rs} ${bld}%s${rs}: %m.\n", arg, from); @@ -16,6 +16,7 @@ #include "util.h" #include "dstring.h" +#include <assert.h> #include <errno.h> #include <fcntl.h> #include <langinfo.h> @@ -426,3 +427,47 @@ char *xgetdelim(FILE *file, char delim) { return NULL; } } + +FILE *xfopen(const char *path, int flags) { + char mode[4]; + + switch (flags & O_ACCMODE) { + case O_RDONLY: + strcpy(mode, "rb"); + break; + case O_WRONLY: + strcpy(mode, "wb"); + break; + case O_RDWR: + strcpy(mode, "r+b"); + break; + default: + assert(!"Invalid access mode"); + return NULL; + } + + if (flags & O_APPEND) { + mode[0] = 'a'; + } + + int fd; + if (flags & O_CREAT) { + fd = open(path, flags, 0666); + } else { + fd = open(path, flags); + } + + if (fd < 0) { + return NULL; + } + + FILE *ret = fdopen(fd, mode); + if (!ret) { + int error = errno; + close(fd); + errno = error; + return NULL; + } + + return ret; +} @@ -288,4 +288,14 @@ char *xconfstr(int name); */ char *xgetdelim(FILE *file, char delim); +/** + * fopen() variant that takes open() style flags. + * + * @param path + * The path to open. + * @param flags + * Flags to pass to open(). + */ +FILE *xfopen(const char *path, int flags); + #endif // BFS_UTIL_H |