/* * opens log subentry */ int monitor_subsys_log_open( BackendDB *be, monitor_subsys_t *ms ) { BerVarray bva = NULL; if ( loglevel2bvarray( ldap_syslog, &bva ) == 0 && bva != NULL ) { monitor_info_t *mi; Entry *e; mi = ( monitor_info_t * )be->be_private; if ( monitor_cache_get( mi, &ms->mss_ndn, &e ) ) { Debug( LDAP_DEBUG_ANY, "monitor_subsys_log_init: " "unable to get entry \"%s\"\n", ms->mss_ndn.bv_val, 0, 0 ); ber_bvarray_free( bva ); return( -1 ); } attr_merge_normalize( e, mi->mi_ad_managedInfo, bva, NULL ); ber_bvarray_free( bva ); monitor_cache_release( mi, e ); } return( 0 ); }
static int replace_values( Operation *op, Entry *e, Modification *mod, int *newlevel ) { int rc; if ( mod->sm_values != NULL ) { *newlevel = 0; rc = check_constraints( mod, newlevel ); if ( rc != LDAP_SUCCESS ) { return rc; } } rc = attr_delete( &e->e_attrs, mod->sm_desc ); if ( rc != LDAP_SUCCESS && rc != LDAP_NO_SUCH_ATTRIBUTE ) { return rc; } if ( mod->sm_values != NULL ) { rc = attr_merge_normalize( e, mod->sm_desc, mod->sm_values, op->o_tmpmemctx ); if ( rc != LDAP_SUCCESS ) { return rc; } } return LDAP_SUCCESS; }
static int collect_response( Operation *op, SlapReply *rs ) { slap_overinst *on = (slap_overinst *) op->o_bd->bd_info; collect_info *ci = on->on_bi.bi_private; /* If we've been configured and the current response is * a search entry */ if ( ci && rs->sr_type == REP_SEARCH ) { int rc; op->o_bd->bd_info = (BackendInfo *)on->on_info; for (; ci; ci=ci->ci_next ) { int idx=0; /* Is this entry an ancestor of this collectinfo ? */ if (!dnIsSuffix(&rs->sr_entry->e_nname, &ci->ci_dn)) { /* collectinfo does not match */ continue; } /* Is this entry the same as the template DN ? */ if ( dn_match(&rs->sr_entry->e_nname, &ci->ci_dn)) { /* dont apply change to parent */ continue; } /* The current entry may live in a cache, so * don't modify it directly. Make a copy and * work with that instead. */ rs_entry2modifiable( op, rs, on ); /* Loop for each attribute in this collectinfo */ for(idx=0; idx<ci->ci_ad_num; idx++) { BerVarray vals = NULL; /* Extract the values of the desired attribute from * the ancestor entry */ rc = backend_attribute( op, NULL, &ci->ci_dn, ci->ci_ad[idx], &vals, ACL_READ ); /* If there are any values, merge them into the * current search result */ if ( vals ) { attr_merge_normalize( rs->sr_entry, ci->ci_ad[idx], vals, op->o_tmpmemctx ); ber_bvarray_free_x( vals, op->o_tmpmemctx ); } } } } /* Default is to just fall through to the normal processing */ return SLAP_CB_CONTINUE; }
static int retcode_db_open( BackendDB *be, ConfigReply *cr) { slap_overinst *on = (slap_overinst *)be->bd_info; retcode_t *rd = (retcode_t *)on->on_bi.bi_private; retcode_item_t *rdi; for ( rdi = rd->rd_item; rdi; rdi = rdi->rdi_next ) { LDAPRDN rdn = NULL; int rc, j; char* p; struct berval val[ 3 ]; char buf[ SLAP_TEXT_BUFLEN ]; /* DN */ rdi->rdi_e.e_name = rdi->rdi_dn; rdi->rdi_e.e_nname = rdi->rdi_ndn; /* objectClass */ val[ 0 ] = oc_errObject->soc_cname; val[ 1 ] = slap_schema.si_oc_extensibleObject->soc_cname; BER_BVZERO( &val[ 2 ] ); attr_merge( &rdi->rdi_e, slap_schema.si_ad_objectClass, val, NULL ); /* RDN avas */ rc = ldap_bv2rdn( &rdi->rdi_dn, &rdn, (char **) &p, LDAP_DN_FORMAT_LDAP ); assert( rc == LDAP_SUCCESS ); for ( j = 0; rdn[ j ]; j++ ) { LDAPAVA *ava = rdn[ j ]; AttributeDescription *ad = NULL; const char *text; rc = slap_bv2ad( &ava->la_attr, &ad, &text ); assert( rc == LDAP_SUCCESS ); attr_merge_normalize_one( &rdi->rdi_e, ad, &ava->la_value, NULL ); } ldap_rdnfree( rdn ); /* error code */ snprintf( buf, sizeof( buf ), "%d", rdi->rdi_err ); ber_str2bv( buf, 0, 0, &val[ 0 ] ); attr_merge_one( &rdi->rdi_e, ad_errCode, &val[ 0 ], NULL ); if ( rdi->rdi_ref != NULL ) { attr_merge_normalize( &rdi->rdi_e, slap_schema.si_ad_ref, rdi->rdi_ref, NULL ); } /* text */ if ( !BER_BVISNULL( &rdi->rdi_text ) ) { val[ 0 ] = rdi->rdi_text; attr_merge_normalize_one( &rdi->rdi_e, ad_errText, &val[ 0 ], NULL ); } /* matched */ if ( !BER_BVISNULL( &rdi->rdi_matched ) ) { val[ 0 ] = rdi->rdi_matched; attr_merge_normalize_one( &rdi->rdi_e, ad_errMatchedDN, &val[ 0 ], NULL ); } /* sleep time */ if ( rdi->rdi_sleeptime ) { snprintf( buf, sizeof( buf ), "%d", rdi->rdi_sleeptime ); ber_str2bv( buf, 0, 0, &val[ 0 ] ); attr_merge_one( &rdi->rdi_e, ad_errSleepTime, &val[ 0 ], NULL ); } /* operations */ if ( rdi->rdi_mask & SN_DG_OP_ADD ) { BER_BVSTR( &val[ 0 ], "add" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_OP_BIND ) { BER_BVSTR( &val[ 0 ], "bind" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_OP_COMPARE ) { BER_BVSTR( &val[ 0 ], "compare" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_OP_DELETE ) { BER_BVSTR( &val[ 0 ], "delete" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_EXTENDED ) { BER_BVSTR( &val[ 0 ], "extended" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_OP_MODIFY ) { BER_BVSTR( &val[ 0 ], "modify" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_OP_RENAME ) { BER_BVSTR( &val[ 0 ], "rename" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } if ( rdi->rdi_mask & SN_DG_OP_SEARCH ) { BER_BVSTR( &val[ 0 ], "search" ); attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL ); } } return 0; }
static int add_values( Operation *op, Entry *e, Modification *mod, int *newlevel ) { Attribute *a; int i, rc; MatchingRule *mr = mod->sm_desc->ad_type->sat_equality; assert( mod->sm_values != NULL ); rc = check_constraints( mod, newlevel ); if ( rc != LDAP_SUCCESS ) { return rc; } a = attr_find( e->e_attrs, mod->sm_desc ); if ( a != NULL ) { /* "managedInfo" SHOULD have appropriate rules ... */ if ( mr == NULL || !mr->smr_match ) { return LDAP_INAPPROPRIATE_MATCHING; } for ( i = 0; !BER_BVISNULL( &mod->sm_values[ i ] ); i++ ) { int rc; int j; const char *text = NULL; struct berval asserted; rc = asserted_value_validate_normalize( mod->sm_desc, mr, SLAP_MR_EQUALITY, &mod->sm_values[ i ], &asserted, &text, op->o_tmpmemctx ); if ( rc != LDAP_SUCCESS ) { return rc; } for ( j = 0; !BER_BVISNULL( &a->a_vals[ j ] ); j++ ) { int match; int rc = value_match( &match, mod->sm_desc, mr, 0, &a->a_nvals[ j ], &asserted, &text ); if ( rc == LDAP_SUCCESS && match == 0 ) { free( asserted.bv_val ); return LDAP_TYPE_OR_VALUE_EXISTS; } } free( asserted.bv_val ); } } /* no - add them */ rc = attr_merge_normalize( e, mod->sm_desc, mod->sm_values, op->o_tmpmemctx ); if ( rc != LDAP_SUCCESS ) { return rc; } return LDAP_SUCCESS; }