Module: wine Branch: master Commit: 8e56d0feb5f08fef1df8810a79d4da0a63373974 URL: https://gitlab.winehq.org/wine/wine/-/commit/8e56d0feb5f08fef1df8810a79d4da0...
Author: Fabian Maurer dark.shadow4@web.de Date: Thu Nov 2 02:43:31 2023 +0100
msvcrt: Fsetpos resets EOF flag.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55856
---
dlls/msvcrt/file.c | 14 +------------- dlls/msvcrt/tests/file.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 14 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 7cccf96b1c7..3c1d9572585 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4682,19 +4682,7 @@ errno_t CDECL freopen_s(FILE** pFile, */ int CDECL fsetpos(FILE* file, fpos_t *pos) { - int ret; - - _lock_file(file); - msvcrt_flush_buffer(file); - - /* Reset direction of i/o */ - if(file->_flag & _IORW) { - file->_flag &= ~(_IOREAD|_IOWRT); - } - - ret = (_lseeki64(file->_file,*pos,SEEK_SET) == -1) ? -1 : 0; - _unlock_file(file); - return ret; + return _fseeki64(file,*pos,SEEK_SET); }
/********************************************************************* diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 71b3e1399f8..75d30648230 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -226,7 +226,50 @@ static void test_fileops( void ) ok(fread(buffer, sizeof(buffer), 1, file) == 0, "fread test failed\n"); /* feof should be set now */ ok(feof(file), "feof after fread failed\n"); - fclose (file); + clearerr(file); + ok(!feof(file), "feof after clearerr failed\n"); + fclose(file); + + file = fopen("fdopen.tst", "rb"); + ok( file != NULL, "fopen failed\n"); + /* sizeof(buffer) > content of file */ + ok(fread(buffer, sizeof(buffer), 1, file) == 0, "fread test failed\n"); + /* feof should be set now */ + ok(feof(file), "feof after fread failed\n"); + rewind(file); + ok(!feof(file), "feof after rewind failed\n"); + fclose(file); + + file = fopen("fdopen.tst", "rb"); + ok( file != NULL, "fopen failed\n"); + /* sizeof(buffer) > content of file */ + ok(fread(buffer, sizeof(buffer), 1, file) == 0, "fread test failed\n"); + /* feof should be set now */ + ok(feof(file), "feof after fread failed\n"); + fseek(file, 0, SEEK_SET); + ok(!feof(file), "feof after fseek failed\n"); + fclose(file); + + file = fopen("fdopen.tst", "rb"); + ok( file != NULL, "fopen failed\n"); + /* sizeof(buffer) > content of file */ + ok(fread(buffer, sizeof(buffer), 1, file) == 0, "fread test failed\n"); + /* feof should be set now */ + ok(feof(file), "feof after fread failed\n"); + fgetpos(file, &pos); + fsetpos(file, &pos); + ok(!feof(file), "feof after fsetpos failed\n"); + fclose(file); + + file = fopen("fdopen.tst", "rb"); + ok( file != NULL, "fopen failed\n"); + /* sizeof(buffer) > content of file */ + ok(fread(buffer, sizeof(buffer), 1, file) == 0, "fread test failed\n"); + /* feof should be set now */ + ok(feof(file), "feof after fread failed\n"); + fsetpos(file, &pos); + ok(!feof(file), "feof after fsetpos failed\n"); + fclose(file);
unlink ("fdopen.tst"); }