mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-25 00:59:45 -05:00
More for loading config from database. Fix non-reentrant strtok_quote.
This commit is contained in:
parent
1e5f43ddd1
commit
83c748fe5c
5 changed files with 77 additions and 32 deletions
|
|
@ -240,9 +240,8 @@ int bdb_back_init_cf( BackendInfo *bi )
|
|||
int rc;
|
||||
bi->bi_cf_table = bdbcfg;
|
||||
|
||||
rc = init_config_attrs( bdbcfg );
|
||||
rc = config_register_schema( bdbcfg, bdbocs );
|
||||
if ( rc ) return rc;
|
||||
bdbcfg[0].ad = slap_schema.si_ad_objectClass;
|
||||
rc = init_config_ocs( bdbocs );
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1026,9 +1026,8 @@ ldif_back_initialize(
|
|||
bi->bi_tool_id2entry_get = 0;
|
||||
bi->bi_tool_entry_modify = 0;
|
||||
|
||||
rc = init_config_attrs( ldifcfg );
|
||||
rc = config_register_schema( ldifcfg, ldifocs );
|
||||
if ( rc ) return rc;
|
||||
ldifcfg[0].ad = slap_schema.si_ad_objectClass;
|
||||
rc = init_config_ocs( ldifocs );
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@
|
|||
#include "config.h"
|
||||
|
||||
static struct berval config_rdn = BER_BVC("cn=config");
|
||||
static struct berval access_rdn = BER_BVC("cn=access");
|
||||
|
||||
#ifdef SLAPD_MODULES
|
||||
typedef struct modpath_s {
|
||||
|
|
@ -57,10 +56,24 @@ typedef struct ConfigFile {
|
|||
BerVarray c_dseFiles;
|
||||
} ConfigFile;
|
||||
|
||||
typedef struct CfOcInfo {
|
||||
struct berval *co_name;
|
||||
ConfigTable *co_table;
|
||||
} CfOcInfo;
|
||||
|
||||
typedef enum {
|
||||
Cf_Global = 1,
|
||||
Cf_Include,
|
||||
Cf_Backend,
|
||||
Cf_Database,
|
||||
Cf_Overlay
|
||||
} CfEtypes;
|
||||
|
||||
typedef struct CfEntryInfo {
|
||||
struct CfEntryInfo *ce_sibs;
|
||||
struct CfEntryInfo *ce_kids;
|
||||
Entry *ce_entry;
|
||||
CfEtypes ce_type;
|
||||
BackendInfo *ce_bi;
|
||||
BackendDB *ce_be;
|
||||
} CfEntryInfo;
|
||||
|
|
@ -84,14 +97,17 @@ static BerVarray authz_rewrites;
|
|||
|
||||
static struct berval cfdir;
|
||||
|
||||
/* Private state */
|
||||
static AttributeDescription *cfAd_backend, *cfAd_database, *cfAd_overlay,
|
||||
*cfAd_include;
|
||||
|
||||
static ObjectClass *cfOc_global, *cfOc_backend, *cfOc_database,
|
||||
*cfOc_include, *cfOc_overlay, *cfOc_access;
|
||||
*cfOc_include, *cfOc_overlay;
|
||||
|
||||
static ConfigFile cf_prv, *cfn = &cf_prv;
|
||||
|
||||
static Avlnode *CfOcTree;
|
||||
|
||||
static int add_syncrepl LDAP_P(( Backend *, char **, int ));
|
||||
static int parse_syncrepl_line LDAP_P(( char **, int, syncinfo_t *));
|
||||
static void syncrepl_unparse LDAP_P (( syncinfo_t *, struct berval *));
|
||||
|
|
@ -604,11 +620,6 @@ static ConfigOCs cf_ocs[] = {
|
|||
"DESC 'OpenLDAP Overlay-specific options' "
|
||||
"SUP olcConfig STRUCTURAL "
|
||||
"MAY ( olcOverlay ) )", &cfOc_overlay },
|
||||
{ "( OLcfgOc:8 "
|
||||
"NAME 'olcACL' "
|
||||
"DESC 'OpenLDAP Access Control List' "
|
||||
"SUP olcConfig STRUCTURAL "
|
||||
"MUST ( olcAccess ) )", &cfOc_access },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
@ -2639,6 +2650,37 @@ config_setup_ldif( BackendDB *be, const char *dir ) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
CfOcInfo_cmp( const void *c1, const void *c2 ) {
|
||||
const CfOcInfo *co1 = c1;
|
||||
const CfOcInfo *co2 = c2;
|
||||
|
||||
return ber_bvcmp( co1->co_name, co2->co_name );
|
||||
}
|
||||
|
||||
int
|
||||
config_register_schema(ConfigTable *ct, ConfigOCs *ocs) {
|
||||
int i;
|
||||
CfOcInfo *co;
|
||||
|
||||
i = init_config_attrs( ct );
|
||||
if ( i ) return i;
|
||||
|
||||
/* set up the objectclasses */
|
||||
i = init_config_ocs( ocs );
|
||||
if ( i ) return i;
|
||||
|
||||
for (i=0; ocs[i].def; i++) {
|
||||
if ( ocs[i].oc ) {
|
||||
co = ch_malloc( sizeof(CfOcInfo) );
|
||||
co->co_name = &(*ocs[i].oc)->soc_cname;
|
||||
co->co_table = ct;
|
||||
avl_insert( &CfOcTree, co, CfOcInfo_cmp, avl_dup_error );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
read_config(const char *fname, const char *dir) {
|
||||
BackendDB *be;
|
||||
|
|
@ -2893,6 +2935,8 @@ config_build_includes( ConfigArgs *c, Entry *parent,
|
|||
op->ora_e = e;
|
||||
op->o_bd->be_add( op, rs );
|
||||
ce = e->e_private;
|
||||
ce->ce_type = Cf_Include;
|
||||
ce->ce_bi = c->bi;
|
||||
if ( !ceparent->ce_kids ) {
|
||||
ceparent->ce_kids = ce;
|
||||
} else {
|
||||
|
|
@ -2951,6 +2995,8 @@ config_back_db_open( BackendDB *be )
|
|||
config_build_entry( &c, e, cfOc_global, &rdn, ct, NO_TABLE );
|
||||
op->ora_e = e;
|
||||
op->o_bd->be_add( op, &rs );
|
||||
ce->ce_type = Cf_Global;
|
||||
ce->ce_bi = c.bi;
|
||||
|
||||
parent = e;
|
||||
ceparent = ce;
|
||||
|
|
@ -2975,6 +3021,7 @@ config_back_db_open( BackendDB *be )
|
|||
rdn.bv_len = sprintf(rdn.bv_val, "%s=%s", cfAd_backend->ad_cname.bv_val, bi->bi_type);
|
||||
e = config_alloc_entry( &parent->e_nname, &rdn );
|
||||
ce = e->e_private;
|
||||
ce->ce_type = Cf_Backend;
|
||||
ce->ce_bi = bi;
|
||||
c.bi = bi;
|
||||
config_build_entry( &c, e, cfOc_backend, &rdn, ct, BI_TABLE );
|
||||
|
|
@ -3009,6 +3056,7 @@ config_back_db_open( BackendDB *be )
|
|||
ce = e->e_private;
|
||||
c.be = bptr;
|
||||
c.bi = bi;
|
||||
ce->ce_type = Cf_Database;
|
||||
ce->ce_be = c.be;
|
||||
ce->ce_bi = c.bi;
|
||||
config_build_entry( &c, e, cfOc_database, &rdn, ct, BE_TABLE );
|
||||
|
|
@ -3035,6 +3083,7 @@ config_back_db_open( BackendDB *be )
|
|||
ce = oe->e_private;
|
||||
c.be = bptr;
|
||||
c.bi = &on->on_bi;
|
||||
ce->ce_type = Cf_Overlay;
|
||||
ce->ce_be = c.be;
|
||||
ce->ce_bi = c.bi;
|
||||
config_build_entry( &c, oe, cfOc_overlay, &rdn, ct, BI_TABLE );
|
||||
|
|
@ -3140,7 +3189,9 @@ config_back_initialize( BackendInfo *bi )
|
|||
parse_oidm( "slapd", i, 3, argv );
|
||||
}
|
||||
|
||||
i = init_config_attrs( ct );
|
||||
bi->bi_cf_table = ct;
|
||||
|
||||
i = config_register_schema( ct, cf_ocs );
|
||||
if ( i ) return i;
|
||||
|
||||
/* set up the notable AttributeDescriptions */
|
||||
|
|
@ -3148,8 +3199,6 @@ config_back_initialize( BackendInfo *bi )
|
|||
ads[3].sub = slap_schema.si_ad_ditContentRules;
|
||||
ads[5].sub = slap_schema.si_ad_objectClasses;
|
||||
|
||||
bi->bi_cf_table = ct;
|
||||
|
||||
i = 0;
|
||||
for (;ct->name;ct++) {
|
||||
if (strcmp(ct->name, ads[i].name)) continue;
|
||||
|
|
@ -3162,9 +3211,6 @@ config_back_initialize( BackendInfo *bi )
|
|||
if (!ads[i].name) break;
|
||||
}
|
||||
|
||||
/* set up the objectclasses */
|
||||
i = init_config_ocs( cf_ocs );
|
||||
|
||||
return i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,8 +72,6 @@ int slap_conn_max_pending_auth = SLAP_CONN_MAX_PENDING_AUTH;
|
|||
char *slapd_pid_file = NULL;
|
||||
char *slapd_args_file = NULL;
|
||||
|
||||
char *strtok_quote_ptr;
|
||||
|
||||
int use_reverse_lookup = 0;
|
||||
|
||||
#ifdef LDAP_SLAPI
|
||||
|
|
@ -84,7 +82,7 @@ static int fp_getline(FILE *fp, ConfigArgs *c);
|
|||
static void fp_getline_init(ConfigArgs *c);
|
||||
static int fp_parse_line(ConfigArgs *c);
|
||||
|
||||
static char *strtok_quote(char *line, char *sep);
|
||||
static char *strtok_quote(char *line, char *sep, char **quote_ptr);
|
||||
|
||||
int read_config_file(const char *fname, int depth, ConfigArgs *cf);
|
||||
|
||||
|
|
@ -458,6 +456,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf)
|
|||
snprintf( c->log, sizeof( c->log ), "%s: line %lu",
|
||||
c->fname, c->lineno );
|
||||
|
||||
c->argc = 0;
|
||||
if ( fp_parse_line( c ) ) {
|
||||
goto badline;
|
||||
}
|
||||
|
|
@ -748,13 +747,13 @@ void bindconf_free( slap_bindconf *bc ) {
|
|||
|
||||
|
||||
static char *
|
||||
strtok_quote( char *line, char *sep )
|
||||
strtok_quote( char *line, char *sep, char **quote_ptr )
|
||||
{
|
||||
int inquote;
|
||||
char *tmp;
|
||||
static char *next;
|
||||
|
||||
strtok_quote_ptr = NULL;
|
||||
*quote_ptr = NULL;
|
||||
if ( line != NULL ) {
|
||||
next = line;
|
||||
}
|
||||
|
|
@ -789,7 +788,7 @@ strtok_quote( char *line, char *sep )
|
|||
default:
|
||||
if ( ! inquote ) {
|
||||
if ( strchr( sep, *next ) != NULL ) {
|
||||
strtok_quote_ptr = next;
|
||||
*quote_ptr = next;
|
||||
*next++ = '\0';
|
||||
return( tmp );
|
||||
}
|
||||
|
|
@ -877,17 +876,18 @@ fp_parse_line(ConfigArgs *c)
|
|||
char *token;
|
||||
char *tline = ch_strdup(c->line);
|
||||
char *hide[] = { "rootpw", "replica", "bindpw", "pseudorootpw", "dbpasswd", '\0' };
|
||||
char *quote_ptr;
|
||||
int i;
|
||||
|
||||
c->argc = 0;
|
||||
token = strtok_quote(tline, " \t");
|
||||
token = strtok_quote(tline, " \t", "e_ptr);
|
||||
|
||||
if(token) for(i = 0; hide[i]; i++) if(!strcasecmp(token, hide[i])) break;
|
||||
if(strtok_quote_ptr) *strtok_quote_ptr = ' ';
|
||||
Debug(LDAP_DEBUG_CONFIG, "line %lu (%s%s)\n", c->lineno, hide[i] ? hide[i] : c->line, hide[i] ? " ***" : "");
|
||||
if(strtok_quote_ptr) *strtok_quote_ptr = '\0';
|
||||
if(quote_ptr) *quote_ptr = ' ';
|
||||
Debug(LDAP_DEBUG_CONFIG, "line %lu (%s%s)\n", c->lineno,
|
||||
hide[i] ? hide[i] : c->line, hide[i] ? " ***" : "");
|
||||
if(quote_ptr) *quote_ptr = '\0';
|
||||
|
||||
for(; token; token = strtok_quote(NULL, " \t")) {
|
||||
for(; token; token = strtok_quote(NULL, " \t", "e_ptr)) {
|
||||
if(c->argc == c->argv_size - 1) {
|
||||
char **tmp;
|
||||
tmp = ch_realloc(c->argv, (c->argv_size + ARGS_STEP) * sizeof(*c->argv));
|
||||
|
|
|
|||
|
|
@ -103,6 +103,7 @@ typedef struct config_args_s {
|
|||
|
||||
typedef int (ConfigDriver)(ConfigArgs *c);
|
||||
|
||||
int config_register_schema(ConfigTable *ct, ConfigOCs *co);
|
||||
int config_get_vals(ConfigTable *ct, ConfigArgs *c);
|
||||
int config_add_vals(ConfigTable *ct, ConfigArgs *c);
|
||||
ConfigTable * config_find_keyword(ConfigTable *ct, ConfigArgs *c);
|
||||
|
|
|
|||
Loading…
Reference in a new issue