Guido Draheim schrieb:
Paul Eggert schrieb:
Guido Draheim <[EMAIL PROTECTED]> writes:
I am using AC_SYS_LARGEFILE AC_CHECK_FUNCS(ftello fseeko)
Use AC_FUNC_FSEEKO rather than AC_CHECK_FUNCS(fseeko). That should work around your problems.
Thanks. However, that macro still calls the glibc behavior a bug, which I think is simply true. The glibc cvs stdio.h should be fixed, - atleast do export fseeko when #def __USE_FILE_OFFSET64 is set!! - just in order to avoid that silent callframe-mismatch. In other words, export the REDIRECT atleast when a redirect-call is required to make things to function properly.
This mode is easily achieved, in the glibc stdio.h part on fseeko: delete the __USE_LARGEFILE ifdefs within the #else-part opened by that #ifndef __USE_FILE_OFFSET64.
This minimal change is strictly required unless glibc maintainers like to see the next program to delete some large database with an innocent fseeko call of a software ported to lfs mode running on a glibc system. Note that C compilers wouldn't even warn about the missing fseeko declaration unless -Wall or similar was given.
I had a second look at current glibc cvs - the libio/stdio.h does have a different order for the two ifdefs but still has the problematic behavior of ommitting fseeko when strictly required through the existance of __USE_FILE_OFFSET64
#ifdef __USE_LARGEFILE # ifndef __USE_FILE_OFFSET64 /* Seek to a certain position on STREAM. */ extern int fseeko (FILE *__stream, __off_t __off, int __whence) __THROW; /* Return the current position of STREAM. */ extern __off_t ftello (FILE *__stream) __THROW; # else # ifdef __REDIRECT extern int __REDIRECT (fseeko, (FILE *__stream, __off64_t __off, int __whence) __THROW, fseeko64); extern __off64_t __REDIRECT (ftello, (FILE *__stream) __THROW, ftello64); # else # define fseeko fseeko64 # define ftello ftello64 # endif # endif #endif
and it should be patched atleast to be:
#ifndef __USE_FILE_OFFSET64
# ifdef __USE_LARGEFILE
/* Seek to a certain position on STREAM. */
extern int fseeko (FILE *__stream, __off_t __off, int __whence) __THROW;
/* Return the current position of STREAM. */
extern __off_t ftello (FILE *__stream) __THROW;
# endif
#else
# ifdef __REDIRECT
extern int __REDIRECT (fseeko,
(FILE *__stream, __off64_t __off, int __whence) __THROW,
fseeko64);
extern __off64_t __REDIRECT (ftello, (FILE *__stream) __THROW, ftello64);
# else
# define fseeko fseeko64
# define ftello ftello64
# endif
#endifPersonally, I think it would be the best to simply add a global change in features.h
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 # define __USE_FILE_OFFSET64 1 +# ifndef __USE_LARGEFILE +# define __USE_LARGEFILE 1 +# endif #endif
This should avoid callframe-mismatches in all futures cases where glibc developers decide to do things differently without a need and differently than all other systems.
The missing fseeko-export might be called a feature-flaw by glibc maintainers, the callframe mismatch is a plain bug, IMHO a severe bug as all silent errors should be called that can trash your database files.
-- cheers, guido http://ac-archive.sf.net/largefile
