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.
From: Fabian Maurer dark.shadow4@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"); }
I don't think the test failure is related
Did you consider calling `_fseeki64` function instead? It looks like `fsetpos` duplicates the same functionality.