| /* | |
| * Public domain dup2() lookalike | |
| * by Curtis Jackson @ AT&T Technologies, Burlington, NC | |
| * electronic address: burl!rcj | |
| * | |
| * dup2 performs the following functions: | |
| * | |
| * Check to make sure that fd1 is a valid open file descriptor. | |
| * Check to see if fd2 is already open; if so, close it. | |
| * Duplicate fd1 onto fd2; checking to make sure fd2 is a valid fd. | |
| * Return fd2 if all went well; return BADEXIT otherwise. | |
| */ | |
| #include <errno.h> // errno | |
| #include <fcntl.h> // fcntl() | |
| #include <unistd.h> // close() | |
| #define BADEXIT -1 | |
| int | |
| dup2(int fd1, int fd2) | |
| { | |
| if (fd1 != fd2) { | |
| #ifdef F_DUPFD | |
| if (fcntl(fd1, F_GETFL) < 0) | |
| return BADEXIT; | |
| if (fcntl(fd2, F_GETFL) >= 0) | |
| close(fd2); | |
| if (fcntl(fd1, F_DUPFD, fd2) < 0) | |
| return BADEXIT; | |
| #else | |
| errno = ENOTSUP; | |
| return BADEXIT; | |
| #endif | |
| } | |
| return fd2; | |
| } |