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:
parent
c4417ee9d3
commit
8e86d93d1e
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue