5
/* built-in parameter support
7
/* #include <postconf.h>
9
/* void register_builtin_parameters()
11
/* register_builtin_parameters() initializes the global parameter
12
/* name space and adds all built-in parameter information.
14
/* Problems are reported to the standard error stream.
18
/* The Secure Mailer license must be distributed with this software.
21
/* IBM T.J. Watson Research
23
/* Yorktown Heights, NY 10598, USA
35
/* Utility library. */
41
#include <get_hostname.h>
42
#include <stringops.h>
46
#include <mynetworks.h>
47
#include <mail_conf.h>
48
#include <mail_params.h>
49
#include <mail_version.h>
50
#include <mail_proto.h>
51
#include <mail_addr.h>
52
#include <inet_proto.h>
53
#include <server_acl.h>
55
/* Application-specific. */
60
* Support for built-in parameters: declarations generated by scanning
61
* actual C source files.
63
#include "time_vars.h"
64
#include "bool_vars.h"
68
#include "nint_vars.h"
69
#include "nbool_vars.h"
70
#include "long_vars.h"
73
* Support for built-in parameters: manually extracted.
75
#include "install_vars.h"
78
* Support for built-in parameters: lookup tables generated by scanning
79
* actual C source files.
81
static const CONFIG_TIME_TABLE time_table[] = {
82
#include "time_table.h"
86
static const CONFIG_BOOL_TABLE bool_table[] = {
87
#include "bool_table.h"
91
static const CONFIG_INT_TABLE int_table[] = {
92
#include "int_table.h"
96
static const CONFIG_STR_TABLE str_table[] = {
97
#include "str_table.h"
98
#include "install_table.h"
102
static const CONFIG_RAW_TABLE raw_table[] = {
103
#include "raw_table.h"
107
static const CONFIG_NINT_TABLE nint_table[] = {
108
#include "nint_table.h"
112
static const CONFIG_NBOOL_TABLE nbool_table[] = {
113
#include "nbool_table.h"
117
static const CONFIG_LONG_TABLE long_table[] = {
118
#include "long_table.h"
123
* Parameters with default values obtained via function calls.
125
char *var_myhostname;
127
char *var_mynetworks;
129
static const char *check_myhostname(void);
130
static const char *check_mydomainname(void);
131
static const char *check_mynetworks(void);
133
static const CONFIG_STR_FN_TABLE str_fn_table[] = {
134
VAR_MYHOSTNAME, check_myhostname, &var_myhostname, 1, 0,
135
VAR_MYDOMAIN, check_mydomainname, &var_mydomain, 1, 0,
138
static const CONFIG_STR_FN_TABLE str_fn_table_2[] = {
139
VAR_MYNETWORKS, check_mynetworks, &var_mynetworks, 1, 0,
143
#define STR(x) vstring_str(x)
145
/* check_myhostname - lookup hostname and validate */
147
static const char *check_myhostname(void)
149
static const char *name;
160
* If the local machine name is not in FQDN form, try to append the
161
* contents of $mydomain.
163
name = get_hostname();
164
if ((dot = strchr(name, '.')) == 0) {
165
if ((domain = mail_conf_lookup_eval(VAR_MYDOMAIN)) == 0)
166
domain = DEF_MYDOMAIN;
167
name = concatenate(name, ".", domain, (char *) 0);
172
/* get_myhostname - look up and store my hostname */
174
static void get_myhostname(void)
178
if ((name = mail_conf_lookup_eval(VAR_MYHOSTNAME)) == 0)
179
name = check_myhostname();
180
var_myhostname = mystrdup(name);
183
/* check_mydomainname - lookup domain name and validate */
185
static const char *check_mydomainname(void)
190
* Use the hostname when it is not a FQDN ("foo"), or when the hostname
191
* actually is a domain name ("foo.com").
193
if (var_myhostname == 0)
195
if ((dot = strchr(var_myhostname, '.')) == 0 || strchr(dot + 1, '.') == 0)
196
return (DEF_MYDOMAIN);
200
/* check_mynetworks - lookup network address list */
202
static const char *check_mynetworks(void)
204
INET_PROTO_INFO *proto_info;
207
if (var_inet_interfaces == 0) {
208
if ((cmd_mode & SHOW_DEFS)
209
|| (junk = mail_conf_lookup_eval(VAR_INET_INTERFACES)) == 0)
210
junk = DEF_INET_INTERFACES;
211
var_inet_interfaces = mystrdup(junk);
213
if (var_mynetworks_style == 0) {
214
if ((cmd_mode & SHOW_DEFS)
215
|| (junk = mail_conf_lookup_eval(VAR_MYNETWORKS_STYLE)) == 0)
216
junk = DEF_MYNETWORKS_STYLE;
217
var_mynetworks_style = mystrdup(junk);
219
if (var_inet_protocols == 0) {
220
if ((cmd_mode & SHOW_DEFS)
221
|| (junk = mail_conf_lookup_eval(VAR_INET_PROTOCOLS)) == 0)
222
junk = DEF_INET_PROTOCOLS;
223
var_inet_protocols = mystrdup(junk);
224
proto_info = inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
226
return (mynetworks());
229
/* convert_bool_parameter - get boolean parameter string value */
231
static const char *convert_bool_parameter(char *ptr)
233
CONFIG_BOOL_TABLE *cbt = (CONFIG_BOOL_TABLE *) ptr;
235
return (cbt->defval ? "yes" : "no");
238
/* convert_time_parameter - get relative time parameter string value */
240
static const char *convert_time_parameter(char *ptr)
242
CONFIG_TIME_TABLE *ctt = (CONFIG_TIME_TABLE *) ptr;
244
return (ctt->defval);
247
/* convert_int_parameter - get integer parameter string value */
249
static const char *convert_int_parameter(char *ptr)
251
CONFIG_INT_TABLE *cit = (CONFIG_INT_TABLE *) ptr;
253
return (STR(vstring_sprintf(param_string_buf, "%d", cit->defval)));
256
/* convert_str_parameter - get string parameter string value */
258
static const char *convert_str_parameter(char *ptr)
260
CONFIG_STR_TABLE *cst = (CONFIG_STR_TABLE *) ptr;
262
return (cst->defval);
265
/* convert_str_fn_parameter - get string-function parameter string value */
267
static const char *convert_str_fn_parameter(char *ptr)
269
CONFIG_STR_FN_TABLE *cft = (CONFIG_STR_FN_TABLE *) ptr;
271
return (cft->defval());
274
/* convert_raw_parameter - get raw string parameter string value */
276
static const char *convert_raw_parameter(char *ptr)
278
CONFIG_RAW_TABLE *rst = (CONFIG_RAW_TABLE *) ptr;
280
return (rst->defval);
283
/* convert_nint_parameter - get new integer parameter string value */
285
static const char *convert_nint_parameter(char *ptr)
287
CONFIG_NINT_TABLE *rst = (CONFIG_NINT_TABLE *) ptr;
289
return (rst->defval);
292
/* convert_nbool_parameter - get new boolean parameter string value */
294
static const char *convert_nbool_parameter(char *ptr)
296
CONFIG_NBOOL_TABLE *bst = (CONFIG_NBOOL_TABLE *) ptr;
298
return (bst->defval);
301
/* convert_long_parameter - get long parameter string value */
303
static const char *convert_long_parameter(char *ptr)
305
CONFIG_LONG_TABLE *clt = (CONFIG_LONG_TABLE *) ptr;
307
return (STR(vstring_sprintf(param_string_buf, "%ld", clt->defval)));
310
/* register_builtin_parameters - add built-ins to the global name space */
312
void register_builtin_parameters(void)
314
const char *myname = "register_builtin_parameters";
315
const CONFIG_TIME_TABLE *ctt;
316
const CONFIG_BOOL_TABLE *cbt;
317
const CONFIG_INT_TABLE *cit;
318
const CONFIG_STR_TABLE *cst;
319
const CONFIG_STR_FN_TABLE *cft;
320
const CONFIG_RAW_TABLE *rst;
321
const CONFIG_NINT_TABLE *nst;
322
const CONFIG_NBOOL_TABLE *bst;
323
const CONFIG_LONG_TABLE *lst;
328
if (param_table != 0)
329
msg_panic("%s: global parameter table is already initialized", myname);
332
* Initialize the global parameter table.
334
param_table = PC_PARAM_TABLE_CREATE(100);
337
* Add the built-in parameters to the global name space. The class
338
* (built-in) is tentative; some parameters are actually service-defined,
339
* but they have their own default value.
341
for (ctt = time_table; ctt->name; ctt++)
342
PC_PARAM_TABLE_ENTER(param_table, ctt->name, PC_PARAM_FLAG_BUILTIN,
343
(char *) ctt, convert_time_parameter);
344
for (cbt = bool_table; cbt->name; cbt++)
345
PC_PARAM_TABLE_ENTER(param_table, cbt->name, PC_PARAM_FLAG_BUILTIN,
346
(char *) cbt, convert_bool_parameter);
347
for (cit = int_table; cit->name; cit++)
348
PC_PARAM_TABLE_ENTER(param_table, cit->name, PC_PARAM_FLAG_BUILTIN,
349
(char *) cit, convert_int_parameter);
350
for (cst = str_table; cst->name; cst++)
351
PC_PARAM_TABLE_ENTER(param_table, cst->name, PC_PARAM_FLAG_BUILTIN,
352
(char *) cst, convert_str_parameter);
353
for (cft = str_fn_table; cft->name; cft++)
354
PC_PARAM_TABLE_ENTER(param_table, cft->name, PC_PARAM_FLAG_BUILTIN,
355
(char *) cft, convert_str_fn_parameter);
356
for (cft = str_fn_table_2; cft->name; cft++)
357
PC_PARAM_TABLE_ENTER(param_table, cft->name, PC_PARAM_FLAG_BUILTIN,
358
(char *) cft, convert_str_fn_parameter);
359
for (rst = raw_table; rst->name; rst++)
360
PC_PARAM_TABLE_ENTER(param_table, rst->name,
361
PC_PARAM_FLAG_BUILTIN | PC_PARAM_FLAG_RAW,
362
(char *) rst, convert_raw_parameter);
363
for (nst = nint_table; nst->name; nst++)
364
PC_PARAM_TABLE_ENTER(param_table, nst->name, PC_PARAM_FLAG_BUILTIN,
365
(char *) nst, convert_nint_parameter);
366
for (bst = nbool_table; bst->name; bst++)
367
PC_PARAM_TABLE_ENTER(param_table, bst->name, PC_PARAM_FLAG_BUILTIN,
368
(char *) bst, convert_nbool_parameter);
369
for (lst = long_table; lst->name; lst++)
370
PC_PARAM_TABLE_ENTER(param_table, lst->name, PC_PARAM_FLAG_BUILTIN,
371
(char *) lst, convert_long_parameter);