]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/config.c
Merge branch 'master' of ssh://git-master.openldap.org/~git/git/openldap
[openldap] / servers / slapd / back-ldap / config.c
index ca7c01df92fa44ce68e3d39e1e533779db26e60e..fdba1d3cf62be951f32690f9151dc4394ddb112c 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2011 The OpenLDAP Foundation.
+ * Copyright 2003-2013 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
@@ -71,6 +71,7 @@ enum {
        LDAP_BACK_CFG_ST_REQUEST,
        LDAP_BACK_CFG_NOREFS,
        LDAP_BACK_CFG_NOUNDEFFILTER,
+       LDAP_BACK_CFG_ONERR,
 
        LDAP_BACK_CFG_REWRITE,
 
@@ -325,6 +326,14 @@ static ConfigTable ldapcfg[] = {
                        "SYNTAX OMsBoolean "
                        "SINGLE-VALUE )",
                NULL, NULL },
+       { "onerr", "CONTINUE|report|stop", 2, 2, 0,
+               ARG_MAGIC|LDAP_BACK_CFG_ONERR,
+               ldap_back_cf_gen, "( OLcfgDbAt:3.108 "
+                       "NAME 'olcDbOnErr' "
+                       "DESC 'error handling' "
+                       "SYNTAX OMsDirectoryString "
+                       "SINGLE-VALUE )",
+               NULL, NULL },
        { "idassert-passThru", "authzRule", 2, 2, 0,
                ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_PASSTHRU,
                ldap_back_cf_gen, "( OLcfgDbAt:3.27 "
@@ -383,6 +392,7 @@ static ConfigOCs ldapocs[] = {
 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
                        "$ olcDbNoRefs "
                        "$ olcDbNoUndefFilter "
+                       "$ olcDbOnErr "
                ") )",
                        Cft_Database, ldapcfg},
        { NULL, 0, NULL }
@@ -472,6 +482,13 @@ static slap_verbmasks cancel_mode[] = {
        { BER_BVNULL,                   0 }
 };
 
+static slap_verbmasks onerr_mode[] = {
+       { BER_BVC( "stop" ),            LDAP_BACK_F_ONERR_STOP },
+       { BER_BVC( "report" ),          LDAP_BACK_F_ONERR_STOP }, /* same behavior */
+       { BER_BVC( "continue" ),        LDAP_BACK_F_NONE },
+       { BER_BVNULL,                   0 }
+};
+
 /* see enum in slap.h */
 static slap_cf_aux_table timeout_table[] = {
        { BER_BVC("bind="),     SLAP_OP_BIND * sizeof( time_t ),        'u', 0, NULL },
@@ -640,7 +657,7 @@ slap_retry_info_destroy(
        ri->ri_num = NULL;
 }
 
-static int
+int
 slap_idassert_authzfrom_parse( ConfigArgs *c, slap_idassert_t *si )
 {
        struct berval   bv;
@@ -759,7 +776,7 @@ slap_idassert_passthru_parse( ConfigArgs *c, slap_idassert_t *si )
        return 0;
 }
 
-static int
+int
 slap_idassert_parse( ConfigArgs *c, slap_idassert_t *si )
 {
        int             i;
@@ -931,22 +948,6 @@ slap_idassert_parse( ConfigArgs *c, slap_idassert_t *si )
 }
 
 /* NOTE: temporary, until back-meta is ported to back-config */
-int
-slap_idassert_authzfrom_parse_cf( const char *fname, int lineno, const char *arg, slap_idassert_t *si )
-{
-       ConfigArgs      c = { 0 };
-       char            *argv[ 3 ];
-
-       snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );
-       c.argc = 2;
-       c.argv = argv;
-       argv[ 0 ] = "idassert-authzFrom";
-       argv[ 1 ] = (char *)arg;
-       argv[ 2 ] = NULL;
-
-       return slap_idassert_authzfrom_parse( &c, si );
-}
-
 int
 slap_idassert_passthru_parse_cf( const char *fname, int lineno, const char *arg, slap_idassert_t *si )
 {
@@ -963,18 +964,6 @@ slap_idassert_passthru_parse_cf( const char *fname, int lineno, const char *arg,
        return slap_idassert_passthru_parse( &c, si );
 }
 
-int
-slap_idassert_parse_cf( const char *fname, int lineno, int argc, char *argv[], slap_idassert_t *si )
-{
-       ConfigArgs      c = { 0 };
-
-       snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );
-       c.argc = argc;
-       c.argv = argv;
-
-       return slap_idassert_parse( &c, si );
-}
-
 static int
 ldap_back_cf_gen( ConfigArgs *c )
 {
@@ -1406,6 +1395,15 @@ ldap_back_cf_gen( ConfigArgs *c )
                        c->value_int = LDAP_BACK_NOUNDEFFILTER( li );
                        break;
 
+               case LDAP_BACK_CFG_ONERR:
+                       enum_to_verb( onerr_mode, li->li_flags & LDAP_BACK_F_ONERR_STOP, &bv );
+                       if ( BER_BVISNULL( &bv )) {
+                               rc = 1;
+                       } else {
+                               value_add_one( &c->rvalue_vals, &bv );
+                       }
+                       break;
+
                default:
                        /* FIXME: we need to handle all... */
                        assert( 0 );
@@ -1569,6 +1567,10 @@ ldap_back_cf_gen( ConfigArgs *c )
                        li->li_flags &= ~LDAP_BACK_F_NOUNDEFFILTER;
                        break;
 
+               case LDAP_BACK_CFG_ONERR:
+                       li->li_flags &= ~LDAP_BACK_F_ONERR_STOP;
+                       break;
+
                default:
                        /* FIXME: we need to handle all... */
                        assert( 0 );
@@ -2235,6 +2237,20 @@ done_url:;
                }
                break;
 
+       case LDAP_BACK_CFG_ONERR:
+       /* onerr? */
+               i = verb_to_mask( c->argv[1], onerr_mode );
+               if ( BER_BVISNULL( &onerr_mode[i].word ) ) {
+                       snprintf( c->cr_msg, sizeof( c->cr_msg ),
+                               "%s unknown argument \"%s\"",
+                               c->argv[0], c->argv[1] );
+                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 );
+                       return 1;
+               }
+               li->li_flags &= ~LDAP_BACK_F_ONERR_STOP;
+               li->li_flags |= onerr_mode[i].mask;
+               break;
+
        case LDAP_BACK_CFG_REWRITE:
                snprintf( c->cr_msg, sizeof( c->cr_msg ),
                        "rewrite/remap capabilities have been moved "