⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modify.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			e = NULL;		}		Debug(LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": retrying...\n", 0, 0, 0);		rs->sr_err = TXN_ABORT( ltid );		ltid = NULL;		op->o_private = NULL;		op->o_do_not_cache = opinfo.boi_acl_cache;		if( rs->sr_err != 0 ) {			rs->sr_err = LDAP_OTHER;			rs->sr_text = "internal error";			goto return_results;		}		if ( op->o_abandon ) {			rs->sr_err = SLAPD_ABANDON;			goto return_results;		}		bdb_trans_backoff( ++num_retries );	}	/* begin transaction */	rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, 		bdb->bi_db_opflags );	rs->sr_text = NULL;	if( rs->sr_err != 0 ) {		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": txn_begin failed: "			"%s (%d)\n", db_strerror(rs->sr_err), rs->sr_err, 0 );		rs->sr_err = LDAP_OTHER;		rs->sr_text = "internal error";		goto return_results;	}	locker = TXN_ID ( ltid );	opinfo.boi_bdb = op->o_bd;	opinfo.boi_txn = ltid;	opinfo.boi_locker = locker;	opinfo.boi_err = 0;	opinfo.boi_acl_cache = op->o_do_not_cache;	op->o_private = &opinfo;	/* get entry or ancestor */	rs->sr_err = bdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1,		locker, &lock );	if ( rs->sr_err != 0 ) {		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": dn2entry failed (%d)\n",			rs->sr_err, 0, 0 );		switch( rs->sr_err ) {		case DB_LOCK_DEADLOCK:		case DB_LOCK_NOTGRANTED:			goto retry;		case DB_NOTFOUND:			if ( BER_BVISEMPTY( &op->o_req_ndn )) {				struct berval gluebv = BER_BVC("glue");				e = ch_calloc( 1, sizeof(Entry));				e->e_name.bv_val = ch_strdup( "" );				ber_dupbv( &e->e_nname, &e->e_name );				attr_merge_one( e, slap_schema.si_ad_objectClass,					&gluebv, NULL );				attr_merge_one( e, slap_schema.si_ad_structuralObjectClass,					&gluebv, NULL );				e->e_private = ei;				fakeroot = 1;				rs->sr_err = 0;			}			break;		case LDAP_BUSY:			rs->sr_text = "ldap server busy";			goto return_results;		default:			rs->sr_err = LDAP_OTHER;			rs->sr_text = "internal error";			goto return_results;		}	}	if ( !fakeroot ) {		e = ei->bei_e;	}	/* acquire and lock entry */	/* FIXME: dn2entry() should return non-glue entry */	if (( rs->sr_err == DB_NOTFOUND ) ||		( !manageDSAit && e && is_entry_glue( e )))	{		if ( e != NULL ) {			rs->sr_matched = ch_strdup( e->e_dn );			rs->sr_ref = is_entry_referral( e )				? get_entry_referrals( op, e )				: NULL;			bdb_unlocked_cache_return_entry_r (&bdb->bi_cache, e);			e = NULL;		} else {			rs->sr_ref = referral_rewrite( default_referral, NULL,				&op->o_req_dn, LDAP_SCOPE_DEFAULT );		}		rs->sr_err = LDAP_REFERRAL;		send_ldap_result( op, rs );		if ( rs->sr_ref != default_referral ) {			ber_bvarray_free( rs->sr_ref );		}		free( (char *)rs->sr_matched );		rs->sr_ref = NULL;		rs->sr_matched = NULL;		goto done;	}	if ( !manageDSAit && is_entry_referral( e ) ) {		/* entry is a referral, don't allow modify */		rs->sr_ref = get_entry_referrals( op, e );		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": entry is referral\n",			0, 0, 0 );		rs->sr_err = LDAP_REFERRAL;		rs->sr_matched = e->e_name.bv_val;		send_ldap_result( op, rs );		ber_bvarray_free( rs->sr_ref );		rs->sr_ref = NULL;		rs->sr_matched = NULL;		goto done;	}	if ( get_assert( op ) &&		( test_filter( op, e, get_assertion( op )) != LDAP_COMPARE_TRUE ))	{		rs->sr_err = LDAP_ASSERTION_FAILED;		goto return_results;	}	if( op->o_preread ) {		if( preread_ctrl == NULL ) {			preread_ctrl = &ctrls[num_ctrls++];			ctrls[num_ctrls] = NULL;		}		if ( slap_read_controls( op, rs, e,			&slap_pre_read_bv, preread_ctrl ) )		{			Debug( LDAP_DEBUG_TRACE,				"<=- " LDAP_XSTRING(bdb_modify) ": pre-read failed!\n",				0, 0, 0 );			goto return_results;		}	}	/* nested transaction */	rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, ltid, &lt2, bdb->bi_db_opflags );	rs->sr_text = NULL;	if( rs->sr_err != 0 ) {		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": txn_begin(2) failed: " "%s (%d)\n",			db_strerror(rs->sr_err), rs->sr_err, 0 );		rs->sr_err = LDAP_OTHER;		rs->sr_text = "internal error";		goto return_results;	}	/* Modify the entry */	dummy = *e;	rs->sr_err = bdb_modify_internal( op, lt2, op->oq_modify.rs_modlist,		&dummy, &rs->sr_text, textbuf, textlen );	if( rs->sr_err != LDAP_SUCCESS ) {		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": modify failed (%d)\n",			rs->sr_err, 0, 0 );		if ( (rs->sr_err == LDAP_INSUFFICIENT_ACCESS) && opinfo.boi_err ) {			rs->sr_err = opinfo.boi_err;		}		/* Only free attrs if they were dup'd.  */		if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL;		switch( rs->sr_err ) {		case DB_LOCK_DEADLOCK:		case DB_LOCK_NOTGRANTED:			goto retry;		}		goto return_results;	}	/* change the entry itself */	rs->sr_err = bdb_id2entry_update( op->o_bd, lt2, &dummy );	if ( rs->sr_err != 0 ) {		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": id2entry update failed " "(%d)\n",			rs->sr_err, 0, 0 );		switch( rs->sr_err ) {		case DB_LOCK_DEADLOCK:		case DB_LOCK_NOTGRANTED:			goto retry;		}		rs->sr_text = "entry update failed";		goto return_results;	}	if ( TXN_COMMIT( lt2, 0 ) != 0 ) {		rs->sr_err = LDAP_OTHER;		rs->sr_text = "txn_commit(2) failed";		goto return_results;	}	if( op->o_postread ) {		if( postread_ctrl == NULL ) {			postread_ctrl = &ctrls[num_ctrls++];			ctrls[num_ctrls] = NULL;		}		if( slap_read_controls( op, rs, &dummy,			&slap_post_read_bv, postread_ctrl ) )		{			Debug( LDAP_DEBUG_TRACE,				"<=- " LDAP_XSTRING(bdb_modify)				": post-read failed!\n", 0, 0, 0 );			goto return_results;		}	}	if( op->o_noop ) {		if ( ( rs->sr_err = TXN_ABORT( ltid ) ) != 0 ) {			rs->sr_text = "txn_abort (no-op) failed";		} else {			rs->sr_err = LDAP_X_NO_OPERATION;			ltid = NULL;			goto return_results;		}	} else {		/* may have changed in bdb_modify_internal() */		e->e_ocflags = dummy.e_ocflags;		if ( fakeroot ) {			e->e_private = NULL;			entry_free( e );			e = NULL;			attrs_free( dummy.e_attrs );		} else {			rc = bdb_cache_modify( e, dummy.e_attrs, bdb->bi_dbenv, locker, &lock );			switch( rc ) {			case DB_LOCK_DEADLOCK:			case DB_LOCK_NOTGRANTED:				goto retry;			}		}		dummy.e_attrs = NULL;		rs->sr_err = TXN_COMMIT( ltid, 0 );	}	ltid = NULL;	op->o_private = NULL;	if( rs->sr_err != 0 ) {		Debug( LDAP_DEBUG_TRACE,			LDAP_XSTRING(bdb_modify) ": txn_%s failed: %s (%d)\n",			op->o_noop ? "abort (no-op)" : "commit",			db_strerror(rs->sr_err), rs->sr_err );		rs->sr_err = LDAP_OTHER;		rs->sr_text = "commit failed";		goto return_results;	}	Debug( LDAP_DEBUG_TRACE,		LDAP_XSTRING(bdb_modify) ": updated%s id=%08lx dn=\"%s\"\n",		op->o_noop ? " (no-op)" : "",		dummy.e_id, op->o_req_dn.bv_val );	rs->sr_err = LDAP_SUCCESS;	rs->sr_text = NULL;	if( num_ctrls ) rs->sr_ctrls = ctrls;return_results:	if( dummy.e_attrs ) {		attrs_free( dummy.e_attrs );	}	send_ldap_result( op, rs );	if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp ) {		TXN_CHECKPOINT( bdb->bi_dbenv,			bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 );	}done:	slap_graduate_commit_csn( op );	if( ltid != NULL ) {		TXN_ABORT( ltid );	}	op->o_private = NULL;	if( e != NULL ) {		bdb_unlocked_cache_return_entry_w (&bdb->bi_cache, e);	}	if( preread_ctrl != NULL && (*preread_ctrl) != NULL ) {		slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );		slap_sl_free( *preread_ctrl, op->o_tmpmemctx );	}	if( postread_ctrl != NULL && (*postread_ctrl) != NULL ) {		slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );		slap_sl_free( *postread_ctrl, op->o_tmpmemctx );	}	return rs->sr_err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -