xref: /third_party/python/Python/dup2.c (revision 7db96d56)
17db96d56Sopenharmony_ci/*
27db96d56Sopenharmony_ci * Public domain dup2() lookalike
37db96d56Sopenharmony_ci * by Curtis Jackson @ AT&T Technologies, Burlington, NC
47db96d56Sopenharmony_ci * electronic address:  burl!rcj
57db96d56Sopenharmony_ci *
67db96d56Sopenharmony_ci * dup2 performs the following functions:
77db96d56Sopenharmony_ci *
87db96d56Sopenharmony_ci * Check to make sure that fd1 is a valid open file descriptor.
97db96d56Sopenharmony_ci * Check to see if fd2 is already open; if so, close it.
107db96d56Sopenharmony_ci * Duplicate fd1 onto fd2; checking to make sure fd2 is a valid fd.
117db96d56Sopenharmony_ci * Return fd2 if all went well; return BADEXIT otherwise.
127db96d56Sopenharmony_ci */
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci#include <errno.h>
157db96d56Sopenharmony_ci#include <fcntl.h>
167db96d56Sopenharmony_ci#include <unistd.h>
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci#define BADEXIT -1
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciint
217db96d56Sopenharmony_cidup2(int fd1, int fd2)
227db96d56Sopenharmony_ci{
237db96d56Sopenharmony_ci    if (fd1 != fd2) {
247db96d56Sopenharmony_ci#ifdef F_DUPFD
257db96d56Sopenharmony_ci        if (fcntl(fd1, F_GETFL) < 0)
267db96d56Sopenharmony_ci            return BADEXIT;
277db96d56Sopenharmony_ci        if (fcntl(fd2, F_GETFL) >= 0)
287db96d56Sopenharmony_ci            close(fd2);
297db96d56Sopenharmony_ci        if (fcntl(fd1, F_DUPFD, fd2) < 0)
307db96d56Sopenharmony_ci            return BADEXIT;
317db96d56Sopenharmony_ci#else
327db96d56Sopenharmony_ci        errno = ENOTSUP;
337db96d56Sopenharmony_ci        return BADEXIT;
347db96d56Sopenharmony_ci#endif
357db96d56Sopenharmony_ci    }
367db96d56Sopenharmony_ci    return fd2;
377db96d56Sopenharmony_ci}
38