373
377
{ "include", "file", 2, 2, 0, ARG_MAGIC,
374
378
&config_include, "( OLcfgGlAt:19 NAME 'olcInclude' "
375
379
"SUP labeledURI )", NULL, NULL },
376
{ "index_substr_if_minlen", "min", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MIN,
380
{ "index_substr_if_minlen", "min", 2, 2, 0, ARG_UINT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MIN,
377
381
&config_generic, "( OLcfgGlAt:20 NAME 'olcIndexSubstrIfMinLen' "
378
382
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
379
{ "index_substr_if_maxlen", "max", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MAX,
383
{ "index_substr_if_maxlen", "max", 2, 2, 0, ARG_UINT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MAX,
380
384
&config_generic, "( OLcfgGlAt:21 NAME 'olcIndexSubstrIfMaxLen' "
381
385
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
382
386
{ "index_substr_any_len", "len", 2, 2, 0, ARG_INT|ARG_NONZERO,
1825
1839
if (( slapMode & SLAP_SERVER_MODE ) && c->argc > 2 ) {
1826
Listener **l = slapd_get_listeners();
1829
/* Try a straight compare with Listener strings */
1830
for ( i=0; l && l[i]; i++ ) {
1831
if ( !strcasecmp( c->argv[2], l[i]->sl_url.bv_val )) {
1837
/* If hostname is empty, or is localhost, or matches
1838
* our hostname, this serverID refers to this host.
1839
* Compare it against listeners and ports.
1841
if ( !isMe && ( !lud->lud_host || !lud->lud_host[0] ||
1842
!strncasecmp("localhost", lud->lud_host,
1843
STRLENOF("localhost")) ||
1844
!strcasecmp( global_host, lud->lud_host ))) {
1846
for ( i=0; l && l[i]; i++ ) {
1848
ldap_url_parse( l[i]->sl_url.bv_val, &lu2 );
1850
if ( strcasecmp( lud->lud_scheme,
1853
if ( lud->lud_port != lu2->lud_port )
1855
/* Listener on ANY address */
1856
if ( !lu2->lud_host || !lu2->lud_host[0] ) {
1860
/* URL on ANY address */
1861
if ( !lud->lud_host || !lud->lud_host[0] ) {
1865
/* Listener has specific host, must
1868
if ( !strcasecmp( lud->lud_host,
1874
ldap_free_urldesc( lu2 );
1840
Listener *l = config_check_my_url( c->argv[2], lud );
1881
1842
slap_serverID = si->si_num;
1882
1843
Debug( LDAP_DEBUG_CONFIG,
1883
1844
"%s: SID=%d (listener=%s)\n",
1884
1845
c->log, slap_serverID,
1885
l[i]->sl_url.bv_val );
1888
1849
if ( c->argc > 2 )
2350
2311
case LDAP_MOD_ADD:
2351
2312
case SLAP_CONFIG_ADD:
2352
advertise = ( c->argc == 2 && !strcasecmp( c->argv[1], "advertise" ));
2313
if ( c->be->be_nsuffix == NULL ) {
2315
snprintf( c->cr_msg, sizeof( c->cr_msg),
2316
"subordinate configuration needs a suffix" );
2317
Debug( LDAP_DEBUG_ANY,
2319
c->log, c->cr_msg, 0 );
2324
if ( c->argc == 2 ) {
2325
if ( strcasecmp( c->argv[1], "advertise" ) == 0 ) {
2328
} else if ( strcasecmp( c->argv[1], "TRUE" ) != 0 ) {
2330
snprintf( c->cr_msg, sizeof( c->cr_msg),
2331
"subordinate must be \"TRUE\" or \"advertise\"" );
2332
Debug( LDAP_DEBUG_ANY,
2333
"%s: suffix \"%s\": %s.\n",
2334
c->log, c->be->be_suffix[0].bv_val, c->cr_msg );
2353
2340
rc = glue_sub_add( c->be, advertise, CONFIG_ONLINE_ADD( c ));
2348
* [listener=<listener>] [{read|write}=]<size>
2351
#ifdef LDAP_TCP_BUFFER
2352
static BerVarray tcp_buffer;
2355
#define SLAP_TCP_RMEM (0x1U)
2356
#define SLAP_TCP_WMEM (0x2U)
2359
tcp_buffer_parse( struct berval *val, int argc, char **argv,
2360
int *size, int *rw, Listener **l )
2362
int i, rc = LDAP_SUCCESS;
2363
LDAPURLDesc *lud = NULL;
2366
if ( val != NULL && argv == NULL ) {
2367
char *s = val->bv_val;
2369
argv = ldap_str2charray( s, " \t" );
2370
if ( argv == NULL ) {
2376
if ( strncasecmp( argv[ i ], "listener=", STRLENOF( "listener=" ) )
2379
char *url = argv[ i ] + STRLENOF( "listener=" );
2381
if ( ldap_url_parse( url, &lud ) ) {
2382
rc = LDAP_INVALID_SYNTAX;
2386
*l = config_check_my_url( url, lud );
2388
rc = LDAP_NO_SUCH_ATTRIBUTE;
2396
if ( strncasecmp( ptr, "read=", STRLENOF( "read=" ) ) == 0 ) {
2397
*rw |= SLAP_TCP_RMEM;
2398
ptr += STRLENOF( "read=" );
2400
} else if ( strncasecmp( ptr, "write=", STRLENOF( "write=" ) ) == 0 ) {
2401
*rw |= SLAP_TCP_WMEM;
2402
ptr += STRLENOF( "write=" );
2405
*rw |= ( SLAP_TCP_RMEM | SLAP_TCP_WMEM );
2408
/* accept any base */
2409
if ( lutil_atoix( size, ptr, 0 ) ) {
2410
rc = LDAP_INVALID_SYNTAX;
2415
if ( val != NULL && argv != NULL ) {
2416
ldap_charray_free( argv );
2419
if ( lud != NULL ) {
2420
ldap_free_urldesc( lud );
2427
tcp_buffer_delete_one( struct berval *val )
2430
int size = -1, rw = 0;
2433
rc = tcp_buffer_parse( val, 0, NULL, &size, &rw, &l );
2440
Listener **ll = slapd_get_listeners();
2442
for ( i = 0; ll[ i ] != NULL; i++ ) {
2443
if ( ll[ i ] == l ) break;
2446
if ( ll[ i ] == NULL ) {
2447
return LDAP_NO_SUCH_ATTRIBUTE;
2450
if ( rw & SLAP_TCP_RMEM ) l->sl_tcp_rmem = -1;
2451
if ( rw & SLAP_TCP_WMEM ) l->sl_tcp_wmem = -1;
2453
for ( i++ ; ll[ i ] != NULL && bvmatch( &l->sl_url, &ll[ i ]->sl_url ); i++ ) {
2454
if ( rw & SLAP_TCP_RMEM ) ll[ i ]->sl_tcp_rmem = -1;
2455
if ( rw & SLAP_TCP_WMEM ) ll[ i ]->sl_tcp_wmem = -1;
2459
/* NOTE: this affects listeners without a specific setting,
2460
* does not reset all listeners. If a listener without
2461
* specific settings was assigned a buffer because of
2462
* a global setting, it will not be reset. In any case,
2463
* buffer changes will only take place at restart. */
2464
if ( rw & SLAP_TCP_RMEM ) slapd_tcp_rmem = -1;
2465
if ( rw & SLAP_TCP_WMEM ) slapd_tcp_wmem = -1;
2472
tcp_buffer_delete( BerVarray vals )
2476
for ( i = 0; !BER_BVISNULL( &vals[ i ] ); i++ ) {
2477
tcp_buffer_delete_one( &vals[ i ] );
2484
tcp_buffer_unparse( int idx, int size, int rw, Listener *l, struct berval *val )
2486
char buf[sizeof("2147483648")], *ptr;
2488
/* unparse for later use */
2489
val->bv_len = snprintf( buf, sizeof( buf ), "%d", size );
2491
val->bv_len += STRLENOF( "listener=" " " ) + l->sl_url.bv_len;
2494
if ( rw != ( SLAP_TCP_RMEM | SLAP_TCP_WMEM ) ) {
2495
if ( rw & SLAP_TCP_RMEM ) {
2496
val->bv_len += STRLENOF( "read=" );
2497
} else if ( rw & SLAP_TCP_WMEM ) {
2498
val->bv_len += STRLENOF( "write=" );
2502
val->bv_val = SLAP_MALLOC( val->bv_len + 1 );
2507
ptr = lutil_strcopy( ptr, "listener=" );
2508
ptr = lutil_strncopy( ptr, l->sl_url.bv_val, l->sl_url.bv_len );
2512
if ( rw != ( SLAP_TCP_RMEM | SLAP_TCP_WMEM ) ) {
2513
if ( rw & SLAP_TCP_RMEM ) {
2514
ptr = lutil_strcopy( ptr, "read=" );
2515
} else if ( rw & SLAP_TCP_WMEM ) {
2516
ptr = lutil_strcopy( ptr, "write=" );
2520
ptr = lutil_strcopy( ptr, buf );
2523
assert( val->bv_val + val->bv_len == ptr );
2525
return LDAP_SUCCESS;
2529
tcp_buffer_add_one( int argc, char **argv, int idx )
2532
int size = -1, rw = 0;
2538
rc = tcp_buffer_parse( NULL, argc, argv, &size, &rw, &l );
2543
/* unparse for later use */
2544
rc = tcp_buffer_unparse( idx, size, rw, l, &val );
2545
if ( rc != LDAP_SUCCESS ) {
2549
/* use parsed values */
2552
Listener **ll = slapd_get_listeners();
2554
for ( i = 0; ll[ i ] != NULL; i++ ) {
2555
if ( ll[ i ] == l ) break;
2558
if ( ll[ i ] == NULL ) {
2559
return LDAP_NO_SUCH_ATTRIBUTE;
2562
/* buffer only applies to TCP listeners;
2563
* we do not do any check here, and delegate them
2564
* to setsockopt(2) */
2565
if ( rw & SLAP_TCP_RMEM ) l->sl_tcp_rmem = size;
2566
if ( rw & SLAP_TCP_WMEM ) l->sl_tcp_wmem = size;
2568
for ( i++ ; ll[ i ] != NULL && bvmatch( &l->sl_url, &ll[ i ]->sl_url ); i++ ) {
2569
if ( rw & SLAP_TCP_RMEM ) ll[ i ]->sl_tcp_rmem = size;
2570
if ( rw & SLAP_TCP_WMEM ) ll[ i ]->sl_tcp_wmem = size;
2574
/* NOTE: this affects listeners without a specific setting,
2575
* does not set all listeners */
2576
if ( rw & SLAP_TCP_RMEM ) slapd_tcp_rmem = size;
2577
if ( rw & SLAP_TCP_WMEM ) slapd_tcp_wmem = size;
2580
tcp_buffer = SLAP_REALLOC( tcp_buffer, sizeof( struct berval ) * ( tcp_buffer_num + 2 ) );
2582
idx = tcp_buffer_num;
2583
tcp_buffer[ idx ] = val;
2586
BER_BVZERO( &tcp_buffer[ tcp_buffer_num ] );
2592
config_tcp_buffer( ConfigArgs *c )
2594
if ( c->op == SLAP_CONFIG_EMIT ) {
2595
if ( tcp_buffer == NULL || BER_BVISNULL( &tcp_buffer[ 0 ] ) ) {
2598
value_add( &c->rvalue_vals, tcp_buffer );
2599
value_add( &c->rvalue_nvals, tcp_buffer );
2601
} else if ( c->op == LDAP_MOD_DELETE ) {
2603
tcp_buffer_delete( tcp_buffer );
2604
ber_bvarray_free( tcp_buffer );
2610
int size = -1, rw = 0;
2613
struct berval val = BER_BVNULL;
2617
if ( tcp_buffer_num == 0 ) {
2622
rc = tcp_buffer_parse( NULL, c->argc - 1, &c->argv[ 1 ], &size, &rw, &l );
2627
/* unparse for later use */
2628
rc = tcp_buffer_unparse( tcp_buffer_num, size, rw, l, &val );
2629
if ( rc != LDAP_SUCCESS ) {
2633
for ( i = 0; !BER_BVISNULL( &tcp_buffer[ i ] ); i++ ) {
2634
if ( bvmatch( &tcp_buffer[ i ], &val ) ) {
2639
if ( BER_BVISNULL( &tcp_buffer[ i ] ) ) {
2645
tcp_buffer_delete_one( &tcp_buffer[ i ] );
2646
ber_memfree( tcp_buffer[ i ].bv_val );
2647
for ( ; i < tcp_buffer_num; i++ ) {
2648
tcp_buffer[ i ] = tcp_buffer[ i + 1 ];
2653
if ( !BER_BVISNULL( &val ) ) {
2654
SLAP_FREE( val.bv_val );
2663
rc = tcp_buffer_add_one( c->argc - 1, &c->argv[ 1 ], idx );
2665
snprintf( c->cr_msg, sizeof( c->cr_msg ),
2666
"<%s> unable to add value #%d",
2668
Debug( LDAP_DEBUG_ANY, "%s: %s\n",
2669
c->log, c->cr_msg, 0 );
2676
#endif /* LDAP_TCP_BUFFER */
2360
2679
config_suffix(ConfigArgs *c)