1 /* $NetBSD: postconf_node.c,v 1.2 2017/02/14 01:16:46 christos Exp $ */
2
3 /*++
4 /* NAME
5 /* postconf_node 3
6 /* SUMMARY
7 /* low-level parameter node support
8 /* SYNOPSIS
9 /* #include <postconf.h>
10 /*
11 /* PCF_PARAM_TABLE *PCF_PARAM_TABLE_CREATE(size)
12 /* ssize_t size;
13 /*
14 /* PCF_PARAM_INFO **PCF_PARAM_TABLE_LIST(table)
15 /* PCF_PARAM_TABLE *table;
16 /*
17 /* const char *PCF_PARAM_INFO_NAME(info)
18 /* PCF_PARAM_INFO *info;
19 /*
20 /* PCF_PARAM_NODE *PCF_PARAM_INFO_NODE(info)
21 /* PCF_PARAM_INFO *info;
22 /*
23 /* PCF_PARAM_NODE *PCF_PARAM_TABLE_FIND(table, name)
24 /* PCF_PARAM_TABLE *table;
25 /* const char *name;
26 /*
27 /* PCF_PARAM_INFO *PCF_PARAM_TABLE_LOCATE(table, name)
28 /* PCF_PARAM_TABLE *table;
29 /* const char *name;
30 /*
31 /* PCF_PARAM_INFO *PCF_PARAM_TABLE_ENTER(table, name, flags,
32 /* param_data, convert_fn)
33 /* PCF_PARAM_TABLE *table;
34 /* const char *name;
35 /* int flags;
36 /* void *param_data;
37 /* const char *(*convert_fn)(void *);
38 /*
39 /* PCF_PARAM_NODE *pcf_make_param_node(flags, param_data, convert_fn)
40 /* int flags;
41 /* void *param_data;
42 /* const char *(*convert_fn) (void *);
43 /*
44 /* const char *pcf_convert_param_node(mode, name, node)
45 /* int mode;
46 /* const char *name;
47 /* PCF_PARAM_NODE *node;
48 /*
49 /* VSTRING *pcf_param_string_buf;
50 /*
51 /* PCF_RAW_PARAMETER(node)
52 /* const PCF_PARAM_NODE *node;
53 /* DESCRIPTION
54 /* This module maintains data structures (PCF_PARAM_NODE) with
55 /* information about known-legitimate parameters. These data
56 /* structures are stored in a hash table.
57 /*
58 /* The PCF_PARAM_MUMBLE() macros are wrappers around the
59 /* htable(3) module. Their sole purpose is to encapsulate all
60 /* the pointer casting from and to (PCF_PARAM_NODE *). Apart
61 /* from that, the macros have no features worth discussing.
62 /*
63 /* pcf_make_param_node() creates a node for the global parameter
64 /* table. This node provides a parameter default value, and a
65 /* function that converts the default value to string.
66 /*
67 /* pcf_convert_param_node() produces a string representation
68 /* for a global parameter default value.
69 /*
70 /* PCF_RAW_PARAMETER() returns non-zero if the specified
71 /* parameter node represents a "raw parameter". The value of
72 /* such parameters must not be scanned for macro names. Some
73 /* "raw parameter" values contain "$" without macros, such as
74 /* the smtpd_expansion_filter "safe character" set; and some
75 /* contain $name from a private name space, such as forward_path.
76 /* Some "raw parameter" values in postscreen(8) are safe to
77 /* expand by one level. Support for that may be added later.
78 /*
79 /* pcf_param_string_buf is a buffer that is initialized on the
80 /* fly and that parameter-to-string conversion functions may
81 /* use for temporary result storage.
82 /*
83 /* Arguments:
84 /* .IP size
85 /* The initial size of the hash table.
86 /* .IP table
87 /* A hash table for storage of "valid parameter" information.
88 /* .IP info
89 /* A data structure with a name component and a PCF_PARAM_NODE
90 /* component. Use PCF_PARAM_INFO_NAME() and PCF_PARAM_INFO_NODE()
91 /* to access these components.
92 /* .IP name
93 /* The name of a "valid parameter".
94 /* .IP flags
95 /* PCF_PARAM_FLAG_RAW for a "raw parameter", PCF_PARAM_FLAG_NONE
96 /* otherwise. See the PCF_RAW_PARAMETER() discussion above for
97 /* discussion of "raw parameter" values.
98 /* .IP param_data
99 /* Information about the parameter value. Specify PCF_PARAM_NO_DATA
100 /* if this is not applicable.
101 /* .IP convert_fn
102 /* The function that will be invoked to produce a string
103 /* representation of the information in param_data. The function
104 /* receives the param_data value as argument.
105 /* .IP mode
106 /* For now, the PCF_SHOW_DEFS flag is required.
107 /* .IP name
108 /* The name of the parameter whose value is requested. This
109 /* is used for diagnostics.
110 /* .IP node
111 /* The (flags, param_data, convert_fn) information that needs
112 /* to be converted to a string representation of the default
113 /* value.
114 /* DIAGNOSTICS
115 /* Problems are reported to the standard error stream.
116 /* LICENSE
117 /* .ad
118 /* .fi
119 /* The Secure Mailer license must be distributed with this software.
120 /* AUTHOR(S)
121 /* Wietse Venema
122 /* IBM T.J. Watson Research
123 /* P.O. Box 704
124 /* Yorktown Heights, NY 10598, USA
125 /*--*/
126
127
128 /* System library. */
129
130 #include <sys_defs.h>
131
132 /* Utility library. */
133
134 #include <msg.h>
135 #include <mymalloc.h>
136 #include <vstring.h>
137
138 /* Application-specific. */
139
140 #include <postconf.h>
141
142 VSTRING *pcf_param_string_buf;
143
144 /* pcf_make_param_node - make node for global parameter table */
145
pcf_make_param_node(int flags,void * param_data,const char * (* convert_fn)(void *))146 PCF_PARAM_NODE *pcf_make_param_node(int flags, void *param_data,
147 const char *(*convert_fn) (void *))
148 {
149 PCF_PARAM_NODE *node;
150
151 node = (PCF_PARAM_NODE *) mymalloc(sizeof(*node));
152 node->flags = flags;
153 node->param_data = param_data;
154 node->convert_fn = convert_fn;
155 return (node);
156 }
157
158 /* pcf_convert_param_node - get default parameter value */
159
pcf_convert_param_node(int mode,const char * name,PCF_PARAM_NODE * node)160 const char *pcf_convert_param_node(int mode, const char *name, PCF_PARAM_NODE *node)
161 {
162 const char *myname = "pcf_convert_param_node";
163 const char *value;
164
165 /*
166 * One-off initialization.
167 */
168 if (pcf_param_string_buf == 0)
169 pcf_param_string_buf = vstring_alloc(100);
170
171 /*
172 * Sanity check. A null value indicates that a parameter does not have
173 * the requested value. At this time, the only requested value can be the
174 * default value, and a null pointer value makes no sense here.
175 */
176 if ((mode & PCF_SHOW_DEFS) == 0)
177 msg_panic("%s: request for non-default value of parameter %s",
178 myname, name);
179 if ((value = node->convert_fn(node->param_data)) == 0)
180 msg_panic("%s: parameter %s has null pointer default value",
181 myname, name);
182
183 /*
184 * Return the parameter default value.
185 */
186 return (value);
187 }
188