[PATCH v2 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. -- v2: msvcrt: fsetpos resets EOF flag 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 | 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 58a607e3bbe..9770a708744 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4669,19 +4669,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"); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4246
On Sat Nov 4 14:55:38 2023 +0000, Piotr Caban wrote:
Did you consider calling `_fseeki64` function instead? It looks like `fsetpos` duplicates the same functionality. Thanks, didn't realize they're the same now. Pushed an update.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4246#note_50918
This merge request was approved by Piotr Caban. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4246
participants (3)
-
Fabian Maurer -
Fabian Maurer (@DarkShadow44) -
Piotr Caban (@piotr)