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
From: Fabian Maurer dark.shadow4@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"); }
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.
This merge request was approved by Piotr Caban.