/* Generic options for routers, all of which live inside router_instance
data blocks and which therefore have the opt_public flag set. */
+#define LOFF(field) OPT_OFF(router_instance, field)
optionlist optionlist_routers[] = {
{ "*expand_group", opt_stringptr | opt_hidden | opt_public,
- (void *)(offsetof(router_instance, expand_gid)) },
+ LOFF(expand_gid) },
{ "*expand_more", opt_stringptr | opt_hidden | opt_public,
- (void *)(offsetof(router_instance, expand_more)) },
+ LOFF(expand_more) },
{ "*expand_unseen", opt_stringptr | opt_hidden | opt_public,
- (void *)(offsetof(router_instance, expand_unseen)) },
+ LOFF(expand_unseen) },
{ "*expand_user", opt_stringptr | opt_hidden | opt_public,
- (void *)(offsetof(router_instance, expand_uid)) },
+ LOFF(expand_uid) },
{ "*set_group", opt_bool | opt_hidden | opt_public,
- (void *)(offsetof(router_instance, gid_set)) },
+ LOFF(gid_set) },
{ "*set_user", opt_bool | opt_hidden | opt_public,
- (void *)(offsetof(router_instance, uid_set)) },
+ LOFF(uid_set) },
{ "address_data", opt_stringptr|opt_public,
- (void *)(offsetof(router_instance, address_data)) },
+ LOFF(address_data) },
{ "address_test", opt_bool|opt_public,
- (void *)(offsetof(router_instance, address_test)) },
+ LOFF(address_test) },
#ifdef EXPERIMENTAL_BRIGHTMAIL
{ "bmi_deliver_alternate", opt_bool | opt_public,
- (void *)(offsetof(router_instance, bmi_deliver_alternate)) },
+ LOFF(bmi_deliver_alternate) },
{ "bmi_deliver_default", opt_bool | opt_public,
- (void *)(offsetof(router_instance, bmi_deliver_default)) },
+ LOFF(bmi_deliver_default) },
{ "bmi_dont_deliver", opt_bool | opt_public,
- (void *)(offsetof(router_instance, bmi_dont_deliver)) },
+ LOFF(bmi_dont_deliver) },
{ "bmi_rule", opt_stringptr|opt_public,
- (void *)(offsetof(router_instance, bmi_rule)) },
+ LOFF(bmi_rule) },
#endif
{ "cannot_route_message", opt_stringptr | opt_public,
- (void *)(offsetof(router_instance, cannot_route_message)) },
+ LOFF(cannot_route_message) },
{ "caseful_local_part", opt_bool | opt_public,
- (void *)(offsetof(router_instance, caseful_local_part)) },
+ LOFF(caseful_local_part) },
{ "check_local_user", opt_bool | opt_public,
- (void *)(offsetof(router_instance, check_local_user)) },
+ LOFF(check_local_user) },
{ "condition", opt_stringptr|opt_public|opt_rep_con,
- (void *)offsetof(router_instance, condition) },
+ LOFF(condition) },
{ "debug_print", opt_stringptr | opt_public,
- (void *)offsetof(router_instance, debug_string) },
+ LOFF(debug_string) },
{ "disable_logging", opt_bool | opt_public,
- (void *)offsetof(router_instance, disable_logging) },
+ LOFF(disable_logging) },
{ "dnssec_request_domains", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, dnssec.request) },
+ LOFF(dnssec.request) },
{ "dnssec_require_domains", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, dnssec.require) },
+ LOFF(dnssec.require) },
{ "domains", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, domains) },
+ LOFF(domains) },
{ "driver", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, driver_name) },
+ LOFF(driver_name) },
{ "dsn_lasthop", opt_bool|opt_public,
- (void *)offsetof(router_instance, dsn_lasthop) },
+ LOFF(dsn_lasthop) },
{ "errors_to", opt_stringptr|opt_public,
- (void *)(offsetof(router_instance, errors_to)) },
+ LOFF(errors_to) },
{ "expn", opt_bool|opt_public,
- (void *)offsetof(router_instance, expn) },
+ LOFF(expn) },
{ "fail_verify", opt_bool_verify|opt_hidden|opt_public,
- (void *)offsetof(router_instance, fail_verify_sender) },
+ LOFF(fail_verify_sender) },
{ "fail_verify_recipient", opt_bool|opt_public,
- (void *)offsetof(router_instance, fail_verify_recipient) },
+ LOFF(fail_verify_recipient) },
{ "fail_verify_sender", opt_bool|opt_public,
- (void *)offsetof(router_instance, fail_verify_sender) },
+ LOFF(fail_verify_sender) },
{ "fallback_hosts", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, fallback_hosts) },
+ LOFF(fallback_hosts) },
{ "group", opt_expand_gid | opt_public,
- (void *)(offsetof(router_instance, gid)) },
+ LOFF(gid) },
{ "headers_add", opt_stringptr|opt_public|opt_rep_str,
- (void *)offsetof(router_instance, extra_headers) },
+ LOFF(extra_headers) },
{ "headers_remove", opt_stringptr|opt_public|opt_rep_str,
- (void *)offsetof(router_instance, remove_headers) },
+ LOFF(remove_headers) },
{ "ignore_target_hosts",opt_stringptr|opt_public,
- (void *)offsetof(router_instance, ignore_target_hosts) },
+ LOFF(ignore_target_hosts) },
{ "initgroups", opt_bool | opt_public,
- (void *)(offsetof(router_instance, initgroups)) },
+ LOFF(initgroups) },
{ "local_part_prefix", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, prefix) },
+ LOFF(prefix) },
{ "local_part_prefix_optional",opt_bool|opt_public,
- (void *)offsetof(router_instance, prefix_optional) },
+ LOFF(prefix_optional) },
{ "local_part_suffix", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, suffix) },
+ LOFF(suffix) },
{ "local_part_suffix_optional",opt_bool|opt_public,
- (void *)offsetof(router_instance, suffix_optional) },
+ LOFF(suffix_optional) },
{ "local_parts", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, local_parts) },
+ LOFF(local_parts) },
{ "log_as_local", opt_bool|opt_public,
- (void *)offsetof(router_instance, log_as_local) },
+ LOFF(log_as_local) },
{ "more", opt_expand_bool|opt_public,
- (void *)offsetof(router_instance, more) },
+ LOFF(more) },
{ "pass_on_timeout", opt_bool|opt_public,
- (void *)offsetof(router_instance, pass_on_timeout) },
+ LOFF(pass_on_timeout) },
{ "pass_router", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, pass_router_name) },
+ LOFF(pass_router_name) },
{ "redirect_router", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, redirect_router_name) },
+ LOFF(redirect_router_name) },
{ "require_files", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, require_files) },
+ LOFF(require_files) },
{ "retry_use_local_part", opt_bool|opt_public,
- (void *)offsetof(router_instance, retry_use_local_part) },
+ LOFF(retry_use_local_part) },
{ "router_home_directory", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, router_home_directory) },
+ LOFF(router_home_directory) },
{ "self", opt_stringptr|opt_public,
- (void *)(offsetof(router_instance, self)) },
+ LOFF(self) },
{ "senders", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, senders) },
+ LOFF(senders) },
{ "set", opt_stringptr|opt_public|opt_rep_str,
- (void *)offsetof(router_instance, set) },
+ LOFF(set) },
#ifdef SUPPORT_TRANSLATE_IP_ADDRESS
{ "translate_ip_address", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, translate_ip_address) },
+ LOFF(translate_ip_address) },
#endif
{ "transport", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, transport_name) },
+ LOFF(transport_name) },
{ "transport_current_directory", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, current_directory) },
+ LOFF(current_directory) },
{ "transport_home_directory", opt_stringptr|opt_public,
- (void *)offsetof(router_instance, home_directory) },
+ LOFF(home_directory) },
{ "unseen", opt_expand_bool|opt_public,
- (void *)offsetof(router_instance, unseen) },
+ LOFF(unseen) },
{ "user", opt_expand_uid | opt_public,
- (void *)(offsetof(router_instance, uid)) },
+ LOFF(uid) },
{ "verify", opt_bool_verify|opt_hidden|opt_public,
- (void *)offsetof(router_instance, verify_sender) },
+ LOFF(verify_sender) },
{ "verify_only", opt_bool|opt_public,
- (void *)offsetof(router_instance, verify_only) },
+ LOFF(verify_only) },
{ "verify_recipient", opt_bool|opt_public,
- (void *)offsetof(router_instance, verify_recipient) },
+ LOFF(verify_recipient) },
{ "verify_sender", opt_bool|opt_public,
- (void *)offsetof(router_instance, verify_sender) }
+ LOFF(verify_sender) }
};
int optionlist_routers_size = nelem(optionlist_routers);
TRUE; otherwise its default is FALSE. */
if (r->retry_use_local_part == TRUE_UNSET)
- r->retry_use_local_part = r->check_local_user;
+ r->retry_use_local_part =
+ r->check_local_user || r->local_parts || r->condition || r->prefix || r->suffix || r->senders || r->require_files;
/* Build a host list if fallback hosts is set. */
login of a local user. Note: the third argument to route_finduser() must be
NULL here, to prevent a numeric string being taken as a numeric uid. If the
user is found, set deliver_home to the home directory, and also set
-local_user_{uid,gid}. */
+local_user_{uid,gid} and local_part_verified. */
if (r->check_local_user)
{
r->name, addr->local_part);
return SKIP;
}
+ deliver_localpart_verified = string_copy(US (*pw)->pw_name);
deliver_home = string_copy(US (*pw)->pw_dir);
local_user_gid = (*pw)->pw_gid;
local_user_uid = (*pw)->pw_uid;
the local part sorted. */
router_name = r->name;
+ deliver_localpart_verified = NULL;
deliver_set_expansions(addr);
/* For convenience, the pre-router checks are in a separate function, which