summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--acinclude.m424
-rw-r--r--configure.in2
-rw-r--r--main/reentrancy.c15
3 files changed, 36 insertions, 5 deletions
diff --git a/acinclude.m4 b/acinclude.m4
index bb2ca1baf0..6d7bf11199 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -4,9 +4,12 @@ dnl This file contains local autoconf functions.
sinclude(dynlib.m4)
-AC_DEFUN(PHP_POSIX_READDIR_R,[
+AC_DEFUN(PHP_READDIR_R_TYPE,[
+ AC_CHECK_FUNCS(readdir_r)
+ if test "$ac_cv_func_readdir_r" = "yes"; then
AC_CACHE_CHECK(for type of readdir_r, ac_cv_what_readdir_r,[
AC_TRY_RUN([
+#define _REENTRANT
#include <sys/types.h>
#include <dirent.h>
@@ -24,13 +27,26 @@ main() {
],[
ac_cv_what_readdir_r=POSIX
],[
- ac_cv_what_readdir_r=none
+ AC_TRY_CPP([
+#define _REENTRANT
+#include <sys/types.h>
+#include <dirent.h>
+int readdir_r(DIR *, struct dirent *);
+ ],[
+ ac_cv_what_readdir_r=old-style
+ ],[
+ ac_cv_what_readdir_r=none
+ ])
],[
ac_cv_what_readdir_r=none
])
])
- if test "$ac_cv_what_readdir_r" = "POSIX"; then
- AC_DEFINE(HAVE_POSIX_READDIR_R,1,[whether you have POSIX readdir_r])
+ case "$ac_cv_what_readdir_r" in
+ POSIX)
+ AC_DEFINE(HAVE_POSIX_READDIR_R,1,[whether you have POSIX readdir_r]);;
+ old-style)
+ AC_DEFINE(HAVE_OLD_READDIR_R,1,[whether you have old-style readdir_r]);;
+ esac
fi
])
diff --git a/configure.in b/configure.in
index 4ed1a52d17..c2b79db30f 100644
--- a/configure.in
+++ b/configure.in
@@ -379,7 +379,7 @@ AC_FUNC_ALLOCA
AC_BROKEN_SPRINTF
PHP_DECLARED_TIMEZONE
PHP_TIME_R_TYPE
-PHP_POSIX_READDIR_R
+PHP_READDIR_R_TYPE
dnl AIX keeps in_addr_t in /usr/include/netinet/in.h
dnl AC_MSG_CHECKING(for in_addr_t)
diff --git a/main/reentrancy.c b/main/reentrancy.c
index d9dd97fec8..c180a5af2b 100644
--- a/main/reentrancy.c
+++ b/main/reentrancy.c
@@ -99,6 +99,20 @@ PHPAPI struct tm *php_gmtime_r(const time_t *const timep, struct tm *p_tm)
PHPAPI int php_readdir_r(DIR *dirp, struct dirent *entry,
struct dirent **result)
{
+#if defined(HAVE_OLD_READDIR_R)
+ int ret;
+
+ errno = 0;
+
+ ret = readdir_r(dirp, entry);
+
+ if (ret == 0)
+ *result = entry;
+ else
+ *result = NULL;
+
+ return ret;
+#else
struct dirent *ptr;
int ret = 0;
@@ -120,6 +134,7 @@ PHPAPI int php_readdir_r(DIR *dirp, struct dirent *entry,
local_unlock(READDIR_R);
return ret;
+#endif
}
#endif