]> granicus.if.org Git - php/commitdiff
fix #39795 (build fails on AIX because crypt_r() uses different data struct)
authorAntony Dovgal <tony2001@php.net>
Tue, 12 Dec 2006 07:36:37 +0000 (07:36 +0000)
committerAntony Dovgal <tony2001@php.net>
Tue, 12 Dec 2006 07:36:37 +0000 (07:36 +0000)
acinclude.m4
configure.in
ext/standard/crypt.c

index efc7ccca0f59cd19d7b9f7646031feff2eab432d..d4af13aabf7c7a4f85c0e4a39761dd71ce44c0b5 100644 (file)
@@ -2590,3 +2590,55 @@ AC_DEFUN([PHP_DETECT_ICC],
   )
 ])
 
+dnl
+dnl PHP_CRYPT_R_STYLE
+dnl detect the style of crypt_r() is any is available
+dnl see APR_CHECK_CRYPT_R_STYLE() for original version
+dnl
+AC_DEFUN([PHP_CRYPT_R_STYLE],
+[
+  AC_CACHE_CHECK([which data struct is used by crypt_r], php_cv_crypt_r_style,[
+    php_cv_crypt_r_style=none
+    AC_TRY_COMPILE([
+#include <crypt.h>
+],[
+CRYPTD buffer;
+crypt_r("passwd", "hash", &buffer);
+], 
+php_cv_crypt_r_style=cryptd)
+
+    if test "$php_cv_crypt_r_style" = "none"; then
+      AC_TRY_COMPILE([
+#include <crypt.h>
+],[
+struct crypt_data buffer;
+crypt_r("passwd", "hash", &buffer);
+], 
+php_cv_crypt_r_style=struct_crypt_data)
+    fi
+
+    if test "$php_cv_crypt_r_style" = "none"; then
+      AC_TRY_COMPILE([
+#define _GNU_SOURCE
+#include <crypt.h>
+],[
+struct crypt_data buffer;
+crypt_r("passwd", "hash", &buffer);
+], 
+php_cv_crypt_r_style=struct_crypt_data_gnu_source)
+    fi
+    ])
+
+  if test "$php_cv_crypt_r_style" = "cryptd"; then
+    AC_DEFINE(CRYPT_R_CRYPTD, 1, [Define if crypt_r has uses CRYPTD])
+  fi
+  if test "$php_cv_crypt_r_style" = "struct_crypt_data" -o "$php_cv_crypt_r_style" = "struct_crypt_data_gnu_source"; then
+    AC_DEFINE(CRYPT_R_STRUCT_CRYPT_DATA, 1, [Define if crypt_r uses struct crypt_data])
+  fi
+  if test "$php_cv_crypt_r_style" = "struct_crypt_data_gnu_source"; then
+    AC_DEFINE(CRYPT_R_GNU_SOURCE, 1, [Define if struct crypt_data requires _GNU_SOURCE])
+  fi
+  if test "$php_cv_crypt_r_style" = "none"; then
+    AC_MSG_ERROR([Unable to detect data struct is used by crypt_r])
+  fi
+])
index 6e5b3fb9bd118f2624057ca5306ba15f7fe27f62..5e2efd5b0b0eff54b4ecf732604e1843904591cf 100644 (file)
@@ -465,7 +465,6 @@ chroot \
 ctime_r \
 cuserid \
 crypt \
-crypt_r \
 flock \
 ftok \
 funopen \
@@ -598,6 +597,11 @@ PHP_TIME_R_TYPE
 PHP_READDIR_R_TYPE
 PHP_CHECK_IN_ADDR_T
 
+AC_CHECK_FUNCS(crypt_r, [ php_crypt_r="1" ], [ php_crypt_r="0" ])
+if test "x$php_crypt_r" = "x1"; then
+  PHP_CRYPT_R_STYLE
+fi
+
 divert(4)
 
 dnl ## In diversion 4 we check user-configurable general settings.
index 47456be4889b0c4b6aa9fe1285412ae8aaebda19..f119ec6e8373e06382637f21afe8beca2c195cda 100644 (file)
@@ -28,6 +28,9 @@
 #include <unistd.h>
 #endif
 #if HAVE_CRYPT_H
+#if defined(CRYPT_R_GNU_SOURCE) && !defined(_GNU_SOURCE)
+#define _GNU_SOURCE
+#endif
 #include <crypt.h>
 #endif
 #if TM_IN_SYS_TIME
@@ -147,8 +150,15 @@ PHP_FUNCTION(crypt)
        }
 #ifdef HAVE_CRYPT_R
        {
+#if defined(CRYPT_R_STRUCT_CRYPT_DATA)
                struct crypt_data buffer;
                memset(&buffer, 0, sizeof(buffer));
+#elif defined(CRYPT_R_CRYPTD)
+               CRYPTD buffer;
+#else 
+#error Data struct used by crypt_r() is unknown. Please report.
+#endif
+
                RETURN_STRING(crypt_r(str, salt, &buffer), 1);
        }
 #else