]> granicus.if.org Git - php/commitdiff
Workaround a bug in glibc 2.2.9x and later that causes it not to seek to EOF
authorWez Furlong <wez@php.net>
Wed, 1 Jan 2003 09:55:38 +0000 (09:55 +0000)
committerWez Furlong <wez@php.net>
Wed, 1 Jan 2003 09:55:38 +0000 (09:55 +0000)
for stdio streams opened with a mode of "a+".

acinclude.m4
configure.in
main/streams.c

index d7af5fffdf5cbd333b2d8b61edde7e5e6fa605e2..f851045ddeaa2b8e74377415446659fc7d70cd06 100644 (file)
@@ -1462,6 +1462,45 @@ int main(void) {
   fi
 ])
 
+AC_DEFUN([PHP_BROKEN_GLIBC_FOPEN_APPEND],[
+  AC_MSG_CHECKING([for broken libc stdio])
+  AC_TRY_RUN([
+#include <stdio.h>
+int main(int argc, char *argv[])
+{
+  FILE *fp;
+  long position;
+  char *filename = "/tmp/phpglibccheck";
+  
+  fp = fopen(filename, "w");
+  if (fp == NULL) {
+         perror("fopen");
+         exit(2);
+  }
+  fputs("foobar", fp);
+  fclose(fp);
+
+  fp = fopen(filename, "a+");
+  position = ftell(fp);
+  fclose(fp);
+  unlink(filename);
+  if (position == 0)
+       return 1;
+  return 0;
+}
+],
+[have_broken_glibc_fopen_append=no],
+[have_broken_glibc_fopen_append=yes ])
+
+  if test "$have_broken_glibc_fopen_append" = "yes"; then
+       AC_MSG_RESULT(yes)
+       AC_DEFINE(HAVE_BROKEN_GLIBC_FOPEN_APPEND,1, [Define if your glibc borks on fopen with mode a+])
+  else
+       AC_MSG_RESULT(no)
+  fi
+])
+
+
 AC_DEFUN([PHP_FOPENCOOKIE],[
        AC_CHECK_FUNC(fopencookie, [ have_glibc_fopencookie=yes ])
 
index 586841acc322466651704360ec7d6926d993741c..6d597743af5e094293449f81c96030274db02ec8 100644 (file)
@@ -382,6 +382,7 @@ sys/ipc.h \
 ])
 
 PHP_FOPENCOOKIE
+PHP_BROKEN_GLIBC_FOPEN_APPEND
 
 dnl Checks for typedefs, structures, and compiler characteristics.
 dnl -------------------------------------------------------------------------
index 02be2f2d7518160009cf60552a8b4d2cc3b209a0..74b95bf94bd2cfd7ceac3012a5be2cb8ad7ac9a9 100755 (executable)
@@ -1317,6 +1317,12 @@ PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STRE
        
        stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
 
+#ifdef HAVE_BROKEN_GLIBC_FOPEN_APPEND
+       if (strchr(mode, 'a')) {
+               fseek(file, 0, SEEK_END);
+       }
+#endif
+       
        if (stream) {
                if (self->is_pipe) {
                        stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
@@ -2417,7 +2423,7 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio
                }
        }
 
-       if (stream && stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0 && strchr(mode, 'a')) {
+       if (stream && stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0 && strchr(mode, 'a') && stream->position == 0) {
                off_t newpos = 0;
 
                /* if opened for append, we need to revise our idea of the initial file position */