[Python-Dev] TELL64
Trent Mick
trentm@ActiveState.com
Mon, 15 Jan 2001 14:10:26 -0800
On Mon, Jan 15, 2001 at 11:02:39AM -0500, Guido van Rossum wrote:
> Greg Stein noticed me checking in *yet* another system that needs
> the fallback TELL64() definition in fileobjects.c, and wrote:
>
> > All of those #ifdefs could be tossed and it would be more robust (long term)
> > if an autoconf macro were used to specify when TELL64 should be defined.
> >
> > [ I've looked thru fileobject.c and am a bit confused: the conditions for
> > defining TELL64 do not match the conditions for *using* it. that would
> > seem to imply a semantic error somewhere and/or a potential gotcha when
> > they get skewed (like I assume what happened to FreeBSD). simplifying with
> > an autoconf macro may help to rationalize it. ]
The problem is that these systems lie when they "say" (according to Python's
configure tests for HAVE_LARGEFILE_SUPPORT) that they have largefile support.
This seems to have happened for a particular release of BSD (which has since
been fixed). I think that the Right(tm) (meaning the cleanest solution where
the tests and definitions in the code actually represent the truth) answer is
a proper configure test (sort of as Greg suggests). I don't really feel
comfortable writing that patch (because (1) lack of time and (2) inability to
test, I don't have any access to any of these BSD machines).
[Guido]
>
> I have a better idea. Since "lseek((fd),0,SEEK_CUR)" seems to be the
> universal fallback, why not just define TELL64 to be that if it's not
> previously defined (currently only MS_WIN64 has a different
> definition)? It isn't always *used* (the conditions under which
> _portable_fseek() uses it are quite complex), but *when* it is used,
> this seems to be the most common definition...
While I agree that it is annoying that the build breaks for these platforms I
think that it is appropriate that the build breaks. Having to put these:
#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(_HAVE_BSDI) || defined(__APPLE__)
definitions here gives a nice list of those platforms that *do* lie. I would
prefer that to having an "#else" block that just captures all other cases,
but that is just my opinion.
Options (in order of preference):
(1) Update the configure test for HAVE_LARGEFILE_SUPPORT such that the proper
versions of these OSes do *not* #define it.
(2) Guido's suggestion.
(2) Keep extending the "#elif" list.
^---- using (2) twice was intentional
Trent
>
> *** fileobject.c 2001/01/15 10:36:56 2.106
> --- fileobject.c 2001/01/15 16:02:06
> ***************
> *** 58,66 ****
> /* define the appropriate 64-bit capable tell() function */
> #if defined(MS_WIN64)
> #define TELL64 _telli64
> ! #elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(_HAVE_BSDI) || defined(__APPLE__)
> ! /* NOTE: this is only used on older
> ! NetBSD prior to f*o() funcions */
> #define TELL64(fd) lseek((fd),0,SEEK_CUR)
> #endif
>
> --- 58,65 ----
> /* define the appropriate 64-bit capable tell() function */
> #if defined(MS_WIN64)
> #define TELL64 _telli64
> ! #else
> ! /* Fallback for older systems that don't have the f*o() funcions */
> #define TELL64(fd) lseek((fd),0,SEEK_CUR)
> #endif
>
>
> I'll check this in after 24 hours unless a better idea comes up.
>
Better idea but no patch. :(
Trent
--
Trent Mick
TrentM@ActiveState.com