]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
Added overlay objects
[openldap] / servers / slapd / config.c
index e9967fb6e485472b6cf0b6de7559217c4b5bc69d..2f44de7ca0ebb0849d865fd0114585e3ba8972ff 100644 (file)
@@ -89,46 +89,47 @@ static char *strtok_quote(char *line, char *sep);
 static int load_ucdata(char *path);
 #endif
 
-/* state info for back-config */
-static ConfigFile cf_prv, *cfn = &cf_prv;
 
 int read_config_file(const char *fname, int depth, ConfigArgs *cf);
 
 static int add_syncrepl LDAP_P(( Backend *, char **, int ));
 static int parse_syncrepl_line LDAP_P(( char **, int, syncinfo_t *));
 
-int config_generic(ConfigArgs *c);
-int config_search_base(ConfigArgs *c);
-int config_passwd_hash(ConfigArgs *c);
-int config_schema_dn(ConfigArgs *c);
-int config_sizelimit(ConfigArgs *c);
-int config_timelimit(ConfigArgs *c);
-int config_limits(ConfigArgs *c); 
-int config_overlay(ConfigArgs *c);
-int config_suffix(ConfigArgs *c); 
-int config_deref_depth(ConfigArgs *c);
-int config_rootdn(ConfigArgs *c);
-int config_rootpw(ConfigArgs *c);
-int config_restrict(ConfigArgs *c);
-int config_allows(ConfigArgs *c);
-int config_disallows(ConfigArgs *c);
-int config_requires(ConfigArgs *c);
-int config_security(ConfigArgs *c);
-int config_referral(ConfigArgs *c);
-int config_loglevel(ConfigArgs *c);
-int config_syncrepl(ConfigArgs *c);
-int config_replica(ConfigArgs *c);
-int config_updatedn(ConfigArgs *c);
-int config_updateref(ConfigArgs *c);
-int config_include(ConfigArgs *c);
+/* All of these table entries and handlers really belong
+ * in back-config, only the parser/table engine belongs here.
+ */
+/* state info for back-config */
+static ConfigFile cf_prv, *cfn = &cf_prv;
+
+static int config_fname(ConfigArgs *c);
+static int config_generic(ConfigArgs *c);
+static int config_search_base(ConfigArgs *c);
+static int config_passwd_hash(ConfigArgs *c);
+static int config_schema_dn(ConfigArgs *c);
+static int config_sizelimit(ConfigArgs *c);
+static int config_timelimit(ConfigArgs *c);
+static int config_limits(ConfigArgs *c); 
+static int config_overlay(ConfigArgs *c);
+static int config_suffix(ConfigArgs *c); 
+static int config_deref_depth(ConfigArgs *c);
+static int config_rootdn(ConfigArgs *c);
+static int config_rootpw(ConfigArgs *c);
+static int config_restrict(ConfigArgs *c);
+static int config_allows(ConfigArgs *c);
+static int config_disallows(ConfigArgs *c);
+static int config_requires(ConfigArgs *c);
+static int config_security(ConfigArgs *c);
+static int config_referral(ConfigArgs *c);
+static int config_loglevel(ConfigArgs *c);
+static int config_syncrepl(ConfigArgs *c);
+static int config_replica(ConfigArgs *c);
+static int config_updatedn(ConfigArgs *c);
+static int config_updateref(ConfigArgs *c);
+static int config_include(ConfigArgs *c);
 #ifdef HAVE_TLS
-int config_tls_option(ConfigArgs *c);
-int config_tls_verify(ConfigArgs *c);
-#endif
-#ifdef LDAP_SLAPI
-int config_plugin(ConfigArgs *c);
+static int config_tls_option(ConfigArgs *c);
+static int config_tls_verify(ConfigArgs *c);
 #endif
-int config_pluginlog(ConfigArgs *c);
 
 enum {
        CFG_ACL = 1,
@@ -167,7 +168,9 @@ enum {
        CFG_LASTMOD,
        CFG_AZPOLICY,
        CFG_AZREGEXP,
-       CFG_SASLSECP
+       CFG_SASLSECP,
+       CFG_SSTR_IF_MAX,
+       CFG_SSTR_IF_MIN,
 };
 
 typedef struct {
@@ -189,7 +192,13 @@ static OidRec OidMacros[] = {
 
 /* alphabetical ordering */
 
-ConfigTable SystemConfiguration[] = {
+static ConfigTable SystemConfiguration[] = {
+       /* This attr is read-only */
+       { "", "", 0, 0, 0, ARG_MAGIC|ARG_STRING,
+               &config_fname, "( OLcfgAt:78 NAME 'olcConfigFile' "
+                       "DESC 'File for slapd configuration directives' "
+                       "EQUALITY caseIgnoreMatch "
+                       "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "access",     NULL, 0, 0, 0, ARG_MAY_DB|ARG_MAGIC|CFG_ACL,
                &config_generic, "( OLcfgAt:1 NAME 'olcAccess' "
                        "DESC 'Access Control List' "
@@ -212,12 +221,15 @@ ConfigTable SystemConfiguration[] = {
                &config_generic, "( OLcfgAt:5 NAME 'olcAttributeOptions' "
                        "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "auth-rewrite", NULL, 2, 2, 14,
 #ifdef SLAP_AUTH_REWRITE
-       { "auth-rewrite", NULL, 2, 2, 14, ARG_MAGIC|CFG_REWRITE,
-               &config_generic, "( OLcfgAt:6 NAME 'olcAuthRewrite' "
+               ARG_MAGIC|CFG_REWRITE, &config_generic,
+#else
+               ARG_IGNORED, NULL,
+#endif
+                "( OLcfgAt:6 NAME 'olcAuthRewrite' "
                        "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-#endif
        { "authz-policy", "policy", 2, 2, 0, ARG_MAGIC|CFG_AZPOLICY,
                &config_generic, "( OLcfgAt:7 NAME 'olcAuthzPolicy' "
                        "EQUALITY caseIgnoreMatch "
@@ -231,7 +243,7 @@ ConfigTable SystemConfiguration[] = {
                        "DESC 'A type of backend' "
                        "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "concurrency", "level", 2, 2, 0, ARG_LONG|ARG_NONZERO|ARG_MAGIC|CFG_CONCUR,
+       { "concurrency", "level", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_MAGIC|CFG_CONCUR,
                &config_generic, "( OLcfgAt:10 NAME 'olcConcurrency' "
                        "SYNTAX OMsInteger )", NULL, NULL },
        { "conn_max_pending", "max", 2, 2, 0, ARG_LONG,
@@ -254,14 +266,14 @@ ConfigTable SystemConfiguration[] = {
        /* use standard schema */
        { "ditcontentrule",     NULL, 0, 0, 0, ARG_MAGIC|CFG_DIT,
                &config_generic, NULL, NULL, NULL },
+       { "gentlehup", "on|off", 2, 2, 0,
 #ifdef SIGHUP
-       { "gentlehup", "on|off", 2, 2, 0, ARG_ON_OFF,
-               &global_gentlehup, "( OLcfgAt:17 NAME 'olcGentleHUP' "
-                       "SYNTAX OMsBoolean )", NULL, NULL },
+               ARG_ON_OFF, &global_gentlehup,
 #else
-       { "gentlehup", NULL, 2, 2, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:17 NAME 'olcGentleHUP' "
+                       "SYNTAX OMsBoolean )", NULL, NULL },
        { "idletimeout", "timeout", 2, 2, 0, ARG_INT,
                &global_idletimeout, "( OLcfgAt:18 NAME 'olcIdleTimeout' "
                        "SYNTAX OMsInteger )", NULL, NULL },
@@ -269,11 +281,11 @@ ConfigTable SystemConfiguration[] = {
        { "include", "file", 2, 2, 0, ARG_MAGIC,
                &config_include, "( OLcfgAt:19 NAME 'olcInclude' "
                        "SUP labeledURI )", NULL, NULL },
-       { "index_substr_if_minlen", "min", 2, 2, 0, ARG_INT|ARG_NONZERO,
-               &index_substr_if_minlen, "( OLcfgAt:20 NAME 'olcIndexSubstrIfMinLen' "
+       { "index_substr_if_minlen", "min", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MIN,
+               &config_generic, "( OLcfgAt:20 NAME 'olcIndexSubstrIfMinLen' "
                        "SYNTAX OMsInteger )", NULL, NULL },
-       { "index_substr_if_maxlen", "max", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_SPECIAL,
-               &index_substr_if_maxlen, "( OLcfgAt:21 NAME 'olcIndexSubstrIfMaxLen' "
+       { "index_substr_if_maxlen", "max", 2, 2, 0, ARG_INT|ARG_NONZERO|ARG_MAGIC|CFG_SSTR_IF_MAX,
+               &config_generic, "( OLcfgAt:21 NAME 'olcIndexSubstrIfMaxLen' "
                        "SYNTAX OMsInteger )", NULL, NULL },
        { "index_substr_any_len", "len", 2, 2, 0, ARG_INT|ARG_NONZERO,
                &index_substr_any_len, "( OLcfgAt:22 NAME 'olcIndexSubstrAnyLen' "
@@ -299,14 +311,22 @@ ConfigTable SystemConfiguration[] = {
        { "maxDerefDepth", "depth", 2, 2, 0, ARG_DB|ARG_INT|ARG_MAGIC|CFG_DEPTH,
                &config_generic, "( OLcfgAt:29 NAME 'olcMaxDerefDepth' "
                        "SYNTAX OMsInteger )", NULL, NULL },
+       { "moduleload", "file", 2, 0, 0,
 #ifdef SLAPD_MODULES
-       { "moduleload", "file", 2, 0, 0, ARG_MAGIC|CFG_MODLOAD,
-               &config_generic, "( OLcfgAt:30 NAME 'olcModuleLoad' "
-                       "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "modulepath", "path", 2, 2, 0, ARG_MAGIC|CFG_MODPATH,
-               &config_generic, "( OLcfgAt:31 NAME 'olcModulePath' "
+               ARG_MAGIC|CFG_MODLOAD, &config_generic,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:30 NAME 'olcModuleLoad' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "modulepath", "path", 2, 2, 0,
+#ifdef SLAPD_MODULES
+               ARG_MAGIC|CFG_MODPATH, &config_generic,
+#else
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:31 NAME 'olcModulePath' "
+                       "SYNTAX OMsDirectoryString )", NULL, NULL },
        /* use standard schema */
        { "objectclass", "objectclass", 2, 0, 0, ARG_PAREN|ARG_MAGIC|CFG_OC,
                &config_generic, NULL, NULL, NULL },
@@ -325,19 +345,22 @@ ConfigTable SystemConfiguration[] = {
        { "pidfile", "file", 2, 2, 0, ARG_STRING,
                &slapd_pid_file, "( OLcfgAt:37 NAME 'olcPidFile' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "plugin", NULL, 0, 0, 0,
 #ifdef LDAP_SLAPI
-       { "plugin", NULL, 0, 0, 0, ARG_MAGIC|CFG_PLUGIN,
-               &config_generic, "( OLcfgAt:38 NAME 'olcPlugin' "
-                       "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "pluginlog", "filename", 2, 2, 0, ARG_STRING,
-               &slapi_log_file, "( OLcfgAt:39 NAME 'olcPluginLogFile' "
+               ARG_MAGIC|CFG_PLUGIN, &config_generic,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:38 NAME 'olcPlugin' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "pluginlog", "filename", 2, 2, 0,
+#ifdef LDAP_SLAPI
+               ARG_STRING, &slapi_log_file,
 #else
-       { "plugin", NULL, 0, 0, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
-       { "pluginlog", NULL, 0, 0, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:39 NAME 'olcPluginLogFile' "
+                       "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "readonly", "on|off", 2, 2, 0, ARG_MAY_DB|ARG_ON_OFF|ARG_MAGIC|CFG_RO,
                &config_generic, "( OLcfgAt:40 NAME 'olcReadOnly' "
                        "SYNTAX OMsBoolean )", NULL, NULL },
@@ -362,50 +385,54 @@ ConfigTable SystemConfiguration[] = {
        { "require", "features", 2, 0, 7, ARG_MAY_DB|ARG_MAGIC,
                &config_requires, "( OLcfgAt:47 NAME 'olcRequires' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "restrict", "op_list", 2, 0, 0, ARG_MAGIC,
+       { "restrict", "op_list", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,
                &config_restrict, "( OLcfgAt:48 NAME 'olcRestrict' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "reverse-lookup", "on|off", 2, 2, 0,
 #ifdef SLAPD_RLOOKUPS
-       { "reverse-lookup", "on|off", 2, 2, 0, ARG_ON_OFF,
-               &use_reverse_lookup, "( OLcfgAt:49 NAME 'olcReverseLookup' "
-                       "SYNTAX OMsBoolean )", NULL, NULL },
+               ARG_ON_OFF, &use_reverse_lookup,
 #else
-       { "reverse-lookup", NULL, 2, 2, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:49 NAME 'olcReverseLookup' "
+                       "SYNTAX OMsBoolean )", NULL, NULL },
        { "rootdn", "dn", 2, 2, 0, ARG_DB|ARG_DN|ARG_MAGIC,
                &config_rootdn, "( OLcfgAt:50 NAME 'olcRootDN' "
                        "SYNTAX OMsDN )", NULL, NULL },
        { "rootDSE", "file", 2, 2, 0, ARG_MAGIC|CFG_ROOTDSE,
                &config_generic, "( OLcfgAt:51 NAME 'olcRootDSE' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "rootpw", "password", 2, 2, 0, ARG_DB|ARG_MAGIC,
+       { "rootpw", "password", 2, 2, 0, ARG_STRING|ARG_DB|ARG_MAGIC,
                &config_rootpw, "( OLcfgAt:52 NAME 'olcRootPW' "
                        "SYNTAX OMsOctetString )", NULL, NULL },
        { "sasl-authz-policy", NULL, 2, 2, 0, ARG_MAGIC|CFG_AZPOLICY,
                &config_generic, NULL, NULL, NULL },
+       { "sasl-host", "host", 2, 2, 0,
 #ifdef HAVE_CYRUS_SASL
-       { "sasl-host", "host", 2, 2, 0, ARG_STRING|ARG_UNIQUE,
-               &global_host, "( OLcfgAt:53 NAME 'olcSaslHost' "
+               ARG_STRING|ARG_UNIQUE, &global_host,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:53 NAME 'olcSaslHost' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "sasl-realm", "realm", 2, 2, 0, ARG_STRING|ARG_UNIQUE,
-               &global_realm, "( OLcfgAt:54 NAME 'olcSaslRealm' "
+       { "sasl-realm", "realm", 2, 2, 0,
+#ifdef HAVE_CYRUS_SASL
+               ARG_STRING|ARG_UNIQUE, &global_realm,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:54 NAME 'olcSaslRealm' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "sasl-regexp", NULL, 2, 2, 0, ARG_MAGIC|CFG_AZREGEXP,
                &config_generic, NULL, NULL, NULL },
-       { "sasl-secprops", "properties", 2, 2, 0, ARG_MAGIC|CFG_SASLSECP,
-               &config_generic, "( OLcfgAt:56 NAME 'olcSaslSecProps' "
-                       "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "sasl-secprops", "properties", 2, 2, 0,
+#ifdef HAVE_CYRUS_SASL
+               ARG_MAGIC|CFG_SASLSECP, &config_generic,
 #else
-       { "sasl-host", NULL, 2, 2, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
-       { "sasl-realm", NULL, 2, 2, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
-       { "sasl-regexp", NULL, 2, 2, 0, ARG_MAGIC|CFG_AZREGEXP,
-               &config_generic, NULL, NULL, NULL },
-       { "sasl-secprops", NULL, 2, 2, 0, ARG_IGNORED,
-               NULL, NULL, NULL, NULL },
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:56 NAME 'olcSaslSecProps' "
+                       "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "saslRegexp", NULL, 2, 2, 0, ARG_MAGIC|CFG_AZREGEXP,
                &config_generic, NULL, NULL, NULL },
        { "schemacheck", "on|off", 2, 2, 0, ARG_ON_OFF|ARG_MAGIC|CFG_CHECK,
@@ -426,11 +453,14 @@ ConfigTable SystemConfiguration[] = {
        { "sockbuf_max_incoming_auth", "max", 2, 2, 0, ARG_LONG,
                &sockbuf_max_incoming_auth, "( OLcfgAt:62 NAME 'olcSockbufMaxIncomingAuth' "
                        "SYNTAX OMsInteger )", NULL, NULL },
+       { "srvtab", "file", 2, 2, 0,
 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
-       { "srvtab", "file", 2, 2, 0, ARG_STRING,
-               &ldap_srvtab, "( OLcfgAt:63 NAME 'olcSrvtab' "
-                       "SYNTAX OMsDirectoryString )", NULL, NULL },
+               ARG_STRING, &ldap_srvtab,
+#else
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:63 NAME 'olcSrvtab' "
+                       "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "suffix",     "suffix", 2, 2, 0, ARG_DB|ARG_DN|ARG_MAGIC,
                &config_suffix, "( OLcfgAt:64 NAME 'olcSuffix' "
                        "SYNTAX OMsDN )", NULL, NULL },
@@ -443,32 +473,70 @@ ConfigTable SystemConfiguration[] = {
        { "timelimit", "limit", 2, 2, 0, ARG_MAY_DB|ARG_MAGIC|CFG_TIME,
                &config_timelimit, "( OLcfgAt:67 NAME 'olcTimeLimit' "
                        "SYNTAX OMsInteger )", NULL, NULL },
+       { "TLSCACertificateFile", NULL, 0, 0, 0,
 #ifdef HAVE_TLS
-       { "TLSCACertificateFile", NULL, 0, 0, 0, CFG_TLS_CA_FILE|ARG_MAGIC,
-               &config_tls_option, "( OLcfgAt:68 NAME 'olcTLSCACertificateFile' "
-                       "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSCACertificatePath", NULL, 0, 0, 0, CFG_TLS_CA_PATH|ARG_MAGIC,
-               &config_tls_option, "( OLcfgAt:69 NAME 'olcTLSCACertificatePath' "
+               CFG_TLS_CA_FILE|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:68 NAME 'olcTLSCACertificateFile' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSCertificateFile", NULL, 0, 0, 0, CFG_TLS_CERT_FILE|ARG_MAGIC,
-               &config_tls_option, "( OLcfgAt:70 NAME 'olcTLSCertificateFile' "
+       { "TLSCACertificatePath", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_CA_PATH|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:69 NAME 'olcTLSCACertificatePath' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSCertificateKeyFile", NULL, 0, 0, 0, CFG_TLS_CERT_KEY|ARG_MAGIC,
-               &config_tls_option, "( OLcfgAt:71 NAME 'olcTLSCertificateKeyFile' "
+       { "TLSCertificateFile", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_CERT_FILE|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:70 NAME 'olcTLSCertificateFile' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSCipherSuite",     NULL, 0, 0, 0, CFG_TLS_CIPHER|ARG_MAGIC,
-               &config_tls_option, "( OLcfgAt:72 NAME 'olcTLSCipherSuite' "
+       { "TLSCertificateKeyFile", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_CERT_KEY|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:71 NAME 'olcTLSCertificateKeyFile' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSCRLCheck", NULL, 0, 0, 0, CFG_TLS_CRLCHECK|ARG_MAGIC,
-               &config_tls_option,     "( OLcfgAt:73 NAME 'olcTLSCRLCheck' "
+       { "TLSCipherSuite",     NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_CIPHER|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:72 NAME 'olcTLSCipherSuite' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSRandFile", NULL, 0, 0, 0, CFG_TLS_RAND|ARG_MAGIC,
-               &config_tls_option, "( OLcfgAt:74 NAME 'olcTLSRandFile' "
+       { "TLSCRLCheck", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_CRLCHECK|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:73 NAME 'olcTLSCRLCheck' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "TLSVerifyClient", NULL, 0, 0, 0, CFG_TLS_VERIFY|ARG_MAGIC,
-               &config_tls_verify, "( OLcfgAt:75 NAME 'olcTLSVerifyClient' "
+       { "TLSRandFile", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_RAND|ARG_MAGIC, &config_tls_option,
+#else
+               ARG_IGNORED, NULL,
+#endif
+               "( OLcfgAt:74 NAME 'olcTLSRandFile' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
+       { "TLSVerifyClient", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+               CFG_TLS_VERIFY|ARG_MAGIC, &config_tls_verify,
+#else
+               ARG_IGNORED, NULL,
 #endif
+               "( OLcfgAt:75 NAME 'olcTLSVerifyClient' "
+                       "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "ucdata-path", "path", 2, 2, 0, ARG_IGNORED,
                NULL, NULL, NULL, NULL },
        { "updatedn", "dn", 2, 2, 0, ARG_DB|ARG_MAGIC,
@@ -526,8 +594,9 @@ int parse_config_table(ConfigTable *Conf, ConfigArgs *c) {
                return(ARG_BAD_CONF);
        }
        if((arg_type & ARG_PRE_BI) && c->bi) {
-               Debug(LDAP_DEBUG_CONFIG, "%s: keyword <%s> must appear before any backend declaration\n",
-                       c->log, Conf[i].name, 0);
+               Debug(LDAP_DEBUG_CONFIG, "%s: keyword <%s> must appear before any backend %sdeclaration\n",
+                       c->log, Conf[i].name, ((arg_type & ARG_PRE_DB)
+                       ? "or database " : "") );
                return(ARG_BAD_CONF);
        }
        if((arg_type & ARG_PRE_DB) && c->be && c->be != frontendDB) {
@@ -546,10 +615,7 @@ int parse_config_table(ConfigTable *Conf, ConfigArgs *c) {
                return(ARG_BAD_CONF);
        }
        c->type = arg_user = (arg_type & ARGS_USERLAND);
-       c->value_int = c->value_long = c->value_ber_t = 0;
-       c->value_string = NULL;
-       BER_BVZERO( &c->value_dn );
-       BER_BVZERO( &c->value_ndn );
+       memset(&c->values, 0, sizeof(c->values));
        if(arg_type & ARGS_NUMERIC) {
                int j;
                iarg = 0; larg = 0; barg = 0;
@@ -558,9 +624,11 @@ int parse_config_table(ConfigTable *Conf, ConfigArgs *c) {
                        case ARG_LONG:          larg = atol(c->argv[1]);                break;
                        case ARG_BER_LEN_T:     barg = (ber_len_t)atol(c->argv[1]);     break;
                        case ARG_ON_OFF:
-                               if(!strcasecmp(c->argv[1], "on")) {
+                               if(!strcasecmp(c->argv[1], "on") ||
+                                       !strcasecmp(c->argv[1], "true")) {
                                        iarg = 1;
-                               } else if(!strcasecmp(c->argv[1], "off")) {
+                               } else if(!strcasecmp(c->argv[1], "off") ||
+                                       !strcasecmp(c->argv[1], "false")) {
                                        iarg = 0;
                                } else {
                                        Debug(LDAP_DEBUG_CONFIG, "%s: ignoring ", c->log, 0, 0);
@@ -571,19 +639,21 @@ int parse_config_table(ConfigTable *Conf, ConfigArgs *c) {
                                break;
                }
                j = (arg_type & ARG_NONZERO) ? 1 : 0;
-               rc = (Conf == SystemConfiguration) ? ((arg_type & ARG_SPECIAL) && (larg < index_substr_if_maxlen)) : 0;
-               if(iarg < j || larg < j || barg < j || rc) {
+               if(iarg < j || larg < j || barg < j ) {
                        larg = larg ? larg : (barg ? barg : iarg);
                        Debug(LDAP_DEBUG_CONFIG, "%s: " , c->log, 0, 0);
                        Debug(LDAP_DEBUG_CONFIG, "invalid %s value (%ld) in <%s> line\n", Conf[i].what, larg, Conf[i].name);
                        return(ARG_BAD_CONF);
                }
-               c->value_int = iarg;
-               c->value_long = larg;
-               c->value_ber_t = barg;
-       }
-       if(arg_type & ARG_STRING) c->value_string = ch_strdup(c->argv[1]);
-       if(arg_type & ARG_DN) {
+               switch(arg_type & ARGS_NUMERIC) {
+                       case ARG_ON_OFF:
+                       case ARG_INT:           c->value_int = iarg;            break;
+                       case ARG_LONG:          c->value_long = larg;           break;
+                       case ARG_BER_LEN_T:     c->value_ber_t = barg;          break;
+               }
+       } else if(arg_type & ARG_STRING) {
+                c->value_string = ch_strdup(c->argv[1]);
+       } else if(arg_type & ARG_DN) {
                struct berval bv;
                ber_str2bv( c->argv[1], 0, 0, &bv );
                rc = dnPrettyNormal( NULL, &bv, &c->value_dn, &c->value_ndn, NULL );
@@ -627,6 +697,55 @@ int parse_config_table(ConfigTable *Conf, ConfigArgs *c) {
        return(arg_user);
 }
 
+int
+config_get_vals(ConfigTable *cf, ConfigArgs *c)
+{
+       int rc = 0;
+       struct berval bv;
+
+       if ( cf->arg_type & ARG_IGNORED ) {
+               return 1;
+       }
+
+       memset(&c->values, 0, sizeof(c->values));
+       c->rvalue_vals = NULL;
+       c->rvalue_nvals = NULL;
+       c->emit = 1;
+       c->type = cf->arg_type & ARGS_USERLAND;
+
+       if ( cf->arg_type & ARG_MAGIC ) {
+               rc = (*((ConfigDriver*)cf->arg_item))(c);
+               if ( rc ) return rc;
+       } else {
+               switch(cf->arg_type & ARGS_POINTER) {
+               case ARG_ON_OFF:
+               case ARG_INT:   c->value_int = *(int *)cf->arg_item; break;
+               case ARG_LONG:  c->value_long = *(long *)cf->arg_item; break;
+               case ARG_BER_LEN_T:     c->value_ber_t = *(ber_len_t *)cf->arg_item; break;
+               case ARG_STRING:        c->value_string = *(char **)cf->arg_item; break;
+               }
+       }
+       if ( cf->arg_type & ARGS_POINTER) {
+               bv.bv_val = c->log;
+               switch(cf->arg_type & ARGS_POINTER) {
+               case ARG_INT: bv.bv_len = sprintf(bv.bv_val, "%d", c->value_int); break;
+               case ARG_LONG: bv.bv_len = sprintf(bv.bv_val, "%l", c->value_long); break;
+               case ARG_BER_LEN_T: bv.bv_len =sprintf(bv.bv_val, "%l",c->value_ber_t); break;
+               case ARG_ON_OFF: bv.bv_len = sprintf(bv.bv_val, "%s",
+                       c->value_int ? "TRUE" : "FALSE"); break;
+               case ARG_STRING:
+                       if ( c->value_string && c->value_string[0]) {
+                               ber_str2bv( c->value_string, 0, 0, &bv);
+                       } else {
+                               rc = 1;
+                       }
+                       break;
+               }
+               ber_bvarray_add(&c->rvalue_vals, &bv);
+       }
+       return rc;
+}
+
 int
 init_config_attrs(ConfigTable *ct) {
        LDAPAttributeType *at;
@@ -654,6 +773,7 @@ init_config_attrs(ConfigTable *ct) {
                                ct[i].attribute, err );
                        return code;
                }
+               ldap_memfree( at );
        }
 }
 
@@ -670,8 +790,6 @@ read_config(const char *fname, int depth) {
        }
        i = init_config_attrs(SystemConfiguration);
        if ( i ) return i;
-       
-
        config_back_init( &cf_prv, SystemConfiguration );
        return read_config_file(fname, depth, NULL);
 }
@@ -828,11 +946,57 @@ badline:
        return(1);
 }
 
-int
+static int
 config_generic(ConfigArgs *c) {
-       char *p = strchr(c->line,'(' /*')'*/);
+       char *p;
        int i;
 
+       if ( c->emit ) {
+               int rc = 0;
+               switch(c->type) {
+               case CFG_CONCUR:
+                       c->value_int = ldap_pvt_thread_get_concurrency();
+                       break;
+               case CFG_THREADS:
+                       c->value_int = connection_pool_max; break;
+                       break;
+               case CFG_RO:
+                       c->value_int = (c->be->be_restrictops & SLAP_RESTRICT_OP_WRITES) != 0;
+                       break;
+               case CFG_DEPTH:
+                       c->value_int = c->be->be_max_deref_depth;
+                       break;
+               case CFG_CHECK:
+                       c->value_int = global_schemacheck;
+                       break;
+               case CFG_REPLOG:
+                       c->value_string = c->be->be_replogfile;
+                       break;
+               case CFG_ROOTDSE: {
+                       ConfigFile *cf = (ConfigFile *)c->line;
+                       if ( cf->c_dseFiles ) {
+                               c->rvalue_vals = cf->c_dseFiles;
+                       } else {
+                               rc = 1;
+                       }
+                       }
+                       break;
+               case CFG_LASTMOD:
+                       c->value_int = (SLAP_NOLASTMOD(c->be) == 0);
+                       break;
+               case CFG_SSTR_IF_MAX:
+                       c->value_int = index_substr_if_maxlen;
+                       break;
+               case CFG_SSTR_IF_MIN:
+                       c->value_int = index_substr_if_minlen;
+                       break;
+               default:
+                       rc = 1;
+               }
+               return rc;
+       }
+
+       p = strchr(c->line,'(' /*')'*/);
        switch(c->type) {
                case CFG_BACKEND:
                        if(!(c->bi = backend_info(c->argv[1]))) {
@@ -844,6 +1008,9 @@ config_generic(ConfigArgs *c) {
 
                case CFG_DATABASE:
                        c->bi = NULL;
+                       /* FIXME - config should probably be the
+                        * last backend, not the first.
+                        */
                        if ( !strcasecmp( c->argv[1], "config" )) {
                                c->be = backendDB;
                        } else if(!(c->be = backend_db_init(c->argv[1]))) {
@@ -854,7 +1021,7 @@ config_generic(ConfigArgs *c) {
                        break;
 
                case CFG_CONCUR:
-                       ldap_pvt_thread_set_concurrency(c->value_long);
+                       ldap_pvt_thread_set_concurrency(c->value_int);
                        break;
 
                case CFG_THREADS:
@@ -988,6 +1155,26 @@ config_generic(ConfigArgs *c) {
                                SLAP_DBFLAGS(c->be) |= SLAP_DBFLAG_NOLASTMOD;
                        break;
 
+               case CFG_SSTR_IF_MAX:
+                       if (c->value_int < index_substr_if_minlen) {
+                               Debug(LDAP_DEBUG_ANY, "%s: "
+                                       "invalid max value (%d)\n",
+                                       c->log, c->value_int, 0 );
+                               return(1);
+                       }
+                       index_substr_if_maxlen = c->value_int;
+                       break;
+
+               case CFG_SSTR_IF_MIN:
+                       if (c->value_int > index_substr_if_maxlen) {
+                               Debug(LDAP_DEBUG_ANY, "%s: "
+                                       "invalid min value (%d)\n",
+                                       c->log, c->value_int, 0 );
+                               return(1);
+                       }
+                       index_substr_if_minlen = c->value_int;
+                       break;
+
 #ifdef SLAPD_MODULES
                case CFG_MODLOAD:
                        if(module_load(c->argv[1], c->argc - 2, (c->argc > 2) ? c->argv + 2 : NULL))
@@ -1045,10 +1232,30 @@ config_generic(ConfigArgs *c) {
 }
 
 
-int
+static int
+config_fname(ConfigArgs *c) {
+       if(c->emit && c->line) {
+               ConfigFile *cf = (ConfigFile *)c->line;
+               c->value_string = cf->c_file.bv_val;
+               return 0;
+       }
+       return(1);
+}
+
+static int
 config_search_base(ConfigArgs *c) {
        struct berval dn;
-       int rc;
+
+       if(c->emit) {
+               int rc = 1;
+               if (!BER_BVISEMPTY(&default_search_base)) {
+                       ber_bvarray_add(&c->rvalue_vals, &default_search_base);
+                       ber_bvarray_add(&c->rvalue_nvals, &default_search_nbase);
+                       rc = 0;
+               }
+               return rc;
+       }
+
        if(c->bi || c->be != frontendDB) {
                Debug(LDAP_DEBUG_ANY, "%s: defaultSearchBase line must appear "
                        "prior to any backend or database definition\n",
@@ -1070,9 +1277,17 @@ config_search_base(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_passwd_hash(ConfigArgs *c) {
        int i;
+       if (c->emit) {
+               struct berval bv;
+               for (i=0; default_passwd_hash && default_passwd_hash[i]; i++) {
+                       ber_str2bv(default_passwd_hash[i], 0, 0, &bv);
+                       ber_bvarray_add(&c->rvalue_vals, &bv);
+               }
+               return i ? 0 : 1;
+       }
        if(default_passwd_hash) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "already set default password_hash\n",
@@ -1096,20 +1311,28 @@ config_passwd_hash(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_schema_dn(ConfigArgs *c) {
        struct berval dn;
        int rc;
+       if ( c->emit ) {
+               ber_bvarray_add(&c->rvalue_vals, &c->be->be_schemadn);
+               ber_bvarray_add(&c->rvalue_nvals, &c->be->be_schemandn);
+               return 0;
+       }
        c->be->be_schemadn = c->value_dn;
        c->be->be_schemandn = c->value_ndn;
        return(0);
 }
 
-int
+static int
 config_sizelimit(ConfigArgs *c) {
        int i, rc = 0;
        char *next;
        struct slap_limits_set *lim = &c->be->be_def_limit;
+       if (c->emit) {
+               return 1;
+       }
        for(i = 1; i < c->argc; i++) {
                if(!strncasecmp(c->argv[i], "size", 4)) {
                        rc = limits_parse_one(c->argv[i], lim);
@@ -1141,11 +1364,14 @@ config_sizelimit(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_timelimit(ConfigArgs *c) {
        int i, rc = 0;
        char *next;
        struct slap_limits_set *lim = &c->be->be_def_limit;
+       if (c->emit) {
+               return 1;
+       }
        for(i = 1; i < c->argc; i++) {
                if(!strncasecmp(c->argv[i], "time", 4)) {
                        rc = limits_parse_one(c->argv[i], lim);
@@ -1177,8 +1403,11 @@ config_timelimit(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_overlay(ConfigArgs *c) {
+       if (c->emit) {
+               return 1;
+       }
        if(c->argv[1][0] == '-' && overlay_config(c->be, &c->argv[1][1])) {
                /* log error */
                Debug(LDAP_DEBUG_ANY, "%s: (optional) %s overlay \"%s\" configuration failed (ignored)\n",
@@ -1189,11 +1418,19 @@ config_overlay(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_suffix(ConfigArgs *c) {
        Backend *tbe;
        struct berval pdn, ndn;
        int rc;
+       if (c->emit) {
+               int i;
+               for (i=0; !BER_BVISNULL(&c->be->be_suffix[i]); i++) {
+                       ber_bvarray_add(&c->rvalue_vals, &c->be->be_suffix[i]);
+                       ber_bvarray_add(&c->rvalue_nvals, &c->be->be_nsuffix[i]);
+               }
+               return i ? 0 : 1;
+       }
 #ifdef SLAPD_MONITOR_DN
        if(!strcasecmp(c->argv[1], SLAPD_MONITOR_DN)) {
                Debug(LDAP_DEBUG_ANY, "%s: "
@@ -1227,23 +1464,37 @@ config_suffix(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_rootdn(ConfigArgs *c) {
+       if (c->emit) {
+               ber_bvarray_add(&c->rvalue_vals, &c->be->be_rootdn);
+               ber_bvarray_add(&c->rvalue_nvals, &c->be->be_rootndn);
+               return 0;
+       }
        c->be->be_rootdn = c->value_dn;
        c->be->be_rootndn = c->value_ndn;
        return(0);
 }
 
-int
+static int
 config_rootpw(ConfigArgs *c) {
-       Backend *tbe = select_backend(&c->be->be_rootndn, 0, 0);
+       Backend *tbe;
+       if (c->emit) {
+               if (!BER_BVISEMPTY(&c->be->be_rootpw)) {
+                       c->value_string="*";
+                       return 0;
+               }
+               return 1;
+       }
+
+       tbe = select_backend(&c->be->be_rootndn, 0, 0);
        if(tbe != c->be) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "rootpw can only be set when rootdn is under suffix\n",
                        c->log, 0, 0);
                return(1);
        }
-       ber_str2bv(c->argv[1], 0, 1, &c->be->be_rootpw);
+       ber_str2bv(c->value_string, 0, 0, &c->be->be_rootpw);
        return(0);
 }
 
@@ -1271,7 +1522,7 @@ verbs_to_mask(ConfigArgs *c, struct verb_mask_list *v, slap_mask_t *m) {
        return(0);
 }
 
-int
+static int
 config_restrict(ConfigArgs *c) {
        slap_mask_t restrictops = 0;
        int i, j;
@@ -1296,6 +1547,9 @@ config_restrict(ConfigArgs *c) {
                { NULL, 0 }
        };
 
+       if (c->emit) {
+               return 1;
+       }
        for(i = 1; i < c->argc; i++) {
                j = verb_to_mask(c, restrictable_ops, i);
                if(restrictable_ops[j].word) {
@@ -1325,7 +1579,7 @@ config_restrict(ConfigArgs *c) {
        return(1);
 }
 
-int
+static int
 config_allows(ConfigArgs *c) {
        slap_mask_t allows = 0;
        int i;
@@ -1336,6 +1590,9 @@ config_allows(ConfigArgs *c) {
                { "update_anon",        SLAP_ALLOW_UPDATE_ANON },
                { NULL, 0 }
        };
+       if (c->emit) {
+               return 1;
+       }
        i = verbs_to_mask(c, allowable_ops, &allows);
        if ( i ) {
                Debug(LDAP_DEBUG_ANY, "%s: "
@@ -1347,7 +1604,7 @@ config_allows(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_disallows(ConfigArgs *c) {
        slap_mask_t disallows = 0;
        int i;
@@ -1359,6 +1616,9 @@ config_disallows(ConfigArgs *c) {
                { "tls_authc",          SLAP_DISALLOW_TLS_AUTHC },
                { NULL, 0 }
        };
+       if (c->emit) {
+               return 1;
+       }
        i = verbs_to_mask(c, disallowable_ops, &disallows);
        if ( i ) {
                Debug(LDAP_DEBUG_ANY, "%s: "
@@ -1370,7 +1630,7 @@ config_disallows(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_requires(ConfigArgs *c) {
        slap_mask_t requires = 0;
        int i;
@@ -1382,6 +1642,9 @@ config_requires(ConfigArgs *c) {
                { "strong",             SLAP_REQUIRE_STRONG },
                { NULL, 0 }
        };
+       if (c->emit) {
+               return 1;
+       }
        i = verbs_to_mask(c, requires_ops, &requires);
        if ( i ) {
                Debug(LDAP_DEBUG_ANY, "%s: "
@@ -1393,7 +1656,7 @@ config_requires(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_loglevel(ConfigArgs *c) {
        int i;
        char *next;
@@ -1417,6 +1680,10 @@ config_loglevel(ConfigArgs *c) {
        };
        ldap_syslog = 0;
 
+       if (c->emit) {
+               return 1;
+       }
+
        for( i=1; i < c->argc; i++ ) {
                int     level;
 
@@ -1445,8 +1712,11 @@ config_loglevel(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_syncrepl(ConfigArgs *c) {
+       if (c->emit) {
+               return 1;
+       }
        if(SLAP_SHADOW(c->be)) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "syncrepl: database already shadowed.\n",
@@ -1459,9 +1729,12 @@ config_syncrepl(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_referral(ConfigArgs *c) {
        struct berval vals[2];
+       if (c->emit) {
+               return 1;
+       }
        if(validate_global_referral(c->argv[1])) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "invalid URL (%s) in \"referral\" line.\n",
@@ -1475,11 +1748,14 @@ config_referral(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_security(ConfigArgs *c) {
        slap_ssf_set_t *set = &c->be->be_ssf_set;
        char *next;
        int i;
+       if (c->emit) {
+               return 1;
+       }
        for(i = 1; i < c->argc; i++) {
                slap_ssf_t *tgt;
                char *src;
@@ -1528,12 +1804,15 @@ config_security(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_replica(ConfigArgs *c) {
        int i, nr = -1;
        char *replicahost, *replicalog = NULL;
        LDAPURLDesc *ludp;
 
+       if (c->emit) {
+               return 1;
+       }
        if(SLAP_MONITOR(c->be)) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "\"replica\" should not be used inside monitor database\n",
@@ -1623,10 +1902,18 @@ config_replica(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_updatedn(ConfigArgs *c) {
        struct berval dn;
        int rc;
+       if (c->emit) {
+               if (!BER_BVISEMPTY(&c->be->be_update_ndn)) {
+                       ber_bvarray_add(&c->rvalue_vals, &c->be->be_update_ndn);
+                       ber_bvarray_add(&c->rvalue_nvals, &c->be->be_update_ndn);
+                       return 0;
+               }
+               return 1;
+       }
        if(SLAP_SHADOW(c->be)) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "updatedn: database already shadowed.\n",
@@ -1649,9 +1936,12 @@ config_updatedn(ConfigArgs *c) {
        return(0);
 }
 
-int
+static int
 config_updateref(ConfigArgs *c) {
        struct berval vals[2];
+       if (c->emit) {
+               return 1;
+       }
        if(!SLAP_SHADOW(c->be)) {
                Debug(LDAP_DEBUG_ANY, "%s: "
                        "updateref line must after syncrepl or updatedn.\n",
@@ -1673,13 +1963,16 @@ config_updateref(ConfigArgs *c) {
 
 /* XXX meaningless in ldif */
 
-int
+static int
 config_include(ConfigArgs *c) {
        unsigned long savelineno = c->lineno;
        int rc;
        ConfigFile *cf = ch_calloc( 1, sizeof(ConfigFile));
        ConfigFile *cfsave = cfn;
        ConfigFile *cf2 = NULL;
+       if (c->emit) {
+               return 1;
+       }
        if ( cfn->c_kids ) {
                for (cf2=cfn->c_kids; cf2 && cf2->c_sibs; cf2=cf2->c_sibs) ;
                cf2->c_sibs = cf;
@@ -1699,9 +1992,12 @@ config_include(ConfigArgs *c) {
 }
 
 #ifdef HAVE_TLS
-int
+static int
 config_tls_option(ConfigArgs *c) {
        int flag;
+       if (c->emit) {
+               return 1;
+       }
        switch(c->type) {
        case CFG_TLS_RAND:              flag = LDAP_OPT_X_TLS_RANDOM_FILE;      break;
        case CFG_TLS_CIPHER:            flag = LDAP_OPT_X_TLS_CIPHER_SUITE;     break;
@@ -1719,9 +2015,12 @@ config_tls_option(ConfigArgs *c) {
        return(ldap_pvt_tls_set_option(NULL, flag, c->argv[1]));
 }
 
-int
+static int
 config_tls_verify(ConfigArgs *c) {
        int i;
+       if (c->emit) {
+               return 1;
+       }
        if(isdigit((unsigned char)c->argv[1][0])) {
                i = atoi(c->argv[1]);
                return(ldap_pvt_tls_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &i));