static int __cdecl _dup_nolock( int fh ) { int newfh; /* variable for new file handle */ ULONG dosretval; /* o.s. return value */ char fileinfo; /* _osfile info for file */ intptr_t new_osfhandle; int success = FALSE; fileinfo = _osfile(fh); /* get file info for file */ if ( !(_osfile(fh) & FOPEN) ) return -1; /* create duplicate handle */ if ( (newfh = _alloc_osfhnd()) == -1 ) { errno = EMFILE; /* too many files error */ _doserrno = 0L; /* not an OS error */ return -1; /* return error to caller */ } __TRY /* * duplicate the file handle */ if ( !(DuplicateHandle(GetCurrentProcess(), (HANDLE)_get_osfhandle(fh), GetCurrentProcess(), (PHANDLE)&new_osfhandle, 0L, TRUE, DUPLICATE_SAME_ACCESS)) ) { dosretval = GetLastError(); } else { _set_osfhnd(newfh, new_osfhandle); dosretval = 0; } if (dosretval) { /* o.s. error -- map errpr and release handle */ _dosmaperr(dosretval); } else { /* * copy the _osfile value, with the FNOINHERIT bit cleared */ _osfile(newfh) = fileinfo & ~FNOINHERIT; _textmode(newfh) = _textmode(fh); _tm_unicode(newfh) = _tm_unicode(fh); success = TRUE; } __FINALLY if (!success) { _osfile(newfh) &= ~FOPEN; } _unlock_fh(newfh); __END_TRY_FINALLY return success ? newfh : -1; }
int __cdecl _pipe ( int phandles[2], unsigned psize, int textmode ) { ULONG dosretval; /* o.s. return value */ HANDLE ReadHandle, WriteHandle; SECURITY_ATTRIBUTES SecurityAttributes; SecurityAttributes.nLength = sizeof(SecurityAttributes); SecurityAttributes.lpSecurityDescriptor = NULL; if (textmode & _O_NOINHERIT) { SecurityAttributes.bInheritHandle = FALSE; } else { SecurityAttributes.bInheritHandle = TRUE; } if (!CreatePipe(&ReadHandle, &WriteHandle, &SecurityAttributes, psize)) { /* o.s. error */ dosretval = GetLastError(); _dosmaperr(dosretval); return -1; } /* now we must allocate C Runtime handles for Read and Write handles */ if ((phandles[0] = _alloc_osfhnd()) != -1) { _osfile(phandles[0]) = (char)(FOPEN | FPIPE | FTEXT); if ((phandles[1] = _alloc_osfhnd()) != -1) { _osfile(phandles[1]) = (char)(FOPEN | FPIPE | FTEXT); if ( (textmode & _O_BINARY) || (((textmode & _O_TEXT) == 0) && (_fmode == _O_BINARY)) ) { /* binary mode */ _osfile(phandles[0]) &= ~FTEXT; _osfile(phandles[1]) &= ~FTEXT; } if ( textmode & _O_NOINHERIT ) { _osfile(phandles[0]) |= FNOINHERIT; _osfile(phandles[1]) |= FNOINHERIT; } _set_osfhnd(phandles[0], (long)ReadHandle); _set_osfhnd(phandles[1], (long)WriteHandle); errno = 0; _unlock_fh(phandles[1]); /* unlock handle */ } else { _osfile(phandles[0]) = 0; errno = EMFILE; /* too many files */ } _unlock_fh(phandles[0]); /* unlock handle */ } else { errno = EMFILE; /* too many files */ } /* If error occurred, close Win32 handles and return -1 */ if (errno != 0) { CloseHandle(ReadHandle); CloseHandle(WriteHandle); _doserrno = 0; /* not an o.s. error */ return -1; } return 0; }
int __cdecl _dup ( int fh ) { ULONG dosretval; /* o.s. return value */ int newfh; /* variable for new file handle */ char fileinfo; /* _osfile info for file */ long new_osfhandle; /* validate file handle */ if ( ((unsigned)fh >= (unsigned)_nhandle) || !(_osfile(fh) & FOPEN) ) { errno = EBADF; _doserrno = 0; /* no o.s. error */ return -1; } _lock_fh(fh); /* lock file handle */ fileinfo = _osfile(fh); /* get file info for file */ /* create duplicate handle */ if ( (newfh = _alloc_osfhnd()) == -1 ) { errno = EMFILE; /* too many files error */ _doserrno = 0L; /* not an OS error */ _unlock_fh(fh); return -1; /* return error to caller */ } /* * duplicate the file handle */ if ( !(DuplicateHandle(GetCurrentProcess(), (HANDLE)_get_osfhandle(fh), GetCurrentProcess(), (PHANDLE)&new_osfhandle, 0L, TRUE, DUPLICATE_SAME_ACCESS)) ) { dosretval = GetLastError(); } else { _set_osfhnd(newfh, new_osfhandle); dosretval = 0; } _unlock_fh(newfh); _unlock_fh(fh); /* unlock file handle */ if (dosretval) { /* o.s. error -- map and return */ _dosmaperr(dosretval); return -1; } /* * copy the _osfile value, with the FNOINHERIT bit cleared */ _osfile(newfh) = fileinfo & ~FNOINHERIT; return newfh; }