home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / cvs-1.8.7-src.tgz / tar.out / fsf / cvs / lib / dup2.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  948b  |  41 lines

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