Use fseeko64() everywhere when possible, instead of potential 32-bit versions.

This commit is contained in:
Sam Hocevar 2009-11-26 01:13:58 +00:00 committed by sam
parent 7026052971
commit c9150f4458
3 changed files with 26 additions and 12 deletions

View File

@ -48,7 +48,7 @@ AC_SUBST(DLL_LDFLAGS)
AC_CHECK_HEADERS(windows.h winsock2.h io.h process.h unistd.h inttypes.h stdint.h getopt.h libc.h malloc.h dlfcn.h regex.h sys/cdefs.h sys/socket.h netinet/in.h arpa/inet.h sys/uio.h aio.h sys/mman.h sys/wait.h sys/resource.h sys/time.h endian.h) AC_CHECK_HEADERS(windows.h winsock2.h io.h process.h unistd.h inttypes.h stdint.h getopt.h libc.h malloc.h dlfcn.h regex.h sys/cdefs.h sys/socket.h netinet/in.h arpa/inet.h sys/uio.h aio.h sys/mman.h sys/wait.h sys/resource.h sys/time.h endian.h)
AC_CHECK_FUNCS(setenv waitpid setrlimit gettimeofday fork kill pipe _pipe) AC_CHECK_FUNCS(setenv waitpid setrlimit gettimeofday fork kill pipe _pipe)
AC_CHECK_FUNCS(open64 __open64 lseek64 __lseek64 mmap64 fopen64 __fopen64 freopen64 __freopen64 dup dup2 fseeko fseeko64 __fseeko64 fsetpos64 __fsetpos64 _IO_getc getline getdelim __getdelim fgetln __srefill __filbuf __srget __uflow map_fd memalign posix_memalign aio_read accept bind connect socket readv pread recv recvfrom recvmsg mmap valloc sigaction getpagesize getc_unlocked getchar_unlocked fgetc_unlocked fread_unlocked fgets_unlocked) AC_CHECK_FUNCS(open64 __open64 lseek64 __lseek64 mmap64 fopen64 __fopen64 freopen64 __freopen64 dup dup2 ftello ftello64 __ftello64 fseeko fseeko64 __fseeko64 fsetpos64 __fsetpos64 _IO_getc getline getdelim __getdelim fgetln __srefill __filbuf __srget __uflow map_fd memalign posix_memalign aio_read accept bind connect socket readv pread recv recvfrom recvmsg mmap valloc sigaction getpagesize getc_unlocked getchar_unlocked fgetc_unlocked fread_unlocked fgets_unlocked)
AC_CHECK_TYPES(sighandler_t, [], [], AC_CHECK_TYPES(sighandler_t, [], [],
[#define _GNU_SOURCE [#define _GNU_SOURCE

View File

@ -42,6 +42,8 @@
/* #undef HAVE_FSEEKO */ /* #undef HAVE_FSEEKO */
#define HAVE_FSEEKO64 1 #define HAVE_FSEEKO64 1
/* #undef HAVE_FSETPOS64 */ /* #undef HAVE_FSETPOS64 */
/* #undef HAVE_FTELLO */
#define HAVE_FTELLO64 1
/* #undef HAVE_GETCHAR_UNLOCKED */ /* #undef HAVE_GETCHAR_UNLOCKED */
/* #undef HAVE_GETC_UNLOCKED */ /* #undef HAVE_GETC_UNLOCKED */
/* #undef HAVE_GETDELIM */ /* #undef HAVE_GETDELIM */
@ -106,6 +108,7 @@
/* #undef HAVE___FREOPEN64 */ /* #undef HAVE___FREOPEN64 */
/* #undef HAVE___FSEEKO64 */ /* #undef HAVE___FSEEKO64 */
/* #undef HAVE___FSETPOS64 */ /* #undef HAVE___FSETPOS64 */
/* #undef HAVE___FTELLO64 */
/* #undef HAVE___GETDELIM */ /* #undef HAVE___GETDELIM */
/* #undef HAVE___LSEEK64 */ /* #undef HAVE___LSEEK64 */
/* #undef HAVE___OPEN64 */ /* #undef HAVE___OPEN64 */

View File

@ -30,6 +30,17 @@
# define HAVE_BSD_STDIO # define HAVE_BSD_STDIO
#endif #endif
/* Define the best ftell() clone */
#if defined HAVE_FTELLO64
# define MYFTELL ftello64
#elif defined HAVE___FTELLO64
# define MYFTELL __ftello64
#elif defined HAVE_FTELLO
# define MYFTELL ftello
#else
# define MYFTELL ftell
#endif
#if defined HAVE_STDINT_H #if defined HAVE_STDINT_H
# include <stdint.h> # include <stdint.h>
#elif defined HAVE_INTTYPES_H #elif defined HAVE_INTTYPES_H
@ -295,16 +306,16 @@ FILE *NEW(__freopen64)(const char *path, const char *mode, FILE *stream)
*/ */
#if defined HAVE_DARWIN_STDIO /* Don't fuzz or seek if we have __srefill() */ #if defined HAVE_DARWIN_STDIO /* Don't fuzz or seek if we have __srefill() */
# define FSEEK_FUZZ(myftell) # define FSEEK_FUZZ()
#else #else
# define FSEEK_FUZZ(myftell) \ # define FSEEK_FUZZ() \
if(ret == 0) \ if(ret == 0) \
{ \ { \
/* FIXME: check what happens when fseek()ing a pipe */ \ /* FIXME: check what happens when fseek()ing a pipe */ \
switch(whence) \ switch(whence) \
{ \ { \
case SEEK_END: \ case SEEK_END: \
offset = myftell(stream); \ offset = MYFTELL(stream); \
/* fall through */ \ /* fall through */ \
case SEEK_SET: \ case SEEK_SET: \
_zz_setpos(fd, offset); \ _zz_setpos(fd, offset); \
@ -316,7 +327,7 @@ FILE *NEW(__freopen64)(const char *path, const char *mode, FILE *stream)
} }
#endif #endif
#define FSEEK(myfseek, myftell) \ #define FSEEK(myfseek) \
do \ do \
{ \ { \
int fd; \ int fd; \
@ -330,33 +341,33 @@ FILE *NEW(__freopen64)(const char *path, const char *mode, FILE *stream)
_zz_unlock(fd); \ _zz_unlock(fd); \
debug("%s([%i], %lli, %i) = %i", __func__, \ debug("%s([%i], %lli, %i) = %i", __func__, \
fd, (long long int)offset, whence, ret); \ fd, (long long int)offset, whence, ret); \
FSEEK_FUZZ(myftell) \ FSEEK_FUZZ() \
DEBUG_STREAM("new", stream); \ DEBUG_STREAM("new", stream); \
} while(0) } while(0)
int NEW(fseek)(FILE *stream, long offset, int whence) int NEW(fseek)(FILE *stream, long offset, int whence)
{ {
int ret; FSEEK(fseek, ftell); return ret; int ret; FSEEK(fseek); return ret;
} }
#if defined HAVE_FSEEKO #if defined HAVE_FSEEKO
int NEW(fseeko)(FILE *stream, off_t offset, int whence) int NEW(fseeko)(FILE *stream, off_t offset, int whence)
{ {
int ret; FSEEK(fseeko, ftello); return ret; int ret; FSEEK(fseeko); return ret;
} }
#endif #endif
#if defined HAVE_FSEEKO64 #if defined HAVE_FSEEKO64
int NEW(fseeko64)(FILE *stream, off64_t offset, int whence) int NEW(fseeko64)(FILE *stream, off64_t offset, int whence)
{ {
int ret; FSEEK(fseeko64, ftello64); return ret; int ret; FSEEK(fseeko64); return ret;
} }
#endif #endif
#if defined HAVE___FSEEKO64 #if defined HAVE___FSEEKO64
int NEW(__fseeko64)(FILE *stream, off64_t offset, int whence) int NEW(__fseeko64)(FILE *stream, off64_t offset, int whence)
{ {
int ret; FSEEK(__fseeko64, ftello); return ret; int ret; FSEEK(__fseeko64); return ret;
} }
#endif #endif
@ -461,7 +472,7 @@ void NEW(rewind)(FILE *stream)
# define FREAD_FUZZ(fd, oldpos) \ # define FREAD_FUZZ(fd, oldpos) \
do \ do \
{ \ { \
int64_t newpos = ftell(stream); \ int64_t newpos = MYFTELL(stream); \
/* XXX: the number of bytes read is not ret * size, because \ /* XXX: the number of bytes read is not ret * size, because \
* a partial read may have advanced the stream pointer. However, \ * a partial read may have advanced the stream pointer. However, \
* when reading from a pipe ftell() will return 0, and ret * size \ * when reading from a pipe ftell() will return 0, and ret * size \
@ -514,7 +525,7 @@ void NEW(rewind)(FILE *stream)
if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \ if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
return ORIG(myfread)(ptr, size, nmemb, stream); \ return ORIG(myfread)(ptr, size, nmemb, stream); \
DEBUG_STREAM("old", stream); \ DEBUG_STREAM("old", stream); \
oldpos = ftell(stream); \ oldpos = MYFTELL(stream); \
_zz_lock(fd); \ _zz_lock(fd); \
ret = ORIG(myfread)(ptr, size, nmemb, stream); \ ret = ORIG(myfread)(ptr, size, nmemb, stream); \
_zz_unlock(fd); \ _zz_unlock(fd); \