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

📄 init.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}		if( i == BDB_ID2ENTRY ) {			if ( slapMode & SLAP_TOOL_MODE )				db->bdi_db->mpf->set_priority( db->bdi_db->mpf,					DB_PRIORITY_VERY_LOW );			rc = db->bdi_db->set_pagesize( db->bdi_db,				BDB_ID2ENTRY_PAGESIZE );			if ( slapMode & SLAP_TOOL_READMAIN ) {				flags |= DB_RDONLY;			} else {				flags |= DB_CREATE;			}		} else {			rc = db->bdi_db->set_flags( db->bdi_db, 				DB_DUP | DB_DUPSORT );#ifndef BDB_HIER			if ( slapMode & SLAP_TOOL_READONLY ) {				flags |= DB_RDONLY;			} else {				flags |= DB_CREATE;			}#else			if ( slapMode & (SLAP_TOOL_READONLY|SLAP_TOOL_READMAIN) ) {				flags |= DB_RDONLY;			} else {				flags |= DB_CREATE;			}#endif			rc = db->bdi_db->set_pagesize( db->bdi_db,				BDB_PAGESIZE );		}#ifdef HAVE_EBCDIC		strcpy( path, bdbi_databases[i].file );		__atoe( path );		rc = DB_OPEN( db->bdi_db,			path,		/*	bdbi_databases[i].name, */ NULL,			bdbi_databases[i].type,			bdbi_databases[i].flags | flags,			bdb->bi_dbenv_mode );#else		rc = DB_OPEN( db->bdi_db,			bdbi_databases[i].file,		/*	bdbi_databases[i].name, */ NULL,			bdbi_databases[i].type,			bdbi_databases[i].flags | flags,			bdb->bi_dbenv_mode );#endif		if ( rc != 0 ) {			char	buf[SLAP_TEXT_BUFLEN];			snprintf( buf, sizeof(buf), "%s/%s", 				bdb->bi_dbenv_home, bdbi_databases[i].file );			Debug( LDAP_DEBUG_ANY,				"bdb_db_open: db_open(%s) failed: %s (%d)\n",				buf, db_strerror(rc), rc );			db->bdi_db->close( db->bdi_db, 0 );			goto fail;		}		flags &= ~(DB_CREATE | DB_RDONLY);		db->bdi_name = bdbi_databases[i].name;		bdb->bi_databases[i] = db;	}	bdb->bi_databases[i] = NULL;	bdb->bi_ndatabases = i;	/* get nextid */	rc = bdb_last_id( be, NULL );	if( rc != 0 ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_open: last_id(%s) failed: %s (%d)\n",			bdb->bi_dbenv_home, db_strerror(rc), rc );		goto fail;	}	if ( !quick ) {		XLOCK_ID(bdb->bi_dbenv, &bdb->bi_cache.c_locker);	}	bdb->bi_flags |= BDB_IS_OPEN;	return 0;fail:	bdb_db_close( be );	return rc;}static intbdb_db_close( BackendDB *be ){	int rc;	struct bdb_info *bdb = (struct bdb_info *) be->be_private;	struct bdb_db_info *db;	bdb_idl_cache_entry_t *entry, *next_entry;	bdb->bi_flags &= ~BDB_IS_OPEN;	ber_bvarray_free( bdb->bi_db_config );	bdb->bi_db_config = NULL;	while( bdb->bi_databases && bdb->bi_ndatabases-- ) {		db = bdb->bi_databases[bdb->bi_ndatabases];		rc = db->bdi_db->close( db->bdi_db, 0 );		/* Lower numbered names are not strdup'd */		if( bdb->bi_ndatabases >= BDB_NDB )			free( db->bdi_name );		free( db );	}	free( bdb->bi_databases );	bdb->bi_databases = NULL;	bdb_cache_release_all (&bdb->bi_cache);	if ( bdb->bi_idl_cache_max_size ) {		avl_free( bdb->bi_idl_tree, NULL );		bdb->bi_idl_tree = NULL;		entry = bdb->bi_idl_lru_head;		while ( entry != NULL ) {			next_entry = entry->idl_lru_next;			if ( entry->idl )				free( entry->idl );			free( entry->kstr.bv_val );			free( entry );			entry = next_entry;		}		bdb->bi_idl_lru_head = bdb->bi_idl_lru_tail = NULL;	}	/* close db environment */	if( bdb->bi_dbenv ) {		/* Free cache locker if we enabled locking */		if ( !( slapMode & SLAP_TOOL_QUICK )) {			XLOCK_ID_FREE(bdb->bi_dbenv, bdb->bi_cache.c_locker);			bdb->bi_cache.c_locker = 0;		}#ifdef BDB_REUSE_LOCKERS		bdb_locker_flush( bdb->bi_dbenv );#endif		/* force a checkpoint, but not if we were ReadOnly,		 * and not in Quick mode since there are no transactions there.		 */		if ( !( slapMode & ( SLAP_TOOL_QUICK|SLAP_TOOL_READONLY ))) {			rc = TXN_CHECKPOINT( bdb->bi_dbenv, 0, 0, DB_FORCE );			if( rc != 0 ) {				Debug( LDAP_DEBUG_ANY,					"bdb_db_close: txn_checkpoint failed: %s (%d)\n",					db_strerror(rc), rc, 0 );			}		}		rc = bdb->bi_dbenv->close( bdb->bi_dbenv, 0 );		bdb->bi_dbenv = NULL;		if( rc != 0 ) {			Debug( LDAP_DEBUG_ANY,				"bdb_db_close: close failed: %s (%d)\n",				db_strerror(rc), rc, 0 );			return rc;		}	}	rc = alock_close( &bdb->bi_alock_info );	if( rc != 0 ) {		Debug( LDAP_DEBUG_ANY,			"bdb_db_close: alock_close failed\n", 0, 0, 0 );		return -1;	}	return 0;}static intbdb_db_destroy( BackendDB *be ){	struct bdb_info *bdb = (struct bdb_info *) be->be_private;	if( bdb->bi_dbenv_home ) ch_free( bdb->bi_dbenv_home );	if( bdb->bi_db_config_path ) ch_free( bdb->bi_db_config_path );	bdb_attr_index_destroy( bdb );	ldap_pvt_thread_rdwr_destroy ( &bdb->bi_cache.c_rwlock );	ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.lru_head_mutex );	ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.lru_tail_mutex );	ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.c_dntree.bei_kids_mutex );#ifdef BDB_HIER	ldap_pvt_thread_mutex_destroy( &bdb->bi_modrdns_mutex );#endif	ldap_pvt_thread_mutex_destroy( &bdb->bi_lastid_mutex );	ldap_pvt_thread_mutex_destroy( &bdb->bi_database_mutex );	ldap_pvt_thread_rdwr_destroy( &bdb->bi_idl_tree_rwlock );	ldap_pvt_thread_mutex_destroy( &bdb->bi_idl_tree_lrulock );	ch_free( bdb );	be->be_private = NULL;	return 0;}intbdb_back_initialize(	BackendInfo	*bi ){	int rc;	static char *controls[] = {		LDAP_CONTROL_ASSERT,		LDAP_CONTROL_MANAGEDSAIT,		LDAP_CONTROL_NOOP,		LDAP_CONTROL_PAGEDRESULTS,		LDAP_CONTROL_PRE_READ,		LDAP_CONTROL_POST_READ,		LDAP_CONTROL_SUBENTRIES,		LDAP_CONTROL_X_PERMISSIVE_MODIFY,		NULL	};	/* initialize the underlying database system */	Debug( LDAP_DEBUG_TRACE,		LDAP_XSTRING(bdb_back_initialize) ": initialize " 		BDB_UCTYPE " backend\n", 0, 0, 0 );	bi->bi_flags |=		SLAP_BFLAG_INCREMENT |		SLAP_BFLAG_SUBENTRIES |		SLAP_BFLAG_ALIASES |		SLAP_BFLAG_REFERRALS;	bi->bi_controls = controls;	{	/* version check */		int major, minor, patch, ver;		char *version = db_version( &major, &minor, &patch );#ifdef HAVE_EBCDIC		char v2[1024];		/* All our stdio does an ASCII to EBCDIC conversion on		 * the output. Strings from the BDB library are already		 * in EBCDIC; we have to go back and forth...		 */		strcpy( v2, version );		__etoa( v2 );		version = v2;#endif		ver = (major << 24) | (minor << 16) | patch;		if( ver != DB_VERSION_FULL ) {			/* fail if a versions don't match */			Debug( LDAP_DEBUG_ANY,				LDAP_XSTRING(bdb_back_initialize) ": "				"BDB library version mismatch:"				" expected " DB_VERSION_STRING ","				" got %s\n", version, 0, 0 );			return -1;		}		Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(bdb_back_initialize)			": %s\n", version, 0, 0 );	}	db_env_set_func_free( ber_memfree );	db_env_set_func_malloc( (db_malloc *)ber_memalloc );	db_env_set_func_realloc( (db_realloc *)ber_memrealloc );#ifndef NO_THREAD	/* This is a no-op on a NO_THREAD build. Leave the default	 * alone so that BDB will sleep on interprocess conflicts.	 */	db_env_set_func_yield( ldap_pvt_thread_yield );#endif	bi->bi_open = 0;	bi->bi_close = 0;	bi->bi_config = 0;	bi->bi_destroy = 0;	bi->bi_db_init = bdb_db_init;	bi->bi_db_config = config_generic_wrapper;	bi->bi_db_open = bdb_db_open;	bi->bi_db_close = bdb_db_close;	bi->bi_db_destroy = bdb_db_destroy;	bi->bi_op_add = bdb_add;	bi->bi_op_bind = bdb_bind;	bi->bi_op_compare = bdb_compare;	bi->bi_op_delete = bdb_delete;	bi->bi_op_modify = bdb_modify;	bi->bi_op_modrdn = bdb_modrdn;	bi->bi_op_search = bdb_search;	bi->bi_op_unbind = 0;	bi->bi_extended = bdb_extended;	bi->bi_chk_referrals = bdb_referrals;	bi->bi_operational = bdb_operational;	bi->bi_has_subordinates = bdb_hasSubordinates;	bi->bi_entry_release_rw = bdb_entry_release;	bi->bi_entry_get_rw = bdb_entry_get;	/*	 * hooks for slap tools	 */	bi->bi_tool_entry_open = bdb_tool_entry_open;	bi->bi_tool_entry_close = bdb_tool_entry_close;	bi->bi_tool_entry_first = bdb_tool_entry_next;	bi->bi_tool_entry_next = bdb_tool_entry_next;	bi->bi_tool_entry_get = bdb_tool_entry_get;	bi->bi_tool_entry_put = bdb_tool_entry_put;	bi->bi_tool_entry_reindex = bdb_tool_entry_reindex;	bi->bi_tool_sync = 0;	bi->bi_tool_dn2id_get = bdb_tool_dn2id_get;	bi->bi_tool_id2entry_get = bdb_tool_id2entry_get;	bi->bi_tool_entry_modify = bdb_tool_entry_modify;	bi->bi_connection_init = 0;	bi->bi_connection_destroy = 0;	rc = bdb_back_init_cf( bi );	return rc;}#if	(SLAPD_BDB == SLAPD_MOD_DYNAMIC && !defined(BDB_HIER)) || \	(SLAPD_HDB == SLAPD_MOD_DYNAMIC && defined(BDB_HIER))/* conditionally define the init_module() function */#ifdef BDB_HIERSLAP_BACKEND_INIT_MODULE( hdb )#else /* !BDB_HIER */SLAP_BACKEND_INIT_MODULE( bdb )#endif /* !BDB_HIER */#endif /* SLAPD_[BH]DB == SLAPD_MOD_DYNAMIC */

⌨️ 快捷键说明

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