Convert back-sock to dynamic config

This commit is contained in:
Howard Chu 2007-12-24 05:18:25 +00:00
parent 94db6fc9e8
commit 6f6bc1ce04
5 changed files with 76 additions and 48 deletions

View File

@ -27,7 +27,7 @@ LDAP_BEGIN_DECL
struct sockinfo {
const char *si_sockpath;
int si_extensions;
slap_mask_t si_extensions;
};
#define SOCK_EXT_BINDDN 1

View File

@ -15,7 +15,7 @@
*/
/* ACKNOWLEDGEMENTS:
* This work was initially developed by Brian Candler for inclusion
* in OpenLDAP Software.
* in OpenLDAP Software. Dynamic config support by Howard Chu.
*/
#include "portable.h"
@ -26,57 +26,82 @@
#include <ac/socket.h>
#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
)
static ConfigDriver bs_cf_gen;
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 }
};
static int
bs_cf_gen( ConfigArgs *c )
{
struct sockinfo *si = (struct sockinfo *) be->be_private;
struct sockinfo *si = c->be->be_private;
int rc;
if ( si == NULL ) {
fprintf( stderr, "%s: line %d: sock backend info is null!\n",
fname, lineno );
return( 1 );
}
/* 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 );
if ( c->op == SLAP_CONFIG_EMIT ) {
switch( c->type ) {
case BS_EXT:
return mask_to_verbs( bs_exts, si->si_extensions, &c->rvalue_vals );
}
si->si_sockpath = ch_strdup( argv[1] );
/* extensions */
} else if ( strcasecmp( argv[0], "extensions" ) == 0 ) {
int i;
for ( i=1; i<argc; i++ ) {
if ( strcasecmp( argv[i], "binddn" ) == 0 )
si->si_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 );
} else if ( c->op == LDAP_MOD_DELETE ) {
switch( c->type ) {
case BS_EXT:
if ( c->valx < 0 ) {
si->si_extensions = 0;
} else {
}
return mask_to_verbs( bs_exts, si->si_extensions, &c->rvalue_vals );
}
/* 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 0;
return 1;
}
int
sock_back_init_cf( BackendInfo *bi )
{
bi->bi_cf_ocs = bsocs;
return config_register_schema( bscfg, bsocs );
}

View File

@ -38,7 +38,7 @@ sock_back_initialize(
bi->bi_destroy = 0;
bi->bi_db_init = sock_back_db_init;
bi->bi_db_config = sock_back_db_config;
bi->bi_db_config = 0;
bi->bi_db_open = 0;
bi->bi_db_close = 0;
bi->bi_db_destroy = sock_back_db_destroy;
@ -60,7 +60,7 @@ sock_back_initialize(
bi->bi_connection_init = 0;
bi->bi_connection_destroy = 0;
return 0;
return sock_back_init_cf( bi );
}
int
@ -74,6 +74,7 @@ sock_back_db_init(
si = (struct sockinfo *) ch_calloc( 1, sizeof(struct sockinfo) );
be->be_private = si;
be->be_cf_ocs = be->bd_info->bi_cf_ocs;
return si == NULL;
}

View File

@ -30,7 +30,6 @@ extern BI_destroy sock_back_destroy;
extern BI_db_init sock_back_db_init;
extern BI_db_destroy sock_back_db_destroy;
extern BI_db_config sock_back_db_config;
extern BI_op_bind sock_back_bind;
extern BI_op_unbind sock_back_unbind;
@ -41,6 +40,8 @@ extern BI_op_modrdn sock_back_modrdn;
extern BI_op_add sock_back_add;
extern BI_op_delete sock_back_delete;
extern int sock_back_init_cf( BackendInfo *bi );
LDAP_END_DECL
#endif /* _PROTO_SOCK_H */

View File

@ -230,6 +230,7 @@ static OidRec OidMacros[] = {
* OLcfg{Bk|Db}{Oc|At}:4 -> back-monitor
* OLcfg{Bk|Db}{Oc|At}:5 -> back-relay
* OLcfg{Bk|Db}{Oc|At}:6 -> back-sql
* OLcfg{Bk|Db}{Oc|At}:7 -> back-sock
*/
/*