From ca2145cccfda19c82e1f220f368d938405abe76c Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Fri, 21 May 1999 19:20:25 +0000 Subject: [PATCH] Initial checkin of ldap_search_ext() and friends. --- include/ldap.h | 2 + libraries/libldap/ldap-int.h | 9 ++- libraries/libldap/search.c | 138 ++++++++++++++++++++++++++++++++--- libraries/libldap/url.c | 7 +- 4 files changed, 141 insertions(+), 15 deletions(-) diff --git a/include/ldap.h b/include/ldap.h index 71ef37c176..9a32c792bd 100644 --- a/include/ldap.h +++ b/include/ldap.h @@ -1117,6 +1117,7 @@ ldap_search_ext LDAP_P(( int scope, LDAP_CONST char *filter, char **attrs, + int attrsonly, LDAPControl **serverctrls, LDAPControl **clientctrls, struct timeval *timeout, @@ -1130,6 +1131,7 @@ ldap_search_ext_s LDAP_P(( int scope, LDAP_CONST char *filter, char **attrs, + int attrsonly, LDAPControl **serverctrls, LDAPControl **clientctrls, struct timeval *timeout, diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index 03a661e3ad..b13507df30 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -375,9 +375,14 @@ LDAP_F int cldap_getmsg ( LDAP *ld, struct timeval *timeout, BerElement *ber ); /* * in search.c */ -BerElement *ldap_build_search_req( LDAP *ld, const char *base, int scope, +BerElement *ldap_build_search_req LDAP_P(( + LDAP *ld, + const char *base, int scope, const char *filter, char **attrs, int attrsonly, - LDAPControl **sctrls, LDAPControl **cctrls ); + LDAPControl **sctrls, + LDAPControl **cctrls, + int timelimit, + int sizelimit )); /* * in strdup.c diff --git a/libraries/libldap/search.c b/libraries/libldap/search.c index dd7f26f734..ca93ada6f1 100644 --- a/libraries/libldap/search.c +++ b/libraries/libldap/search.c @@ -29,6 +29,111 @@ static int put_simple_filter LDAP_P(( BerElement *ber, char *str )); static int put_substring_filter LDAP_P(( BerElement *ber, char *type, char *str )); static int put_filter_list LDAP_P(( BerElement *ber, char *str )); +/* + * ldap_search_ext - initiate an ldap search operation. + * + * Parameters: + * + * ld LDAP descriptor + * base DN of the base object + * scope the search scope - one of LDAP_SCOPE_BASE, + * LDAP_SCOPE_ONELEVEL, LDAP_SCOPE_SUBTREE + * filter a string containing the search filter + * (e.g., "(|(cn=bob)(sn=bob))") + * attrs list of attribute types to return for matches + * attrsonly 1 => attributes only 0 => attributes and values + * + * Example: + * char *attrs[] = { "mail", "title", 0 }; + * ldap_search_ext( ld, "c=us@o=UM", LDAP_SCOPE_SUBTREE, "cn~=bob", + * attrs, attrsonly, sctrls, ctrls, timeout, sizelimit, + * &msgid ); + */ +int +ldap_search_ext( + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + LDAPControl **sctrls, + LDAPControl **cctrls, + struct timeval *timeout, + int sizelimit, + int *msgidp ) +{ + BerElement *ber; + int timelimit; + + Debug( LDAP_DEBUG_TRACE, "ldap_search_ext\n", 0, 0, 0 ); + + /* + * if timeout is provided, use only tv_sec as timelimit. + * otherwise, use default. + */ + timelimit = (timeout != NULL) + ? timelimit = timeout->tv_sec + : -1; + + ber = ldap_build_search_req( ld, base, scope, filter, attrs, + attrsonly, sctrls, cctrls, timelimit, sizelimit ); + + if ( ber == NULLBER ) { + return ld->ld_errno; + } + +#ifndef LDAP_NOCACHE + if ( ld->ld_cache != NULL ) { + if ( ldap_check_cache( ld, LDAP_REQ_SEARCH, ber ) == 0 ) { + ber_free( ber, 1 ); + ld->ld_errno = LDAP_SUCCESS; + *msgidp = ld->ld_msgid; + return ld->ld_errno; + } + ldap_add_request_to_cache( ld, LDAP_REQ_SEARCH, ber ); + } +#endif /* LDAP_NOCACHE */ + + /* send the message */ + *msgidp = ldap_send_initial_request( ld, LDAP_REQ_SEARCH, base, ber ); + + if( *msgidp < 0 ) + return ld->ld_errno; + + return LDAP_SUCCESS; +} + +int +ldap_search_ext_s( + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + LDAPControl **sctrls, + LDAPControl **cctrls, + struct timeval *timeout, + int sizelimit, + LDAPMessage **res ) +{ + int rc; + int msgid; + + rc = ldap_search_ext( ld, base, scope, filter, attrs, attrsonly, + sctrls, cctrls, timeout, sizelimit, &msgid ); + + if ( rc != LDAP_SUCCESS ) { + return( rc ); + } + + if ( ldap_result( ld, msgid, 1, timeout, res ) == -1 ) + return( ld->ld_errno ); + + return( ldap_result2error( ld, *res, 0 ) ); +} + /* * ldap_search - initiate an ldap search operation. * @@ -49,15 +154,18 @@ static int put_filter_list LDAP_P(( BerElement *ber, char *str )); * attrs, attrsonly ); */ int -ldap_search( LDAP *ld, LDAP_CONST char *base, int scope, LDAP_CONST char *filter, +ldap_search( + LDAP *ld, LDAP_CONST char *base, int scope, LDAP_CONST char *filter, char **attrs, int attrsonly ) { BerElement *ber; Debug( LDAP_DEBUG_TRACE, "ldap_search\n", 0, 0, 0 ); - if (( ber = ldap_build_search_req( ld, base, scope, filter, attrs, - attrsonly, NULL, NULL )) == NULLBER ) { + ber = ldap_build_search_req( ld, base, scope, filter, attrs, + attrsonly, NULL, NULL, -1, -1 ); + + if ( ber == NULLBER ) { return( -1 ); } @@ -86,7 +194,9 @@ ldap_build_search_req( char **attrs, int attrsonly, LDAPControl **sctrls, - LDAPControl **cctrls ) + LDAPControl **cctrls, + int timelimit, + int sizelimit ) { BerElement *ber; int err; @@ -137,13 +247,17 @@ ldap_build_search_req( #ifdef LDAP_CONNECTIONLESS if ( ld->ld_cldapnaddr > 0 ) { err = ber_printf( ber, "{ist{seeiib", ++ld->ld_msgid, - ld->ld_cldapdn, LDAP_REQ_SEARCH, base, scope, ld->ld_deref, - ld->ld_sizelimit, ld->ld_timelimit, attrsonly ); + ld->ld_cldapdn, LDAP_REQ_SEARCH, base, scope, ld->ld_deref, + (sizelimit < 0) ? ld->ld_sizelimit : sizelimit, + (timelimit < 0) ? ld->ld_timelimit : timelimit, + attrsonly ); } else { #endif /* LDAP_CONNECTIONLESS */ err = ber_printf( ber, "{it{seeiib", ++ld->ld_msgid, LDAP_REQ_SEARCH, base, scope, ld->ld_deref, - ld->ld_sizelimit, ld->ld_timelimit, attrsonly ); + (sizelimit < 0) ? ld->ld_sizelimit : sizelimit, + (timelimit < 0) ? ld->ld_timelimit : timelimit, + attrsonly ); #ifdef LDAP_CONNECTIONLESS } #endif /* LDAP_CONNECTIONLESS */ @@ -225,10 +339,11 @@ put_complex_filter( BerElement *ber, char *str, unsigned long tag, int not ) /* put explicit tag */ if ( ber_printf( ber, "t{", tag ) == -1 ) return( NULL ); -/* + +#if 0 if ( !not && ber_printf( ber, "{" ) == -1 ) return( NULL ); -*/ +#endif str++; if ( (next = find_right_paren( str )) == NULL ) @@ -242,10 +357,11 @@ put_complex_filter( BerElement *ber, char *str, unsigned long tag, int not ) /* flush explicit tagged thang */ if ( ber_printf( ber, "}" ) == -1 ) return( NULL ); -/* + +#if 0 if ( !not && ber_printf( ber, "}" ) == -1 ) return( NULL ); -*/ +#endif return( next ); } diff --git a/libraries/libldap/url.c b/libraries/libldap/url.c index 781ff2f6f5..7541e85415 100644 --- a/libraries/libldap/url.c +++ b/libraries/libldap/url.c @@ -264,8 +264,11 @@ ldap_url_search( LDAP *ld, LDAP_CONST char *url, int attrsonly ) return( -1 ); } - if (( ber = ldap_build_search_req( ld, ludp->lud_dn, ludp->lud_scope, - ludp->lud_filter, ludp->lud_attrs, attrsonly, NULL, NULL )) == NULLBER ) { + ber = ldap_build_search_req( ld, ludp->lud_dn, ludp->lud_scope, + ludp->lud_filter, ludp->lud_attrs, attrsonly, NULL, NULL, + -1, -1 ); + + if ( ber == NULLBER ) { return( -1 ); } -- 2.39.5