# HG changeset patch # User markus schnalke # Date 1287759407 10800 # Node ID 5f9f3a65032e7544b0f6d922fac36c0efe59e7c0 # Parent 5a0e8ed56c2a28c078a1768b0c8233ad2e9b7d11 refactoring: new function split_rcpts() replaces two others split_rcpts() merges rcptlist_with_one_of_hostlist() and rcptlist_with_addr_is_local() into one with hardly adding complexity I'd actually say that the overall complexity decreased. Have a look at the comment for split_rcpts() in route.c diff -r 5a0e8ed56c2a -r 5f9f3a65032e src/deliver.c --- a/src/deliver.c Fri Oct 22 11:15:24 2010 -0300 +++ b/src/deliver.c Fri Oct 22 11:56:47 2010 -0300 @@ -668,7 +668,7 @@ GList *rcpt_list; GList *local_rcpt_list = NULL; GList *localnet_rcpt_list = NULL; - GList *other_rcpt_list; + GList *other_rcpt_list = NULL; if (!spool_lock(msgout->msg->uid)) { DEBUG(5) debugf("spool_lock(%s) failed.\n", msgout->msg->uid); @@ -689,40 +689,28 @@ rcpt_list = aliased_rcpt_list; } + split_rcpts(rcpt_list, conf.local_nets, &local_rcpt_list, &localnet_rcpt_list, &other_rcpt_list); + g_list_free(rcpt_list); + /* local recipients */ - other_rcpt_list = NULL; - rcptlist_with_addr_is_local(rcpt_list, &local_rcpt_list, &other_rcpt_list); - - if (flags & DLVR_LOCAL) { - if (local_rcpt_list != NULL) { - msg_out *local_msgout = clone_msg_out(msgout); - local_msgout->rcpt_list = local_rcpt_list; - local_msgout_list = g_list_append(local_msgout_list, local_msgout); - } + if ((flags & DLVR_LOCAL) && local_rcpt_list) { + msg_out *local_msgout = clone_msg_out(msgout); + local_msgout->rcpt_list = local_rcpt_list; + local_msgout_list = g_list_append(local_msgout_list, local_msgout); } - g_list_free(rcpt_list); - /* local net recipients */ - rcpt_list = other_rcpt_list; - other_rcpt_list = NULL; - rcptlist_with_one_of_hostlist(rcpt_list, conf.local_nets, &localnet_rcpt_list, &other_rcpt_list); - - if (flags & DLVR_LAN) { - if (localnet_rcpt_list != NULL) { - msg_out *localnet_msgout = clone_msg_out(msgout); - localnet_msgout->rcpt_list = localnet_rcpt_list; - localnet_msgout_list = g_list_append(localnet_msgout_list, localnet_msgout); - } + if ((flags & DLVR_LAN) && localnet_rcpt_list) { + msg_out *localnet_msgout = clone_msg_out(msgout); + localnet_msgout->rcpt_list = localnet_rcpt_list; + localnet_msgout_list = g_list_append(localnet_msgout_list, localnet_msgout); } - if (flags & DLVR_ONLINE) { - /* the rest, this is online delivery */ - if (other_rcpt_list != NULL) { - msg_out *other_msgout = clone_msg_out(msgout); - other_msgout->rcpt_list = other_rcpt_list; - other_msgout_list = g_list_append(other_msgout_list, other_msgout); - } + /* remote recipients (the rest), requires online delivery */ + if ((flags & DLVR_ONLINE) && other_rcpt_list) { + msg_out *other_msgout = clone_msg_out(msgout); + other_msgout->rcpt_list = other_rcpt_list; + other_msgout_list = g_list_append(other_msgout_list, other_msgout); } } @@ -730,7 +718,8 @@ destroy_table(alias_table); /* actual delivery */ - if (local_msgout_list != NULL) { + + if (local_msgout_list) { DEBUG(5) debugf("local_msgout_list\n"); foreach(local_msgout_list, msgout_node) { msg_out *msgout = (msg_out *) (msgout_node->data); @@ -740,7 +729,7 @@ destroy_msg_out_list(local_msgout_list); } - if (localnet_msgout_list != NULL) { + if (localnet_msgout_list) { GList *route_list = NULL; GList *route_node; @@ -759,7 +748,7 @@ destroy_route_list(route_list); } - if (other_msgout_list != NULL) { + if (other_msgout_list) { DEBUG(5) debugf("other_msgout_list\n"); if (!deliver_msgout_list_online(other_msgout_list)) ok = FALSE; diff -r 5a0e8ed56c2a -r 5f9f3a65032e src/masqmail.h --- a/src/masqmail.h Fri Oct 22 11:15:24 2010 -0300 +++ b/src/masqmail.h Fri Oct 22 11:56:47 2010 -0300 @@ -498,8 +498,7 @@ msgout_perhost *create_msgout_perhost(gchar * host); void destroy_msgout_perhost(msgout_perhost * mo_ph); void rewrite_headers(msg_out * msgout, connect_route * route); -void rcptlist_with_one_of_hostlist(GList * rcpt_list, GList * host_list, GList **, GList **); -void rcptlist_with_addr_is_local(GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list); +void split_rcpts(GList* rcpt_list, GList* localnets, GList** rl_local, GList** rl_localnet, GList** rl_others); gboolean route_strip_msgout(connect_route * route, msg_out * msgout); msg_out *route_prepare_msgout(connect_route * route, msg_out * msgout); GList *route_msgout_list(connect_route * route, GList * msgout_list); diff -r 5a0e8ed56c2a -r 5f9f3a65032e src/route.c --- a/src/route.c Fri Oct 22 11:15:24 2010 -0300 +++ b/src/route.c Fri Oct 22 11:56:47 2010 -0300 @@ -189,52 +189,50 @@ DEBUG(5) debugf("rewrite_headers() returning\n"); } +/* +Split a recipient list into the three groups: +- local recipients +- local net recipients +- other/remote/online recipients +It should be possible to call the function like: + split_rcpts(rcpts, hostlist, local, others, others); +This would split online between local and localnet+online recipients. +(untested yet; remove this line if you saw it worked -- meillo 2010-10-21) +If host_list is NULL, only splitting between local and other is done. +*/ void -rcptlist_with_one_of_hostlist(GList * rcpt_list, GList * host_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list) +split_rcpts(GList* rcpt_list, GList* localnets, GList** rl_local, GList** rl_localnet, GList** rl_others) { GList *rcpt_node; + GList *host_node = NULL; + address *rcpt = NULL; if (rcpt_list == NULL) return; foreach(rcpt_list, rcpt_node) { - address *rcpt = (address *) (rcpt_node->data); - GList *host_node = NULL; + rcpt = (address *) (rcpt_node->data); + host_node = NULL; - foreach(host_list, host_node) { - gchar *host = (gchar *) (host_node->data); - if (fnmatch(host, rcpt->domain, FNM_CASEFOLD) == 0) - break; + if (addr_is_local(rcpt)) { + if (rl_local) + *rl_local = g_list_append(*rl_local, rcpt); + } else { + /* if localnets is NULL, host_node will be NULL, + hence all non-locals are put to others */ + foreach(localnets, host_node) { + gchar *host = (gchar *) (host_node->data); + if (fnmatch(host, rcpt->domain, FNM_CASEFOLD) == 0) + break; + } + if (host_node) { + if (rl_localnet) + *rl_localnet = g_list_append(*rl_localnet, rcpt); + } else { + if (rl_others) + *rl_others = g_list_append(*rl_others, rcpt); + } } - if (host_node) { - if (p_rcpt_list) - *p_rcpt_list = g_list_append(*p_rcpt_list, rcpt); - } else { - if (p_non_rcpt_list) - *p_non_rcpt_list = g_list_append(*p_non_rcpt_list, rcpt); - } - - } -} - -void -rcptlist_with_addr_is_local(GList * rcpt_list, GList ** p_rcpt_list, GList ** p_non_rcpt_list) -{ - GList *rcpt_node; - - if (rcpt_list == NULL) - return; - - foreach(rcpt_list, rcpt_node) { - address *rcpt = (address *) (rcpt_node->data); - if (addr_is_local(rcpt)) { - if (p_rcpt_list) - *p_rcpt_list = g_list_append(*p_rcpt_list, rcpt); - } else { - if (p_non_rcpt_list) - *p_non_rcpt_list = g_list_append(*p_non_rcpt_list, rcpt); - } - } } @@ -297,14 +295,14 @@ /* sort out those domains that can be sent over this connection: */ if (route->allowed_rcpt_domains) { DEBUG(5) debugf("testing for route->allowed_rcpt_domains\n"); - rcptlist_with_one_of_hostlist(rcpt_list, route->allowed_rcpt_domains, &tmp_list, p_non_rcpt_list); + split_rcpts(rcpt_list, route->allowed_rcpt_domains, NULL, &tmp_list, p_non_rcpt_list); } else { DEBUG(5) debugf("route->allowed_rcpt_domains == NULL\n"); tmp_list = g_list_copy(rcpt_list); } /* sort out those domains that cannot be sent over this connection: */ - rcptlist_with_one_of_hostlist(tmp_list, route->not_allowed_rcpt_domains, p_non_rcpt_list, p_rcpt_list); + split_rcpts(tmp_list, route->not_allowed_rcpt_domains, NULL, p_non_rcpt_list, p_rcpt_list); g_list_free(tmp_list); }