diff options
| -rw-r--r-- | acinclude.m4 | 24 | ||||
| -rw-r--r-- | configure.in | 2 | ||||
| -rw-r--r-- | main/reentrancy.c | 15 |
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 |
