60 #ifdef STRCASECMP_IN_STRINGS_H
135 #define STR vstring_str
136 #define LEN VSTRING_LEN
145 static MAPS *relocated_maps;
158 if (virt_alias_doms) {
161 if (virt_alias_doms->error)
164 if (virt_mailbox_doms) {
167 if (virt_mailbox_doms->error)
173 if (relay_domains->error)
181 static void resolve_addr(
RES_CONTEXT *rp,
char *sender,
char *addr,
185 const char *myname =
"resolve_addr";
191 const char *blame = 0;
192 const char *rcpt_domain;
201 const char *sender_key;
233 addr_len = strlen(addr);
241 #define FREE_MEMORY_AND_RETURN { \
243 tok822_free_tree(saved_domain); \
245 tok822_free_tree(tree); \
247 vstring_free(addr_buf); \
260 #define RESOLVE_LOCAL(domain) \
261 resolve_local(STR(tok822_internalize(addr_buf, domain, TOK822_STR_DEFL)))
263 for (loop_count = 0, loop_max = addr_len + 100; ; loop_count++) {
270 if (loop_count > loop_max) {
271 msg_warn(
"resolve_addr: <%s>: giving up after %ld iterations",
272 addr, (
long) loop_count);
317 saved_domain = domain;
343 && ((oper = strrchr(local =
STR(tree->
head->
vstr),
'@')) != 0
372 if (tree->
head == 0) {
377 if (domain == 0 && saved_domain == 0) {
422 rcpt_domain = strrchr(
STR(nextrcpt),
'@') + 1;
423 if (rcpt_domain == (
char *) 1)
425 if (*rcpt_domain ==
'[') {
436 rcpt_domain = strrchr(
STR(nextrcpt),
'@') + 1;
466 if (strcmp(
STR(nextrcpt) + strcspn(
STR(nextrcpt),
"@!%") + 1, rcpt_domain))
485 #define STREQ(x,y) (strcmp((x), (y)) == 0)
495 if (virt_mailbox_doms
497 msg_warn(
"do not list domain %s in BOTH %s and %s",
502 msg_warn(
"do not list domain %s in BOTH %s and %s",
507 msg_warn(
"do not list $%s (%s) in %s",
514 " in virtual alias table" :
"");
516 }
else if (virt_alias_doms && virt_alias_doms->error != 0) {
525 else if (virt_mailbox_doms
530 msg_warn(
"do not list domain %s in BOTH %s and %s",
538 }
else if (virt_mailbox_doms && virt_mailbox_doms->error != 0) {
552 }
else if (relay_domains && relay_domains->error != 0) {
564 sender_key = (*sender ? sender :
566 (
char **) 0)) != 0) {
568 msg_warn(
"%s: ignoring null lookup result for %s",
593 sender_key = (*sender ? sender :
595 (
char **) 0)) != 0) {
597 msg_warn(
"%s: ignoring null lookup result for %s",
630 msg_warn(
"do not list domain %s in BOTH %s and %s",
632 if (virt_mailbox_doms
634 msg_warn(
"do not list domain %s in BOTH %s and %s",
651 if ((destination =
split_at(
STR(channel),
':')) != 0 && *destination)
657 if (*
STR(channel) == 0) {
660 msg_warn(
"file %s/%s: parameter %s: null transport is not allowed",
665 if (*
STR(nexthop) == 0)
697 rcpt_domain, channel, nexthop) == 0
714 #define IGNORE_ADDR_EXTENSION ((char **) 0)
716 if (relocated_maps != 0) {
724 }
else if (relocated_maps->
error != 0) {
773 resolve_addr(context,
STR(sender),
STR(query),
774 channel, nexthop, nextrcpt, &flags);
777 msg_info(
"`%s' -> `%s' -> (`%s' `%s' `%s' `%d')",
779 STR(nexthop),
STR(nextrcpt), flags);
790 msg_warn(
"write resolver reply: %m");
int valid_hostaddr(const char *addr, int gripe)
#define RESOLVE_FLAG_FAIL
void rewrite_tree(RWR_CONTEXT *context, TOK822 *tree)
#define MATCH_FLAG_RETURN
TOK822 * tok822_sub_keep_before(TOK822 *, TOK822 *)
int match_parent_style(const char *name)
char * mystrdup(const char *str)
char * var_null_def_xport_maps_key
#define FREE_MEMORY_AND_RETURN
#define MAIL_SERVICE_ERROR
char * var_relocated_maps
NORETURN msg_panic(const char *fmt,...)
TOK822 * tok822_rfind_type(TOK822 *, int)
#define VAR_RELAY_DOMAINS
int resolve_proto(RES_CONTEXT *context, VSTREAM *stream)
#define tok822_scan(cp, ptr)
#define domain_list_match
int valid_utf8_string(const char *, ssize_t)
int resolve_class(const char *domain)
const char * local_transport_name
int resolve_local(const char *addr)
#define RESOLVE_LOCAL(domain)
#define DICT_FLAG_UTF8_REQUEST
char * var_virt_alias_doms
#define strcasecmp_utf8(s1, s2)
#define VAR_RELOCATED_MAPS
#define DICT_FLAG_FOLD_FIX
#define RESOLVE_FLAG_ROUTED
#define RESOLVE_CLASS_VIRTUAL
TOK822 * tok822_sub_append(TOK822 *, TOK822 *)
#define VAR_VIRT_MAILBOX_DOMS
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
TOK822 * tok822_free_tree(TOK822 *)
#define VAR_VIRT_ALIAS_DOMS
#define MAIL_ATTR_TRANSPORT
bool var_resolve_dequoted
#define string_list_init(o, f, p)
struct TRANSPORT_INFO * transport_info
#define RESOLVE_CLASS_LOCAL
#define string_list_match
VSTRING * vstring_insert(VSTRING *vp, ssize_t start, const char *buf, ssize_t len)
const char * snd_def_xp_maps_name
const char * relay_transport_name
#define RESOLVE_FLAG_ERROR
int valid_mailhost_literal(const char *addr, int gripe)
int valid_utf8_hostname(int enable_utf8, const char *name, int gripe)
int transport_lookup(TRANSPORT_INFO *tp, const char *addr, const char *rcpt_domain, VSTRING *channel, VSTRING *nexthop)
MAPS * maps_create(const char *title, const char *map_names, int dict_flags)
bool var_show_unk_rcpt_table
RWR_CONTEXT local_context
#define mail_addr_find(maps, address, extension)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define IGNORE_ADDR_EXTENSION
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
VSTRING * tok822_internalize(VSTRING *, TOK822 *, int)
#define SEND_ATTR_INT(name, val)
#define domain_list_init(o, f, p)
#define MAIL_ATTR_NEXTHOP
int vstream_fflush(VSTREAM *stream)
char * var_virt_mailbox_doms
TOK822 * tok822_alloc(int, const char *)
TOK822 * tok822_free(TOK822 *)
#define quote_822_local(dst, src)
const char * transport_maps_name
#define RESOLVE_CLASS_RELAY
int strcasecmp(const char *s1, const char *s2)
#define RESOLVE_CLASS_ALIAS
TOK822 * tok822_scan_addr(const char *)
VSTRING * vstring_free(VSTRING *vp)
char * split_at(char *string, int delimiter)
char * var_null_relay_maps_key
#define RESOLVE_CLASS_DEFAULT
const char * def_transport_name
const char * virt_transport_name
#define SEND_ATTR_STR(name, val)
#define RES_PARAM_VALUE(x)
VSTRING * vstring_strcat(VSTRING *vp, const char *src)
const char * snd_relay_maps_name
#define RECV_ATTR_STR(name, val)
void msg_info(const char *fmt,...)