7 /* Postfix address rewriting and resolving daemon
9 /* \fBtrivial-rewrite\fR [generic Postfix daemon options]
11 /* The \fBtrivial-rewrite\fR(8) daemon processes three types of client
13 /* .IP "\fBrewrite \fIcontext address\fR"
14 /* Rewrite an address to standard form, according to the
15 /* address rewriting context:
18 /* Append the domain names specified with \fB$myorigin\fR or
19 /* \fB$mydomain\fR to incomplete addresses; do \fBswap_bangpath\fR
20 /* and \fBallow_percent_hack\fR processing as described below, and
21 /* strip source routed addresses (\fI@site,@site:user@domain\fR)
22 /* to \fIuser@domain\fR form.
24 /* Append the domain name specified with
25 /* \fB$remote_header_rewrite_domain\fR to incomplete
26 /* addresses. Otherwise the result is identical to that of
27 /* the \fBlocal\fR address rewriting context. This prevents
28 /* Postfix from appending the local domain to spam from poorly
29 /* written remote clients.
31 /* .IP "\fBresolve \fIsender\fR \fIaddress\fR"
32 /* Resolve the address to a (\fItransport\fR, \fInexthop\fR,
33 /* \fIrecipient\fR, \fIflags\fR) quadruple. The meaning of
34 /* the results is as follows:
36 /* .IP \fItransport\fR
37 /* The delivery agent to use. This is the first field of an entry
38 /* in the \fBmaster.cf\fR file.
40 /* The host to send to and optional delivery method information.
41 /* .IP \fIrecipient\fR
42 /* The envelope recipient address that is passed on to \fInexthop\fR.
44 /* The address class, whether the address requires relaying,
45 /* whether the address has problems, and whether the request failed.
47 /* .IP "\fBverify \fIsender\fR \fIaddress\fR"
48 /* Resolve the address for address verification purposes.
49 /* SERVER PROCESS MANAGEMENT
52 /* The \fBtrivial-rewrite\fR(8) servers run under control by
54 /* server. Each server can handle multiple simultaneous connections.
55 /* When all servers are busy while a client connects, the master
56 /* creates a new server process, provided that the trivial-rewrite
57 /* server process limit is not exceeded.
58 /* Each trivial-rewrite server terminates after
59 /* serving at least \fB$max_use\fR clients of after \fB$max_idle\fR
60 /* seconds of idle time.
64 /* None. The command does not interact with the outside world.
68 /* The \fBtrivial-rewrite\fR(8) daemon is not security sensitive.
69 /* By default, this daemon does not talk to remote or local users.
70 /* It can run at a fixed low privilege in a chrooted environment.
72 /* Problems and transactions are logged to \fBsyslogd\fR(8).
73 /* CONFIGURATION PARAMETERS
76 /* On busy mail systems a long time may pass before a \fBmain.cf\fR
77 /* change affecting \fBtrivial-rewrite\fR(8) is picked up. Use the command
78 /* "\fBpostfix reload\fR" to speed up a change.
80 /* The text below provides only a parameter summary. See
81 /* \fBpostconf\fR(5) for more details including examples.
82 /* COMPATIBILITY CONTROLS
85 /* .IP "\fBresolve_dequoted_address (yes)\fR"
86 /* Resolve a recipient address safely instead of correctly, by
87 /* looking inside quotes.
88 /* .IP "\fBresolve_null_domain (no)\fR"
89 /* Resolve an address that ends in the "@" null domain as if the
90 /* local hostname were specified, instead of rejecting the address as
92 /* .IP "\fBresolve_numeric_domain (no)\fR"
93 /* Resolve "user@ipaddress" as "user@[ipaddress]", instead of
94 /* rejecting the address as invalid.
96 /* Available with Postfix version 2.5 and later:
97 /* .IP "\fBallow_min_user (no)\fR"
98 /* Allow a sender or recipient address to have `-' as the first
100 /* ADDRESS REWRITING CONTROLS
103 /* .IP "\fBmyorigin ($myhostname)\fR"
104 /* The domain name that locally-posted mail appears to come
105 /* from, and that locally posted mail is delivered to.
106 /* .IP "\fBallow_percent_hack (yes)\fR"
107 /* Enable the rewriting of the form "user%domain" to "user@domain".
108 /* .IP "\fBappend_at_myorigin (yes)\fR"
109 /* With locally submitted mail, append the string "@$myorigin" to mail
110 /* addresses without domain information.
111 /* .IP "\fBappend_dot_mydomain (yes)\fR"
112 /* With locally submitted mail, append the string ".$mydomain" to
113 /* addresses that have no ".domain" information.
114 /* .IP "\fBrecipient_delimiter (empty)\fR"
115 /* The separator between user names and address extensions (user+foo).
116 /* .IP "\fBswap_bangpath (yes)\fR"
117 /* Enable the rewriting of "site!user" into "user@site".
119 /* Available in Postfix 2.2 and later:
120 /* .IP "\fBremote_header_rewrite_domain (empty)\fR"
121 /* Don't rewrite message headers from remote clients at all when
122 /* this parameter is empty; otherwise, rewrite message headers and
123 /* append the specified domain name to incomplete addresses.
127 /* The following is applicable to Postfix version 2.0 and later.
128 /* Earlier versions do not have support for: virtual_transport,
129 /* relay_transport, virtual_alias_domains, virtual_mailbox_domains
130 /* or proxy_interfaces.
131 /* .IP "\fBlocal_transport (local:$myhostname)\fR"
132 /* The default mail delivery transport and next-hop destination
133 /* for final delivery to domains listed with mydestination, and for
134 /* [ipaddress] destinations that match $inet_interfaces or $proxy_interfaces.
135 /* .IP "\fBvirtual_transport (virtual)\fR"
136 /* The default mail delivery transport and next-hop destination for
137 /* final delivery to domains listed with $virtual_mailbox_domains.
138 /* .IP "\fBrelay_transport (relay)\fR"
139 /* The default mail delivery transport and next-hop destination for
140 /* remote delivery to domains listed with $relay_domains.
141 /* .IP "\fBdefault_transport (smtp)\fR"
142 /* The default mail delivery transport and next-hop destination for
143 /* destinations that do not match $mydestination, $inet_interfaces,
144 /* $proxy_interfaces, $virtual_alias_domains, $virtual_mailbox_domains,
145 /* or $relay_domains.
146 /* .IP "\fBparent_domain_matches_subdomains (see 'postconf -d' output)\fR"
147 /* What Postfix features match subdomains of "domain.tld" automatically,
148 /* instead of requiring an explicit ".domain.tld" pattern.
149 /* .IP "\fBrelayhost (empty)\fR"
150 /* The next-hop destination of non-local mail; overrides non-local
151 /* domains in recipient addresses.
152 /* .IP "\fBtransport_maps (empty)\fR"
153 /* Optional lookup tables with mappings from recipient address to
154 /* (message delivery transport, next-hop destination).
156 /* Available in Postfix version 2.3 and later:
157 /* .IP "\fBsender_dependent_relayhost_maps (empty)\fR"
158 /* A sender-dependent override for the global relayhost parameter
161 /* Available in Postfix version 2.5 and later:
162 /* .IP "\fBempty_address_relayhost_maps_lookup_key (<>)\fR"
163 /* The sender_dependent_relayhost_maps search string that will be
164 /* used instead of the null sender address.
165 /* ADDRESS VERIFICATION CONTROLS
168 /* Postfix version 2.1 introduces sender and recipient address verification.
169 /* This feature is implemented by sending probe email messages that
170 /* are not actually delivered.
171 /* By default, address verification probes use the same route
172 /* as regular mail. To override specific aspects of message
173 /* routing for address verification probes, specify one or more
175 /* .IP "\fBaddress_verify_local_transport ($local_transport)\fR"
176 /* Overrides the local_transport parameter setting for address
177 /* verification probes.
178 /* .IP "\fBaddress_verify_virtual_transport ($virtual_transport)\fR"
179 /* Overrides the virtual_transport parameter setting for address
180 /* verification probes.
181 /* .IP "\fBaddress_verify_relay_transport ($relay_transport)\fR"
182 /* Overrides the relay_transport parameter setting for address
183 /* verification probes.
184 /* .IP "\fBaddress_verify_default_transport ($default_transport)\fR"
185 /* Overrides the default_transport parameter setting for address
186 /* verification probes.
187 /* .IP "\fBaddress_verify_relayhost ($relayhost)\fR"
188 /* Overrides the relayhost parameter setting for address verification
190 /* .IP "\fBaddress_verify_transport_maps ($transport_maps)\fR"
191 /* Overrides the transport_maps parameter setting for address verification
194 /* Available in Postfix version 2.3 and later:
195 /* .IP "\fBaddress_verify_sender_dependent_relayhost_maps ($sender_dependent_relayhost_maps)\fR"
196 /* Overrides the sender_dependent_relayhost_maps parameter setting for address
197 /* verification probes.
198 /* MISCELLANEOUS CONTROLS
201 /* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
202 /* The default location of the Postfix main.cf and master.cf
203 /* configuration files.
204 /* .IP "\fBdaemon_timeout (18000s)\fR"
205 /* How much time a Postfix daemon process may take to handle a
206 /* request before it is terminated by a built-in watchdog timer.
207 /* .IP "\fBempty_address_recipient (MAILER-DAEMON)\fR"
208 /* The recipient of mail addressed to the null address.
209 /* .IP "\fBipc_timeout (3600s)\fR"
210 /* The time limit for sending or receiving information over an internal
211 /* communication channel.
212 /* .IP "\fBmax_idle (100s)\fR"
213 /* The maximum amount of time that an idle Postfix daemon process waits
214 /* for an incoming connection before terminating voluntarily.
215 /* .IP "\fBmax_use (100)\fR"
216 /* The maximal number of incoming connections that a Postfix daemon
217 /* process will service before terminating voluntarily.
218 /* .IP "\fBrelocated_maps (empty)\fR"
219 /* Optional lookup tables with new contact information for users or
220 /* domains that no longer exist.
221 /* .IP "\fBprocess_id (read-only)\fR"
222 /* The process ID of a Postfix command or daemon process.
223 /* .IP "\fBprocess_name (read-only)\fR"
224 /* The process name of a Postfix command or daemon process.
225 /* .IP "\fBqueue_directory (see 'postconf -d' output)\fR"
226 /* The location of the Postfix top-level queue directory.
227 /* .IP "\fBshow_user_unknown_table_name (yes)\fR"
228 /* Display the name of the recipient table in the "User unknown"
230 /* .IP "\fBsyslog_facility (mail)\fR"
231 /* The syslog facility of Postfix logging.
232 /* .IP "\fBsyslog_name (see 'postconf -d' output)\fR"
233 /* The mail system name that is prepended to the process name in syslog
234 /* records, so that "smtpd" becomes, for example, "postfix/smtpd".
236 /* Available in Postfix version 2.0 and later:
237 /* .IP "\fBhelpful_warnings (yes)\fR"
238 /* Log warnings about problematic configuration settings, and provide
239 /* helpful suggestions.
241 /* postconf(5), configuration parameters
242 /* transport(5), transport table format
243 /* relocated(5), format of the "user has moved" table
244 /* master(8), process manager
245 /* syslogd(8), system logging
249 /* Use "\fBpostconf readme_directory\fR" or
250 /* "\fBpostconf html_directory\fR" to locate this information.
253 /* ADDRESS_CLASS_README, Postfix address classes howto
254 /* ADDRESS_VERIFICATION_README, Postfix address verification
258 /* The Secure Mailer license must be distributed with this software.
261 /* IBM T.J. Watson Research
263 /* Yorktown Heights, NY 10598, USA
266 /* System library. */
268 #include <sys_defs.h>
273 /* Utility library. */
278 #include <vstring_vstream.h>
279 #include <split_at.h>
280 #include <stringops.h>
284 /* Global library. */
286 #include <mail_params.h>
287 #include <mail_version.h>
288 #include <mail_proto.h>
289 #include <resolve_local.h>
290 #include <mail_conf.h>
291 #include <resolve_clnt.h>
292 #include <rewrite_clnt.h>
294 #include <mail_addr.h>
296 /* Multi server skeleton. */
298 #include <mail_server.h>
300 /* Application-specific. */
302 #include <trivial-rewrite.h>
303 #include <transport.h>
305 static VSTRING
*command
;
308 * Tunable parameters.
310 char *var_transport_maps
;
311 bool var_swap_bangpath
;
312 bool var_append_dot_mydomain
;
313 bool var_append_at_myorigin
;
314 bool var_percent_hack
;
315 char *var_local_transport
;
316 char *var_virt_transport
;
317 char *var_relay_transport
;
318 int var_resolve_dequoted
;
319 char *var_virt_alias_maps
; /* XXX virtual_alias_domains */
320 char *var_virt_mailbox_maps
; /* XXX virtual_mailbox_domains */
321 char *var_virt_alias_doms
;
322 char *var_virt_mailbox_doms
;
323 char *var_relocated_maps
;
324 char *var_def_transport
;
325 char *var_empty_addr
;
326 int var_show_unk_rcpt_table
;
327 int var_resolve_nulldom
;
328 char *var_remote_rwr_domain
;
329 char *var_snd_relay_maps
;
330 char *var_null_relay_maps_key
;
331 int var_resolve_num_dom
;
332 bool var_allow_min_user
;
335 * Shadow personality for address verification.
337 char *var_vrfy_xport_maps
;
338 char *var_vrfy_local_xport
;
339 char *var_vrfy_virt_xport
;
340 char *var_vrfy_relay_xport
;
341 char *var_vrfy_def_xport
;
342 char *var_vrfy_relayhost
;
343 char *var_vrfy_relay_maps
;
346 * Different resolver personalities depending on the kind of request.
348 RES_CONTEXT resolve_regular
= {
349 VAR_LOCAL_TRANSPORT
, &var_local_transport
,
350 VAR_VIRT_TRANSPORT
, &var_virt_transport
,
351 VAR_RELAY_TRANSPORT
, &var_relay_transport
,
352 VAR_DEF_TRANSPORT
, &var_def_transport
,
353 VAR_RELAYHOST
, &var_relayhost
,
354 VAR_SND_RELAY_MAPS
, &var_snd_relay_maps
, 0,
355 VAR_TRANSPORT_MAPS
, &var_transport_maps
, 0
358 RES_CONTEXT resolve_verify
= {
359 VAR_VRFY_LOCAL_XPORT
, &var_vrfy_local_xport
,
360 VAR_VRFY_VIRT_XPORT
, &var_vrfy_virt_xport
,
361 VAR_VRFY_RELAY_XPORT
, &var_vrfy_relay_xport
,
362 VAR_VRFY_DEF_XPORT
, &var_vrfy_def_xport
,
363 VAR_VRFY_RELAYHOST
, &var_vrfy_relayhost
,
364 VAR_VRFY_RELAY_MAPS
, &var_vrfy_relay_maps
, 0,
365 VAR_VRFY_XPORT_MAPS
, &var_vrfy_xport_maps
, 0
369 * Connection management. When file-based lookup tables change we should
370 * restart at our convenience, but avoid client read errors. We restart
371 * rather than reopen, because the process may be chrooted (and if it isn't
372 * we still need code that handles the chrooted case anyway).
374 * Three variants are implemented. Only one should be used.
376 * ifdef DETACH_AND_ASK_CLIENTS_TO_RECONNECT
378 * This code detaches the trivial-rewrite process from the master, stops
379 * accepting new clients, and handles established clients in the background,
380 * asking them to reconnect the next time they send a request. The master
381 * creates a new process that accepts connections. This is reasonably safe
382 * because the number of trivial-rewrite server processes is small compared
383 * to the number of trivial-rewrite client processes. The few extra
384 * background processes should not make a difference in Postfix's footprint.
385 * However, once a daemon detaches from the master, its exit status will be
386 * lost, and abnormal termination may remain undetected. Timely restart is
387 * achieved by checking the table changed status every 10 seconds or so
388 * before responding to a client request.
390 * ifdef CHECK_TABLE_STATS_PERIODICALLY
392 * This code runs every 10 seconds and terminates the process when lookup
393 * tables have changed. This is subject to race conditions when established
394 * clients send a request while the server exits; those clients may read EOF
395 * instead of a server reply. If the experience with the oldest option
396 * (below) is anything to go by, however, then this is unlikely to be a
397 * problem during real deployment.
399 * ifdef CHECK_TABLE_STATS_BEFORE_ACCEPT
401 * This is the old code. It checks the table changed status when a new client
402 * connects (i.e. before the server calls accept()), and terminates
403 * immediately. This is invisible for the connecting client, but is subject
404 * to race conditions when established clients send a request while the
405 * server exits; those clients may read EOF instead of a server reply. This
406 * has, however, not been a problem in real deployment. With the old code,
407 * timely restart is achieved by setting the ipc_ttl parameter to 60
408 * seconds, so that the table change status is checked several times a
414 * Define exactly one of these.
416 /* #define DETACH_AND_ASK_CLIENTS_TO_RECONNECT /* correct and complex */
417 #define CHECK_TABLE_STATS_PERIODICALLY /* quick */
418 /* #define CHECK_TABLE_STATS_BEFORE_ACCEPT /* slow */
420 /* rewrite_service - read request and send reply */
422 static void rewrite_service(VSTREAM
*stream
, char *unused_service
, char **argv
)
426 #ifdef DETACH_AND_ASK_CLIENTS_TO_RECONNECT
434 * Sanity check. This service takes no command-line arguments.
437 msg_fatal("unexpected command-line argument: %s", argv
[0]);
440 * Client connections are long-lived. Be sure to refesh timely.
442 #ifdef DETACH_AND_ASK_CLIENTS_TO_RECONNECT
443 if (server_flags
== 0 && (now
= event_time()) - last
> 10) {
444 if ((table
= dict_changed_name()) != 0) {
445 msg_info("table %s has changed -- restarting", table
);
446 if (multi_server_drain() == 0)
454 * This routine runs whenever a client connects to the UNIX-domain socket
455 * dedicated to address rewriting. All connection-management stuff is
456 * handled by the common code in multi_server.c.
458 if (attr_scan(stream
, ATTR_FLAG_STRICT
| ATTR_FLAG_MORE
,
459 ATTR_TYPE_STR
, MAIL_ATTR_REQ
, command
,
460 ATTR_TYPE_END
) == 1) {
461 if (strcmp(vstring_str(command
), REWRITE_ADDR
) == 0) {
462 status
= rewrite_proto(stream
);
463 } else if (strcmp(vstring_str(command
), RESOLVE_REGULAR
) == 0) {
464 status
= resolve_proto(&resolve_regular
, stream
);
465 } else if (strcmp(vstring_str(command
), RESOLVE_VERIFY
) == 0) {
466 status
= resolve_proto(&resolve_verify
, stream
);
468 msg_warn("bad command %.30s", printable(vstring_str(command
), '?'));
472 multi_server_disconnect(stream
);
475 /* pre_accept - see if tables have changed */
477 #ifdef CHECK_TABLE_STATS_BEFORE_ACCEPT
479 static void pre_accept(char *unused_name
, char **unused_argv
)
483 if ((table
= dict_changed_name()) != 0) {
484 msg_info("table %s has changed -- restarting", table
);
491 static void check_table_stats(int unused_event
, char *unused_context
)
495 if ((table
= dict_changed_name()) != 0) {
496 msg_info("table %s has changed -- restarting", table
);
499 event_request_timer(check_table_stats
, (char *) 0, 10);
502 /* pre_jail_init - initialize before entering chroot jail */
504 static void pre_jail_init(char *unused_name
, char **unused_argv
)
506 command
= vstring_alloc(100);
509 if (*RES_PARAM_VALUE(resolve_regular
.transport_maps
))
510 resolve_regular
.transport_info
=
511 transport_pre_init(resolve_regular
.transport_maps_name
,
512 RES_PARAM_VALUE(resolve_regular
.transport_maps
));
513 if (*RES_PARAM_VALUE(resolve_verify
.transport_maps
))
514 resolve_verify
.transport_info
=
515 transport_pre_init(resolve_verify
.transport_maps_name
,
516 RES_PARAM_VALUE(resolve_verify
.transport_maps
));
517 if (*RES_PARAM_VALUE(resolve_regular
.snd_relay_maps
))
518 resolve_regular
.snd_relay_info
=
519 maps_create(resolve_regular
.snd_relay_maps_name
,
520 RES_PARAM_VALUE(resolve_regular
.snd_relay_maps
),
521 DICT_FLAG_LOCK
| DICT_FLAG_FOLD_FIX
522 | DICT_FLAG_NO_REGSUB
);
523 if (*RES_PARAM_VALUE(resolve_verify
.snd_relay_maps
))
524 resolve_verify
.snd_relay_info
=
525 maps_create(resolve_verify
.snd_relay_maps_name
,
526 RES_PARAM_VALUE(resolve_verify
.snd_relay_maps
),
527 DICT_FLAG_LOCK
| DICT_FLAG_FOLD_FIX
528 | DICT_FLAG_NO_REGSUB
);
531 /* post_jail_init - initialize after entering chroot jail */
533 static void post_jail_init(char *unused_name
, char **unused_argv
)
535 if (resolve_regular
.transport_info
)
536 transport_post_init(resolve_regular
.transport_info
);
537 if (resolve_verify
.transport_info
)
538 transport_post_init(resolve_verify
.transport_info
);
539 check_table_stats(0, (char *) 0);
542 * This process is called by clients that already enforce the max_idle
543 * time, so we don't have to do it another time.
548 MAIL_VERSION_STAMP_DECLARE
;
550 /* main - pass control to the multi-threaded skeleton code */
552 int main(int argc
, char **argv
)
554 static const CONFIG_STR_TABLE str_table
[] = {
555 VAR_TRANSPORT_MAPS
, DEF_TRANSPORT_MAPS
, &var_transport_maps
, 0, 0,
556 VAR_LOCAL_TRANSPORT
, DEF_LOCAL_TRANSPORT
, &var_local_transport
, 1, 0,
557 VAR_VIRT_TRANSPORT
, DEF_VIRT_TRANSPORT
, &var_virt_transport
, 1, 0,
558 VAR_RELAY_TRANSPORT
, DEF_RELAY_TRANSPORT
, &var_relay_transport
, 1, 0,
559 VAR_DEF_TRANSPORT
, DEF_DEF_TRANSPORT
, &var_def_transport
, 1, 0,
560 VAR_VIRT_ALIAS_MAPS
, DEF_VIRT_ALIAS_MAPS
, &var_virt_alias_maps
, 0, 0,
561 VAR_VIRT_ALIAS_DOMS
, DEF_VIRT_ALIAS_DOMS
, &var_virt_alias_doms
, 0, 0,
562 VAR_VIRT_MAILBOX_MAPS
, DEF_VIRT_MAILBOX_MAPS
, &var_virt_mailbox_maps
, 0, 0,
563 VAR_VIRT_MAILBOX_DOMS
, DEF_VIRT_MAILBOX_DOMS
, &var_virt_mailbox_doms
, 0, 0,
564 VAR_RELOCATED_MAPS
, DEF_RELOCATED_MAPS
, &var_relocated_maps
, 0, 0,
565 VAR_EMPTY_ADDR
, DEF_EMPTY_ADDR
, &var_empty_addr
, 1, 0,
566 VAR_VRFY_XPORT_MAPS
, DEF_VRFY_XPORT_MAPS
, &var_vrfy_xport_maps
, 0, 0,
567 VAR_VRFY_LOCAL_XPORT
, DEF_VRFY_LOCAL_XPORT
, &var_vrfy_local_xport
, 1, 0,
568 VAR_VRFY_VIRT_XPORT
, DEF_VRFY_VIRT_XPORT
, &var_vrfy_virt_xport
, 1, 0,
569 VAR_VRFY_RELAY_XPORT
, DEF_VRFY_RELAY_XPORT
, &var_vrfy_relay_xport
, 1, 0,
570 VAR_VRFY_DEF_XPORT
, DEF_VRFY_DEF_XPORT
, &var_vrfy_def_xport
, 1, 0,
571 VAR_VRFY_RELAYHOST
, DEF_VRFY_RELAYHOST
, &var_vrfy_relayhost
, 0, 0,
572 VAR_REM_RWR_DOMAIN
, DEF_REM_RWR_DOMAIN
, &var_remote_rwr_domain
, 0, 0,
573 VAR_SND_RELAY_MAPS
, DEF_SND_RELAY_MAPS
, &var_snd_relay_maps
, 0, 0,
574 VAR_NULL_RELAY_MAPS_KEY
, DEF_NULL_RELAY_MAPS_KEY
, &var_null_relay_maps_key
, 1, 0,
575 VAR_VRFY_RELAY_MAPS
, DEF_VRFY_RELAY_MAPS
, &var_vrfy_relay_maps
, 0, 0,
578 static const CONFIG_BOOL_TABLE bool_table
[] = {
579 VAR_SWAP_BANGPATH
, DEF_SWAP_BANGPATH
, &var_swap_bangpath
,
580 VAR_APP_DOT_MYDOMAIN
, DEF_APP_DOT_MYDOMAIN
, &var_append_dot_mydomain
,
581 VAR_APP_AT_MYORIGIN
, DEF_APP_AT_MYORIGIN
, &var_append_at_myorigin
,
582 VAR_PERCENT_HACK
, DEF_PERCENT_HACK
, &var_percent_hack
,
583 VAR_RESOLVE_DEQUOTED
, DEF_RESOLVE_DEQUOTED
, &var_resolve_dequoted
,
584 VAR_SHOW_UNK_RCPT_TABLE
, DEF_SHOW_UNK_RCPT_TABLE
, &var_show_unk_rcpt_table
,
585 VAR_RESOLVE_NULLDOM
, DEF_RESOLVE_NULLDOM
, &var_resolve_nulldom
,
586 VAR_RESOLVE_NUM_DOM
, DEF_RESOLVE_NUM_DOM
, &var_resolve_num_dom
,
587 VAR_ALLOW_MIN_USER
, DEF_ALLOW_MIN_USER
, &var_allow_min_user
,
592 * Fingerprint executables and core dumps.
594 MAIL_VERSION_STAMP_ALLOCATE
;
596 multi_server_main(argc
, argv
, rewrite_service
,
597 MAIL_SERVER_STR_TABLE
, str_table
,
598 MAIL_SERVER_BOOL_TABLE
, bool_table
,
599 MAIL_SERVER_PRE_INIT
, pre_jail_init
,
600 MAIL_SERVER_POST_INIT
, post_jail_init
,
601 #ifdef CHECK_TABLE_STATS_BEFORE_ACCEPT
602 MAIL_SERVER_PRE_ACCEPT
, pre_accept
,