static int config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca,
SlapReply *rs, int *renumber, Operation *op );
-static int config_check_schema( CfBackInfo *cfb );
+static int config_check_schema( Operation *op, CfBackInfo *cfb );
static ConfigDriver config_fname;
static ConfigDriver config_cfdir;
&global_idletimeout, "( OLcfgGlAt:18 NAME 'olcIdleTimeout' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
{ "include", "file", 2, 2, 0, ARG_MAGIC,
- &config_include, "( OLcfgGlAt:19 NAME 'olcInclude' "
- "SUP labeledURI )", NULL, NULL },
+ &config_include, NULL, NULL, NULL },
{ "index_substr_if_minlen", "min", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MIN,
&config_generic, "( OLcfgGlAt:20 NAME 'olcIndexSubstrIfMinLen' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
};
/* Routines to check if a child can be added to this type */
-static ConfigLDAPadd cfAddSchema, cfAddInclude, cfAddDatabase,
+static ConfigLDAPadd cfAddSchema, cfAddDatabase,
cfAddBackend, cfAddModule, cfAddOverlay;
/* NOTE: be careful when defining array members
#define CFOC_BACKEND cf_ocs[3]
#define CFOC_DATABASE cf_ocs[4]
#define CFOC_OVERLAY cf_ocs[5]
-#define CFOC_INCLUDE cf_ocs[6]
-#define CFOC_FRONTEND cf_ocs[7]
+#define CFOC_FRONTEND cf_ocs[6]
#ifdef SLAPD_MODULES
-#define CFOC_MODULE cf_ocs[8]
+#define CFOC_MODULE cf_ocs[7]
#endif /* SLAPD_MODULES */
static ConfigOCs cf_ocs[] = {
"DESC 'OpenLDAP Overlay-specific options' "
"SUP olcConfig STRUCTURAL "
"MUST olcOverlay )", Cft_Overlay, NULL, cfAddOverlay },
- { "( OLcfgGlOc:6 "
- "NAME 'olcIncludeFile' "
- "DESC 'OpenLDAP configuration include file' "
- "SUP olcConfig STRUCTURAL "
- "MUST olcInclude "
- "MAY ( cn $ olcRootDSE ) )",
- Cft_Include, NULL, cfAddInclude },
/* This should be STRUCTURAL like all the other database classes, but
* that would mean inheriting all of the olcDatabaseConfig attributes,
* which causes them to be merged twice in config_build_entry.
}
/* Check for any new hardcoded schema */
if ( c->op == LDAP_MOD_ADD && CONFIG_ONLINE_ADD( c )) {
- config_check_schema( &cfBackInfo );
+ config_check_schema( NULL, &cfBackInfo );
}
break;
} else if ( SLAP_MONITOR(c->be) ) {
notallowed = "monitor";
-
- } else if ( SLAP_CONFIG(c->be) ) {
- notallowed = "config";
}
if ( notallowed != NULL ) {
}
return 0;
}
- if(!SLAP_SHADOW(c->be)) {
+ if(!SLAP_SHADOW(c->be) && !c->be->be_syncinfo) {
snprintf( c->msg, sizeof( c->msg ), "<%s> must appear after syncrepl or updatedn",
c->argv[0] );
Debug(LDAP_DEBUG_ANY, "%s: %s\n",
ConfigFile *cf;
ConfigFile *cfsave = cfn;
ConfigFile *cf2 = NULL;
- if (c->op == SLAP_CONFIG_EMIT) {
- if (c->private) {
- ConfigFile *cf = c->private;
- value_add_one( &c->rvalue_vals, &cf->c_file );
- return 0;
- }
- return 1;
- } else if ( c->op == LDAP_MOD_DELETE ) {
- }
+
+ /* No dynamic config for include files */
cf = ch_calloc( 1, sizeof(ConfigFile));
if ( cfn->c_kids ) {
for (cf2=cfn->c_kids; cf2 && cf2->c_sibs; cf2=cf2->c_sibs) ;
if ( use_ldif ) {
CfBackInfo *cfb = (CfBackInfo *)op->o_bd->be_private;
BackendDB *be = op->o_bd;
- slap_callback sc = { NULL, slap_null_cb, NULL, NULL };
+ slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
struct berval dn, ndn, xdn, xndn;
op->o_bd = &cfb->cb_db;
op->o_req_dn = odn;
op->o_req_ndn = ondn;
- sc.sc_next = op->o_callback;
+ scp = op->o_callback;
op->o_callback = ≻
op->orr_newrdn = *newrdn;
op->orr_nnewrdn = *nnewrdn;
op->orr_deleteoldrdn = 1;
op->orr_modlist = NULL;
slap_modrdn2mods( op, rs );
+ slap_mods_opattrs( op, &op->orr_modlist, 1 );
rc = op->o_bd->be_modrdn( op, rs );
slap_mods_free( op->orr_modlist, 1 );
op->o_bd = be;
- op->o_callback = sc.sc_next;
+ op->o_callback = scp;
op->o_dn = dn;
op->o_ndn = ndn;
op->o_req_dn = xdn;
{
CfEntryInfo *ce;
int index = -1, gotindex = 0, nsibs, rc = 0;
- int renumber = 0, tailindex = 0;
+ int renumber = 0, tailindex = 0, isfrontend = 0;
char *ptr1, *ptr2 = NULL;
struct berval rdn;
if ( ce_type == Cft_Global ) return 0;
if ( ce_type == Cft_Schema && parent->ce_type == Cft_Global ) return 0;
- if ( ce_type == Cft_Include || ce_type == Cft_Module )
+ if ( ce_type == Cft_Module )
tailindex = 1;
/* See if the rdn has an index already */
dnRdn( &e->e_name, &rdn );
+ if ( ce_type == Cft_Database && !strncmp( rdn.bv_val + rdn.bv_len -
+ STRLENOF("frontend"), "frontend", STRLENOF("frontend") ))
+ isfrontend = 1;
ptr1 = ber_bvchr( &e->e_name, '{' );
if ( ptr1 && ptr1 - e->e_name.bv_val < rdn.bv_len ) {
char *next;
}
if ( index < 0 ) {
/* Special case, we allow -1 for the frontendDB */
- if ( index != -1 || ce_type != Cft_Database ||
- strncmp( ptr2+1, "frontend,", STRLENOF("frontend,") ))
-
+ if ( index != -1 || !isfrontend )
return LDAP_NAMING_VIOLATION;
}
}
if ( index < nsibs ) {
if ( tailindex ) return LDAP_NAMING_VIOLATION;
/* Siblings need to be renumbered */
- renumber = 1;
+ if ( index != -1 || !isfrontend )
+ renumber = 1;
}
}
+ if ( !isfrontend && index == -1 )
+ index = nsibs;
+
/* just make index = nsibs */
if ( !renumber ) {
rc = config_renumber_one( NULL, rs, parent, e, index, tailindex, 0 );
return colst;
}
-static int
-cfAddInclude( CfEntryInfo *p, Entry *e, ConfigArgs *ca )
-{
- if ( p->ce_type != Cft_Global && p->ce_type != Cft_Include )
- return LDAP_CONSTRAINT_VIOLATION;
-
- /* If we're reading from a configdir, don't parse this entry */
- if ( ca->lineno )
- return LDAP_COMPARE_TRUE;
-
- cfn = p->ce_private;
- ca->private = cfn;
- return LDAP_SUCCESS;
-}
-
static int
cfAddSchema( CfEntryInfo *p, Entry *e, ConfigArgs *ca )
{
char *ptr;
/* Make sure parent exists and entry does not. But allow
- * Databases and Overlays to be inserted.
+ * Databases and Overlays to be inserted. Don't do any
+ * auto-renumbering if manageDSAit control is present.
*/
ce = config_find_base( cfb->cb_root, &e->e_nname, &last );
- if ( ce && ce->ce_type != Cft_Database &&
- ce->ce_type != Cft_Overlay )
+ if ( ce ) {
+ if (( op && op->o_managedsait ) ||
+ ( ce->ce_type != Cft_Database && ce->ce_type != Cft_Overlay &&
+ ce->ce_type != Cft_Module ))
return LDAP_ALREADY_EXISTS;
+ }
dnParent( &e->e_nname, &pdn );
ca->fname = cfdir.bv_val;
ca->lineno = 1;
}
+ ca->ca_op = op;
colst = count_ocs( oc_at, &nocs );
/* Advance to first of this type */
cprev = &last->ce_kids;
- for ( c2 = *cprev; c2 && c2->ce_type != ce->ce_type; ) {
+ for ( c2 = *cprev; c2 && c2->ce_type < ce->ce_type; ) {
cprev = &c2->ce_sibs;
c2 = c2->ce_sibs;
}
cfb = (CfBackInfo *)op->o_bd->be_private;
+ /* add opattrs for syncprov */
+ {
+ char textbuf[SLAP_TEXT_BUFLEN];
+ size_t textlen = sizeof textbuf;
+ rs->sr_err = entry_schema_check(op, op->ora_e, NULL, 0, 1,
+ &rs->sr_text, textbuf, sizeof( textbuf ) );
+ if ( rs->sr_err != LDAP_SUCCESS )
+ goto out;
+ rs->sr_err = slap_add_opattrs( op, &rs->sr_text, textbuf, textlen, 1 );
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(config_back_add) ": entry failed op attrs add: "
+ "%s (%d)\n", rs->sr_text, rs->sr_err, 0 );
+ goto out;
+ }
+ }
+
ldap_pvt_thread_pool_pause( &connection_pool );
/* Strategy:
if ( cfb->cb_use_ldif ) {
BackendDB *be = op->o_bd;
- slap_callback sc = { NULL, slap_null_cb, NULL, NULL };
+ slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
struct berval dn, ndn;
op->o_bd = &cfb->cb_db;
op->o_dn = op->o_bd->be_rootdn;
op->o_ndn = op->o_bd->be_rootndn;
- sc.sc_next = op->o_callback;
+ scp = op->o_callback;
op->o_callback = ≻
op->o_bd->be_add( op, rs );
op->o_bd = be;
- op->o_callback = sc.sc_next;
+ op->o_callback = scp;
op->o_dn = dn;
op->o_ndn = ndn;
}
out:;
send_ldap_result( op, rs );
+ slap_graduate_commit_csn( op );
return rs->sr_err;
}
ca->private = ce->ce_private;
ca->ca_entry = e;
ca->fname = "slapd";
+ ca->ca_op = op;
strcpy( ca->log, "back-config" );
for (ml = op->orm_modlist; ml; ml=ml->sml_next) {
}
}
- ldap_pvt_thread_pool_pause( &connection_pool );
+ slap_mods_opattrs( op, &op->orm_modlist, 1 );
+
+ if ( !slapd_shutdown )
+ ldap_pvt_thread_pool_pause( &connection_pool );
/* Strategy:
* 1) perform the Modify on the cached Entry.
rs->sr_text = ca.msg;
} else if ( cfb->cb_use_ldif ) {
BackendDB *be = op->o_bd;
- slap_callback sc = { NULL, slap_null_cb, NULL, NULL };
+ slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
struct berval dn, ndn;
op->o_bd = &cfb->cb_db;
op->o_dn = op->o_bd->be_rootdn;
op->o_ndn = op->o_bd->be_rootndn;
- sc.sc_next = op->o_callback;
+ scp = op->o_callback;
op->o_callback = ≻
op->o_bd->be_modify( op, rs );
op->o_bd = be;
- op->o_callback = sc.sc_next;
+ op->o_callback = scp;
op->o_dn = dn;
op->o_ndn = ndn;
}
- ldap_pvt_thread_pool_resume( &connection_pool );
+ if ( !slapd_shutdown )
+ ldap_pvt_thread_pool_resume( &connection_pool );
out:
send_ldap_result( op, rs );
+ slap_graduate_commit_csn( op );
return rs->sr_err;
}
return rs->sr_err;
}
+static int
+config_back_delete( Operation *op, SlapReply *rs )
+{
+ send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, NULL );
+ return rs->sr_err;
+}
+
static int
config_back_search( Operation *op, SlapReply *rs )
{
Debug( LDAP_DEBUG_TRACE, "config_build_entry: \"%s\"\n", rdn->bv_val, 0, 0);
e->e_private = ce;
ce->ce_entry = e;
+ ce->ce_type = main->co_type;
ce->ce_parent = parent;
if ( parent ) {
pdn = parent->ce_entry->e_nname;
- if ( parent->ce_kids )
- for ( ceprev = parent->ce_kids; ceprev->ce_sibs;
+ if ( parent->ce_kids && parent->ce_kids->ce_type < ce->ce_type )
+ for ( ceprev = parent->ce_kids; ceprev->ce_sibs &&
+ ceprev->ce_type < ce->ce_type;
ceprev = ceprev->ce_sibs );
} else {
BER_BVZERO( &pdn );
}
- ce->ce_type = main->co_type;
ce->ce_private = c->private;
ce->ce_be = c->be;
ce->ce_bi = c->bi;
oc_at = attr_find( e->e_attrs, slap_schema.si_ad_objectClass );
rc = structural_class(oc_at->a_vals, &oc, NULL, &text, c->msg,
- sizeof(c->msg), op->o_tmpmemctx );
+ sizeof(c->msg), op ? op->o_tmpmemctx : NULL );
attr_merge_normalize_one(e, slap_schema.si_ad_structuralObjectClass, &oc->soc_cname, NULL );
- if ( !op->o_noop ) {
+ if ( op && !op->o_noop ) {
op->ora_e = e;
+ op->ora_modlist = NULL;
op->o_bd->be_add( op, rs );
if ( ( rs->sr_err != LDAP_SUCCESS )
&& (rs->sr_err != LDAP_ALREADY_EXISTS) ) {
}
}
if ( ceprev ) {
+ ce->ce_sibs = ceprev->ce_sibs;
ceprev->ce_sibs = ce;
} else if ( parent ) {
+ ce->ce_sibs = parent->ce_kids;
parent->ce_kids = ce;
}
return 0;
}
-static int
-config_build_includes( ConfigArgs *c, CfEntryInfo *ceparent,
- Operation *op, SlapReply *rs )
-{
- Entry *e;
- int i;
- ConfigFile *cf = c->private;
-
- for (i=0; cf; cf=cf->c_sibs, i++) {
- c->value_dn.bv_val = c->log;
- c->value_dn.bv_len = snprintf(c->value_dn.bv_val, sizeof( c->log ), "cn=include" SLAP_X_ORDERED_FMT, i);
- if ( c->value_dn.bv_len >= sizeof( c->log ) ) {
- /* FIXME: how can indicate error? */
- return -1;
- }
- c->private = cf;
- e = config_build_entry( op, rs, ceparent, c, &c->value_dn,
- &CFOC_INCLUDE, NULL );
- if ( ! e ) {
- return -1;
- } else if ( e && cf->c_kids ) {
- c->private = cf->c_kids;
- config_build_includes( c, e->e_private, op, rs );
- }
- }
- return 0;
-}
-
#ifdef SLAPD_MODULES
static int
#endif
static int
-config_check_schema(CfBackInfo *cfb)
+config_check_schema(Operation *op, CfBackInfo *cfb)
{
struct berval schema_dn = BER_BVC(SCHEMA_RDN "," CONFIG_RDN);
ConfigArgs c = {0};
- ConfigFile *cf = cfb->cb_config;
CfEntryInfo *ce, *last;
Entry *e;
} else {
SlapReply rs = {REP_RESULT};
c.private = NULL;
- e = config_build_entry( NULL, &rs, cfb->cb_root, &c, &schema_rdn,
+ e = config_build_entry( op, &rs, cfb->cb_root, &c, &schema_rdn,
&CFOC_SCHEMA, NULL );
if ( !e ) {
return -1;
parse_acl(be, "config_back_db_open", 0, 6, (char **)defacl, 0 );
}
- /* If we read the config from back-ldif, do some quick sanity checks */
- if ( cfb->cb_got_ldif ) {
- return config_check_schema( cfb );
- }
-
thrctx = ldap_pvt_thread_pool_context();
op = (Operation *) &opbuf;
connection_fake_init( &conn, op, thrctx );
op->o_noop = 1;
}
+ /* If we read the config from back-ldif, do some quick sanity checks */
+ if ( cfb->cb_got_ldif ) {
+ return config_check_schema( op, cfb );
+ }
+
/* create root of tree */
rdn = config_rdn;
c.private = cfb->cb_config;
parent = e;
ceparent = ce;
- /* Create includeFile nodes */
- if ( cfb->cb_config->c_kids ) {
- c.depth = 0;
- c.private = cfb->cb_config->c_kids;
- if ( config_build_includes( &c, ceparent, op, &rs ) ) {
- return -1;
- }
- }
-
#ifdef SLAPD_MODULES
/* Create Module nodes... */
if ( modpaths.mp_loads ) {
bi->bi_op_modify = config_back_modify;
bi->bi_op_modrdn = config_back_modrdn;
bi->bi_op_add = config_back_add;
- bi->bi_op_delete = 0;
+ bi->bi_op_delete = config_back_delete;
bi->bi_op_abandon = 0;
bi->bi_extended = 0;