[PATCH 0/1] MR4246: msvcrt: fsetpos resets EOF flag
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55856 I added tests for the other cases that already work as well, just tell me if those are not needed. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4246
From: Fabian Maurer <dark.shadow4(a)web.de> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55856 --- dlls/msvcrt/file.c | 3 +++ dlls/msvcrt/tests/file.c | 45 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 58a607e3bbe..ade2c9af855 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4679,7 +4679,10 @@ int CDECL fsetpos(FILE* file, fpos_t *pos) file->_flag &= ~(_IOREAD|_IOWRT); } + /* Clear end of file flag */ + file->_flag &= ~_IOEOF; ret = (_lseeki64(file->_file,*pos,SEEK_SET) == -1) ? -1 : 0; + _unlock_file(file); return ret; } 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"); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4246
I don't think the test failure is related -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4246#note_50565
Did you consider calling `_fseeki64` function instead? It looks like `fsetpos` duplicates the same functionality. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4246#note_50624
participants (3)
-
Fabian Maurer -
Fabian Maurer (@DarkShadow44) -
Piotr Caban (@piotr)