From: Wez Furlong Date: Thu, 22 Aug 2002 22:28:19 +0000 (+0000) Subject: Add a configure check to see if the seeker function in an fopencookie X-Git-Tag: RELEASE_0_91~301 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d8b6c2d521d7c90c8107a4f85083c32d98e9b1a;p=php Add a configure check to see if the seeker function in an fopencookie uses off_t or the newer, more portable "fpos_t *". The check could perhaps be more refined, as the test program will segfault on older systems (like mine) that use off_t. --- diff --git a/acinclude.m4 b/acinclude.m4 index 1e9e9088a1..8c4eb35a7d 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1408,9 +1408,44 @@ AC_DEFUN(PHP_FOPENCOOKIE,[ [ have_cookie_io_functions_t=yes ], [] ) - if test "$have_cookie_io_functions_t" = "yes" ; then + if test "$have_cookie_io_functions_t" = "yes" ; then cookie_io_functions_t=cookie_io_functions_t - have_fopen_cookie=yes + have_fopen_cookie=yes + + dnl even newer glibcs have a different seeker definition... + + AC_TRY_RUN([ +#define _GNU_SOURCE +#include + +struct cookiedata { + fpos_t pos; +}; + +size_t reader(void *cookie, char *buffer, size_t size) +{ return size; } +size_t writer(void *cookie, const char *buffer, size_t size) +{ return size; } +int closer(void *cookie) +{ return 0; } +int seeker(void *cookie, fpos_t *position, int whence) +{ ((struct cookiedata*)cookie)->pos = *position; return 0; } + +cookie_io_functions_t funcs = {reader, writer, seeker, closer}; + +main() { + struct cookiedata g = { 0 }; + FILE *fp = fopencookie(&g, "r", funcs); + + if (fp && fseek(fp, 69, SEEK_SET) == 0 && g.pos == 69) + exit(0); + exit(1); +} + + ], + [ cookie_io_functions_use_fpos_t=yes ], + [ ] ) + else dnl older glibc versions (up to 2.1.2 ?) dnl call it _IO_cookie_io_functions_t @@ -1421,14 +1456,17 @@ AC_DEFUN(PHP_FOPENCOOKIE,[ [ have_IO_cookie_io_functions_t=yes ], [] ) if test "$have_cookie_io_functions_t" = "yes" ; then - cookie_io_functions_t=_IO_cookie_io_functions_t - have_fopen_cookie=yes + cookie_io_functions_t=_IO_cookie_io_functions_t + have_fopen_cookie=yes fi - fi + fi - if test "$have_fopen_cookie" = "yes" ; then - AC_DEFINE(HAVE_FOPENCOOKIE, 1, [ ]) - AC_DEFINE_UNQUOTED(COOKIE_IO_FUNCTIONS_T, $cookie_io_functions_t, [ ]) + if test "$have_fopen_cookie" = "yes" ; then + AC_DEFINE(HAVE_FOPENCOOKIE, 1, [ ]) + AC_DEFINE_UNQUOTED(COOKIE_IO_FUNCTIONS_T, $cookie_io_functions_t, [ ]) + if test "$cookie_io_functions_use_fpos_t" = "yes" ; then + AC_DEFINE(COOKIE_SEEKER_USES_FPOS_T, 1, [ ]) + fi fi fi diff --git a/main/streams.c b/main/streams.c index 229ec545e6..943c600d81 100755 --- a/main/streams.c +++ b/main/streams.c @@ -1138,12 +1138,25 @@ static ssize_t stream_cookie_writer(void *cookie, const char *buffer, size_t siz return php_stream_write(((php_stream *)cookie), (char *)buffer, size); } +#ifdef COOKIE_SEEKER_USES_FPOS_T +static int stream_cookie_seeker(void *cookie, fpos_t *position, int whence) +{ + TSRMLS_FETCH(); + + *position = php_stream_seek((php_stream *)cookie, *position, whence); + + if (*position == -1) + return -1; + return 0; +} +#else static int stream_cookie_seeker(void *cookie, off_t position, int whence) { TSRMLS_FETCH(); return php_stream_seek((php_stream *)cookie, position, whence); } +#endif static int stream_cookie_closer(void *cookie) {