X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Frepl.c;h=ebdf6267b847aaed1e16c5dc0d4832681c3ff40c;hb=c3960b98d3b5fbd6ebeb200ca7799ece7b766d50;hp=2051cd0cfc399f82c87771ae911333d1fb83e878;hpb=acbb5cf689a4336af05c9f259d909d8141055bac;p=openldap diff --git a/servers/slapd/repl.c b/servers/slapd/repl.c index 2051cd0cfc..ebdf6267b8 100644 --- a/servers/slapd/repl.c +++ b/servers/slapd/repl.c @@ -328,11 +328,22 @@ replog1( if ( ri && ri->ri_attrs ) { int is_in = ad_inlist( ml->sml_desc, ri->ri_attrs ); + /* skip if: + * 1) the attribute is not in the list, + * and it's not an exclusion list + * 2) the attribute is in the list + * and it's an exclusion list, + * and either the objectClass attribute + * has already been dealt with or + * this is not the objectClass attr + */ if ( ( !is_in && !ri->ri_exclude ) - || ( is_in && ri->ri_exclude ) ) + || ( ( is_in && ri->ri_exclude ) + && ( !ocs || ml->sml_desc != slap_schema.si_ad_objectClass ) ) ) { continue; } + /* If this is objectClass, see if the value is included * in any subset, otherwise drop it. */ @@ -347,11 +358,24 @@ replog1( int match = 0; for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) { if ( an->an_oc ) { + struct berval bv = an->an_name; + ocs = 1; match |= an->an_oc_exclude; - if ( ml->sml_values[i].bv_len == an->an_name.bv_len + + switch ( bv.bv_val[ 0 ] ) { + case '@': + case '+': + case '!': + bv.bv_val++; + bv.bv_len--; + break; + } + + if ( ml->sml_values[i].bv_len == bv.bv_len && !strcasecmp(ml->sml_values[i].bv_val, - an->an_name.bv_val ) ) { + bv.bv_val ) ) + { match = !an->an_oc_exclude; break; } @@ -374,7 +398,7 @@ replog1( fprintf( fp, "%s: %s\n", did, type ); first = 0; } - vals[0] = an->an_name; + vals[0] = ml->sml_values[i]; print_vals( fp, &ml->sml_desc->ad_cname, vals ); ocs = 2; } @@ -406,7 +430,20 @@ replog1( for ( a = op->ora_e->e_attrs ; a != NULL; a=a->a_next ) { if ( ri && ri->ri_attrs ) { int is_in = ad_inlist( a->a_desc, ri->ri_attrs ); - if ( ( !is_in && !ri->ri_exclude ) || ( is_in && ri->ri_exclude ) ) { + + /* skip if: + * 1) the attribute is not in the list, + * and it's not an exclusion list + * 2) the attribute is in the list + * and it's an exclusion list, + * and either the objectClass attribute + * has already been dealt with or + * this is not the objectClass attr + */ + if ( ( !is_in && !ri->ri_exclude ) + || ( ( is_in && ri->ri_exclude ) + && ( !ocs || a->a_desc != slap_schema.si_ad_objectClass ) ) ) + { continue; } @@ -423,11 +460,24 @@ replog1( int match = 0; for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) { if ( an->an_oc ) { + struct berval bv = an->an_name; + ocs = 1; match |= an->an_oc_exclude; - if ( a->a_vals[i].bv_len == an->an_name.bv_len + + switch ( bv.bv_val[ 0 ] ) { + case '@': + case '+': + case '!': + bv.bv_val++; + bv.bv_len--; + break; + } + + if ( a->a_vals[i].bv_len == bv.bv_len && !strcasecmp(a->a_vals[i].bv_val, - an->an_name.bv_val ) ) { + bv.bv_val ) ) + { match = !an->an_oc_exclude; break; } @@ -442,7 +492,7 @@ replog1( fprintf( fp, "changetype: add\n" ); dohdr = 0; } - vals[0] = an->an_name; + vals[0] = a->a_nvals[i]; print_vals( fp, &a->a_desc->ad_cname, vals ); } }