enum lcf_daemon flag = 0;
int rc = LDAP_SUCCESS;
- lload_change.type = c->op;
- lload_change.object = LLOAD_DAEMON;
-
if ( c->op == SLAP_CONFIG_EMIT ) {
switch ( c->type ) {
case CFG_IOTHREADS:
return rc;
}
+ lload_change.type = LLOAD_CHANGE_MODIFY;
+ lload_change.object = LLOAD_DAEMON;
+
switch ( c->type ) {
case CFG_CONCUR:
ldap_pvt_thread_set_concurrency( c->value_uint );
{
int i;
- lload_change.type = c->op;
- lload_change.object = LLOAD_DAEMON;
-
if ( c->op == SLAP_CONFIG_EMIT ) {
struct berval bv;
return LDAP_SUCCESS;
}
+ lload_change.type = LLOAD_CHANGE_MODIFY;
+ lload_change.object = LLOAD_DAEMON;
+ lload_change.flags.daemon |= LLOAD_DAEMON_MOD_BINDCONF;
+
for ( i = 1; i < c->argc; i++ ) {
if ( lload_bindconf_parse( c->argv[i], &bindconf ) ) {
Debug( LDAP_DEBUG_ANY, "config_bindconf: "
slap_mask_t mask = 0;
int i;
- lload_change.type = c->op;
+ if ( c->op == SLAP_CONFIG_EMIT ) {
+ return mask_to_verbs( features, lload_features, &c->rvalue_vals );
+ }
+
+ lload_change.type = LLOAD_CHANGE_MODIFY;
lload_change.object = LLOAD_DAEMON;
lload_change.flags.daemon |= LLOAD_DAEMON_MOD_FEATURES;
if ( !lload_change.target ) {
lload_change.target = (void *)(uintptr_t)~lload_features;
}
- if ( c->op == SLAP_CONFIG_EMIT ) {
- return mask_to_verbs( features, lload_features, &c->rvalue_vals );
- } else if ( c->op == LDAP_MOD_DELETE ) {
+ if ( c->op == LDAP_MOD_DELETE ) {
if ( !c->line ) {
/* Last value has been deleted */
lload_features = 0;
static int
config_tls_option( ConfigArgs *c )
{
- int flag, rc;
+ int flag;
int berval = 0;
LDAP *ld = lload_tls_ld;
- lload_change.type = c->op;
- lload_change.object = LLOAD_DAEMON;
- lload_change.flags.daemon |= LLOAD_DAEMON_MOD_TLS;
-
switch ( c->type ) {
case CFG_TLS_RAND:
flag = LDAP_OPT_X_TLS_RANDOM_FILE;
if ( c->op == SLAP_CONFIG_EMIT ) {
return ldap_pvt_tls_get_option( ld, flag,
berval ? (void *)&c->value_bv : (void *)&c->value_string );
- } else if ( c->op == LDAP_MOD_DELETE ) {
- config_push_cleanup( c, config_tls_cleanup );
+ }
+
+ lload_change.type = LLOAD_CHANGE_MODIFY;
+ lload_change.object = LLOAD_DAEMON;
+ lload_change.flags.daemon |= LLOAD_DAEMON_MOD_TLS;
+
+ config_push_cleanup( c, config_tls_cleanup );
+ if ( c->op == LDAP_MOD_DELETE ) {
return ldap_pvt_tls_set_option( ld, flag, NULL );
}
if ( !berval ) ch_free( c->value_string );
- config_push_cleanup( c, config_tls_cleanup );
- rc = ldap_pvt_tls_set_option(
+ return ldap_pvt_tls_set_option(
ld, flag, berval ? (void *)&c->value_bv : (void *)c->argv[1] );
- if ( berval ) ch_free( c->value_bv.bv_val );
- return rc;
}
/* FIXME: this ought to be provided by libldap */
{
int i, flag;
- lload_change.type = c->op;
- lload_change.object = LLOAD_DAEMON;
- lload_change.flags.daemon |= LLOAD_DAEMON_MOD_TLS;
-
switch ( c->type ) {
case CFG_TLS_CRLCHECK:
flag = LDAP_OPT_X_TLS_CRLCHECK;
}
if ( c->op == SLAP_CONFIG_EMIT ) {
return lload_tls_get_config( lload_tls_ld, flag, &c->value_string );
- } else if ( c->op == LDAP_MOD_DELETE ) {
+ }
+
+ lload_change.type = LLOAD_CHANGE_MODIFY;
+ lload_change.object = LLOAD_DAEMON;
+ lload_change.flags.daemon |= LLOAD_DAEMON_MOD_TLS;
+
+ config_push_cleanup( c, config_tls_cleanup );
+ if ( c->op == LDAP_MOD_DELETE ) {
int i = 0;
- config_push_cleanup( c, config_tls_cleanup );
return ldap_pvt_tls_set_option( lload_tls_ld, flag, &i );
}
ch_free( c->value_string );
- config_push_cleanup( c, config_tls_cleanup );
if ( isdigit( (unsigned char)c->argv[1][0] ) &&
c->type != CFG_TLS_PROTOCOL_MIN ) {
if ( lutil_atoi( &i, c->argv[1] ) != 0 ) {
assert( b != NULL );
- lload_change.type = c->op;
- lload_change.object = LLOAD_BACKEND;
- lload_change.target = b;
-
if ( c->op == SLAP_CONFIG_EMIT ) {
switch ( c->type ) {
case CFG_URI:
rc = 1;
break;
}
+
+ /* do not set this if it has already been set by another callback, e.g.
+ * lload_backend_ldadd */
+ if ( lload_change.type == LLOAD_CHANGE_UNDEFINED ) {
+ lload_change.type = LLOAD_CHANGE_MODIFY;
+ }
+ lload_change.object = LLOAD_BACKEND;
+ lload_change.target = b;
lload_change.flags.backend |= flag;
config_push_cleanup( c, lload_backend_finish );
* save the new config when done with the entry */
ca->lineno = 0;
- lload_change.type = LDAP_REQ_ADD;
+ lload_change.type = LLOAD_CHANGE_ADD;
lload_change.object = LLOAD_BACKEND;
lload_change.target = b;
{
LloadBackend *b = ce->ce_private;
- lload_change.type = op->o_tag;
+ lload_change.type = LLOAD_CHANGE_DEL;
lload_change.object = LLOAD_BACKEND;
lload_change.target = b;
event_del( lload_daemon[tid].wakeup_event );
}
-LloadChange lload_change = { .type = LLOAD_UNDEFINED };
+LloadChange lload_change = { .type = LLOAD_CHANGE_UNDEFINED };
#ifdef BALANCER_MODULE
int
assert( change->object == LLOAD_BACKEND );
- if ( change->type == LDAP_REQ_ADD ) {
+ if ( change->type == LLOAD_CHANGE_ADD ) {
BackendInfo *mi = backend_info( "monitor" );
if ( mi ) {
}
backend_retry( b );
return;
- } else if ( change->type == LDAP_REQ_DELETE ) {
+ } else if ( change->type == LLOAD_CHANGE_DEL ) {
ldap_pvt_thread_pool_walk(
&connection_pool, handle_pdus, backend_conn_cb, b );
ldap_pvt_thread_pool_walk(
lload_backend_destroy( b );
return;
}
- assert( change->type == LDAP_REQ_MODIFY );
- assert( change->flags.generic != 0 );
+ assert( change->type == LLOAD_CHANGE_MODIFY );
/*
* A change that can't be handled gracefully, terminate all connections and
}
}
-void
-lload_handle_bindconf_invalidation( LloadChange *change )
-{
- LloadBackend *b;
- LloadConnection *c;
-
- assert( change->type == LDAP_REQ_MODIFY );
- assert( change->object == LLOAD_BINDCONF );
-
- change->flags.bindconf &= ~LLOAD_BINDCONF_MOD_TIMEOUTS;
-
- if ( !change->flags.bindconf ) {
- /* Nothing needs doing, things will generally fall into place */
- return;
- }
-
- /*
- * Only timeout changes can be handled gracefully, terminate all
- * connections and start over.
- */
- ldap_pvt_thread_pool_walk(
- &connection_pool, handle_pdus, backend_conn_cb, NULL );
- ldap_pvt_thread_pool_walk(
- &connection_pool, upstream_bind, backend_conn_cb, NULL );
-
- LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
- backend_reset( b );
- backend_retry( b );
- }
-
- /* Reconsider the PRIVILEGED flag on all clients */
- LDAP_CIRCLEQ_FOREACH ( c, &clients, c_next ) {
- int privileged = ber_bvstrcasecmp( &c->c_auth, &lloadd_identity );
-
- /* We have just terminated all pending operations (even pins), there
- * should be no connections still binding/closing */
- assert( c->c_state == LLOAD_C_READY );
-
- c->c_type = privileged ? LLOAD_C_PRIVILEGED : LLOAD_C_OPEN;
- }
-}
-
void
lload_handle_global_invalidation( LloadChange *change )
{
- assert( change->type == LDAP_REQ_MODIFY );
+ assert( change->type == LLOAD_CHANGE_MODIFY );
assert( change->object == LLOAD_DAEMON );
if ( change->flags.daemon & LLOAD_DAEMON_MOD_THREADS ) {
}
}
}
+
+ if ( change->flags.daemon & LLOAD_DAEMON_MOD_BINDCONF ) {
+ LloadBackend *b;
+ LloadConnection *c;
+
+ /*
+ * Only timeout changes can be handled gracefully, terminate all
+ * connections and start over.
+ */
+ ldap_pvt_thread_pool_walk(
+ &connection_pool, handle_pdus, backend_conn_cb, NULL );
+ ldap_pvt_thread_pool_walk(
+ &connection_pool, upstream_bind, backend_conn_cb, NULL );
+
+ LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
+ ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ backend_reset( b );
+ backend_retry( b );
+ ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ }
+
+ /* Reconsider the PRIVILEGED flag on all clients */
+ LDAP_CIRCLEQ_FOREACH ( c, &clients, c_next ) {
+ int privileged = ber_bvstrcasecmp( &c->c_auth, &lloadd_identity );
+
+ /* We have just terminated all pending operations (even pins), there
+ * should be no connections still binding/closing */
+ assert( c->c_state == LLOAD_C_READY );
+
+ c->c_type = privileged ? LLOAD_C_PRIVILEGED : LLOAD_C_OPEN;
+ }
+ }
}
int
lload_handle_invalidation( LloadChange *change )
{
- if ( change->type == LDAP_REQ_MODIFY && change->flags.generic == 0 ) {
+ if ( (change->type == LLOAD_CHANGE_MODIFY) &&
+ change->flags.generic == 0 ) {
Debug( LDAP_DEBUG_ANY, "lload_handle_invalidation: "
"a modify where apparently nothing changed\n" );
}
case LLOAD_DAEMON:
lload_handle_global_invalidation( change );
break;
- case LLOAD_BINDCONF:
- lload_handle_bindconf_invalidation( change );
- break;
default:
Debug( LDAP_DEBUG_ANY, "lload_handle_invalidation: "
"unrecognised change\n" );
void
lload_pause_server( void )
{
- LloadChange ch = { .type = LLOAD_UNDEFINED };
+ LloadChange ch = { .type = LLOAD_CHANGE_UNDEFINED };
int i;
lload_pause_base( listener_base );
void
lload_unpause_server( void )
{
- if ( lload_change.type != LLOAD_UNDEFINED ) {
+ if ( lload_change.type != LLOAD_CHANGE_UNDEFINED ) {
lload_handle_invalidation( &lload_change );
}
typedef struct LloadListener LloadListener;
+enum lc_type {
+ LLOAD_CHANGE_UNDEFINED = 0,
+ LLOAD_CHANGE_MODIFY,
+ LLOAD_CHANGE_ADD,
+ LLOAD_CHANGE_DEL,
+};
+
enum lc_object {
LLOAD_UNDEFINED = 0,
LLOAD_DAEMON,
+ /*
LLOAD_BINDCONF,
+ */
LLOAD_BACKEND,
};
LLOAD_DAEMON_MOD_TLS = 1 << 2,
LLOAD_DAEMON_MOD_LISTENER_ADD = 1 << 3,
LLOAD_DAEMON_MOD_LISTENER_REPLACE = 1 << 4,
-};
-
-enum lcf_bindconf {
- LLOAD_BINDCONF_MOD_TIMEOUTS = 1 << 0,
+ LLOAD_DAEMON_MOD_BINDCONF = 1 << 5,
};
enum lcf_backend {
};
struct LloadChange {
- ber_tag_t type;
+ enum lc_type type;
enum lc_object object;
union {
int generic;
enum lcf_daemon daemon;
- enum lcf_bindconf bindconf;
enum lcf_backend backend;
} flags;
void *target;