/*
 * 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: qmgrcnfdef.h,v 1.66 2007/07/14 16:55:01 ca Exp $
 */

#ifndef SM_QMGRCNFDEF_H
#define SM_QMGRCNFDEF_H 1

#include "sm/generic.h"
#include "sm/magic.h"
#include "sm/cnf.h"
#include "sm/edbdef.h"
#include "sm/qmgrcto.h"
#include "sm/qmgrdef.h"
#include "sm/qmgrcnf.h"
#include "sm/mcpcnfs.h"
#include "sm/mta.h"
#include "sm/sm-conf-time.h"
#include "sm/sm-conf-byte.h"
#include "sm/mapcnfs.h"

/*
**  Note: the defaults in here are ignored as long as SM_CONF_FLAG_KEEP_DEFAULT
**  is set, which is necessary to avoid zero'ing out the structure.
*/

#if SM_QMGRCNFDEF
#define EXTERN
#else /* SM_QMGRCNFDEF */
#define EXTERN extern
#endif /* SM_QMGRCNFDEF */

#define QMGR_CNF_AQ_SIZE	"AQ_max_entries"
#define QMGR_CNF_OCC_SIZE	"OCC_max_entries"
#define QMGR_CNF_IBDB_SIZE	"size"
#define QMGR_CNF_IQDB_CACHE_SIZE	"max_cache_entries"
#define QMGR_CNF_IQDB_HASH_TABLE_SIZE	"hash_table_entries"
#define QMGR_CNF_MIN_DISK_SPACE	"min_disk_space"
#define QMGR_CNF_OK_DISK_SPACE	"ok_disk_space"
#define QMGR_CNF_MAX_OPEN_TAS	"max_open_TAs"

#define QMGR_CNF_SC_INITIAL_CONNS	"initial_connections"
#define QMGR_CNF_SC_MAX_CONNS		"max_connections"
#define QMGR_CNF_SS_MAX_OPEN_CONNS	"max_connections"
#define QMGR_CNF_SS_MAX_CONN_RATE	"max_connection_rate"
#define QMGR_CNF_SS_CONNCTL_SIZE	"connection_control_hash_table_size"

#define QMGR_CNF_SC_SMTP_RCPTS_TA	"smtp_max_rcpts_per_transaction"
#define QMGR_CNF_SC_LMTP_RCPTS_TA	"lmtp_max_rcpts_per_transaction"

#define QMGR_CNF_MAX_ERRORS_PER_DSN	"max_errors_per_DSN"
#define QMGR_CNF_FLAGS	"flags"
#define QMGR_CNF_IBDB_MAX_COMMIT_DELAY	"max_commit_delay"
#define QMGR_CNF_MIN_DELAY_RETRIES	"retry_min_delay"
#define QMGR_CNF_MAX_DELAY_RETRIES	"retry_max_delay"
#define QMGR_CNF_TMOUT_QUEUERETURN	"queue_return_timeout"
#define QMGR_CNF_TMOUT_QUEUEDELAY	"queue_delay_timeout"
#define QMGR_CNF_TMOUT_AR	"SMAR_timeout"
#define QMGR_CNF_TMOUT_DELIVERY	"delivery_timeout"
#define QMGR_CNF_TMOUT_SCHED	"scheduler_timeout"
#define QMGR_CNF_MAX_DSN_DELAY	"merge_delay_max"
#define QMGR_CNF_WAIT_FOR_SERVER	"wait_for_server"
#define QMGR_CNF_WAIT_FOR_CLIENT	"wait_for_client"
#define QMGR_CNF_LOG_LEVEL	"log_level"
#define QMGR_CNF_DEBUG_LEVEL	"debug_level"
#define QMGR_CNF_TESTS	"tests"
#define QMGR_CNF_MIN_THR	"min_threads"
#define QMGR_CNF_MAX_THR	"max_threads"
#define QMGR_CNF_MAX_FD		"max_fds"

#define QMEDB_CNF_BASEDIR	"base_directory"
#define QMEDB_CNF_LOGDIR	"log_directory"
#define QMEDB_CNF_PAGESIZE	"page_size"
#define QMEDB_CNF_CACHESIZE	"cache_size"
#define QMEDB_CNF_CHKP_KB	"KBytes_written_for_checkpointing"
#define QMEDB_CNF_CHKP_DELAY	"delay_between_2_checkpoints"
#define QMEDB_CNF_FATAL_RCVR	"fatal_recovery"
#define QMEDB_CNF_RM_LOGFILES	"remove_unused_logfiles"

#define QMGR_CNF_SC_LKP_RCPT_CONF "lookup_rcpt_conf"
#define QMGR_CNF_SC_LKP_SE_CONF "lookup_session_conf"

EXTERN
sm_conf_definition_T const
qmgr_flag_names[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "Reuse_connection",	sm_conf_type_choice_value,
	QCNF_FL_SE_REUSE,
	0, NULL, 0, NULL, NULL, NULL,
	"reuse existing connection if possible"
	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_QMGRCNFDEF */
;

EXTERN
sm_conf_definition_T const
qmgr_dsn_flag_names[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "header_only",	sm_conf_type_choice_value,
	QCNF_FL_B_HDR,
	0, NULL, 0, NULL, NULL, NULL,
	"send only headers in a DSN"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, "MIME_format",	sm_conf_type_choice_value,
	QCNF_FL_B_DSN_MIME,
	0, NULL, 0, NULL, NULL, NULL,
	"send DSN in MIME format"
	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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T
qmgr_dsn_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMGR_CNF_MAX_ERRORS_PER_DSN,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_dsn_rcpts_max),	sizeof(uint),
	SM_XSTR(AQR_DSN_RCPTS_MAX),	0,	NULL,	NULL,	NULL,
	"maximum number of error messages (failed recipients) in a bounce (DSN)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_MAX_DSN_DELAY,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_t_sched_dsn),	sizeof(uint),
	SM_XSTR(QM_TMO_SCHED_DSN),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum time to wait for merging multiple DSNs into one"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_FLAGS,			sm_conf_type_choice,
	offsetof(qmgr_cnf_T, q_cnf_flags),		sizeof(uint),
	NULL,	SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	qmgr_dsn_flag_names,	NULL,	NULL,
	"flags for DSN handling"
	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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T const
qmgr_edb_flag_names[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMEDB_CNF_FATAL_RCVR,	sm_conf_type_choice_value,
	EDB_OPEN_RECOVER_FATAL,
	0, NULL, 0, NULL, NULL, NULL, "perform fatal recovery"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMEDB_CNF_RM_LOGFILES,	sm_conf_type_choice_value,
	EDB_LOG_AUTOREMOVE,
	0, NULL, 0, NULL, NULL, NULL,
	"automatically remove unused logfiles"
	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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T
qmgr_edb_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMEDB_CNF_BASEDIR,	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_basedir),	0,
	NULL,	0,	NULL,	NULL,	NULL,
	"Home directory for DEFEDB"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMEDB_CNF_LOGDIR,	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_logdir),	0,
	NULL,	0,	NULL,	NULL,	NULL,
	"Log directory for DEFEDB"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMEDB_CNF_PAGESIZE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_pagesize),
	sizeof(uint),
	NULL,	0,	sm_conf_byte_suffixes,	NULL,	NULL,
	"DB page size"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMEDB_CNF_CACHESIZE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_cachesize),
	sizeof(uint),
	SM_XSTR(EDB_CACHE_DFLT), 0,	sm_conf_byte_suffixes,	NULL,	NULL,
	"DB cache size"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMEDB_CNF_CHKP_KB,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_chkpt_kb),
	sizeof(uint32_t),
	NULL,	0,	sm_conf_Kbyte_suffixes,	NULL,	NULL,
	"If non-zero, a checkpoint will be done if more than the amount of"
	" KBytes of log data have been written since the last checkpoint"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMEDB_CNF_CHKP_DELAY,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_chkpt_delay),
	sizeof(uint32_t),
	SM_XSTR(EDB_SWEEP_DELAY), 0,	sm_conf_time_suffixes,	NULL,	NULL,
	"Minimum delay between two checkpoints"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_FLAGS,			sm_conf_type_choice,
	offsetof(qmgr_cnf_T, q_cnf_edb_cnf.edbcnf_oflags),	sizeof(uint),
	NULL,	SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	qmgr_edb_flag_names,	NULL,	NULL,
	"flags for DEFEDB"
	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_QMGRCNFDEF */
;

EXTERN
sm_conf_definition_T
qmgr_ibdb_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMGR_CNF_IBDB_SIZE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_ibdb_size),	sizeof(uint),
	SM_XSTR(IBDB_SIZE),	0,	sm_conf_byte_suffixes,
	NULL,	NULL,
	"maximum size of each IBDB file"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_MAX_OPEN_TAS,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_optas),		sizeof(uint),
	SM_XSTR(IBDB_OPEN_TAS),	0,	NULL,	NULL,	NULL,
	"maximum number of open transactions in IBDB before a commit is performed"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_IBDB_MAX_COMMIT_DELAY,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_ibdb_delay),	sizeof(uint),
	SM_XSTR(IBDB_DELAY),	0,	NULL,	NULL,	NULL,
	"maximum time between commits to IBDB (micro seconds)"
	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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T const
qmgr_sc_flag_names[]
#if SM_QMGRCNFDEF
=
{
#if MTA_USE_TLS
{ SM_CONF_DEF_MAGIC,
	QMGR_CNF_SC_LKP_RCPT_CONF,			sm_conf_type_choice_value,
	QCNF_FL_SC_LKP_RCPT_CONF,
	0, NULL, 0, NULL, NULL, NULL,
	"lookup recipient configuration data in access map"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC,
	QMGR_CNF_SC_LKP_SE_CONF,			sm_conf_type_choice_value,
	QCNF_FL_SC_LKP_SE_CONF,
	0, NULL, 0, NULL, NULL, NULL,
	"lookup session configuration data in qmgr_conf 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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T const
qmgr_smtpc_lfl_names[]
#if SM_QMGRCNFDEF
=
{
	MAP_FL_CNF_DEFS,

/* 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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T
qmgr_smtpc_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMGR_CNF_SC_INITIAL_CONNS,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_init_conc_conn),	sizeof(uint),
	SM_XSTR(DA_INIT_CONC_CONN),	0,	NULL,	NULL,	NULL,
	"initial number of outgoing connections to a single host"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_SC_MAX_CONNS,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_conc_conn),	sizeof(uint),
	SM_XSTR(DA_MAX_CONC_CONN),	0,	NULL,	NULL,	NULL,
	"maximum number of outgoing connections to a single host"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_SC_SMTP_RCPTS_TA,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_smtp_rcpts_ta),	sizeof(uint),
	SM_XSTR(DA_MAX_RCPTS_TA),	0,	NULL,	NULL,	NULL,
	"maximum number of recipients per transaction (smtp)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_SC_LMTP_RCPTS_TA,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_lmtp_rcpts_ta),	sizeof(uint),
	SM_XSTR(DA_MAX_RCPTS_TA),	0,	NULL,	NULL,	NULL,
	"maximum number of recipients per transaction (lmtp)"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_FLAGS,			sm_conf_type_choice,
	offsetof(qmgr_cnf_T, q_cnf_flags),		sizeof(uint),
	NULL,	SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	qmgr_sc_flag_names,	NULL,	NULL,
	""
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "rcpt_conf_lookup_flags",			sm_conf_type_choice,
	offsetof(qmgr_cnf_T, q_cnf_sc_lfl),		sizeof(uint32_t),
	NULL,	SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	qmgr_smtpc_lfl_names,	NULL,	NULL,
	""
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

/* 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_QMGRCNFDEF */
;

EXTERN
sm_conf_definition_T
qmgr_smtps_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMGR_CNF_SS_MAX_OPEN_CONNS,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_open_se),	sizeof(uint),
	SM_XSTR(SS_MAX_OPEN_SE),	0,	NULL,	NULL,	NULL,
	"maximum number of open incoming connection from a single host"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_SS_MAX_CONN_RATE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_conn_rate),	sizeof(uint),
	SM_XSTR(SS_MAX_CONN_RATE),	0,	NULL,	NULL,	NULL,
	"maximum incoming connection rate from a single host"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_SS_CONNCTL_SIZE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_ss_cc_size),	sizeof(uint),
	SM_XSTR(SS_CONNCTL_SIZE),	0,	NULL,	NULL,	NULL,
	"size of connection control hash table [experts only]"
	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_QMGRCNFDEF */
;


EXTERN
sm_conf_definition_T
qmgr_iqdb_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMGR_CNF_IQDB_CACHE_SIZE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_iqdb_csize), sizeof(uint),
	SM_XSTR(IQDB_CSIZE),	0,	NULL,	NULL,	NULL,
	"maximum number of entries in IQDB cache"
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },
{ SM_CONF_DEF_MAGIC, QMGR_CNF_IQDB_HASH_TABLE_SIZE,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_iqdb_htsize),	sizeof(uint),
	SM_XSTR(IQDB_HTSIZE),	0,	NULL,	NULL,	NULL,
	"size of hash table for IQDB"
	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_QMGRCNFDEF */
;

EXTERN
sm_conf_definition_T
qmgr_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, QMGR_CNF_AQ_SIZE,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_aq_size),	sizeof(uint),
	SM_XSTR(AQ_SIZE),	0,	NULL,	NULL,	NULL,
	"maximum number of entries in AQ (active queue)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_OCC_SIZE,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_occ_size),	sizeof(uint),
	SM_XSTR(OCC_CSIZE),	0,	NULL,	NULL,	NULL,
	"maximum number of entries in OCC (outgoing connection cache)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "IBDB", sm_conf_type_section,
	0, sizeof(qmgr_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT,
	qmgr_ibdb_defs, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "IQDB", sm_conf_type_section,
	0, sizeof(qmgr_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT,
	qmgr_iqdb_defs, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_MIN_DISK_SPACE,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_min_df),		sizeof(uint),
	SM_XSTR(DISK_MIN_FREE),	0,	sm_conf_Kbyte_suffixes,
	NULL,	NULL,
	"minimum amount of free disk space (KB)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_OK_DISK_SPACE,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_ok_df),		sizeof(uint),
	SM_XSTR(DISK_OK_FREE),	0,	sm_conf_Kbyte_suffixes,
	NULL,	NULL,
	"amount of free disk space at which normal operation continues (KB)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "smtpc", sm_conf_type_section,
	0, sizeof(qmgr_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT,
	qmgr_smtpc_defs, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "smtps", sm_conf_type_section,
	0, sizeof(qmgr_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT,
	qmgr_smtps_defs, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, QMGR_CNF_FLAGS,			sm_conf_type_choice,
	offsetof(qmgr_cnf_T, q_cnf_flags),		sizeof(uint),
	NULL,	SM_CONF_FLAG_MULTIPLE|SM_CONF_FLAG_OR|SM_CONF_FLAG_PLURAL,
	qmgr_flag_names,	NULL,	NULL,
	""
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_MIN_DELAY_RETRIES,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_min_delay),	sizeof(uint),
	SM_XSTR(MIN_DELAY_NXT_TRY),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"minimum time for retrying a delivery"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, QMGR_CNF_MAX_DELAY_RETRIES,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_delay),	sizeof(uint),
	SM_XSTR(MAX_DELAY_NXT_TRY),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum time for retrying a delivery"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_TMOUT_QUEUERETURN,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tmo_return),	sizeof(uint),
	SM_XSTR(QM_TMO_RETURN),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum time in queue"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_TMOUT_QUEUEDELAY,	sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tmo_delay),	sizeof(uint),
	SM_XSTR(QM_TMO_DELAY),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"send delay warning after this time in queue"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_TMOUT_AR,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tmo_ar),	sizeof(uint),
	SM_XSTR(AQR_AR_TMOUT),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"timeout in address resolver"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, QMGR_CNF_TMOUT_DELIVERY,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tmo_da),	sizeof(uint),
	SM_XSTR(AQR_DA_TMOUT),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"timeout for a single delivery attempt"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, QMGR_CNF_TMOUT_SCHED,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tmo_sched),	sizeof(uint),
	SM_XSTR(AQR_SCHED_TMOUT),	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum time waiting to be scheduled"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_WAIT_FOR_SERVER,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_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_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, QMGR_CNF_WAIT_FOR_CLIENT,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_wait4clt),	sizeof(uint),
	"1",	0,	sm_conf_time_suffixes,
	NULL,	NULL,
	"maximum amount of time to wait for a client to become available"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, QMGR_CNF_LOG_LEVEL,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_loglevel),	sizeof(uint),
	SM_XSTR(SM_LOG_LEVEL),	0,	NULL,	NULL,	NULL,
	""
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "log", sm_conf_type_section,
	offsetof(qmgr_cnf_T, q_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_QMGR_CNF_MAGIC)
	},

#if QMGR_DEBUG
{ SM_CONF_DEF_MAGIC, QMGR_CNF_DEBUG_LEVEL,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_debug),	sizeof(uint),
	"0", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
#endif /* QMGR_DEBUG */

#if QMGR_TEST
{ SM_CONF_DEF_MAGIC, QMGR_CNF_TESTS,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tests),	sizeof(uint),
	"0", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "test_total_transactions",		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_tot_tas),	sizeof(uint32_t),
	"5000", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "test_once_transactions",		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_once_tas),	sizeof(uint32_t),
	"100", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "test_max_fill_AQ",		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_fill_aq),	sizeof(uint),
	"80", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "test_fill_rate",		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_fill_rate),	sizeof(uint),
	"1000", 0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

#endif /* QMGR_TEST */

{ SM_CONF_DEF_MAGIC, "DSN_handling",	sm_conf_type_section,
	0, sizeof(qmgr_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT, qmgr_dsn_defs,
	NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "DEFEDB", sm_conf_type_section,
	0, sizeof(edb_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT, qmgr_edb_defs,
	NULL, NULL, NULL
	SM_LC_NO_ISSET	SM_LC_SET_MAGIC(0) },

{ SM_CONF_DEF_MAGIC, "control_socket",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_ctlsock),	0,
	NULL, 0, NULL, NULL, NULL,
	"name of control socket"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "conf",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_confmap_fn),	0,
	"qmgr_conf.db", 0, NULL, NULL, NULL,
	"name of configuration map (including extension)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "double_bounce_address",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_pm_add),	0,
	NULL, 0, NULL, NULL, NULL,
	"full address for double bounces (defaults to <postmaster@HOSTNAME>)"
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, EVTHR_CNF_MIN_THR,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_min_thr),	sizeof(uint),
	SM_XSTR(SM_QMGR_MIN_THR),	0,	NULL,	NULL,	NULL,
	EVTHR_COMM_MIN_THR
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, EVTHR_CNF_MAX_THR,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_thr),	sizeof(uint),
	SM_XSTR(SM_QMGR_MAX_THR),	0,	NULL,	NULL,	NULL,
	EVTHR_COMM_MAX_THR
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, EVTHR_CNF_MAX_FD,		sm_conf_type_u32,
	offsetof(qmgr_cnf_T, q_cnf_max_fd),	sizeof(uint),
	SM_XSTR(SM_QMGR_MAX_FD),	0,	NULL,	NULL,	NULL,
	EVTHR_COMM_MAX_FD
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

	MCP_DEFS(qmgr_cnf_T, q_cnf)

/* 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_QMGRCNFDEF */
;

EXTERN
sm_conf_definition_T
qmgr_global_defs[]
#if SM_QMGRCNFDEF
=
{
{ SM_CONF_DEF_MAGIC, "SMTPC_socket",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_smtpcsock),	0,	smsmtpcsock,
	0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, "SMTPS_socket",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_smtpssock),	0,	smsmtpssock,
	0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, "SMAR_socket",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_smarsock),	0,	smarsock,
	0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, "CDB_base_directory",	sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_cdb_base),	0,	"",
	0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},
{ SM_CONF_DEF_MAGIC, "hostname",		sm_conf_type_string,
	offsetof(qmgr_cnf_T, q_cnf_hostname),	0,	NULL,
	0, NULL, NULL, NULL, NULL
	SM_LC_NO_ISSET
	SM_LC_SET_MAGIC(SM_QMGR_CNF_MAGIC)
	},

{ SM_CONF_DEF_MAGIC, "qmgr", sm_conf_type_section,
	0, sizeof(qmgr_cnf_T), NULL, SM_CONF_FLAG_KEEP_DEFAULT, qmgr_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_QMGRCNFDEF */
;

#undef EXTERN

#endif /* SM_QMGRCNFDEF_H */


syntax highlighted by Code2HTML, v. 0.9.1