/contrib/cvs/lib/dup2.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 40 lines · 25 code · 9 blank · 6 comment · 5 complexity · 3eded0710ebbfe63638eb58fe54aa4ac MD5 · raw file

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