https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2765bddffa434dc4a6949d...
commit 2765bddffa434dc4a6949dfcad8fce85c9564363 Author: Thomas Faber thomas.faber@reactos.org AuthorDate: Sun Mar 25 18:34:56 2018 +0200 Commit: Thomas Faber thomas.faber@reactos.org CommitDate: Mon Mar 26 13:35:02 2018 +0200
[CRT] Various fixes to Wine file functions.
Import the following Wine commits: * ea2798f1ce9 Iván Matellanes: msvcrt: _setmode should check if file descriptor is valid. * 9b495caacfd Carlo Bramini: msvcrt: Call SetFilePointer() with correct parameters. * 13f34481b26 Carlo Bramini: msvcrt: Use MSVCRT_xxx macros instead of the same ones from GLIBC. * 781b069ed81 Piotr Caban: msvcrt: Don't close HANDLE if stdout or stderr is sharing it. --- sdk/lib/crt/stdio/file.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/sdk/lib/crt/stdio/file.c b/sdk/lib/crt/stdio/file.c index b4c66856a3..2357d99bfc 100644 --- a/sdk/lib/crt/stdio/file.c +++ b/sdk/lib/crt/stdio/file.c @@ -936,6 +936,14 @@ int CDECL _close(int fd) TRACE(":fd (%d) handle (%p)\n", fd, info->handle); if (!(info->wxflag & WX_OPEN)) { ret = -1; + } else if (fd == STDOUT_FILENO && + info->handle == get_ioinfo_nolock(STDERR_FILENO)->handle) { + msvcrt_free_fd(fd); + ret = 0; + } else if (fd == STDERR_FILENO && + info->handle == get_ioinfo_nolock(STDOUT_FILENO)->handle) { + msvcrt_free_fd(fd); + ret = 0; } else { ret = CloseHandle(info->handle) ? 0 : -1; msvcrt_free_fd(fd); @@ -1237,7 +1245,7 @@ int CDECL _locking(int fd, int mode, LONG nbytes) (mode==_LK_NBRLCK)?"_LK_NBRLCK": "UNKNOWN");
- if ((cur_locn = SetFilePointer(info->handle, 0L, NULL, SEEK_CUR)) == INVALID_SET_FILE_POINTER) + if ((cur_locn = SetFilePointer(info->handle, 0L, NULL, FILE_CURRENT)) == INVALID_SET_FILE_POINTER) { release_ioinfo(info); FIXME ("Seek failed\n"); @@ -2480,6 +2488,11 @@ int CDECL _setmode(int fd,int mode) return -1; }
+ if(info == &__badioinfo) { + *_errno() = EBADF; + return EOF; + } + if(mode == _O_BINARY) { info->wxflag &= ~WX_TEXT; info->exflag &= ~(EF_UTF8|EF_UTF16);