X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fattr.c;h=2f6203e66f2934457c08f29d0576a41a783f189c;hb=22bf5188a91d300453c4077eaa88af6b399ce7e9;hp=8c8f691ee6232e3684af22ccac47f2eef8dc5958;hpb=c890c96d13c53cf0fa1d9580fea2ab47a2c8caa9;p=openldap diff --git a/servers/slapd/back-bdb/attr.c b/servers/slapd/back-bdb/attr.c index 8c8f691ee6..2f6203e66f 100644 --- a/servers/slapd/back-bdb/attr.c +++ b/servers/slapd/back-bdb/attr.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2008 The OpenLDAP Foundation. + * Copyright 2000-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,20 +23,21 @@ #include "slap.h" #include "back-bdb.h" +#include "config.h" #include "lutil.h" /* Find the ad, return -1 if not found, * set point for insertion if ins is non-NULL */ int -bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, unsigned *ins ) +bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, int *ins ) { unsigned base = 0, cursor = 0; unsigned n = bdb->bi_nattrs; int val = 0; while ( 0 < n ) { - int pivot = n >> 1; + unsigned pivot = n >> 1; cursor = base + pivot; val = SLAP_PTRCMP( ad, bdb->bi_attrs[cursor]->ai_desc ); @@ -60,7 +61,7 @@ bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, unsigned *ins ) static int ainfo_insert( struct bdb_info *bdb, AttrInfo *a ) { - unsigned x; + int x; int i = bdb_attr_slot( bdb, a->ai_desc, &x ); /* Is it a dup? */ @@ -92,7 +93,8 @@ bdb_attr_index_config( const char *fname, int lineno, int argc, - char **argv ) + char **argv, + struct config_reply_s *c_reply) { int rc = 0; int i; @@ -132,9 +134,14 @@ bdb_attr_index_config( rc = slap_str2index( indexes[i], &index ); if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: line %d: " - "index type \"%s\" undefined\n", - fname, lineno, indexes[i] ); + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index type \"%s\" undefined", indexes[i] ); + + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } rc = LDAP_PARAM_ERROR; goto done; } @@ -144,9 +151,13 @@ bdb_attr_index_config( } if( !mask ) { - fprintf( stderr, "%s: line %d: " - "no indexes selected\n", - fname, lineno ); + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "no indexes selected" ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } rc = LDAP_PARAM_ERROR; goto done; } @@ -169,9 +180,14 @@ bdb_attr_index_config( if ( is_component_reference( attrs[i] ) ) { rc = extract_component_reference( attrs[i], &cr ); if ( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: line %d: " - "index component reference\"%s\" undefined\n", - fname, lineno, attrs[i] ); + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index component reference\"%s\" undefined", + attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } goto done; } cr->cr_indexmask = mask; @@ -187,16 +203,25 @@ bdb_attr_index_config( rc = slap_str2ad( attrs[i], &ad, &text ); if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: line %d: " - "index attribute \"%s\" undefined\n", - fname, lineno, attrs[i] ); + if ( c_reply ) + { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index attribute \"%s\" undefined", + attrs[i] ); + + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } goto done; } - if( slap_ad_is_binary( ad ) ) { - fprintf( stderr, "%s: line %d: " - "index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); + if( ad == slap_schema.si_ad_entryDN || slap_ad_is_binary( ad ) ) { + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } rc = LDAP_UNWILLING_TO_PERFORM; goto done; } @@ -206,9 +231,12 @@ bdb_attr_index_config( && ad->ad_type->sat_approx->smr_indexer && ad->ad_type->sat_approx->smr_filter ) ) { - fprintf( stderr, "%s: line %d: " - "approx index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "approx index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } rc = LDAP_INAPPROPRIATE_MATCHING; goto done; } @@ -218,9 +246,12 @@ bdb_attr_index_config( && ad->ad_type->sat_equality->smr_indexer && ad->ad_type->sat_equality->smr_filter ) ) { - fprintf( stderr, "%s: line %d: " - "equality index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "equality index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } rc = LDAP_INAPPROPRIATE_MATCHING; goto done; } @@ -230,9 +261,12 @@ bdb_attr_index_config( && ad->ad_type->sat_substr->smr_indexer && ad->ad_type->sat_substr->smr_filter ) ) { - fprintf( stderr, "%s: line %d: " - "substr index of attribute \"%s\" disallowed\n", - fname, lineno, attrs[i] ); + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "substr index of attribute \"%s\" disallowed", attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); + } rc = LDAP_INAPPROPRIATE_MATCHING; goto done; } @@ -285,18 +319,28 @@ bdb_attr_index_config( if( rc ) { if ( bdb->bi_flags & BDB_IS_OPEN ) { AttrInfo *b = bdb_attr_mask( bdb, ad ); - /* If we were editing this attr, reset it */ - b->ai_indexmask &= ~BDB_INDEX_DELETING; - /* If this is leftover from a previous add, commit it */ - if ( b->ai_newmask ) - b->ai_indexmask = b->ai_newmask; - b->ai_newmask = a->ai_newmask; - ch_free( a ); - continue; + /* If there is already an index defined for this attribute + * it must be replaced. Otherwise we end up with multiple + * olcIndex values for the same attribute */ + if ( b->ai_indexmask & BDB_INDEX_DELETING ) { + /* If we were editing this attr, reset it */ + b->ai_indexmask &= ~BDB_INDEX_DELETING; + /* If this is leftover from a previous add, commit it */ + if ( b->ai_newmask ) + b->ai_indexmask = b->ai_newmask; + b->ai_newmask = a->ai_newmask; + ch_free( a ); + rc = 0; + continue; + } + } + if (c_reply) { + snprintf(c_reply->msg, sizeof(c_reply->msg), + "duplicate index definition for attr \"%s\"", + attrs[i] ); + fprintf( stderr, "%s: line %d: %s\n", + fname, lineno, c_reply->msg ); } - fprintf( stderr, - "%s: line %d: duplicate index definition for attr \"%s\".\n", - fname, lineno, attrs[i] ); rc = LDAP_PARAM_ERROR; goto done;