1*1e72d8d2Sderaadt /* 2*1e72d8d2Sderaadt dup2 -- 7th Edition UNIX system call emulation for UNIX System V 3*1e72d8d2Sderaadt 4*1e72d8d2Sderaadt last edit: 11-Feb-1987 D A Gwyn 5*1e72d8d2Sderaadt */ 6*1e72d8d2Sderaadt 7*1e72d8d2Sderaadt #ifdef HAVE_CONFIG_H 8*1e72d8d2Sderaadt #include "config.h" 9*1e72d8d2Sderaadt #endif 10*1e72d8d2Sderaadt 11*1e72d8d2Sderaadt #include <errno.h> 12*1e72d8d2Sderaadt #include <fcntl.h> 13*1e72d8d2Sderaadt 14*1e72d8d2Sderaadt extern int close(), fcntl(); 15*1e72d8d2Sderaadt 16*1e72d8d2Sderaadt int dup2(oldfd,newfd)17*1e72d8d2Sderaadtdup2( oldfd, newfd ) 18*1e72d8d2Sderaadt int oldfd; /* already-open file descriptor */ 19*1e72d8d2Sderaadt int newfd; /* desired duplicate descriptor */ 20*1e72d8d2Sderaadt { 21*1e72d8d2Sderaadt register int ret; /* for fcntl() return value */ 22*1e72d8d2Sderaadt register int save; /* for saving entry errno */ 23*1e72d8d2Sderaadt 24*1e72d8d2Sderaadt if ( oldfd == newfd ) 25*1e72d8d2Sderaadt return oldfd; /* be careful not to close() */ 26*1e72d8d2Sderaadt 27*1e72d8d2Sderaadt save = errno; /* save entry errno */ 28*1e72d8d2Sderaadt (void) close( newfd ); /* in case newfd is open */ 29*1e72d8d2Sderaadt /* (may have just clobbered the original errno value) */ 30*1e72d8d2Sderaadt 31*1e72d8d2Sderaadt ret = fcntl( oldfd, F_DUPFD, newfd ); /* dupe it */ 32*1e72d8d2Sderaadt 33*1e72d8d2Sderaadt if ( ret >= 0 ) 34*1e72d8d2Sderaadt errno = save; /* restore entry errno */ 35*1e72d8d2Sderaadt else /* fcntl() returned error */ 36*1e72d8d2Sderaadt if ( errno == EINVAL ) 37*1e72d8d2Sderaadt errno = EBADF; /* we think of everything */ 38*1e72d8d2Sderaadt 39*1e72d8d2Sderaadt return ret; /* return file descriptor */ 40*1e72d8d2Sderaadt } 41