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