changeset 237:5f9f3a65032e

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
author markus schnalke <meillo@marmaro.de>
date Fri, 22 Oct 2010 11:56:47 -0300
parents 5a0e8ed56c2a
children ec28ce798b79
files src/deliver.c src/masqmail.h src/route.c
diffstat 3 files changed, 56 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- 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;
 		}
 
-		/* local recipients */
-		other_rcpt_list = NULL;
-		rcptlist_with_addr_is_local(rcpt_list, &local_rcpt_list, &other_rcpt_list);
+		split_rcpts(rcpt_list, conf.local_nets, &local_rcpt_list, &localnet_rcpt_list, &other_rcpt_list);
+		g_list_free(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);
-			}
+		/* local recipients */
+		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;
--- 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);
--- 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;
-
-		foreach(host_list, host_node) {
-			gchar *host = (gchar *) (host_node->data);
-			if (fnmatch(host, rcpt->domain, FNM_CASEFOLD) == 0)
-				break;
-		}
-		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);
-		}
-
-	}
-}
+		rcpt = (address *) (rcpt_node->data);
+		host_node = NULL;
 
-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);
+			if (rl_local)
+				*rl_local = g_list_append(*rl_local, rcpt);
 		} else {
-			if (p_non_rcpt_list)
-				*p_non_rcpt_list = g_list_append(*p_non_rcpt_list, rcpt);
+			/* 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);
+			}
 		}
-
 	}
 }
 
@@ -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);
 }