Browse Source

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.
experimental/new_apache_hooks
Wez Furlong 24 years ago
parent
commit
3d8b6c2d52
  1. 54
      acinclude.m4
  2. 13
      main/streams.c

54
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 <stdio.h>
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

13
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)
{

Loading…
Cancel
Save