1#ifndef _MAIL_CONF_H_INCLUDED_
2#define _MAIL_CONF_H_INCLUDED_
3
4/*++
5/* NAME
6/*	mail_conf 3h
7/* SUMMARY
8/*	global configuration parameter management
9/* SYNOPSIS
10/*	#include <mail_conf.h>
11/* DESCRIPTION
12/* .nf
13
14 /*
15  * Well known names. These are not configurable. One has to start somewhere.
16  */
17#define CONFIG_DICT	"mail_dict"	/* global Postfix dictionary */
18
19 /*
20  * Environment variables.
21  */
22#define CONF_ENV_PATH	"MAIL_CONFIG"	/* config database */
23#define CONF_ENV_VERB	"MAIL_VERBOSE"	/* verbose mode on */
24#define CONF_ENV_DEBUG	"MAIL_DEBUG"	/* live debugging */
25#define CONF_ENV_LOGTAG	"MAIL_LOGTAG"	/* instance name */
26
27 /*
28  * External representation for booleans.
29  */
30#define CONFIG_BOOL_YES	"yes"
31#define CONFIG_BOOL_NO	"no"
32
33 /*
34  * Basic configuration management.
35  */
36extern void mail_conf_read(void);
37extern void mail_conf_suck(void);
38extern void mail_conf_flush(void);
39
40extern void mail_conf_update(const char *, const char *);
41extern const char *mail_conf_lookup(const char *);
42extern const char *mail_conf_eval(const char *);
43extern const char *mail_conf_eval_once(const char *);
44extern const char *mail_conf_lookup_eval(const char *);
45
46 /*
47  * Specific parameter lookup routines.
48  */
49extern char *get_mail_conf_str(const char *, const char *, int, int);
50extern int get_mail_conf_int(const char *, int, int, int);
51extern long get_mail_conf_long(const char *, long, long, long);
52extern int get_mail_conf_bool(const char *, int);
53extern int get_mail_conf_time(const char *, const char *, int, int);
54extern int get_mail_conf_nint(const char *, const char *, int, int);
55extern char *get_mail_conf_raw(const char *, const char *, int, int);
56extern int get_mail_conf_nbool(const char *, const char *);
57
58extern char *get_mail_conf_str2(const char *, const char *, const char *, int, int);
59extern int get_mail_conf_int2(const char *, const char *, int, int, int);
60extern long get_mail_conf_long2(const char *, const char *, long, long, long);
61extern int get_mail_conf_time2(const char *, const char *, int, int, int, int);
62extern int get_mail_conf_nint2(const char *, const char *, int, int, int);
63
64 /*
65  * Lookup with function-call defaults.
66  */
67extern char *get_mail_conf_str_fn(const char *, const char *(*) (void), int, int);
68extern int get_mail_conf_int_fn(const char *, int (*) (void), int, int);
69extern long get_mail_conf_long_fn(const char *, long (*) (void), long, long);
70extern int get_mail_conf_bool_fn(const char *, int (*) (void));
71extern int get_mail_conf_time_fn(const char *, const char *(*) (void), int, int, int);
72extern int get_mail_conf_nint_fn(const char *, const char *(*) (void), int, int);
73extern char *get_mail_conf_raw_fn(const char *, const char *(*) (void), int, int);
74extern int get_mail_conf_nbool_fn(const char *, const char *(*) (void));
75
76 /*
77  * Update dictionary.
78  */
79extern void set_mail_conf_str(const char *, const char *);
80extern void set_mail_conf_int(const char *, int);
81extern void set_mail_conf_long(const char *, long);
82extern void set_mail_conf_bool(const char *, int);
83extern void set_mail_conf_time(const char *, const char *);
84extern void set_mail_conf_time_int(const char *, int);
85extern void set_mail_conf_nint(const char *, const char *);
86extern void set_mail_conf_nint_int(const char *, int);
87extern void set_mail_conf_nbool(const char *, const char *);
88
89#define set_mail_conf_nbool_int(name, value) \
90    set_mail_conf_nbool((name), (value) ? CONFIG_BOOL_YES : CONFIG_BOOL_NO)
91
92 /*
93  * Tables that allow us to selectively copy values from the global
94  * configuration file to global variables.
95  */
96typedef struct {
97    const char *name;			/* config variable name */
98    const char *defval;			/* default value or null */
99    char  **target;			/* pointer to global variable */
100    int     min;			/* min length or zero */
101    int     max;			/* max length or zero */
102} CONFIG_STR_TABLE;
103
104typedef struct {
105    const char *name;			/* config variable name */
106    const char *defval;			/* default value or null */
107    char  **target;			/* pointer to global variable */
108    int     min;			/* min length or zero */
109    int     max;			/* max length or zero */
110} CONFIG_RAW_TABLE;
111
112typedef struct {
113    const char *name;			/* config variable name */
114    int     defval;			/* default value */
115    int    *target;			/* pointer to global variable */
116    int     min;			/* lower bound or zero */
117    int     max;			/* upper bound or zero */
118} CONFIG_INT_TABLE;
119
120typedef struct {
121    const char *name;			/* config variable name */
122    long    defval;			/* default value */
123    long   *target;			/* pointer to global variable */
124    long    min;			/* lower bound or zero */
125    long    max;			/* upper bound or zero */
126} CONFIG_LONG_TABLE;
127
128typedef struct {
129    const char *name;			/* config variable name */
130    int     defval;			/* default value */
131    int    *target;			/* pointer to global variable */
132} CONFIG_BOOL_TABLE;
133
134typedef struct {
135    const char *name;			/* config variable name */
136    const char *defval;			/* default value + default unit */
137    int    *target;			/* pointer to global variable */
138    int     min;			/* lower bound or zero */
139    int     max;			/* upper bound or zero */
140} CONFIG_TIME_TABLE;
141
142typedef struct {
143    const char *name;			/* config variable name */
144    const char *defval;			/* default value + default unit */
145    int    *target;			/* pointer to global variable */
146    int     min;			/* lower bound or zero */
147    int     max;			/* upper bound or zero */
148} CONFIG_NINT_TABLE;
149
150typedef struct {
151    const char *name;			/* config variable name */
152    const char *defval;			/* default value */
153    int    *target;			/* pointer to global variable */
154} CONFIG_NBOOL_TABLE;
155
156extern void get_mail_conf_str_table(const CONFIG_STR_TABLE *);
157extern void get_mail_conf_int_table(const CONFIG_INT_TABLE *);
158extern void get_mail_conf_long_table(const CONFIG_LONG_TABLE *);
159extern void get_mail_conf_bool_table(const CONFIG_BOOL_TABLE *);
160extern void get_mail_conf_time_table(const CONFIG_TIME_TABLE *);
161extern void get_mail_conf_nint_table(const CONFIG_NINT_TABLE *);
162extern void get_mail_conf_raw_table(const CONFIG_RAW_TABLE *);
163extern void get_mail_conf_nbool_table(const CONFIG_NBOOL_TABLE *);
164
165 /*
166  * Tables to initialize parameters from the global configuration file or
167  * from function calls.
168  */
169typedef struct {
170    const char *name;			/* config variable name */
171    const char *(*defval) (void);	/* default value provider */
172    char  **target;			/* pointer to global variable */
173    int     min;			/* lower bound or zero */
174    int     max;			/* upper bound or zero */
175} CONFIG_STR_FN_TABLE;
176
177typedef struct {
178    const char *name;			/* config variable name */
179    const char *(*defval) (void);	/* default value provider */
180    char  **target;			/* pointer to global variable */
181    int     min;			/* lower bound or zero */
182    int     max;			/* upper bound or zero */
183} CONFIG_RAW_FN_TABLE;
184
185typedef struct {
186    const char *name;			/* config variable name */
187    int     (*defval) (void);		/* default value provider */
188    int    *target;			/* pointer to global variable */
189    int     min;			/* lower bound or zero */
190    int     max;			/* upper bound or zero */
191} CONFIG_INT_FN_TABLE;
192
193typedef struct {
194    const char *name;			/* config variable name */
195    long    (*defval) (void);		/* default value provider */
196    long   *target;			/* pointer to global variable */
197    long    min;			/* lower bound or zero */
198    long    max;			/* upper bound or zero */
199} CONFIG_LONG_FN_TABLE;
200
201typedef struct {
202    const char *name;			/* config variable name */
203    int     (*defval) (void);		/* default value provider */
204    int    *target;			/* pointer to global variable */
205} CONFIG_BOOL_FN_TABLE;
206
207typedef struct {
208    const char *name;			/* config variable name */
209    const char *(*defval) (void);	/* default value provider */
210    int    *target;			/* pointer to global variable */
211    int     min;			/* lower bound or zero */
212    int     max;			/* upper bound or zero */
213} CONFIG_NINT_FN_TABLE;
214
215typedef struct {
216    const char *name;			/* config variable name */
217    const char *(*defval) (void);	/* default value provider */
218    int    *target;			/* pointer to global variable */
219} CONFIG_NBOOL_FN_TABLE;
220
221extern void get_mail_conf_str_fn_table(const CONFIG_STR_FN_TABLE *);
222extern void get_mail_conf_int_fn_table(const CONFIG_INT_FN_TABLE *);
223extern void get_mail_conf_long_fn_table(const CONFIG_LONG_FN_TABLE *);
224extern void get_mail_conf_bool_fn_table(const CONFIG_BOOL_FN_TABLE *);
225extern void get_mail_conf_raw_fn_table(const CONFIG_RAW_FN_TABLE *);
226extern void get_mail_conf_nint_fn_table(const CONFIG_NINT_FN_TABLE *);
227extern void get_mail_conf_nbool_fn_table(const CONFIG_NBOOL_FN_TABLE *);
228
229/* LICENSE
230/* .ad
231/* .fi
232/*	The Secure Mailer license must be distributed with this software.
233/* AUTHOR(S)
234/*	Wietse Venema
235/*	IBM T.J. Watson Research
236/*	P.O. Box 704
237/*	Yorktown Heights, NY 10598, USA
238/*--*/
239
240#endif
241