• Main Page
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

missing/dup2.c

Go to the documentation of this file.
00001 /*
00002  * Public domain dup2() lookalike
00003  * by Curtis Jackson @ AT&T Technologies, Burlington, NC
00004  * electronic address:  burl!rcj
00005  *
00006  * dup2 performs the following functions:
00007  *
00008  * Check to make sure that fd1 is a valid open file descriptor.
00009  * Check to see if fd2 is already open; if so, close it.
00010  * Duplicate fd1 onto fd2; checking to make sure fd2 is a valid fd.
00011  * Return fd2 if all went well; return BADEXIT otherwise.
00012  */
00013 
00014 #include "ruby/config.h"
00015 
00016 #if defined(HAVE_FCNTL)
00017 # include <fcntl.h>
00018 #endif
00019 
00020 #if !defined(HAVE_FCNTL) || !defined(F_DUPFD)
00021 # include <errno.h>
00022 #endif
00023 
00024 #define BADEXIT -1
00025 
00026 int
00027 dup2(int fd1, int fd2)
00028 {
00029 #if defined(HAVE_FCNTL) && defined(F_DUPFD)
00030         if (fd1 != fd2) {
00031 #ifdef F_GETFL
00032                 if (fcntl(fd1, F_GETFL) < 0)
00033                         return BADEXIT;
00034                 if (fcntl(fd2, F_GETFL) >= 0)
00035                         close(fd2);
00036 #else
00037                 close(fd2);
00038 #endif
00039                 if (fcntl(fd1, F_DUPFD, fd2) < 0)
00040                         return BADEXIT;
00041         }
00042         return fd2;
00043 #else
00044         extern int errno;
00045         int i, fd, fds[256];
00046 
00047         if (fd1 == fd2) return 0;
00048         close(fd2);
00049         for (i=0; i<256; i++) {
00050                 fd = fds[i] = dup(fd1);
00051                 if (fd == fd2) break;
00052         }
00053         while (i) {
00054                 close(fds[i--]);
00055         }
00056         if (fd == fd2) return 0;
00057         errno = EMFILE;
00058         return BADEXIT;
00059 #endif
00060 }
00061 

Generated on Wed Sep 8 2010 09:55:57 for Ruby by  doxygen 1.7.1