From: Deqiang Chen chendeqiang1024@qq.com
When open() used O_RDONLY,dpopen(fd,rb) set bin-mode failed. --- dlls/msvcrt/file.c | 5 ++++- dlls/msvcrt/tests/file.c | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index e72784eef41..b4b6c6c9602 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -632,7 +632,8 @@ static int msvcrt_init_fp(FILE* file, int fd, unsigned stream_flags) file->_file = fd; file->_flag = stream_flags; file->_tmpfname = NULL; - + if(stream_flags & _O_BINARY) _setmode(fd,_O_BINARY); + TRACE(":got FILE* (%p)\n",file); return 0; } @@ -1706,6 +1707,8 @@ static int msvcrt_get_flags(const wchar_t* mode, int *open_flags, int* stream_fl case 'B': case 'b': *open_flags |= _O_BINARY; *open_flags &= ~_O_TEXT; + *stream_flags |= _O_BINARY; + *stream_flags &= ~_O_TEXT; break; case 't': *open_flags |= _O_TEXT; diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 3f57b3f871f..7e5d727df49 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -130,6 +130,7 @@ static void test_fdopen( void ) char ibuf[10]; int fd; FILE *file; + ioinfo *info;
fd = open ("fdopen.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE); write (fd, buffer, sizeof (buffer)); @@ -141,6 +142,12 @@ static void test_fdopen( void ) ok (fread (ibuf, 1, sizeof (buffer), file) == 5, "read wrong byte count\n"); ok (memcmp (ibuf, buffer + 5, 5) == 0, "read wrong bytes\n"); fclose (file); + + fd = open ("fdopen.tst", O_RDONLY); + file = fdopen (fd, "rb"); + info = &__pioinfo[fd/MSVCRT_FD_BLOCK_SIZE][fd%MSVCRT_FD_BLOCK_SIZE]; + ok((info->wxflag & WX_TEXT) == 0, "Couldn't set file bin mode, wxflag=%x, fd=%d \n",info->wxflag,fd); + fclose (file); unlink ("fdopen.tst"); }