static int put_filter_list( BerElement *ber, char *str ) { char *next; char save; Debug( LDAP_DEBUG_TRACE, "put_filter_list \"%s\"\n", str, 0, 0 ); while ( *str ) { while ( *str && isspace( *str ) ) str++; if ( *str == '\0' ) break; if ( (next = find_right_paren( str + 1 )) == NULL ) return( -1 ); save = *++next; /* now we have "(filter)" with str pointing to it */ *next = '\0'; if ( put_filter( ber, str ) == -1 ) return( -1 ); *next = save; str = next; } return( 0 ); }
BerElement * ldap_build_search_req( LDAP *ld, char *base, int scope, char *filter, char **attrs, int attrsonly ) { BerElement *ber; int err; /* * Create the search request. It looks like this: * SearchRequest := [APPLICATION 3] SEQUENCE { * baseObject DistinguishedName, * scope ENUMERATED { * baseObject (0), * singleLevel (1), * wholeSubtree (2) * }, * derefAliases ENUMERATED { * neverDerefaliases (0), * derefInSearching (1), * derefFindingBaseObj (2), * alwaysDerefAliases (3) * }, * sizelimit INTEGER (0 .. 65535), * timelimit INTEGER (0 .. 65535), * attrsOnly BOOLEAN, * filter Filter, * attributes SEQUENCE OF AttributeType * } * wrapped in an ldap message. */ /* create a message to send */ if ( (ber = alloc_ber_with_options( ld )) == NULLBER ) { return( NULLBER ); } if ( base == NULL ) { base = ""; } #ifdef CLDAP if ( ld->ld_sb.sb_naddr > 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 ); } else { #endif /* CLDAP */ err = ber_printf( ber, "{it{seeiib", ++ld->ld_msgid, LDAP_REQ_SEARCH, base, scope, ld->ld_deref, ld->ld_sizelimit, ld->ld_timelimit, attrsonly ); #ifdef CLDAP } #endif /* CLDAP */ if ( err == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } filter = strdup( filter ); err = put_filter( ber, filter ); free( filter ); if ( err == -1 ) { ld->ld_errno = LDAP_FILTER_ERROR; ber_free( ber, 1 ); return( NULLBER ); } if ( ber_printf( ber, "{v}}}", attrs ) == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( NULLBER ); } return( ber ); }
/* returns an LDAP error code and also sets it in ld */ int nsldapi_build_search_req( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly, LDAPControl **serverctrls, LDAPControl **clientctrls, /* not used for anything yet */ int timelimit, /* if -1, ld->ld_timelimit is used */ int sizelimit, /* if -1, ld->ld_sizelimit is used */ int msgid, BerElement **berp ) { BerElement *ber; int err; char *fdup; /* * Create the search request. It looks like this: * SearchRequest := [APPLICATION 3] SEQUENCE { * baseObject DistinguishedName, * scope ENUMERATED { * baseObject (0), * singleLevel (1), * wholeSubtree (2) * }, * derefAliases ENUMERATED { * neverDerefaliases (0), * derefInSearching (1), * derefFindingBaseObj (2), * alwaysDerefAliases (3) * }, * sizelimit INTEGER (0 .. 65535), * timelimit INTEGER (0 .. 65535), * attrsOnly BOOLEAN, * filter Filter, * attributes SEQUENCE OF AttributeType * } * wrapped in an ldap message. */ /* create a message to send */ if (( err = nsldapi_alloc_ber_with_options( ld, &ber )) != LDAP_SUCCESS ) { return( err ); } if ( base == NULL ) { base = ""; } if ( sizelimit == -1 ) { sizelimit = ld->ld_sizelimit; } if ( timelimit == -1 ) { timelimit = ld->ld_timelimit; } #ifdef CLDAP if ( ld->ld_sbp->sb_naddr > 0 ) { err = ber_printf( ber, "{ist{seeiib", msgid, ld->ld_cldapdn, LDAP_REQ_SEARCH, base, scope, ld->ld_deref, sizelimit, timelimit, attrsonly ); } else { #endif /* CLDAP */ err = ber_printf( ber, "{it{seeiib", msgid, LDAP_REQ_SEARCH, base, scope, ld->ld_deref, sizelimit, timelimit, attrsonly ); #ifdef CLDAP } #endif /* CLDAP */ if ( err == -1 ) { LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL ); ber_free( ber, 1 ); return( LDAP_ENCODING_ERROR ); } fdup = nsldapi_strdup( filter ); err = put_filter( ber, fdup ); NSLDAPI_FREE( fdup ); if ( err == -1 ) { LDAP_SET_LDERRNO( ld, LDAP_FILTER_ERROR, NULL, NULL ); ber_free( ber, 1 ); return( LDAP_FILTER_ERROR ); } if ( ber_printf( ber, "{v}}", attrs ) == -1 ) { LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL ); ber_free( ber, 1 ); return( LDAP_ENCODING_ERROR ); } if ( (err = nsldapi_put_controls( ld, serverctrls, 1, ber )) != LDAP_SUCCESS ) { ber_free( ber, 1 ); return( err ); } *berp = ber; return( LDAP_SUCCESS ); }