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

📄 config.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
				value_add_one( &c->rvalue_vals, &bv );			} else{				rc = 1;			}			break;		case BDB_DIRECTORY:			if ( bdb->bi_dbenv_home ) {				c->value_string = ch_strdup( bdb->bi_dbenv_home );			} else {				rc = 1;			}			break;		case BDB_CONFIG:			if (( slapMode&SLAP_SERVER_MODE ) && !( bdb->bi_flags&BDB_IS_OPEN )				&& !bdb->bi_db_config ) {				char	buf[SLAP_TEXT_BUFLEN];				FILE *f = fopen( bdb->bi_db_config_path, "r" );				struct berval bv;				if ( f ) {					bdb->bi_flags |= BDB_HAS_CONFIG;					while ( fgets( buf, sizeof(buf), f )) {						ber_str2bv( buf, 0, 1, &bv );						if ( bv.bv_len > 0 && bv.bv_val[bv.bv_len-1] == '\n' ) {							bv.bv_len--;							bv.bv_val[bv.bv_len] = '\0';						}						/* shouldn't need this, but ... */						if ( bv.bv_len > 0 && bv.bv_val[bv.bv_len-1] == '\r' ) {							bv.bv_len--;							bv.bv_val[bv.bv_len] = '\0';						}						ber_bvarray_add( &bdb->bi_db_config, &bv );					}					fclose( f );				}			}			if ( bdb->bi_db_config ) {				int i;				struct berval bv;				bv.bv_val = c->log;				for (i=0; !BER_BVISNULL(&bdb->bi_db_config[i]); i++) {					bv.bv_len = sprintf( bv.bv_val, "{%d}%s", i,						bdb->bi_db_config[i].bv_val );					value_add_one( &c->rvalue_vals, &bv );				}			}			if ( !c->rvalue_vals ) rc = 1;			break;		case BDB_NOSYNC:			if ( bdb->bi_dbenv_xflags & DB_TXN_NOSYNC )				c->value_int = 1;			break;					case BDB_INDEX:			bdb_attr_index_unparse( bdb, &c->rvalue_vals );			if ( !c->rvalue_vals ) rc = 1;			break;		case BDB_LOCKD:			rc = 1;			if ( bdb->bi_lock_detect != DB_LOCK_DEFAULT ) {				int i;				for (i=0; !BER_BVISNULL(&bdb_lockd[i].word); i++) {					if ( bdb->bi_lock_detect == bdb_lockd[i].mask ) {						value_add_one( &c->rvalue_vals, &bdb_lockd[i].word );						rc = 0;						break;					}				}			}			break;		case BDB_SSTACK:			c->value_int = bdb->bi_search_stack_depth;			break;		}		return rc;	} else if ( c->op == LDAP_MOD_DELETE ) {		rc = 0;		switch( c->type ) {		/* single-valued no-ops */		case BDB_LOCKD:		case BDB_SSTACK:			break;		case BDB_CHKPT:			if ( bdb->bi_txn_cp_task ) {				struct re_s *re = bdb->bi_txn_cp_task;				bdb->bi_txn_cp_task = NULL;				if ( ldap_pvt_runqueue_isrunning( &slapd_rq, re ))					ldap_pvt_runqueue_stoptask( &slapd_rq, re );				ldap_pvt_runqueue_remove( &slapd_rq, re );			}			bdb->bi_txn_cp = 0;			break;		case BDB_CONFIG:			if ( c->valx < 0 ) {				ber_bvarray_free( bdb->bi_db_config );				bdb->bi_db_config = NULL;			} else {				int i = c->valx;				ch_free( bdb->bi_db_config[i].bv_val );				for (; bdb->bi_db_config[i].bv_val; i++)					bdb->bi_db_config[i] = bdb->bi_db_config[i+1];			}			bdb->bi_flags |= BDB_UPD_CONFIG;			c->cleanup = bdb_cf_cleanup;			break;		case BDB_DIRECTORY:			bdb->bi_flags |= BDB_RE_OPEN;			bdb->bi_flags ^= BDB_HAS_CONFIG;			ch_free( bdb->bi_dbenv_home );			bdb->bi_dbenv_home = NULL;			ch_free( bdb->bi_db_config_path );			bdb->bi_db_config_path = NULL;			c->cleanup = bdb_cf_cleanup;			ldap_pvt_thread_pool_purgekey( bdb->bi_dbenv );			ldap_pvt_thread_pool_purgekey( ((char *)bdb->bi_dbenv) + 1 );			break;		case BDB_NOSYNC:			bdb->bi_dbenv->set_flags( bdb->bi_dbenv, DB_TXN_NOSYNC, 0 );			break;		case BDB_INDEX:			if ( c->valx == -1 ) {				int i;				/* delete all (FIXME) */				for ( i = 0; i < bdb->bi_nattrs; i++ ) {					bdb->bi_attrs[i]->ai_indexmask |= BDB_INDEX_DELETING;				}				bdb->bi_flags |= BDB_DEL_INDEX;				c->cleanup = bdb_cf_cleanup;			} else {				struct berval bv, def = BER_BVC("default");				char *ptr;				for (ptr = c->line; !isspace( *ptr ); ptr++);				bv.bv_val = c->line;				bv.bv_len = ptr - bv.bv_val;				if ( bvmatch( &bv, &def )) {					bdb->bi_defaultmask = 0;				} else {					int i;					char **attrs;					char sep;					sep = bv.bv_val[ bv.bv_len ];					bv.bv_val[ bv.bv_len ] = '\0';					attrs = ldap_str2charray( bv.bv_val, "," );					for ( i = 0; attrs[ i ]; i++ ) {						AttributeDescription *ad = NULL;						const char *text;						AttrInfo *ai;						slap_str2ad( attrs[ i ], &ad, &text );						/* if we got here... */						assert( ad != NULL );						ai = bdb_attr_mask( bdb, ad );						/* if we got here... */						assert( ai != NULL );						ai->ai_indexmask |= BDB_INDEX_DELETING;						bdb->bi_flags |= BDB_DEL_INDEX;						c->cleanup = bdb_cf_cleanup;					}					bv.bv_val[ bv.bv_len ] = sep;					ldap_charray_free( attrs );				}			}			break;		}		return rc;	}	switch( c->type ) {	case BDB_CHKPT: {		long	l;		bdb->bi_txn_cp = 1;		if ( lutil_atolx( &l, c->argv[1], 0 ) != 0 ) {			fprintf( stderr, "%s: "				"invalid kbyte \"%s\" in \"checkpoint\".\n",				c->log, c->argv[1] );			return 1;		}		bdb->bi_txn_cp_kbyte = l;		if ( lutil_atolx( &l, c->argv[2], 0 ) != 0 ) {			fprintf( stderr, "%s: "				"invalid minutes \"%s\" in \"checkpoint\".\n",				c->log, c->argv[2] );			return 1;		}		bdb->bi_txn_cp_min = l;		/* If we're in server mode and time-based checkpointing is enabled,		 * submit a task to perform periodic checkpoints.		 */		if ((slapMode & SLAP_SERVER_MODE) && bdb->bi_txn_cp_min ) {			struct re_s *re = bdb->bi_txn_cp_task;			if ( re ) {				re->interval.tv_sec = bdb->bi_txn_cp_min * 60;			} else {				if ( c->be->be_suffix == NULL || BER_BVISNULL( &c->be->be_suffix[0] ) ) {					fprintf( stderr, "%s: "						"\"checkpoint\" must occur after \"suffix\".\n",						c->log );					return 1;				}				bdb->bi_txn_cp_task = ldap_pvt_runqueue_insert( &slapd_rq,					bdb->bi_txn_cp_min * 60, bdb_checkpoint, bdb,					LDAP_XSTRING(bdb_checkpoint), c->be->be_suffix[0].bv_val );			}		}		} break;	case BDB_CONFIG: {		char *ptr = c->line;		struct berval bv;		if ( c->op == SLAP_CONFIG_ADD ) {			ptr += STRLENOF("dbconfig");			while (!isspace(*ptr)) ptr++;			while (isspace(*ptr)) ptr++;		}		if ( bdb->bi_flags & BDB_IS_OPEN ) {			bdb->bi_flags |= BDB_UPD_CONFIG;			c->cleanup = bdb_cf_cleanup;		} else {		/* If we're just starting up...		 */			FILE *f;			/* If a DB_CONFIG file exists, or we don't know the path			 * to the DB_CONFIG file, ignore these directives			 */			if (( bdb->bi_flags & BDB_HAS_CONFIG ) || !bdb->bi_db_config_path )				break;			f = fopen( bdb->bi_db_config_path, "a" );			if ( f ) {				/* FIXME: EBCDIC probably needs special handling */				fprintf( f, "%s\n", ptr );				fclose( f );			}		}		ber_str2bv( ptr, 0, 1, &bv );		ber_bvarray_add( &bdb->bi_db_config, &bv );		}		break;	case BDB_DIRECTORY: {		FILE *f;		char *ptr;		if ( bdb->bi_dbenv_home )			ch_free( bdb->bi_dbenv_home );		bdb->bi_dbenv_home = c->value_string;		/* See if a DB_CONFIG file already exists here */		if ( bdb->bi_db_config_path )			ch_free( bdb->bi_db_config_path );		bdb->bi_db_config_path = ch_malloc( strlen( bdb->bi_dbenv_home ) +			STRLENOF(LDAP_DIRSEP) + STRLENOF("DB_CONFIG") + 1 );		ptr = lutil_strcopy( bdb->bi_db_config_path, bdb->bi_dbenv_home );		*ptr++ = LDAP_DIRSEP[0];		strcpy( ptr, "DB_CONFIG" );		f = fopen( bdb->bi_db_config_path, "r" );		if ( f ) {			bdb->bi_flags |= BDB_HAS_CONFIG;			fclose(f);		}		}		break;	case BDB_NOSYNC:		if ( c->value_int )			bdb->bi_dbenv_xflags |= DB_TXN_NOSYNC;		else			bdb->bi_dbenv_xflags &= ~DB_TXN_NOSYNC;		if ( bdb->bi_flags & BDB_IS_OPEN ) {			bdb->bi_dbenv->set_flags( bdb->bi_dbenv, DB_TXN_NOSYNC,				c->value_int );		}		break;	case BDB_INDEX:		rc = bdb_attr_index_config( bdb, c->fname, c->lineno,			c->argc - 1, &c->argv[1] );		if( rc != LDAP_SUCCESS ) return 1;		if (( bdb->bi_flags & BDB_IS_OPEN ) && !bdb->bi_index_task ) {			/* Start the task as soon as we finish here. Set a long			 * interval (10 hours) so that it only gets scheduled once.			 */			if ( c->be->be_suffix == NULL || BER_BVISNULL( &c->be->be_suffix[0] ) ) {				fprintf( stderr, "%s: "					"\"index\" must occur after \"suffix\".\n",					c->log );				return 1;			}			bdb->bi_index_task = ldap_pvt_runqueue_insert( &slapd_rq, 36000,				bdb_online_index, c->be,				LDAP_XSTRING(bdb_online_index), c->be->be_suffix[0].bv_val );		}		break;	case BDB_LOCKD:		rc = verb_to_mask( c->argv[1], bdb_lockd );		if ( BER_BVISNULL(&bdb_lockd[rc].word) ) {			fprintf( stderr, "%s: "				"bad policy (%s) in \"lockDetect <policy>\" line\n",				c->log, c->argv[1] );			return 1;		}		bdb->bi_lock_detect = rc;		break;	case BDB_SSTACK:		if ( c->value_int < MINIMUM_SEARCH_STACK_DEPTH ) {			fprintf( stderr,		"%s: depth %d too small, using %d\n",			c->log, c->value_int, MINIMUM_SEARCH_STACK_DEPTH );			c->value_int = MINIMUM_SEARCH_STACK_DEPTH;		}		bdb->bi_search_stack_depth = c->value_int;		break;	}	return 0;}int bdb_back_init_cf( BackendInfo *bi ){	int rc;	bi->bi_cf_ocs = bdbocs;	rc = config_register_schema( bdbcfg, bdbocs );	if ( rc ) return rc;	return 0;}

⌨️ 快捷键说明

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