wez Wed Jan 1 04:58:17 2003 EDT
Modified files:
/php4 acinclude.m4 configure.in
/php4/main streams.c
Log:
Workaround for glibc 2.2.9x and later "a+" bug that does not seek to EOF for
files fopen()ed with that mode.
Index: php4/acinclude.m4
diff -u php4/acinclude.m4:1.221 php4/acinclude.m4:1.222
--- php4/acinclude.m4:1.221 Mon Nov 18 06:39:41 2002
+++ php4/acinclude.m4 Wed Jan 1 04:58:16 2003
@@ -1,4 +1,4 @@
-dnl $Id: acinclude.m4,v 1.221 2002/11/18 11:39:41 wez Exp $
+dnl $Id: acinclude.m4,v 1.222 2003/01/01 09:58:16 wez Exp $
dnl
dnl This file contains local autoconf functions.
@@ -1454,6 +1454,45 @@
AC_DEFINE(CHARSET_EBCDIC,1, [Define if system uses EBCDIC])
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: php4/configure.in
diff -u php4/configure.in:1.409 php4/configure.in:1.410
--- php4/configure.in:1.409 Thu Dec 19 12:02:39 2002
+++ php4/configure.in Wed Jan 1 04:58:16 2003
@@ -1,4 +1,4 @@
-dnl ## $Id: configure.in,v 1.409 2002/12/19 17:02:39 edink Exp $ -*- sh -*-
+dnl ## $Id: configure.in,v 1.410 2003/01/01 09:58:16 wez Exp $ -*- sh -*-
dnl ## Process this file with autoconf to produce a configure script.
divert(1)
@@ -382,6 +382,7 @@
])
PHP_FOPENCOOKIE
+PHP_BROKEN_GLIBC_FOPEN_APPEND
dnl Checks for typedefs, structures, and compiler characteristics.
dnl -------------------------------------------------------------------------
Index: php4/main/streams.c
diff -u php4/main/streams.c:1.139 php4/main/streams.c:1.140
--- php4/main/streams.c:1.139 Tue Dec 31 10:58:54 2002
+++ php4/main/streams.c Wed Jan 1 04:58:17 2003
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: streams.c,v 1.139 2002/12/31 15:58:54 sebastian Exp $ */
+/* $Id: streams.c,v 1.140 2003/01/01 09:58:17 wez Exp $ */
#define _GNU_SOURCE
#include "php.h"
@@ -1317,6 +1317,12 @@
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 @@
}
}
- 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 */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php