--- servers/slapd/filter.c 2000/10/09 17:13:17 1.53 +++ servers/slapd/filter.c 2000/10/13 18:41:56 1.54 @@ -1,5 +1,5 @@ /* filter.c - routines for parsing and dealing with filters */ -/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.52 2000/08/28 16:38:48 kurt Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.53 2000/10/09 17:13:17 jsanchez Exp $ */ /* * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file @@ -255,13 +255,31 @@ get_filter( break; case LDAP_FILTER_EXT: - /* not yet implemented */ - Debug( LDAP_DEBUG_ANY, "extensible match not yet implemented.\n", - 0, 0, 0 ); - (void) ber_skip_tag( ber, &len ); - f->f_choice = SLAPD_FILTER_COMPUTED; - f->f_result = SLAPD_COMPARE_UNDEFINED; - *fstr = ch_strdup( "(extended)" ); + Debug( LDAP_DEBUG_FILTER, "EXTENSIBLE\n", 0, 0, 0 ); + + err = get_mra( ber, &f->f_mra, text ); + if ( err != LDAP_SUCCESS ) { + break; + } + + assert( f->f_mra != NULL ); + + filter_escape_value( f->f_mr_value, &escaped ); + + *fstr = ch_malloc( sizeof("(:dn::=)") + + (f->f_mr_desc ? f->f_mr_desc->ad_cname->bv_len : 0) + + (f->f_mr_rule ? strlen(f->f_mr_rule) : 0) + + escaped.bv_len ); + + sprintf( *fstr, "(%s%s%s%s:=%s)", + (f->f_mr_desc ? f->f_mr_desc->ad_cname->bv_val : ""), + (f->f_mr_dnattrs ? ":dn" : ""), + (f->f_mr_rule ? ":" : ""), + (f->f_mr_rule ? f->f_mr_rule : ""), + f->f_mr_desc->ad_cname->bv_val, + escaped.bv_val ); + + ber_memfree( escaped.bv_val ); break; default: