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);