cvs: php4 /ext/ldap config.m4 ldap.c php_ldap.h

From: Date: Thu, 29 Nov 2001 20:26:20 +0000
Subject: cvs: php4 /ext/ldap config.m4 ldap.c php_ldap.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-8332@lists.php.net to get a copy of this message
venaas Thu Nov 29 15:26:20 2001 EDT Modified files: /php4/ext/ldap config.m4 ldap.c php_ldap.h Log: Adding ldap_set_rebind_proc() for APIs with V3 3 arg variant, need more testing. Index: php4/ext/ldap/config.m4 diff -u php4/ext/ldap/config.m4:1.19 php4/ext/ldap/config.m4:1.20 --- php4/ext/ldap/config.m4:1.19 Mon May 21 15:47:15 2001 +++ php4/ext/ldap/config.m4 Thu Nov 29 15:26:20 2001 @@ -1,4 +1,4 @@ -dnl $Id: config.m4,v 1.19 2001/05/21 19:47:15 sniper Exp $ +dnl $Id: config.m4,v 1.20 2001/11/29 20:26:20 venaas Exp $ AC_DEFUN(PHP_LDAP_CHECKS, [ if test -f $1/include/ldap.h; then @@ -90,4 +90,15 @@ PHP_ADD_INCLUDE($LDAP_INCDIR) PHP_SUBST(LDAP_SHARED_LIBADD) AC_DEFINE(HAVE_LDAP,1,[ ]) + + dnl Check for 3 arg ldap_set_rebind_proc + _SAVE_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -I$LDAP_INCDIR" + AC_CACHE_CHECK([for 3 arg ldap_set_rebind_proc], ac_cv_3arg_setrebindproc, + [AC_TRY_COMPILE([#include <ldap.h>], [ldap_set_rebind_proc(0,0,0)], + ac_cv_3arg_setrebindproc=yes, ac_cv_3arg_setrebindproc=no)]) + if test "$ac_cv_3arg_setrebindproc" = yes; then + AC_DEFINE(HAVE_3ARG_SETREBINDPROC,1,[Whether 3 arg set_rebind_proc()]) + fi + CPPFLAGS=$_SAVE_CPPFLAGS fi Index: php4/ext/ldap/ldap.c diff -u php4/ext/ldap/ldap.c:1.106 php4/ext/ldap/ldap.c:1.107 --- php4/ext/ldap/ldap.c:1.106 Thu Nov 29 15:17:17 2001 +++ php4/ext/ldap/ldap.c Thu Nov 29 15:26:20 2001 @@ -22,7 +22,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ldap.c,v 1.106 2001/11/29 20:17:17 venaas Exp $ */ +/* $Id: ldap.c,v 1.107 2001/11/29 20:26:20 venaas Exp $ */ #define IS_EXT_MODULE #ifdef HAVE_CONFIG_H @@ -53,6 +53,9 @@ typedef struct { LDAP *link; +#ifdef HAVE_3ARG_SETREBINDPROC + zval *rebindproc; +#endif } ldap_linkdata; ZEND_DECLARE_MODULE_GLOBALS(ldap) @@ -119,6 +122,10 @@ PHP_FE(ldap_start_tls, NULL) #endif +#ifdef HAVE_3ARG_SETREBINDPROC + PHP_FE(ldap_set_rebind_proc, NULL) +#endif + #ifdef STR_TRANSLATION PHP_FE(ldap_t61_to_8859, NULL) PHP_FE(ldap_8859_to_t61, NULL) @@ -152,6 +159,12 @@ ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr; ldap_unbind_s(ld->link); +#ifdef HAVE_3ARG_SETREBINDPROC + if (ld->rebindproc != NULL) { + zval_dtor(ld->rebindproc); + FREE_ZVAL(ld->rebindproc); + } +#endif efree(ld); LDAPG(num_links)--; } @@ -262,7 +275,7 @@ php_info_print_table_start(); php_info_print_table_row(2, "LDAP Support", "enabled" ); - php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 1.106 2001/11/29 20:17:17 venaas Exp $" ); + php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 1.107 2001/11/29 20:26:20 venaas Exp $" ); php_info_print_table_row(2, "Total Links", maxl ); #ifdef LDAP_API_VERSION @@ -1989,6 +2002,89 @@ } } /* }}} */ +#endif + + +#ifdef HAVE_3ARG_SETREBINDPROC +int _ldap_rebind_proc(LDAP *ldap, LDAP_CONST char *url, ber_tag_t req, ber_int_t msgid, void *params) { + ldap_linkdata *ld; + int retval; + zval *cb_url; + zval **cb_args[2]; + zval *cb_retval; + zval *cb_link = (zval *) params; + + ld = (ldap_linkdata *) zend_fetch_resource(&cb_link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); + + /* link exists and callback set? */ + if (ld == NULL || ld->rebindproc == NULL) { + php_error(E_WARNING, "%s(): Link not found or no callback set", get_active_function_name(TSRMLS_C)); + return LDAP_OTHER; + } + + /* callback */ + MAKE_STD_ZVAL(cb_url); + ZVAL_STRING(cb_url, estrdup(url), 0); + cb_args[0] = &cb_link; + cb_args[1] = &cb_url; + if (call_user_function_ex(EG(function_table), NULL, ld->rebindproc, &cb_retval, 2, cb_args, 0, NULL) == SUCCESS && cb_retval) { + convert_to_long_ex(&cb_retval); + retval = Z_LVAL_P(cb_retval); + zval_ptr_dtor(&cb_retval); + } else { + php_error(E_WARNING, "LDAP: rebind_proc php callback failed"); + retval = LDAP_OTHER; + } + zval_dtor(cb_url); + FREE_ZVAL(cb_url); + return retval; +} + + +/* {{{ proto int ldap_set_rebind_proc(int link, string callback) + Set a callback function to do re-binds on referral chasing. */ +PHP_FUNCTION(ldap_set_rebind_proc) +{ + zval *link, *callback; + ldap_linkdata *ld; + char *callback_name; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &link, &callback) == FAILURE) { + RETURN_FALSE; + } + + ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, &link, -1, "ldap link", le_link); + + if (Z_TYPE_P(callback) == IS_STRING && Z_STRLEN_P(callback) == 0) { + /* unregister rebind procedure */ + if (ld->rebindproc != NULL) { + zval_dtor(ld->rebindproc); + ld->rebindproc = NULL; + ldap_set_rebind_proc(ld->link, NULL, NULL); + } + RETURN_TRUE; + } + + /* callable? */ + if (!zend_is_callable(callback, 0, &callback_name)) { + php_error(E_WARNING, "%s() expects argument 2, '%s', to be a valid callback", get_active_function_name(TSRMLS_C), callback_name); + efree(callback_name); + RETURN_FALSE; + } + efree(callback_name); + + /* register rebind procedure */ + if (ld->rebindproc == NULL) { + ldap_set_rebind_proc(ld->link, _ldap_rebind_proc, (void *) link); + } else { + zval_dtor(ld->rebindproc); + } + + ALLOC_ZVAL(ld->rebindproc); + *ld->rebindproc = *callback; + zval_copy_ctor(ld->rebindproc); + RETURN_TRUE; +} #endif Index: php4/ext/ldap/php_ldap.h diff -u php4/ext/ldap/php_ldap.h:1.21 php4/ext/ldap/php_ldap.h:1.22 --- php4/ext/ldap/php_ldap.h:1.21 Wed Nov 21 15:14:17 2001 +++ php4/ext/ldap/php_ldap.h Thu Nov 29 15:26:20 2001 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ldap.h,v 1.21 2001/11/21 20:14:17 venaas Exp $ */ +/* $Id: php_ldap.h,v 1.22 2001/11/29 20:26:20 venaas Exp $ */ #ifndef PHP_LDAP_H #define PHP_LDAP_H @@ -92,6 +92,10 @@ #if LDAP_API_VERSION > 2000 PHP_FUNCTION(ldap_start_tls); +#endif + +#ifdef HAVE_3ARG_SETREBINDPROC +PHP_FUNCTION(ldap_set_rebind_proc); #endif #ifdef STR_TRANSLATION

« previous php.cvs (#8332) next »