⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldap.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		case 8 :			convert_to_long_ex(deref);			ldap_deref = Z_LVAL_PP(deref);		case 7 :			convert_to_long_ex(timelimit);			ldap_timelimit = Z_LVAL_PP(timelimit);		case 6 :			convert_to_long_ex(sizelimit);			ldap_sizelimit = Z_LVAL_PP(sizelimit);		case 5 :			convert_to_long_ex(attrsonly);			ldap_attrsonly = Z_LVAL_PP(attrsonly);		case 4 : 			if (Z_TYPE_PP(attrs) != IS_ARRAY) {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected Array as last element");				RETURN_FALSE;			}			num_attribs = zend_hash_num_elements(Z_ARRVAL_PP(attrs));			ldap_attrs = safe_emalloc((num_attribs+1), sizeof(char *), 0);			for (i = 0; i<num_attribs; i++) {				if (zend_hash_index_find(Z_ARRVAL_PP(attrs), i, (void **) &attr) == FAILURE) {					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array initialization wrong");					efree(ldap_attrs);					RETURN_FALSE;				}				SEPARATE_ZVAL(attr);				convert_to_string_ex(attr);				ldap_attrs[i] = Z_STRVAL_PP(attr);			}			ldap_attrs[num_attribs] = NULL;				case 3 :			/* parallel search? */			if (Z_TYPE_PP(link) != IS_ARRAY) {				convert_to_string_ex(filter);				ldap_filter = Z_STRVAL_PP(filter);				convert_to_string_ex(base_dn);				ldap_base_dn = Z_STRVAL_PP(base_dn);			}		break;		default:			WRONG_PARAM_COUNT;		break;	}	/* parallel search? */	if (Z_TYPE_PP(link) == IS_ARRAY) {		int i, nlinks, nbases, nfilters, *rcs;		ldap_linkdata **lds;		zval **entry, *resource;				nlinks = zend_hash_num_elements(Z_ARRVAL_PP(link));		if (nlinks == 0) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "No links in link array");			if (ldap_attrs != NULL) {				efree(ldap_attrs);			}			RETURN_FALSE;		}		if (Z_TYPE_PP(base_dn) == IS_ARRAY) {			nbases = zend_hash_num_elements(Z_ARRVAL_PP(base_dn));			if (nbases != nlinks) {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Base must either be a string, or an array with the same number of elements as the links array");				if (ldap_attrs != NULL) {					efree(ldap_attrs);				}				RETURN_FALSE;			}			zend_hash_internal_pointer_reset(Z_ARRVAL_PP(base_dn));		} else {			nbases = 0; /* this means string, not array */			convert_to_string_ex(base_dn);			ldap_base_dn = Z_STRLEN_PP(base_dn) < 1 ? NULL : Z_STRVAL_PP(base_dn);		}		if (Z_TYPE_PP(filter) == IS_ARRAY) {			nfilters = zend_hash_num_elements(Z_ARRVAL_PP(filter));			if (nfilters != nlinks) {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filter must either be a string, or an array with the same number of elements as the links array");				if (ldap_attrs != NULL) {					efree(ldap_attrs);				}				RETURN_FALSE;			}			zend_hash_internal_pointer_reset(Z_ARRVAL_PP(filter));		} else {			nfilters = 0; /* this means string, not array */			convert_to_string_ex(filter);			ldap_filter = Z_STRVAL_PP(filter);		}		lds = safe_emalloc(nlinks, sizeof(ldap_linkdata), 0);		rcs = safe_emalloc(nlinks, sizeof(*rcs), 0);				zend_hash_internal_pointer_reset(Z_ARRVAL_PP(link));		for (i=0; i<nlinks; i++) {			zend_hash_get_current_data(Z_ARRVAL_PP(link), (void **)&entry);			ld = (ldap_linkdata *) zend_fetch_resource(entry TSRMLS_CC, -1, "ldap link", NULL, 1, le_link);			if (ld == NULL) {				efree(lds);				efree(rcs);				if (ldap_attrs != NULL) {					efree(ldap_attrs);				}				RETURN_FALSE;			}			if (nbases != 0) { /* base_dn an array? */				zend_hash_get_current_data(Z_ARRVAL_PP(base_dn), (void **)&entry);				zend_hash_move_forward(Z_ARRVAL_PP(base_dn));				convert_to_string_ex(entry);				ldap_base_dn = Z_STRLEN_PP(entry) < 1 ? NULL : Z_STRVAL_PP(entry);			}			if (nfilters != 0) { /* filter an array? */				zend_hash_get_current_data(Z_ARRVAL_PP(filter), (void **)&entry);				zend_hash_move_forward(Z_ARRVAL_PP(filter));				convert_to_string_ex(entry);				ldap_filter = Z_STRVAL_PP(entry);			}			php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref);			/* Run the actual search */				rcs[i] = ldap_search(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly);			lds[i] = ld;			zend_hash_move_forward(Z_ARRVAL_PP(link));		}				if (ldap_attrs != NULL) {			efree(ldap_attrs);		}				array_init(return_value);		/* Collect results from the searches */		for (i=0; i<nlinks; i++) {			MAKE_STD_ZVAL(resource);			if (rcs[i] != -1) {				rcs[i] = ldap_result(lds[i]->link, LDAP_RES_ANY, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);			}			if (rcs[i] != -1) {				ZEND_REGISTER_RESOURCE(resource, ldap_res, le_result);				add_next_index_zval(return_value, resource);			} else {				add_next_index_bool(return_value, 0);			}		}		efree(lds);		efree(rcs);		return;	}	/* fix to make null base_dn's work */	if (strlen(ldap_base_dn) < 1) {		ldap_base_dn = NULL;	}	ld = (ldap_linkdata *) zend_fetch_resource(link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link);	if (ld == NULL) {		if (ldap_attrs != NULL) {			efree(ldap_attrs);		}		RETURN_FALSE;	}	php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref);	/* Run the actual search */		errno = ldap_search_s(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly, &ldap_res);	if (ldap_attrs != NULL) {		efree(ldap_attrs);	}	if (errno != LDAP_SUCCESS		&& errno != LDAP_SIZELIMIT_EXCEEDED#ifdef LDAP_ADMINLIMIT_EXCEEDED		&& errno != LDAP_ADMINLIMIT_EXCEEDED#endif#ifdef LDAP_REFERRAL		&& errno != LDAP_REFERRAL#endif	) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Search: %s", ldap_err2string(errno));		RETVAL_FALSE; 	} else {		if (errno == LDAP_SIZELIMIT_EXCEEDED) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Sizelimit exceeded.");		}#ifdef LDAP_ADMINLIMIT_EXCEEDED		else if (errno == LDAP_ADMINLIMIT_EXCEEDED) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Adminlimit exceeded.");		}#endif				ZEND_REGISTER_RESOURCE(return_value, ldap_res, le_result);	}}/* }}} *//* {{{ proto resource ldap_read(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])   Read an entry */PHP_FUNCTION(ldap_read){	php_ldap_do_search(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_SCOPE_BASE);}/* }}} *//* {{{ proto resource ldap_list(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])   Single-level search */PHP_FUNCTION(ldap_list){	php_ldap_do_search(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_SCOPE_ONELEVEL);}/* }}} *//* {{{ proto resource ldap_search(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])   Search LDAP tree under base_dn */PHP_FUNCTION(ldap_search){	php_ldap_do_search(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_SCOPE_SUBTREE);}/* }}} *//* {{{ proto bool ldap_free_result(resource result)   Free result memory */PHP_FUNCTION(ldap_free_result){	zval **result;	LDAPMessage *ldap_result;	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ldap_result, LDAPMessage *, result, -1, "ldap result", le_result);	zend_list_delete(Z_LVAL_PP(result));  /* Delete list entry and call registered destructor function */	RETVAL_TRUE;}/* }}} *//* {{{ proto int ldap_count_entries(resource link, resource result)   Count the number of entries in a search result */PHP_FUNCTION(ldap_count_entries){	zval **link, **result;	ldap_linkdata *ld;	LDAPMessage *ldap_result;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(ldap_result, LDAPMessage *, result, -1, "ldap result", le_result);	RETURN_LONG(ldap_count_entries(ld->link, ldap_result));}/* }}} *//* {{{ proto resource ldap_first_entry(resource link, resource result)   Return first result id */PHP_FUNCTION(ldap_first_entry){	zval **link, **result;	ldap_linkdata *ld;		ldap_resultentry *resultentry;	LDAPMessage *ldap_result, *entry;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(ldap_result, LDAPMessage *, result, -1, "ldap result", le_result);	if ((entry = ldap_first_entry(ld->link, ldap_result)) == NULL) {		RETVAL_FALSE;	} else {		resultentry = emalloc(sizeof(ldap_resultentry));		ZEND_REGISTER_RESOURCE(return_value, resultentry, le_result_entry);		resultentry->id = Z_LVAL_PP(result);		zend_list_addref(resultentry->id);		resultentry->data = entry;	}}/* }}} *//* {{{ proto resource ldap_next_entry(resource link, resource result_entry)   Get next result entry */PHP_FUNCTION(ldap_next_entry){	zval **link, **result_entry;	ldap_linkdata *ld;	ldap_resultentry *resultentry, *resultentry_next;	LDAPMessage *entry_next;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result_entry) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry);	if ((entry_next = ldap_next_entry(ld->link, resultentry->data)) == NULL) {		RETVAL_FALSE;	} else {		resultentry_next = emalloc(sizeof(ldap_resultentry));		ZEND_REGISTER_RESOURCE(return_value, resultentry_next, le_result_entry);		resultentry_next->id = resultentry->id;		zend_list_addref(resultentry->id);		resultentry_next->data = entry_next;	}}/* }}} *//* {{{ proto array ldap_get_entries(resource link, resource result)   Get all result entries */PHP_FUNCTION(ldap_get_entries){	zval **link, **result;	LDAPMessage *ldap_result, *ldap_result_entry;	zval *tmp1, *tmp2;	ldap_linkdata *ld;	LDAP *ldap;	int num_entries, num_attrib, num_values, i;	BerElement *ber;	char *attribute;	size_t attr_len;	char **ldap_value;	char *dn;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(ldap_result, LDAPMessage *, result, -1, "ldap result", le_result);	ldap = ld->link;	num_entries = ldap_count_entries(ldap, ldap_result);	array_init(return_value);	add_assoc_long(return_value, "count", num_entries);	if (num_entries == 0) return;	num_entries = 0;		ldap_result_entry = ldap_first_entry(ldap, ldap_result);	if (ldap_result_entry == NULL) RETURN_FALSE;	while (ldap_result_entry != NULL) {		MAKE_STD_ZVAL(tmp1);		array_init(tmp1);		num_attrib = 0;		attribute = ldap_first_attribute(ldap, ldap_result_entry, &ber);		while (attribute != NULL) {			ldap_value = ldap_get_values(ldap, ldap_result_entry, attribute);			num_values = ldap_count_values(ldap_value);			MAKE_STD_ZVAL(tmp2);			array_init(tmp2);			add_assoc_long(tmp2, "count", num_values);			for (i = 0; i < num_values; i++) {				add_index_string(tmp2, i, ldap_value[i], 1);			}				ldap_value_free(ldap_value);			attr_len = strlen(attribute);			zend_hash_update(Z_ARRVAL_P(tmp1), php_strtolower(attribute, attr_len), attr_len+1, (void *) &tmp2, sizeof(zval *), NULL);			add_index_string(tmp1, num_attrib, attribute, 1);			num_attrib++;#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS			ldap_memfree(attribute);#endif			attribute = ldap_next_attribute(ldap, ldap_result_entry, ber);		}#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS		if (ber != NULL)			ber_free(ber, 0);#endif		add_assoc_long(tmp1, "count", num_attrib);		dn = ldap_get_dn(ldap, ldap_result_entry);		add_assoc_string(tmp1, "dn", dn, 1);#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS		ldap_memfree(dn);#else		free(dn);#endif		zend_hash_index_update(Z_ARRVAL_P(return_value), num_entries, (void *) &tmp1, sizeof(zval *), NULL);				num_entries++;		ldap_result_entry = ldap_next_entry(ldap, ldap_result_entry);	}	add_assoc_long(return_value, "count", num_entries);}/* }}} *//* {{{ proto string ldap_first_attribute(resource link, resource result_entry, int ber)   Return first attribute */PHP_FUNCTION(ldap_first_attribute){	zval **link, **result_entry, **berp;	ldap_linkdata *ld;	ldap_resultentry *resultentry;	BerElement *ber;	char *attribute;	if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &link, &result_entry, &berp) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry);	if ((attribute = ldap_first_attribute(ld->link, resultentry->data, &ber)) == NULL) {		RETURN_FALSE;	} else {		ZEND_REGISTER_RESOURCE(*berp, ber, le_ber_entry);		RETVAL_STRING(attribute, 1);#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS		ldap_memfree(attribute);#endif	}}/* }}} *//* {{{ proto string ldap_next_attribute(resource link, resource result_entry, resource ber)   Get the next attribute in result */PHP_FUNCTION(ldap_next_attribute){	zval **link, **result_entry, **berp;	ldap_linkdata *ld;	ldap_resultentry *resultentry;	BerElement *ber;	char *attribute;	if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &link, &result_entry, &berp) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry);	ZEND_FETCH_RESOURCE(ber, BerElement *, berp, -1, "ldap ber entry", le_ber_entry);	if ((attribute = ldap_next_attribute(ld->link, resultentry->data, ber)) == NULL) {		RETURN_FALSE;	} else {		ZEND_REGISTER_RESOURCE(*berp, ber, le_ber_entry);		RETVAL_STRING(attribute, 1);#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS		ldap_memfree(attribute);#endif	}}/* }}} *//* {{{ proto array ldap_get_attributes(resource link, resource result_entry)   Get attributes from a search result entry */PHP_FUNCTION(ldap_get_attributes){	zval **link, **result_entry;	zval *tmp;	ldap_linkdata *ld;	ldap_resultentry *resultentry;	char *attribute;	char **ldap_value;	int i, num_values, num_attrib;	BerElement *ber;	if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result_entry) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link);	ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry);	array_init(return_value);	num_attrib = 0;		attribute = ldap_first_attribute(ld->link, resultentry->data, &ber);	while (attribute != NULL) {		ldap_value = ldap_get_values(ld->link, resultentry->data, attribute);		num_values = ldap_count_values(ldap_value);		MAKE_STD_ZVAL(tmp);		array_init(tmp);		add_assoc_long(tmp, "count", num_values);		for (i = 0; i < num_values; i++) {			add_index_string(tmp, i, ldap_value[i], 1);		}		ldap_value_free(ldap_value);		zend_hash_update(Z_ARRVAL_P(return_value), attribute, strlen(attribute)+1, (void *) &tmp, sizeof(zval *), NULL);		add_index_string(return_value, num_attrib, attribute, 1);		num_attrib++;#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS		ldap_memfree(attribute);#endif		attribute = ldap_next_attribute(ld->link, resultentry->data, ber);	}#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS		if (ber != NULL) {			ber_free(ber, 0);		}#endif		add_assoc_long(return_value, "count", num_attrib);}/* }}} *//* {{{ proto array ldap_get_values(resource link, resource result_entry, string attribute)   Get all values from a result entry */PHP_FUNCTION(ldap_get_values)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -