--- servers/slapd/back-sock/config.c 2007/09/07 10:04:55 1.1 +++ servers/slapd/back-sock/config.c 2007/12/24 04:32:13 1.4 @@ -1,5 +1,5 @@ /* config.c - sock backend configuration file routine */ -/* $OpenLDAP$ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/back-sock/config.c,v 1.3 2007/12/24 04:18:26 hyc Exp $ */ /* This work is part of OpenLDAP Software . * * Copyright 2007 The OpenLDAP Foundation. @@ -13,6 +13,10 @@ * top-level directory of the distribution or, alternatively, at * . */ +/* ACKNOWLEDGEMENTS: + * This work was initially developed by Brian Candler for inclusion + * in OpenLDAP Software. Dynamic config support by Howard Chu. + */ #include "portable.h" @@ -22,57 +26,87 @@ #include #include "slap.h" +#include "config.h" #include "back-sock.h" -int -sock_back_db_config( - BackendDB *be, - const char *fname, - int lineno, - int argc, - char **argv -) -{ - struct sockinfo *si = (struct sockinfo *) be->be_private; +static ConfigDriver bs_cf_gen; - if ( si == NULL ) { - fprintf( stderr, "%s: line %d: sock backend info is null!\n", - fname, lineno ); - return( 1 ); - } +enum { + BS_EXT = 1 +}; + +static ConfigTable bscfg[] = { + { "socketpath", "pathname", 2, 2, 0, ARG_STRING|ARG_OFFSET, + (void *)offsetof(struct sockinfo, si_sockpath), + "( OLcfgDbAt:7.1 NAME 'olcDbSocketPath' " + "DESC 'Pathname for Unix domain socket' " + "EQUALITY caseExactMatch " + "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL }, + { "extensions", "ext", 2, 0, 0, ARG_MAGIC|BS_EXT, + bs_cf_gen, "( OLcfgDbAt:7.2 NAME 'olcDbSocketExtensions' " + "DESC 'binddn, peername, or ssf' " + "EQUALITY caseIgnoreMatch " + "SYNTAX OMsDirectoryString )", NULL, NULL }, + { NULL, NULL } +}; + +static ConfigOCs bsocs[] = { + { "( OLcfgDbOc:7.1 " + "NAME 'olcDbSocketConfig' " + "DESC 'Socket backend configuration' " + "SUP olcDatabaseConfig " + "MUST olcDbSocketPath " + "MAY olcDbSocketExtensions )", + Cft_Database, bscfg }, + { NULL, 0, NULL } +}; + +static slap_verbmasks bs_exts[] = { + { BER_BVC("binddn"), SOCK_EXT_BINDDN }, + { BER_BVC("peername"), SOCK_EXT_PEERNAME }, + { BER_BVC("ssf"), SOCK_EXT_SSF }, + { BER_BVNULL, 0 } +}; - /* socketpath */ - if ( strcasecmp( argv[0], "socketpath" ) == 0 ) { - if ( argc != 2 ) { - fprintf( stderr, - "%s: line %d: exactly one parameter needed for \"socketpath\"\n", - fname, lineno ); - return( 1 ); - } - si->si_sockpath = ch_strdup( argv[1] ); +static int +bs_cf_gen( ConfigArgs *c ) +{ + struct sockinfo *si = c->be->be_private; + int rc; - /* extensions */ - } else if ( strcasecmp( argv[0], "extensions" ) == 0 ) { - int i; - for ( i=1; isi_extensions |= SOCK_EXT_BINDDN; - else if ( strcasecmp( argv[i], "peername" ) == 0 ) - si->si_extensions |= SOCK_EXT_PEERNAME; - else if ( strcasecmp( argv[i], "ssf" ) == 0 ) - si->si_extensions |= SOCK_EXT_SSF; - else { - fprintf( stderr, - "%s: line %d: unknown extension \"%s\"\n", - fname, lineno, argv[i] ); - return( 1 ); + if ( c->op == SLAP_CONFIG_EMIT ) { + switch( c->type ) { + case BS_EXT: + return mask_to_verbs( bs_exts, si->si_extensions, &c->rvalue_vals ); + } + } else if ( c->op == LDAP_MOD_DELETE ) { + switch( c->type ) { + case BS_EXT: + if ( c->valx < 0 ) { + si->si_extensions = 0; + rc = 0; + } else { + slap_mask_t dels = 0; + rc = verbs_to_mask( c->argc, c->argv, bs_exts, &dels ); + if ( rc == 0 ) + si->si_extensions ^= dels; } + return rc; } - /* anything else */ } else { - return SLAP_CONF_UNKNOWN; + switch( c->type ) { + case BS_EXT: + return verbs_to_mask( c->argc, c->argv, bs_exts, &si->si_extensions ); + } } + return 1; +} + +int +sock_back_init_cf( BackendInfo *bi ) +{ + bi->bi_cf_ocs = bsocs; - return 0; + return config_register_schema( bscfg, bsocs ); }