Correct fseeko64 function. git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@242 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/ChangeLog b/mingw-w64-crt/ChangeLog index 0fb603c..da3314d 100644 --- a/mingw-w64-crt/ChangeLog +++ b/mingw-w64-crt/ChangeLog
@@ -1,3 +1,7 @@ +2008-01-25 Kai Tietz <kai.tietz@onevision.com> + + * stdio/fseeko64.c: Correct feeko64. + 2008-01-23 Kai Tietz <kai.tietz@onevision.com> * crt64/dirent.c: Add add _tGetFileAttributes for win95.
diff --git a/mingw-w64-crt/stdio/fseeko64.c b/mingw-w64-crt/stdio/fseeko64.c index 9a30ceb..5af2337 100644 --- a/mingw-w64-crt/stdio/fseeko64.c +++ b/mingw-w64-crt/stdio/fseeko64.c
@@ -105,7 +105,28 @@ int fseeko64 (FILE* stream, _off64_t offset, int whence) { - return _fseeki64(stream,offset,whence); + fpos_t pos; + if (whence == SEEK_CUR) + { + /* If stream is invalid, fgetpos sets errno. */ + if (fgetpos (stream, &pos)) + return (-1); + pos += (fpos_t) offset; + } + else if (whence == SEEK_END) + { + /* If writing, we need to flush before getting file length. */ + fflush (stream); + pos = (fpos_t) (_filelengthi64 (_fileno (stream)) + offset); + } + else if (whence == SEEK_SET) + pos = (fpos_t) offset; + else + { + errno = EINVAL; + return (-1); + } + return fsetpos (stream, &pos); } int __cdecl _fseeki64(FILE *str,__int64 offset,int whence)