Ticket #38225

Emulate _fseeki64()/_ftelli64() API on legacy platforms.

Open Date: 2018-04-21 23:26 Last Update: 2018-10-10 06:04

5 - Medium
5 - Medium
Score: 3
100.0% (3/3)
0.0% (0/3)


Although 32-bit Windows has supported operations on files larger than 2GB, since at least WinNT4 and Win98, (and possibly earlier), Microsoft did not introduce the _fseeki64() and _ftelli64() APIs until MSVCR80.DLL, (and subsequently retrofitted it to MSVCRT.DLL, from WinVista onwards); prior to this, random access support in large files was provided through lower level APIs such as _lseeki64(), or native Windows API functions.

As noted in this mailing list query, and this subsequent follow-up thread, it is practicable to emulate the _fseeki64() and _ftelli64() APIs, such that they become available on legacy versions of Windows, which pre-date the formal introduction of these APIs by Microsoft; however, previous efforts to do so may not have been entirely robust. Hopefully, the attached patch will do a better job.

Attachment File List

  • emulate-fseeki64.patch(18KB)
    • Patch to implement _fseeki64()/_ftelli64(), and replace fseeko64()/ftello64(), on legacy platforms

Ticket History (3/4 Histories)

2018-04-21 23:26 Updated by: keith
  • New Ticket "Emulate _fseeki64()/_ftelli64() API on legacy platforms." created
2018-04-21 23:29 Updated by: keith
  • File emulate-fseeki64.patch (File ID: 5396) is attached
2018-04-25 01:43 Updated by: earnie

It would be extremely useful to be able to seek past the 2G limit MS has.

2018-10-10 06:04 Updated by: keith

Reply To earnie

It would be extremely useful to be able to seek past the 2G limit MS has.

It always has been possible to do so, to the extent that _lseeki64() supports it; the problem is that the effect of _lseeki64() isn't reflected in __iob context, without some additional processing.

The patch I've proposed provides fall-back implementations of _fseeki64() and _ftelli64(), based on _lseeki64() and _telli64() respectively, with the additional processing required to propagate relevant effects to the associated __iob context. Unfortunately, while these fall-back implementations should be entirely suitable for deployment on all WinNT derived platforms, they are likely to be susceptible to the "write after seek beyond EOF" issue described in Mumit Khan's mingw-fseek.c, when deployed on Win9x; however, I do have reservations about the robustness of Mumit's work-around for this issue, which may thus benefit from review, and some rework.


Please login to add comment to this ticket » Login