From: Guillem Jover Date: Sat, 6 Jun 2015 04:19:05 +0000 (+0200) Subject: lib/fileutils: Add new dup_fd_cloexec function X-Git-Tag: v2.27-rc1~164 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8e86d93d1e3f0c11b3fdca3246c4f3a267acf8eb;p=thirdparty%2Futil-linux.git lib/fileutils: Add new dup_fd_cloexec function This function duplicates and marks a file descriptor as close-on-exec. Takes care of build and run-time support for the fcntl F_DUPFD_CLOEXEC command, and other errors. Signed-off-by: Guillem Jover --- diff --git a/include/fileutils.h b/include/fileutils.h index 3353f69a07..e0e2ecee12 100644 --- a/include/fileutils.h +++ b/include/fileutils.h @@ -25,6 +25,7 @@ static inline FILE *xfmkstemp(char **tmpname, char *dir) return ret; } +extern int dup_fd_cloexec(int oldfd, int lowfd); extern int get_fd_tabsize(void); extern int mkdir_p(const char *path, mode_t mode); diff --git a/lib/fileutils.c b/lib/fileutils.c index bffa8ff34c..81b38ad3a7 100644 --- a/lib/fileutils.c +++ b/lib/fileutils.c @@ -50,6 +50,36 @@ int xmkstemp(char **tmpname, char *dir) return fd; } +int dup_fd_cloexec(int oldfd, int lowfd) +{ + int fd, flags, errno_save; + +#ifdef F_DUPFD_CLOEXEC + fd = fcntl(oldfd, F_DUPFD_CLOEXEC, lowfd); + if (fd >= 0) + return fd; +#endif + + fd = dup(oldfd); + if (fd < 0) + return fd; + + flags = fcntl(fd, F_GETFD); + if (flags < 0) + goto unwind; + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) + goto unwind; + + return fd; + +unwind: + errno_save = errno; + close(fd); + errno = errno_save; + + return -1; +} + /* * portable getdtablesize() */