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 <guillem@hadrons.org>
This commit is contained in:
Guillem Jover 2015-06-06 06:19:05 +02:00 committed by Karel Zak
parent c4417ee9d3
commit 8e86d93d1e
2 changed files with 31 additions and 0 deletions

View File

@ -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);

View File

@ -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()
*/