#include <ac/ctype.h>
#include <ac/errno.h>
#include <sys/stat.h>
+#include <ac/unistd.h>
#include "slap.h"
static ConfigDriver config_subordinate;
static ConfigDriver config_suffix;
#ifdef LDAP_TCP_BUFFER
-/* #define LDAP_TCP_BUFFER_X_ORDERED */
static ConfigDriver config_tcp_buffer;
#endif /* LDAP_TCP_BUFFER */
static ConfigDriver config_rootdn;
CFG_IX_INTLEN,
CFG_SYNTAX,
CFG_ACL_ADD,
+ CFG_SYNC_SUBENTRY,
CFG_LAST
};
&config_suffix, "( OLcfgDbAt:0.10 NAME 'olcSuffix' "
"EQUALITY distinguishedNameMatch "
"SYNTAX OMsDN )", NULL, NULL },
+ { "sync_use_subentry", NULL, 0, 0, 0, ARG_ON_OFF|ARG_DB|ARG_MAGIC|CFG_SYNC_SUBENTRY,
+ &config_generic, "( OLcfgDbAt:0.19 NAME 'olcSyncUseSubentry' "
+ "DESC 'Store sync context in a subentry' "
+ "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
{ "syncrepl", NULL, 0, 0, 0, ARG_DB|ARG_MAGIC,
&syncrepl_config, "( OLcfgDbAt:0.11 NAME 'olcSyncrepl' "
"EQUALITY caseIgnoreMatch "
#endif /* LDAP_TCP_BUFFER */
"( OLcfgGlAt:90 NAME 'olcTCPBuffer' "
"DESC 'Custom TCP buffer size' "
- "SYNTAX OMsDirectoryString "
-#ifdef LDAP_TCP_BUFFER_X_ORDERED
- "X-ORDERED 'VALUES' "
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
- ")", NULL, NULL },
+ "SYNTAX OMsDirectoryString )", NULL, NULL },
{ "threads", "count", 2, 2, 0,
#ifdef NO_THREADS
ARG_IGNORED, NULL,
"olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ "
"olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ "
"olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ "
- "olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncrepl $ "
+ "olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncUseSubentry $ olcSyncrepl $ "
"olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ "
"olcMonitoring ) )",
Cft_Database, NULL, cfAddDatabase },
case CFG_LASTMOD:
c->value_int = (SLAP_NOLASTMOD(c->be) == 0);
break;
+ case CFG_SYNC_SUBENTRY:
+ c->value_int = (SLAP_SYNC_SUBENTRY(c->be) != 0);
+ break;
case CFG_MIRRORMODE:
if ( SLAP_SHADOW(c->be))
c->value_int = (SLAP_SINGLE_SHADOW(c->be) == 0);
case CFG_SSTR_IF_MAX:
case CFG_SSTR_IF_MIN:
case CFG_ACL_ADD:
+ case CFG_SYNC_SUBENTRY:
break;
/* no-ops, requires slapd restart */
ServerID *si, **sip;
LDAPURLDesc *lud;
int num;
- if ( lutil_atoi( &num, c->argv[1] ) ||
+ if (( lutil_atoi( &num, c->argv[1] ) &&
+ lutil_atoix( &num, c->argv[1], 16 )) ||
num < 0 || num > SLAP_SYNC_SID_MAX )
{
snprintf( c->cr_msg, sizeof( c->cr_msg ),
BER_BVZERO( &si->si_url );
slap_serverID = num;
Debug( LDAP_DEBUG_CONFIG,
- "%s: SID=%d\n",
+ "%s: SID=0x%03x\n",
c->log, slap_serverID, 0 );
}
si->si_next = NULL;
if ( l ) {
slap_serverID = si->si_num;
Debug( LDAP_DEBUG_CONFIG,
- "%s: SID=%d (listener=%s)\n",
+ "%s: SID=0x%03x (listener=%s)\n",
c->log, slap_serverID,
l->sl_url.bv_val );
}
SLAP_DBFLAGS(c->be) &= ~SLAP_DBFLAG_HIDDEN;
break;
+ case CFG_SYNC_SUBENTRY:
+ if (c->value_int)
+ SLAP_DBFLAGS(c->be) |= SLAP_DBFLAG_SYNC_SUBENTRY;
+ else
+ SLAP_DBFLAGS(c->be) &= ~SLAP_DBFLAG_SYNC_SUBENTRY;
+ break;
+
case CFG_SSTR_IF_MAX:
if (c->value_uint < index_substr_if_minlen) {
snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> invalid value", c->argv[0] );
case CFG_REWRITE: {
struct berval bv;
char *line;
-
+ int rc = 0;
+
+ if ( c->op == LDAP_MOD_ADD ) {
+ c->argv++;
+ c->argc--;
+ }
if(slap_sasl_rewrite_config(c->fname, c->lineno, c->argc, c->argv))
- return(1);
+ rc = 1;
+ if ( rc == 0 ) {
- if ( c->argc > 1 ) {
- char *s;
+ if ( c->argc > 1 ) {
+ char *s;
- /* quote all args but the first */
- line = ldap_charray2str( c->argv, "\" \"" );
- ber_str2bv( line, 0, 0, &bv );
- s = ber_bvchr( &bv, '"' );
- assert( s != NULL );
- /* move the trailing quote of argv[0] to the end */
- AC_MEMCPY( s, s + 1, bv.bv_len - ( s - bv.bv_val ) );
- bv.bv_val[ bv.bv_len - 1 ] = '"';
+ /* quote all args but the first */
+ line = ldap_charray2str( c->argv, "\" \"" );
+ ber_str2bv( line, 0, 0, &bv );
+ s = ber_bvchr( &bv, '"' );
+ assert( s != NULL );
+ /* move the trailing quote of argv[0] to the end */
+ AC_MEMCPY( s, s + 1, bv.bv_len - ( s - bv.bv_val ) );
+ bv.bv_val[ bv.bv_len - 1 ] = '"';
- } else {
- ber_str2bv( c->argv[ 0 ], 0, 1, &bv );
+ } else {
+ ber_str2bv( c->argv[ 0 ], 0, 1, &bv );
+ }
+
+ ber_bvarray_add( &authz_rewrites, &bv );
}
-
- ber_bvarray_add( &authz_rewrites, &bv );
+ if ( c->op == LDAP_MOD_ADD ) {
+ c->argv--;
+ c->argc++;
+ }
+ return rc;
}
- break;
#endif
if ( val != NULL && argv == NULL ) {
char *s = val->bv_val;
-#ifdef LDAP_TCP_BUFFER_X_ORDERED
- if ( s[0] == '{' ) {
- s = strchr( s, '}' );
- if ( s == NULL ) {
- return 1;
- }
- s++;
- }
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
-
argv = ldap_str2charray( s, " \t" );
if ( argv == NULL ) {
return LDAP_OTHER;
}
static int
-tcp_buffer_unparse( int idx, int size, int rw, Listener *l, struct berval *val )
+tcp_buffer_unparse( int size, int rw, Listener *l, struct berval *val )
{
char buf[sizeof("2147483648")], *ptr;
-#ifdef LDAP_TCP_BUFFER_X_ORDERED
- char fmtbuf[sizeof("{2147483648}")];
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
/* unparse for later use */
val->bv_len = snprintf( buf, sizeof( buf ), "%d", size );
-#ifdef LDAP_TCP_BUFFER_X_ORDERED
- val->bv_len += snprintf( fmtbuf, sizeof( fmtbuf ), SLAP_X_ORDERED_FMT, idx );
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
if ( l != NULL ) {
val->bv_len += STRLENOF( "listener=" " " ) + l->sl_url.bv_len;
}
ptr = val->bv_val;
-#ifdef LDAP_TCP_BUFFER_X_ORDERED
- ptr = lutil_strcopy( ptr, fmtbuf );
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
-
if ( l != NULL ) {
ptr = lutil_strcopy( ptr, "listener=" );
ptr = lutil_strncopy( ptr, l->sl_url.bv_val, l->sl_url.bv_len );
}
static int
-tcp_buffer_add_one( int argc, char **argv, int idx )
+tcp_buffer_add_one( int argc, char **argv )
{
int rc = 0;
int size = -1, rw = 0;
}
/* unparse for later use */
- rc = tcp_buffer_unparse( idx, size, rw, l, &val );
+ rc = tcp_buffer_unparse( size, rw, l, &val );
if ( rc != LDAP_SUCCESS ) {
return rc;
}
}
tcp_buffer = SLAP_REALLOC( tcp_buffer, sizeof( struct berval ) * ( tcp_buffer_num + 2 ) );
-#ifndef LDAP_TCP_BUFFER_X_ORDERED
/* append */
- idx = tcp_buffer_num;
-#else /* LDAP_TCP_BUFFER_X_ORDERED */
- if ( idx < tcp_buffer_num ) {
- int i;
-
- for ( i = tcp_buffer_num; i > idx; i-- ) {
- tcp_buffer[ i ] = tcp_buffer[ i - 1 ];
- }
- }
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
- tcp_buffer[ idx ] = val;
+ tcp_buffer[ tcp_buffer_num ] = val;
tcp_buffer_num++;
BER_BVZERO( &tcp_buffer[ tcp_buffer_num ] );
value_add( &c->rvalue_nvals, tcp_buffer );
} else if ( c->op == LDAP_MOD_DELETE ) {
-#ifndef LDAP_TCP_BUFFER_X_ORDERED
if ( !c->line ) {
tcp_buffer_delete( tcp_buffer );
ber_bvarray_free( tcp_buffer );
}
/* unparse for later use */
- rc = tcp_buffer_unparse( tcp_buffer_num, size, rw, l, &val );
+ rc = tcp_buffer_unparse( size, rw, l, &val );
if ( rc != LDAP_SUCCESS ) {
return 1;
}
}
}
-#else /* LDAP_TCP_BUFFER_X_ORDERED */
- if ( c->valx == -1 ) {
- tcp_buffer_delete( tcp_buffer );
- ber_bvarray_free( tcp_buffer );
- tcp_buffer = NULL;
- tcp_buffer_num = 0;
-
- } else if ( c->valx >= tcp_buffer_num ) {
- snprintf( c->cr_msg, sizeof( c->cr_msg ),
- "<%s> invalid value #%d",
- c->argv[0], c->valx );
- Debug( LDAP_DEBUG_ANY, "%s: %s\n",
- c->log, c->cr_msg, 0 );
- return 1;
-
- } else {
- int i;
-
- tcp_buffer_delete_one( &tcp_buffer[ c->valx ] );
- ber_memfree( tcp_buffer[ c->valx ].bv_val );
- for ( i = c->valx; i < tcp_buffer_num; i++ ) {
- tcp_buffer[ i ] = tcp_buffer[ i + 1 ];
- }
- tcp_buffer_num--;
- }
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
} else {
int rc;
- int idx;
-
-#ifdef LDAP_TCP_BUFFER_X_ORDERED
- idx = c->valx;
- if ( c->valx == -1 ) {
- idx = tcp_buffer_num;
- }
-#endif /* LDAP_TCP_BUFFER_X_ORDERED */
- rc = tcp_buffer_add_one( c->argc - 1, &c->argv[ 1 ], idx );
+ rc = tcp_buffer_add_one( c->argc - 1, &c->argv[ 1 ] );
if ( rc ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to add value #%d",
- c->argv[0], idx );
+ c->argv[0], tcp_buffer_num );
Debug( LDAP_DEBUG_ANY, "%s: %s\n",
c->log, c->cr_msg, 0 );
return 1;
loglevel_init( void )
{
slap_verbmasks lo[] = {
- { BER_BVC("Any"), -1 },
+ { BER_BVC("Any"), (slap_mask_t) LDAP_DEBUG_ANY },
{ BER_BVC("Trace"), LDAP_DEBUG_TRACE },
{ BER_BVC("Packets"), LDAP_DEBUG_PACKETS },
{ BER_BVC("Args"), LDAP_DEBUG_ARGS },
fprintf( out, "Installed log subsystems:\n\n" );
for ( i = 0; !BER_BVISNULL( &loglevel_ops[ i ].word ); i++ ) {
- fprintf( out, "\t%-30s (%lu)\n",
- loglevel_ops[ i ].word.bv_val,
- loglevel_ops[ i ].mask );
+ unsigned mask = loglevel_ops[ i ].mask & 0xffffffffUL;
+ fprintf( out,
+ (mask == ((slap_mask_t) -1 & 0xffffffffUL)
+ ? "\t%-30s (-1, 0xffffffff)\n" : "\t%-30s (%u, 0x%x)\n"),
+ loglevel_ops[ i ].word.bv_val, mask, mask );
}
fprintf( out, "\nNOTE: custom log subsystems may be later installed "
ca->valx = -1;
ca->line = NULL;
+ ca->argc = 1;
if ( cfn->c_cr_head ) {
struct berval bv = BER_BVC("olcDitContentRules");
ad = NULL;
Debug( LDAP_DEBUG_TRACE, "%s: config_add_internal: "
"DN=\"%s\" already exists\n",
log_prefix, e->e_name.bv_val, 0 );
+ /* global schema ignores all writes */
+ if ( ce->ce_type == Cft_Schema && ce->ce_parent->ce_type == Cft_Global )
+ return LDAP_COMPARE_TRUE;
return LDAP_ALREADY_EXISTS;
}
}
ldap_pvt_thread_pool_resume( &connection_pool );
out:;
- send_ldap_result( op, rs );
+ { int repl = op->o_dont_replicate;
+ if ( rs->sr_err == LDAP_COMPARE_TRUE ) {
+ rs->sr_err = LDAP_SUCCESS;
+ op->o_dont_replicate = 1;
+ }
+ send_ldap_result( op, rs );
+ op->o_dont_replicate = repl;
+ }
slap_graduate_commit_csn( op );
return rs->sr_err;
}
}
ca->line = bv.bv_val;
ca->valx = d->idx[i];
+ config_parse_vals(ct, ca, d->idx[i] );
rc = config_del_vals( ct, ca );
if ( rc != LDAP_SUCCESS ) break;
if ( s )
} else {
ca->valx = -1;
ca->line = NULL;
+ ca->argc = 1;
rc = config_del_vals( ct, ca );
if ( rc ) rc = LDAP_OTHER;
if ( s )
a->a_flags &= ~(SLAP_ATTR_IXDEL|SLAP_ATTR_IXADD);
ca->valx = -1;
ca->line = NULL;
+ ca->argc = 1;
config_del_vals( ct, ca );
}
for ( i=0; !BER_BVISNULL( &s->a_vals[i] ); i++ ) {
ct = config_find_table( colst, nocs, a->a_desc, ca );
ca->valx = -1;
ca->line = NULL;
+ ca->argc = 1;
config_del_vals( ct, ca );
s = attr_find( save_attrs, a->a_desc );
if ( s ) {