]> granicus.if.org Git - php/commitdiff
Add a configure check to see if the seeker function in an fopencookie
authorWez Furlong <wez@php.net>
Thu, 22 Aug 2002 22:28:19 +0000 (22:28 +0000)
committerWez Furlong <wez@php.net>
Thu, 22 Aug 2002 22:28:19 +0000 (22:28 +0000)
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.

acinclude.m4
main/streams.c

index 1e9e9088a15b0ef0032a6917f870ba4b941ccd66..8c4eb35a7d523443222acbf4244e4bed9bb70b5b 100644 (file)
@@ -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
index 229ec545e6263545361e959beb99cc4eefed9422..943c600d814393aafab008ac7c225702d3654a08 100755 (executable)
@@ -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)
 {