Index: acinclude.m4 =================================================================== RCS file: /repository/php-src/acinclude.m4,v retrieving revision 1.332.2.14.2.6 diff -u -p -d -r1.332.2.14.2.6 acinclude.m4 --- acinclude.m4 4 Dec 2006 18:28:49 -0000 1.332.2.14.2.6 +++ acinclude.m4 11 Dec 2006 19:40:56 -0000 @@ -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 +],[ +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 +],[ +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 +],[ +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: configure.in =================================================================== RCS file: /repository/php-src/configure.in,v retrieving revision 1.579.2.52.2.29 diff -u -p -d -r1.579.2.52.2.29 configure.in --- configure.in 5 Dec 2006 08:07:56 -0000 1.579.2.52.2.29 +++ configure.in 11 Dec 2006 19:40:56 -0000 @@ -467,7 +467,6 @@ chroot \ ctime_r \ cuserid \ crypt \ -crypt_r \ flock \ ftok \ funopen \ @@ -600,6 +599,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: ext/standard/crypt.c =================================================================== RCS file: /repository/php-src/ext/standard/crypt.c,v retrieving revision 1.62.2.1.2.2 diff -u -p -d -r1.62.2.1.2.2 crypt.c --- ext/standard/crypt.c 3 Dec 2006 13:46:37 -0000 1.62.2.1.2.2 +++ ext/standard/crypt.c 11 Dec 2006 19:40:56 -0000 @@ -28,6 +28,9 @@ #include #endif #if HAVE_CRYPT_H +#if defined(CRYPT_R_GNU_SOURCE) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif #include #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