X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=lib%2Fcrtdll%2Fio%2Fopen.c;h=928cb88ed6ef44e820eeaf18e248bc361dc41683;hb=e3ed2d773259cc445c7ff8181ebd934931365328;hp=4cc7e33eb6ecce83d1af2e4d2f2abbd9fc92ac51;hpb=d378c68f5a9bb25c9e671dacd482d2e25d211df3;p=reactos.git diff --git a/lib/crtdll/io/open.c b/lib/crtdll/io/open.c index 4cc7e33..928cb88 100644 --- a/lib/crtdll/io/open.c +++ b/lib/crtdll/io/open.c @@ -1,4 +1,5 @@ -/* +/* $Id$ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/crtdll/io/open.c @@ -14,147 +15,140 @@ #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include + +#define STD_AUX_HANDLE 3 +#define STD_PRINTER_HANDLE 4 typedef struct _fileno_modes_type { - HANDLE hFile; - int mode; - int fd; + HANDLE hFile; + int mode; + int fd; } fileno_modes_type; +int __fileno_alloc(HANDLE hFile, int mode); + fileno_modes_type *fileno_modes = NULL; int maxfno = 5; int minfno = 5; -char __is_text_file(FILE *p) +char __is_text_file(FILE* p) { - if ( p == NULL || fileno_modes == NULL ) + if (p == NULL || fileno_modes == NULL) return FALSE; return (!((p)->_flag&_IOSTRG) && (fileno_modes[(p)->_file].mode&O_TEXT)); } - - - -int __fileno_alloc(HANDLE hFile, int mode); - - -int _open(const char *_path, int _oflag,...) +int _open(const char* _path, int _oflag,...) { - HANDLE hFile; - DWORD dwDesiredAccess = 0; - DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; - DWORD dwCreationDistribution = 0; - DWORD dwFlagsAndAttributes = 0; - int mode; - va_list arg; - - va_start (arg, _oflag); - mode = va_arg(arg,int); - va_end (arg); - if ( (mode == S_IWRITE) || (mode == 0) ) - dwFlagsAndAttributes = FILE_ATTRIBUTE_READONLY; - - /* - * - * _O_BINARY Opens file in binary (untranslated) mode. (See fopen for a description of binary mode.) - * _O_TEXT Opens file in text (translated) mode. (For more information, see Text and Binary Mode File I/O and fopen.) - * - */ - if (( _oflag & _O_RDWR ) == _O_RDWR ) - dwDesiredAccess |= GENERIC_WRITE|GENERIC_READ ; - else if (( _oflag & _O_WRONLY ) == _O_WRONLY ) - dwDesiredAccess |= GENERIC_WRITE ; - else - dwDesiredAccess |= GENERIC_READ ; - - if (( _oflag & (_O_CREAT | _O_EXCL ) ) == (_O_CREAT | _O_EXCL) ) - dwCreationDistribution |= CREATE_NEW; - - else if (( _oflag & O_TRUNC ) == O_TRUNC ) { - if (( _oflag & O_CREAT ) == O_CREAT ) - dwCreationDistribution |= CREATE_ALWAYS; - else if (( _oflag & O_RDONLY ) != O_RDONLY ) - dwCreationDistribution |= TRUNCATE_EXISTING; - } - else if (( _oflag & _O_APPEND ) == _O_APPEND ) - dwCreationDistribution |= OPEN_EXISTING; - else if (( _oflag & _O_CREAT ) == _O_CREAT ) - dwCreationDistribution |= OPEN_ALWAYS; - else - dwCreationDistribution |= OPEN_EXISTING; - - if (( _oflag & _O_RANDOM ) == _O_RANDOM ) - dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; - if (( _oflag & _O_SEQUENTIAL ) == _O_SEQUENTIAL ) - dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN; - - if (( _oflag & _O_TEMPORARY ) == _O_TEMPORARY ) - dwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE; - - if (( _oflag & _O_SHORT_LIVED ) == _O_SHORT_LIVED ) - dwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE; - - hFile = CreateFileA(_path, - dwDesiredAccess, - dwShareMode, - NULL, - dwCreationDistribution, - dwFlagsAndAttributes, - NULL); - if (hFile == (HANDLE)-1) - return -1; - return __fileno_alloc(hFile,_oflag); - -// _O_APPEND Moves file pointer to end of file before every write operation. + HANDLE hFile; + DWORD dwDesiredAccess = 0; + DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + DWORD dwCreationDistribution = 0; + DWORD dwFlagsAndAttributes = 0; + int mode; + va_list arg; + + va_start(arg, _oflag); + mode = va_arg(arg,int); + va_end (arg); + if ((mode == S_IWRITE) || (mode == 0)) + dwFlagsAndAttributes = FILE_ATTRIBUTE_READONLY; + /* + * + * _O_BINARY Opens file in binary (untranslated) mode. (See fopen for a description of binary mode.) + * _O_TEXT Opens file in text (translated) mode. (For more information, see Text and Binary Mode File I/O and fopen.) + * + */ + if (( _oflag & _O_RDWR ) == _O_RDWR ) + dwDesiredAccess |= GENERIC_WRITE|GENERIC_READ ; + else if (( _oflag & _O_WRONLY ) == _O_WRONLY ) + dwDesiredAccess |= GENERIC_WRITE ; + else + dwDesiredAccess |= GENERIC_READ ; + + if ((_oflag & (_O_CREAT | _O_EXCL ) ) == (_O_CREAT | _O_EXCL)) + dwCreationDistribution |= CREATE_NEW; + + else if ((_oflag & O_TRUNC) == O_TRUNC) { + if ((_oflag & O_CREAT) == O_CREAT) + dwCreationDistribution |= CREATE_ALWAYS; + else if ((_oflag & O_RDONLY ) != O_RDONLY) + dwCreationDistribution |= TRUNCATE_EXISTING; + } + else if ((_oflag & _O_APPEND) == _O_APPEND) + dwCreationDistribution |= OPEN_EXISTING; + else if ((_oflag & _O_CREAT) == _O_CREAT) + dwCreationDistribution |= OPEN_ALWAYS; + else + dwCreationDistribution |= OPEN_EXISTING; + + if ((_oflag & _O_RANDOM) == _O_RANDOM) + dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; + if ((_oflag & _O_SEQUENTIAL) == _O_SEQUENTIAL) + dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN; + + if ((_oflag & _O_TEMPORARY) == _O_TEMPORARY) + dwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE; + + if ((_oflag & _O_SHORT_LIVED) == _O_SHORT_LIVED) + dwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE; + + hFile = CreateFileA(_path, + dwDesiredAccess, + dwShareMode, + NULL, + dwCreationDistribution, + dwFlagsAndAttributes, + NULL); + if (hFile == (HANDLE)-1) + return -1; + return __fileno_alloc(hFile,_oflag); + +// _O_APPEND Moves file pointer to end of file before every write operation. } - - int __fileno_alloc(HANDLE hFile, int mode) { - int i; /* Check for bogus values */ if (hFile < 0) - return -1; + return -1; for(i=minfno;i= maxfno ) - return (void *)-1; - - if ( fileno_modes[fileno].fd == -1 ) - return (void *)-1; - return fileno_modes[fileno].hFile; -} - -int __fileno_dup2( int handle1, int handle2 ) -{ - if ( handle1 >= maxfno ) - return -1; - - if ( handle1 < 0 ) - return -1; - if ( handle2 >= maxfno ) - return -1; - - if ( handle2 < 0 ) - return -1; - - memcpy(&fileno_modes[handle1],&fileno_modes[handle2],sizeof(fileno_modes)); - - - return handle1; + if (fileno < 0) + return (void*)-1; + switch (fileno) { + case 0: + return GetStdHandle(STD_INPUT_HANDLE); + case 1: + return GetStdHandle(STD_OUTPUT_HANDLE); + case 2: + return GetStdHandle(STD_ERROR_HANDLE); + case 3: + return GetStdHandle(STD_AUX_HANDLE); + case 4: + return GetStdHandle(STD_PRINTER_HANDLE); + default: + break; + } + if (fileno >= maxfno) + return (void*)-1; + if (fileno_modes[fileno].fd == -1) + return (void*)-1; + return fileno_modes[fileno].hFile; } int __fileno_setmode(int _fd, int _newmode) { - int m; - if ( _fd < minfno ) - return -1; - - if ( _fd >= maxfno ) - return -1; + int m; - m = fileno_modes[_fd].mode; - fileno_modes[_fd].mode = _newmode; - return m; + if (_fd < minfno) { + return -1; + } + if (_fd >= maxfno) + return -1; + m = fileno_modes[_fd].mode; + fileno_modes[_fd].mode = _newmode; + return m; } int __fileno_getmode(int _fd) { - if ( _fd < minfno ) - return -1; - - if ( _fd >= maxfno ) - return -1; - - return fileno_modes[_fd].mode; - + if (_fd < minfno) { + return -1; + } + if (_fd >= maxfno) + return -1; + return fileno_modes[_fd].mode; } - -int __fileno_close(int _fd) +int __fileno_close(int _fd) { - if ( _fd < 0 ) - return -1; - - if ( _fd >= maxfno ) - return -1; + if (_fd < 0) { + return -1; + } + if (_fd >= maxfno) + return -1; + fileno_modes[_fd].fd = -1; + fileno_modes[_fd].hFile = (HANDLE)-1; + return 0; +} - fileno_modes[_fd].fd = -1; - fileno_modes[_fd].hFile = (HANDLE)-1; - return 0; +int _open_osfhandle(void *osfhandle, int flags) +{ + return __fileno_alloc((HANDLE)osfhandle, flags); } -int _open_osfhandle (void *osfhandle, int flags ) +void *_get_osfhandle(int fileno) { - return __fileno_alloc((HANDLE)osfhandle, flags); -} + return filehnd(fileno); +} -void *_get_osfhandle( int fileno ) +int __fileno_dup2(int handle1, int handle2) { - return filehnd(fileno); + if (handle1 >= maxfno) { + return -1; + } + if (handle1 < 0) + return -1; + if (handle2 >= maxfno) + return -1; + if (handle2 < 0) + return -1; + memcpy(&fileno_modes[handle1],&fileno_modes[handle2],sizeof(fileno_modes)); + return handle1; }