blind

suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log | Files | Refs | README | LICENSE

commit 69e3e11a75ed1dabc854406e29bacd5401912874
parent 4f4763bbcbbf0dbc897d430c26fcb96225be24d8
Author: Mattias Andrée <maandree@kth.se>
Date:   Sat, 21 Jan 2017 16:34:08 +0100

Don't open files from /dev/fd/, just return the fd.

Advantage 1: Less file descriptors opened.

Advantage 2: The other end will be alerted when the process
closes the file descriptor, and does not have to wait until
the process exits.

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
Msrc/util.c | 15+++++++++++++++
Msrc/util/eopen.h | 9+--------
2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/util.c b/src/util.c @@ -7,6 +7,7 @@ #include <sys/wait.h> #include <ctype.h> #include <errno.h> +#include <fcntl.h> #include <limits.h> #include <signal.h> #include <stdarg.h> @@ -220,3 +221,17 @@ enjoin_jobs(int status, int is_master, pid_t *pids) } /* } */ + + +int +xenopen(int status, const char *path, int flags, int mode, ...) +{ + int fd; + if (strncmp(path, "/dev/fd/", sizeof("/dev/fd/") - 1)) + if (!toi(path + sizeof("/dev/fd/") - 1, 0, INT_MAX, &fd)) + return fd; + fd = open(path, flags, mode); + if (fd < 0) + enprintf(status, "open %s:", path); + return fd; +} diff --git a/src/util/eopen.h b/src/util/eopen.h @@ -4,11 +4,4 @@ #define eopen(...) enopen(1, __VA_ARGS__) #define enopen(...) xenopen(__VA_ARGS__, 0) -static inline int -xenopen(int status, const char *path, int flags, int mode, ...) -{ - int fd = open(path, flags, mode); - if (fd < 0) - enprintf(status, "open %s:", path); - return fd; -} +int xenopen(int status, const char *path, int flags, int mode, ...);