diff options
-rw-r--r-- | main.c | 22 | ||||
-rw-r--r-- | util.c | 28 | ||||
-rw-r--r-- | util.h | 20 |
3 files changed, 22 insertions, 48 deletions
@@ -61,6 +61,28 @@ #include <unistd.h> /** + * Check if a file descriptor is open. + */ +static bool isopen(int fd) { + return fcntl(fd, F_GETFD) >= 0 || errno != EBADF; +} + +/** + * Open a file and redirect it to a particular descriptor. + */ +static int redirect(int fd, const char *path, int flags) { + int ret = open(path, flags); + + if (ret >= 0 && ret != fd) { + int orig = ret; + ret = dup2(orig, fd); + close(orig); + } + + return ret; +} + +/** * Make sure the standard streams std{in,out,err} are open. If they are not, * future open() calls may use those file descriptors, and std{in,out,err} will * use them unintentionally. @@ -92,34 +92,6 @@ error: return NULL; } -bool isopen(int fd) { - return fcntl(fd, F_GETFD) >= 0 || errno != EBADF; -} - -int redirect(int fd, const char *path, int flags, ...) { - mode_t mode = 0; - if (flags & O_CREAT) { - va_list args; - va_start(args, flags); - - // Use int rather than mode_t, because va_arg must receive a - // fully-promoted type - mode = va_arg(args, int); - - va_end(args); - } - - int ret = open(path, flags, mode); - - if (ret >= 0 && ret != fd) { - int orig = ret; - ret = dup2(orig, fd); - close(orig); - } - - return ret; -} - int dup_cloexec(int fd) { #ifdef F_DUPFD_CLOEXEC return fcntl(fd, F_DUPFD_CLOEXEC, 0); @@ -110,26 +110,6 @@ int xreaddir(DIR *dir, struct dirent **de); char *xreadlinkat(int fd, const char *path, size_t size); /** - * Check if a file descriptor is open. - */ -bool isopen(int fd); - -/** - * Open a file and redirect it to a particular descriptor. - * - * @param fd - * The file descriptor to redirect. - * @param path - * The path to open. - * @param flags - * The flags passed to open(). - * @param mode - * The mode passed to open() (optional). - * @return fd on success, -1 on failure. - */ -int redirect(int fd, const char *path, int flags, ...); - -/** * Like dup(), but set the FD_CLOEXEC flag. * * @param fd |