Mercurial > masqmail
comparison src/alias.c @ 242:bc9d9cd9ee8e
made addr_isequal() and addr_isequal_parent() more flexible
refactored various bits of this stuff.
addr_isequal_alias() had become needless now and was removed.
In fail_msg.c: postmaster is now matched caseless, like required by RFC.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Mon, 25 Oct 2010 17:42:48 -0300 |
parents | 31ee44f45787 |
children | 7082044c05c6 |
comparison
equal
deleted
inserted
replaced
241:87df0aa99cc7 | 242:bc9d9cd9ee8e |
---|---|
38 } | 38 } |
39 foreach(conf.not_local_addresses, addr_node) { | 39 foreach(conf.not_local_addresses, addr_node) { |
40 a = create_address_qualified(addr_node->data, TRUE, conf.host_name); | 40 a = create_address_qualified(addr_node->data, TRUE, conf.host_name); |
41 DEBUG(6) debugf("not_local_addresses: addr_node->data=%s a->address=%s\n", | 41 DEBUG(6) debugf("not_local_addresses: addr_node->data=%s a->address=%s\n", |
42 addr_node->data, a->address); | 42 addr_node->data, a->address); |
43 if (addr_isequal(a, addr)) { | 43 if (addr_isequal(a, addr, conf.alias_local_cmp)) { |
44 destroy_address(a); | 44 destroy_address(a); |
45 /* in local_hosts but also in not_local_addresses */ | 45 /* in local_hosts but also in not_local_addresses */ |
46 return FALSE; | 46 return FALSE; |
47 } | 47 } |
48 destroy_address(a); | 48 destroy_address(a); |
52 } | 52 } |
53 foreach(conf.local_addresses, addr_node) { | 53 foreach(conf.local_addresses, addr_node) { |
54 a = create_address_qualified(addr_node->data, TRUE, conf.host_name); | 54 a = create_address_qualified(addr_node->data, TRUE, conf.host_name); |
55 DEBUG(6) debugf("local_addresses: addr_node->data=%s a->address=%s\n", | 55 DEBUG(6) debugf("local_addresses: addr_node->data=%s a->address=%s\n", |
56 addr_node->data, a->address); | 56 addr_node->data, a->address); |
57 if (addr_isequal(a, addr)) { | 57 if (addr_isequal(a, addr, conf.alias_local_cmp)) { |
58 destroy_address(a); | 58 destroy_address(a); |
59 /* in local_addresses */ | 59 /* in local_addresses */ |
60 return TRUE; | 60 return TRUE; |
61 } | 61 } |
62 destroy_address(a); | 62 destroy_address(a); |
63 } | 63 } |
64 return FALSE; | 64 return FALSE; |
65 } | |
66 | |
67 static gboolean | |
68 addr_isequal_alias(address * addr1, address * addr2) | |
69 { | |
70 return (conf.alias_local_cmp(addr1->local_part, addr2->local_part) == 0) | |
71 && (strcasecmp(addr1->domain, addr2->domain) == 0); | |
72 } | 65 } |
73 | 66 |
74 static GList* | 67 static GList* |
75 parse_list(gchar * line) | 68 parse_list(gchar * line) |
76 { | 69 { |
178 alias_addr->local_part, alias_addr->domain); | 171 alias_addr->local_part, alias_addr->domain); |
179 alias_list = g_list_append(alias_list, alias_addr); | 172 alias_list = g_list_append(alias_list, alias_addr); |
180 continue; | 173 continue; |
181 } | 174 } |
182 | 175 |
183 /* addr is local, so let's go into recursion and expand again, | 176 /* addr is local and to expand at this point */ |
184 but first ... search in parents for loops: */ | 177 /* but first ... search in parents for loops: */ |
185 for (addr_parent=addr; addr_parent; addr_parent=addr_parent->parent) { | 178 if (addr_isequal_parent(addr, alias_addr, conf.alias_local_cmp)) { |
186 if (addr_isequal_alias(alias_addr, addr_parent)) { | |
187 break; | |
188 } | |
189 } | |
190 if (addr_parent) { | |
191 /* loop detected, ignore this path */ | 179 /* loop detected, ignore this path */ |
192 logwrite(LOG_ALERT, | 180 logwrite(LOG_ALERT, "alias: detected loop, hence ignoring '%s'\n", |
193 "alias: detected loop (%s -> %s), hence ignoring\n", | 181 alias_addr->local_part); |
194 addr_parent->local_part, addr->local_part); | |
195 continue; | 182 continue; |
196 } | 183 } |
197 alias_addr->parent = addr; | 184 alias_addr->parent = addr; |
198 | 185 |
199 /* recurse */ | 186 /* recurse */ |
249 GList *non_node; | 236 GList *non_node; |
250 | 237 |
251 rcpt_node_next = g_list_next(rcpt_node); | 238 rcpt_node_next = g_list_next(rcpt_node); |
252 foreach(non_rcpt_list, non_node) { | 239 foreach(non_rcpt_list, non_node) { |
253 address *non_addr = (address *) (non_node->data); | 240 address *non_addr = (address *) (non_node->data); |
254 if (addr_isequal(addr, non_addr)) { | 241 if (addr_isequal(addr, non_addr, conf.alias_local_cmp)) { |
255 done_list = g_list_remove_link(done_list, rcpt_node); | 242 done_list = g_list_remove_link(done_list, rcpt_node); |
256 g_list_free_1(rcpt_node); | 243 g_list_free_1(rcpt_node); |
257 /* this address is still in the children lists | 244 /* this address is still in the children lists |
258 of the original address, simply mark them delivered */ | 245 of the original address, simply mark them delivered */ |
259 addr_mark_delivered(addr); | 246 addr_mark_delivered(addr); |