--- servers/slapd/filter.c 2000/07/02 15:14:37 1.51 +++ 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.50 2000/07/02 05:18:55 mrv 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", - f->f_choice, 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: @@ -699,18 +717,11 @@ int filter_escape_value( out->bv_val = (char *) ch_malloc( ( in->bv_len * 3 ) + 1 ); out->bv_len = 0; -#undef NIBBLE -#undef ESCAPE_LO -#undef ESCAPE_HI -#define NIBBLE(c) ((c)&0x0f) -#define ESCAPE_LO(c) ( NIBBLE(c) + ( NIBBLE(c) < 10 ? '0' : 'A' - 10 ) ) -#define ESCAPE_HI(c) ( ESCAPE_LO((c)>>4) ) - for( i=0; i < in->bv_len ; i++ ) { if( FILTER_ESCAPE(in->bv_val[i]) ) { - out->bv_val[out->bv_len++] = '\\'; - out->bv_val[out->bv_len++] = ESCAPE_HI( in->bv_val[i] ); - out->bv_val[out->bv_len++] = ESCAPE_LO( in->bv_val[i] ); + out->bv_val[out->bv_len++] = SLAP_ESCAPE_CHAR; + out->bv_val[out->bv_len++] = SLAP_ESCAPE_HI( in->bv_val[i] ); + out->bv_val[out->bv_len++] = SLAP_ESCAPE_LO( in->bv_val[i] ); } else { out->bv_val[out->bv_len++] = in->bv_val[i]; } @@ -719,5 +730,3 @@ int filter_escape_value( out->bv_val[out->bv_len] = '\0'; return LDAP_SUCCESS; } - -