/*
 * Copyright (c) 2004-2006 Sendmail, Inc. and its suppliers.
 *	All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 *
 * $Id: sscnfdef.h,v 1.107 2007/09/29 02:53:39 ca Exp $
 */

#ifndef SM_SSCNFDEF_H
#define SM_SSCNFDEF_H 1

#include "sm/generic.h"
#include "sm/types.h"
#include "sm/time.h"
#include "sm/sm-conf.h"
#include "sm/sm-conf-time.h"
#include "sm/sm-conf-byte.h"
#include "sm/mta.h"
#include "sm/cnf.h"
#include "sm/ssdef.h"
#include "sm/sscnf.h"
#include "sm/smtpdef.h"

#if SM_SSCNFDEF
#define SM_SOCKCNFDEF 1
#define SM_TLSREQCNFDEF 1
#endif
#include "sm/sockcnfdef.h"
#include "sm/tlsreqcnf.h"
#include "sm/tlsreqcnfs.h"

#include "sm/mcpcnfs.h"
#include "sm/tlscnfs.h"

#if MTA_USE_SASL
#include "sm/sasl.h"
#endif

#define SS_CNFN_ACCESS	"access"
#define SS_PR_CNF	"protected_recipients"
#define SS_PR_A_SENDER	"sender"
#define SS_PR_A_CLTADDR	"client_ip"
#define SS_PR_USE_LOOKUP	"generic_lookup"
#define SS_IMPLDET	"implicitly_match_detail"
#define SS_LKP_SE_CONF	"lookup_session_conf"

#if SM_SSCNFDEF
#define EXTERN
#else
#define EXTERN extern
#endif

#if MTA_USE_SASL
EXTERN
sm_conf_definition_T const
ss_auth_flag_names[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC,
	"noplaintext",			sm_conf_type_choice_value,
	SASL_SEC_NOPLAINTEXT,
	0, NULL, 0, NULL, NULL, NULL,
	"do not allow mechanisms that are susceptable to simple passive attack"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"noactive",			sm_conf_type_choice_value,
	SASL_SEC_NOACTIVE,
	0, NULL, 0, NULL, NULL, NULL,
	"do not allow mechanisms that are susceptable to active attacks"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"nodictionary",			sm_conf_type_choice_value,
	SASL_SEC_NODICTIONARY,
	0, NULL, 0, NULL, NULL, NULL,
	"do not allow mechanisms that are susceptable to passive dictionary attack"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"forward_secrecy",		sm_conf_type_choice_value,
	SASL_SEC_FORWARD_SECRECY,
	0, NULL, 0, NULL, NULL, NULL,
	"allow only mechanism with forward secrecy (breaking one session won't help break the next)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"noanonymous",			sm_conf_type_choice_value,
	SASL_SEC_NOANONYMOUS,
	0, NULL, 0, NULL, NULL, NULL,
	"do not allow anonymous mechanisms"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"pass_credentials",		sm_conf_type_choice_value,
	SASL_SEC_PASS_CREDENTIALS,
	0, NULL, 0, NULL, NULL, NULL,
	"require mechanisms that can pass client credentials"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"mutual_auth",			sm_conf_type_choice_value,
	SASL_SEC_MUTUAL_AUTH,
	0, NULL, 0, NULL, NULL, NULL,
	"require mechanisms that support mutual authentication"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

#endif /* MTA_USE_SASL */

EXTERN
sm_conf_definition_T const
ss_flag_names[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "u|",  sm_conf_type_u32_suffix, 1,
	1, NULL, SM_CONF_FLAG_DONTPRINT, NULL, NULL, NULL, ""
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "|",  sm_conf_type_u32_suffix, 1,
	1, NULL, SM_CONF_FLAG_DONTPRINT, NULL, NULL, NULL, ""
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "u",  sm_conf_type_u32_suffix, 1,
	1, NULL, SM_CONF_FLAG_DONTPRINT, NULL, NULL, NULL, ""
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"8bitmime",		sm_conf_type_choice_value,
	SSC_CFL_8BITMIME,
	0, NULL, 0, NULL, NULL, NULL,
	"offer 8BITMIME"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	SS_CNFN_ACCESS,		sm_conf_type_choice_value,
	SSC_CFL_ACCESS_DB,
	0, NULL, 0, NULL, NULL, NULL,
	"use access map"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"greylisting",		sm_conf_type_choice_value,
	SSC_CFL_GREY,
	0, NULL, 0, NULL, NULL, NULL,
	"enable greylisting"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"delay_greylisting_error_until_DATA",	sm_conf_type_choice_value,
	SSC_CFL_GREY_DATA,
	0, NULL, 0, NULL, NULL, NULL,
	"delay an error from greylisting until the DATA command"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	SS_IMPLDET,		sm_conf_type_choice_value,
	SSC_CFL_ACCIMPLDET,
	0, NULL, 0, NULL, NULL, NULL,
	"implicitly match +detail without specifying +* or *"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"delay_checks",		sm_conf_type_choice_value,
	SSC_CFL_DELAY_CHKS,
	0, NULL, 0, NULL, NULL, NULL,
	"delay returning results from access check until RCPT stage"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"require_EHLO_before_MAIL",	sm_conf_type_choice_value,
	SSC_CFL_EHLO_REQ,
	0, NULL, 0, NULL, NULL, NULL,
	"require EHLO or HELO command before MAIL"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"spam_friend",		sm_conf_type_choice_value,
	SSC_CFL_SPAM_FRIEND,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"spam_hater",		sm_conf_type_choice_value,
	SSC_CFL_SPAM_HATER,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"background",		sm_conf_type_choice_value,
	SSC_CFL_BACKGROUND,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"serialize_accept",	sm_conf_type_choice_value,
	SSC_CFL_SERIAL_ACC,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"soft_bounce",	sm_conf_type_choice_value,
	SSC_CFL_SOFTBOUNCE,
	0, NULL, 0, NULL, NULL, NULL,
	"change permanent errors (5xy) into temporary errors (4xy)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"lmtp_does_not_imply_relaying",	sm_conf_type_choice_value,
	SSC_CFL_LMTPNOTRELAY,
	0, NULL, 0, NULL, NULL, NULL,
	"do not implicitly allow relaying to domains that have lmtp: as RHS in mailertable"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"strict_EHLO_checks",		sm_conf_type_choice_value,
	SSC_CFL_EHLO_SYNTAX,
	0, NULL, 0, NULL, NULL, NULL,
	"perform strict checks for HELO/EHLO parameter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"strict_EHLO_syntax",		sm_conf_type_choice_value,
	SSC_CFL_EHLO_SYNTAX,
	0, NULL, 0, NULL, NULL, NULL,
	"perform strict syntax checks for HELO/EHLO parameter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"check_EHLO",		sm_conf_type_choice_value,
	SSC_CFL_CHK_EHLO,
	0, NULL, 0, NULL, NULL, NULL,
	"check HELO/EHLO parameter via access map"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"xverp",	sm_conf_type_choice_value,
	SSC_CFL_XVERP,
	0, NULL, 0, NULL, NULL, NULL,
	"offer XVERP extension to enable VERP for a transaction"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"starttls",			sm_conf_type_choice_value,
	SSSE_CFL_STARTTLS,
	0, NULL, 0, NULL, NULL, NULL,
	"offer STARTTLS"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"auth",				sm_conf_type_choice_value,
	SSSE_CFL_AUTH,
	0, NULL, 0, NULL, NULL, NULL,
	"offer AUTH"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"allow_data_before_greeting",	sm_conf_type_choice_value,
	SSSE_CFL_DATA_BEFORE_GREET,
	0, NULL, 0, NULL, NULL, NULL,
	"allow client to send data before SMTP greeting"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

#if MTA_USE_RSAD
{ SM_CONF_DEF_MAGIC,
	"prdr",			sm_conf_type_choice_value,
	SSC_CFL_RSAD,
	0, NULL, 0, NULL, NULL, NULL,
	"offer PRDR"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif

#if MTA_USE_TLS
{ SM_CONF_DEF_MAGIC,
	SS_LKP_SE_CONF,			sm_conf_type_choice_value,
	SSC_CFL_SE_CONF,
	0, NULL, 0, NULL, NULL, NULL,
	"lookup session configuration data in access map"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

EXTERN
sm_conf_definition_T const
ss_se_flag_names[]
#if SM_SSCNFDEF
=
{
/* hack to allow for "|" of initialization data and trailing "u" */
{ SM_CONF_DEF_MAGIC, "u|",  sm_conf_type_u32_suffix, 1,
	1, NULL, SM_CONF_FLAG_DONTPRINT, NULL, NULL, NULL, ""
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "|",  sm_conf_type_u32_suffix, 1,
	1, NULL, SM_CONF_FLAG_DONTPRINT, NULL, NULL, NULL, ""
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "u",  sm_conf_type_u32_suffix, 1,
	1, NULL, SM_CONF_FLAG_DONTPRINT, NULL, NULL, NULL, ""
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* other flags? see above */
{ SM_CONF_DEF_MAGIC,
	"starttls",			sm_conf_type_choice_value,
	SSSE_CFL_STARTTLS,
	0, NULL, 0, NULL, NULL, NULL,
	"offer STARTTLS"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"auth",				sm_conf_type_choice_value,
	SSSE_CFL_AUTH,
	0, NULL, 0, NULL, NULL, NULL,
	"offer AUTH"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"delay_checks",			sm_conf_type_choice_value,
	SSSE_CFL_DELAY_CHKS,
	0, NULL, 0, NULL, NULL, NULL,
	"delay returning results from access check until RCPT stage"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"allow_data_before_greeting",	sm_conf_type_choice_value,
	SSSE_CFL_DATA_BEFORE_GREET,
	0, NULL, 0, NULL, NULL, NULL,
	"allow client to send data before SMTP greeting"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"require_EHLO_before_MAIL",	sm_conf_type_choice_value,
	SSSE_CFL_EHLO_REQ,
	0, NULL, 0, NULL, NULL, NULL,
	"require EHLO or HELO command before MAIL"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"strict_EHLO_syntax",		sm_conf_type_choice_value,
	SSSE_CFL_EHLO_SYNTAX,
	0, NULL, 0, NULL, NULL, NULL,
	"perform strict syntax checks for HELO/EHLO parameter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"strict_EHLO_checks",		sm_conf_type_choice_value,
	SSSE_CFL_EHLO_SYNTAX,
	0, NULL, 0, NULL, NULL, NULL,
	"perform strict checks for HELO/EHLO parameter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"check_EHLO",		sm_conf_type_choice_value,
	SSSE_CFL_CHK_EHLO,
	0, NULL, 0, NULL, NULL, NULL,
	"check HELO/EHLO parameter via access map"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

#if MTA_USE_RSAD
{ SM_CONF_DEF_MAGIC,
	"prdr",			sm_conf_type_choice_value,
	SSSE_CFL_RSAD,
	0, NULL, 0, NULL, NULL, NULL,
	"offer PRDR"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

EXTERN
sm_conf_definition_T
ss_se_feat_defs[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "name",		sm_conf_type_section_title,
	offsetof(ss_se_feat_T, sssf_name),	0,
	NULL,	0 /*SM_CONF_FLAG_STRICTLY_REQUIRED*/,
	NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "flags",		sm_conf_type_choice,
	offsetof(ss_se_feat_T, sssf_flags),	sizeof(uint32_t),
	SM_XSTR(SSSE_CFL_STARTTLS) "|" SM_XSTR(SSSE_CFL_AUTH),
	SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_NUMERIC|SM_CONF_FLAG_PLURAL,
	ss_se_flag_names,
	NULL,	NULL,
	"flags to influence behavior per session"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

EXTERN
sm_conf_definition_T
ss_se_feat_definitions[]
#if SM_SSCNFDEF
=
{

{ SM_CONF_DEF_MAGIC, "session feature declaration",	sm_conf_type_section,
	offsetof(ss_cnf_T, ss_cnf_se_feats.sssfs_feat), sizeof(ss_se_feat_T),
	NULL, SM_CONF_FLAG_SECTION_MUST_BE_NAMED,
	ss_se_feat_defs,
	NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "n",	sm_conf_type_array_n,
	offsetof(ss_cnf_T, ss_cnf_se_feats.sssfs_n), sizeof(uint),
	NULL, 0,
	ss_se_feat_defs,
	NULL, NULL,
	"number of session features (implicit)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;


EXTERN
sm_conf_definition_T const
ss_protrcpt_allow_names[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC,
	SS_PR_A_SENDER,			sm_conf_type_choice_value,
	SSC_CFL_PROTBYMAIL,
	0, NULL, 0, NULL, NULL, NULL,
	"protect recipients by sender address"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	SS_PR_A_CLTADDR,		sm_conf_type_choice_value,
	SSC_CFL_PROTBYCLTADDR,
	0, NULL, 0, NULL, NULL, NULL,
	"protect recipients by client IPv4 address"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;
EXTERN
sm_conf_definition_T const
ss_protrcpt_match_names[]
#if SM_SSCNFDEF
=
{
/*
{ SM_CONF_DEF_MAGIC,
	"exact",		sm_conf_type_choice_value,
	0x0,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
*/

{ SM_CONF_DEF_MAGIC,
	SS_PR_USE_LOOKUP,		sm_conf_type_choice_value,
	SSC_CFL_PROTMAP,
	0, NULL, 0, NULL, NULL, NULL,
	"use generic lookup algorithm"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	SS_IMPLDET,			sm_conf_type_choice_value,
	SSC_CFL_PROTIMPLDET,
	0, NULL, 0, NULL, NULL, NULL,
	"implicitly match +detail"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

EXTERN
sm_conf_definition_T const
ss_protrcpt_defs[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "allow_by",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_cflags),	sizeof(uint32_t),
	NULL,
	SM_CONF_FLAG_KEEP_DEFAULT|SM_CONF_FLAG_STRICTLY_REQUIRED
		|SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR,
	ss_protrcpt_allow_names, NULL,	NULL,
	"allow by"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "match_type",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_cflags),	sizeof(uint32_t),
	NULL,
	SM_CONF_FLAG_KEEP_DEFAULT|SM_CONF_FLAG_OR,
	ss_protrcpt_match_names, NULL,	NULL,
	"match type"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;


#if MTA_USE_PMILTER
EXTERN
sm_conf_definition_T const
ss_pm_flag_names[]
#if SM_SSCNFDEF
=
{
#if 0
/* default ... */
{ SM_CONF_DEF_MAGIC,
	"ignore",		sm_conf_type_choice_value,
	SSC_MFL_PM_IGN,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
/* should not be used either */
{ SM_CONF_DEF_MAGIC,
	"tempfail",		sm_conf_type_choice_value,
	SSC_MFL_PM_TEMP,
	0, NULL, 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif /* 0 */
{ SM_CONF_DEF_MAGIC,
	"abort",		sm_conf_type_choice_value,
	SSC_MFL_PM_421,
	0, NULL, 0, NULL, NULL, NULL,
	"abort session on communication error"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	"accept_but_reconnect",		sm_conf_type_choice_value,
	SSC_MFL_PM_AGAIN,
	0, NULL, 0, NULL, NULL, NULL,
	"try to reconnect on communication error, accept current session"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;
#endif /* MTA_USE_PMILTER */


#if MTA_USE_TLS
EXTERN
sm_conf_definition_T const
ss_tls_flag_names[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC,
	"allow_relaying_if_verified",		sm_conf_type_choice_value,
	SSC_CFL_TLS_REL_VRFY,
	0, NULL, 0, NULL, NULL, NULL,
	"allow relaying if client cert has been verified"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC,
	"check_access_map_for_relaying",	sm_conf_type_choice_value,
	SSC_CFL_TLS_REL_ACC,
	0, NULL, 0, NULL, NULL, NULL,
	"perform access map lookups to allow relaying"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

EXTERN
sm_conf_definition_T
ss_tls_defs[]
#if SM_SSCNFDEF
=
{
	TLS_DEFS(ss_cnf_T, ss),

{ SM_CONF_DEF_MAGIC, "flags",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_cflags),	sizeof(uint32_t),
	NULL,
	SM_CONF_FLAG_KEEP_DEFAULT|SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR
		|SM_CONF_FLAG_PLURAL,
	ss_tls_flag_names,
	NULL,	NULL,
	"flags to influence behavior related to STARTTLS [see documentation]"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "cache_size",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_tls.tlscnf_cache_size),	sizeof(uint),
	NULL,	0,	NULL,	NULL,	NULL,
	"size of TLS session cache"
	SM_LC_NO_ISSET
	},

{ SM_CONF_DEF_MAGIC, "cache_timeout",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_tls.tlscnf_cache_tmout),	sizeof(uint),
	NULL,	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"timeout for TLS session cache"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "options",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_tls.tlscnf_options),	sizeof(long),
	SM_XSTR(SSL_OP_ALL),	0,	NULL, NULL,	NULL,
	"options for SSL_CTX_set_options [expert only]"
	SM_LC_ISSET(offsetof(ss_cnf_T, ss_cnf_tls.tlscnf_options_isset))
	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "requirements_violation",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_tlsreqfail),	sizeof(uint),
	"abort",
	SM_CONF_FLAG_KEEP_DEFAULT,
	tlsreq_violation,
	NULL,	NULL,
	"how to treat TLS requirements violation"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;
#endif /* MTA_USE_TLS */


#if MTA_USE_SASL
EXTERN
sm_conf_definition_T
ss_auth_defs[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "flags",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_auth_flags),	sizeof(uint32_t),
	NULL, SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	ss_auth_flag_names,
	NULL,	NULL,
	"Flags for Cyrus SASL (AUTH)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "trusted_mechanisms",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_trusted_mechs),	0,
	"PLAIN LOGIN DIGEST-MD5 CRAM-MD5",
	0,	NULL,	NULL,	NULL,
	"List of SASL mechanisms for which relaying is allowed if a client "
	"successfully authenticated using one of those"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;
#endif /* MTA_USE_SASL */


#if MTA_USE_PMILTER
EXTERN
sm_conf_definition_T
ss_pmilter_defs[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "socket",	sm_conf_type_union,
	offsetof(ss_cnf_T, ss_cnf_miltsockspec.sckspc_type),
	sizeof(sockspec_T),
	"unix", SM_CONF_FLAG_KEEP_DEFAULT, sock_spec_definitions,
	NULL, NULL,
	"socket for communication with pmilter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "timeout",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_w4m2s),	sizeof(uint),
	SM_XSTR(TMO_W4M2S),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum amount of time to wait for a reply from a policy milter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "flags",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_mflags),	sizeof(uint32_t),
	NULL, SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	ss_pm_flag_names,
	NULL,	NULL,
	"policy milter flags [see documentation]"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;
#endif /* MTA_USE_PMILTER */




EXTERN
sm_conf_definition_T
ss_defs[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "pass_fd_socket",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_fd_socket),	0,
	NULL,			SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"path of Unix domain socket to exchange file descriptor [use with MCP]"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "daemon_address",		sm_conf_type_argv,
	offsetof(ss_cnf_T, ss_cnf_sck_addr),	SS_MAX_BIND_ADDRS,	NULL,
	0,	NULL,	NULL,	NULL,
	"address for daemon to listen on [do not use with MCP]"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "listen_queue",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_listenq_size),	sizeof(int),
	SM_XSTR(LISTENQ_SIZE_DEFAULT),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"length of listen(2) queue [do not use with MCP]"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

#if SS_LOGDIR
{ SM_CONF_DEF_MAGIC, "log_directory",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_logdir),	0,
	NULL,			SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"Directory for logfiles"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},
#endif /* SS_LOGDIR */
{ SM_CONF_DEF_MAGIC, "log_level",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_loglevel),	sizeof(uint),
	SM_XSTR(SM_LOG_LEVEL),	0,	NULL,	NULL,	NULL,
	"log level"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, "log", sm_conf_type_section,
	offsetof(ss_cnf_T, ss_cnf_log),		0,
	NULL, SM_CONF_FLAG_KEEP_DEFAULT, sm_log_spec_defs,
	NULL,	NULL,
	SM_CNF_LOG
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "relay_from",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_relay_from),	0,
	RELAY_CLT,			SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"allow relaying from IPv4 addresses that match this regular expression"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, "relay_to",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_relay_to),	0,
	RELAY_RCPT,			SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"allow relaying to addresses that match this regular expression"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "cdb_gid",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_cdb_gid),	sizeof(gid_t),
	"0",	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"group id (numeric) to use for CDB files"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "id",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_id_base),	sizeof(int),
	"0",	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"(unique) id for server (if multiple SMTP servers are configured)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_transactions",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_t_tot_lim),	sizeof(uint),
	SM_XSTR(SM_MAX_TAS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of transactions per session"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_recipients_per_session",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_r_tot_lim),	sizeof(uint),
	SM_XSTR(SM_MAX_RCPTS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of recipients per session"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_recipients_per_transaction",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_r_ta_lim),	sizeof(uint),
	SM_XSTR(SM_MAX_RCPTS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of recipients per transaction"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_hops",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_maxhops),	sizeof(uint),
	SM_XSTR(MTA_MAXHOPS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of hops (Received: headers)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_message_size",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_max_msg_sz_kb),	sizeof(uint),
	SM_XSTR(SM_MAX_MSG_SZ_KB),	SM_CONF_FLAG_KEEP_DEFAULT,
	sm_conf_Kbyte_suffixes,	NULL,	NULL,
	"maximum message size (KB)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_bad_commands_per_session",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_sess_max_badcmds),	sizeof(uint),
	SM_XSTR(SS_SESS_MAX_BADCMDS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of bad SMTP commands per session"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_invalid_addresses_per_session", sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_sess_max_invldaddr),	sizeof(uint),
	SM_XSTR(SS_SESS_MAX_INVLDADDR),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of SMTP commands with invalid addresses per session"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_nop_commands_between_transactions", sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_sess_max_nopcmds),	sizeof(uint),
	SM_XSTR(SS_SESS_MAX_NOPCMDS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of nop SMTP commands between transactions"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_bad_commands_per_transaction", sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_ta_max_badcmds),	sizeof(uint),
	SM_XSTR(SS_TA_MAX_BADCMDS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of bad SMTP commands per transaction"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_nop_commands_in_transaction", sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_ta_max_nopcmds),	sizeof(uint),
	SM_XSTR(SS_TA_MAX_NOPCMDS),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of nop SMTP commands in a single transaction"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_invalid_addresses_per_transaction", sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_ta_max_invldaddr),	sizeof(uint),
	SM_XSTR(SS_TA_MAX_INVLDADDR),	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of SMTP commands with invalid addresses per transaction"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "io_timeout",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_timeout),	sizeof(sm_intvl_T),
	SM_XSTR(SS_IO_TIMEOUT),		SM_CONF_FLAG_KEEP_DEFAULT,
	sm_conf_time_suffixes, NULL,	NULL,
	"timeout for SMTP I/O operations"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "module_timeout",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_mod_tmo),	sizeof(sm_intvl_T),
	SM_XSTR(SS_RCB_SND_TMO),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"timeout for communication with other modules"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "flags",		sm_conf_type_choice,
	offsetof(ss_cnf_T, ss_cnf_cflags),	sizeof(uint32_t),
	SM_XSTR(SSSE_CFL_STARTTLS) "|" SM_XSTR(SSSE_CFL_AUTH),
	SM_CONF_FLAG_KEEP_DEFAULT|SM_CONF_FLAG_MULTIPLE
		|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL|SM_CONF_FLAG_NUMERIC,
	ss_flag_names,
	NULL,	NULL,
	"flags to influence behavior [see documentation]"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, SS_PR_CNF,		sm_conf_type_section,
	0,				sizeof(uint32_t),
	NULL, SM_CONF_FLAG_KEEP_DEFAULT,	ss_protrcpt_defs,
	NULL,	NULL,
	"how to protect recipient addresses [see documentation]"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_threads",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_max_threads),	sizeof(uint),
	"0",		SM_CONF_FLAG_KEEP_DEFAULT,
	NULL,	NULL,	NULL,
	"maximum number of threads"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "max_wait_threads",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_max_wait_threads),	sizeof(uint),
	"8",	SM_CONF_FLAG_KEEP_DEFAULT,	NULL,	NULL,	NULL,
	"maximum number of waiting threads"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "min_wait_threads",	sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_min_wait_threads),	sizeof(uint),
	"2",	SM_CONF_FLAG_KEEP_DEFAULT,	NULL,	NULL,	NULL,
	"minimum number of waiting threads"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "processes",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_vp_count),	sizeof(int),
	"1",	SM_CONF_FLAG_KEEP_DEFAULT,	NULL,	NULL,	NULL,
	"number of processes to start"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "wait_for_server",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_wait4srv),	sizeof(uint),
	"1",	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum amount of time to wait for a server to become available"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "wait_for_smar",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_w4a2s),	sizeof(uint),
	SM_XSTR(TMO_W4A2S),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum amount of time to wait for a reply from smar"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "debug_level",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_debug),	sizeof(uint),
	"0",	0,	NULL,	NULL,	NULL,
	"debug level"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_SS_CNF_MAGIC)
	},

#if MTA_USE_TLS
{ SM_CONF_DEF_MAGIC, "tls", sm_conf_type_section,
	0, sizeof(ss_cnf_T), NULL,
	SM_CONF_FLAG_KEEP_DEFAULT,
	ss_tls_defs,
	NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif /* MTA_USE_TLS */

#if MTA_USE_SASL
{ SM_CONF_DEF_MAGIC, "auth", sm_conf_type_section,
	0, sizeof(ss_cnf_T), NULL,
	SM_CONF_FLAG_KEEP_DEFAULT,
	ss_auth_defs,
	NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif /* MTA_USE_SASL */

#if MTA_USE_PMILTER
{ SM_CONF_DEF_MAGIC, "pmilter", sm_conf_type_section,
	0, sizeof(ss_cnf_T), NULL,
	SM_CONF_FLAG_KEEP_DEFAULT|SM_CONF_FLAG_DPRCD,
	ss_pmilter_defs,
	NULL, NULL,
	"policy milter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "policy_milter", sm_conf_type_section,
	0, sizeof(ss_cnf_T), NULL,
	SM_CONF_FLAG_KEEP_DEFAULT,
	ss_pmilter_defs,
	NULL, NULL,
	"policy milter"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif /* MTA_USE_PMILTER */

{ SM_CONF_DEF_MAGIC, "session_features",		sm_conf_type_array,
	0,	/* offset */
	0,	/* size (# of elements) */
	NULL,	/* default */
	SM_CONF_FLAG_MULTIPLE,
	ss_se_feat_definitions,
	NULL,  NULL,
	"session feature declarations"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

	MCP_SRV_DEFS(ss_cnf_T, ss_cnf),
	MCP_DEFS(ss_cnf_T, ss_cnf)

#if SS_TEST
{ SM_CONF_DEF_MAGIC, "tests",		sm_conf_type_u32,
	offsetof(ss_cnf_T, ss_cnf_tests),	sizeof(uint),
	"0", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
#endif

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

EXTERN
sm_conf_definition_T
ss_global_defs[]
#if SM_SSCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "SMTPS_socket",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_smtpssock),	0,
	smsmtpssock,	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "SMAR_socket",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_smarsock),	0,
	smarsock,	SM_CONF_FLAG_KEEP_DEFAULT,
	NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "CDB_base_directory",	sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_cdb_base),	0,
	"",		SM_CONF_FLAG_KEEP_DEFAULT,
	NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "hostname",		sm_conf_type_string,
	offsetof(ss_cnf_T, ss_cnf_hostname),	0,	NULL,
	0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "smtps", sm_conf_type_section,
	0, sizeof(ss_cnf_T), NULL,
	SM_CONF_FLAG_KEEP_DEFAULT|SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_PARSE_ONLY,
	ss_defs,
	NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

/* Sentinel */
{ SM_CONF_DEF_MAGIC, NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0)}
}
#endif /* SM_SSCNFDEF */
;

#undef EXTERN

#endif /* SM_SSCNFDEF_H */


syntax highlighted by Code2HTML, v. 0.9.1