Mercurial > masqmail
comparison src/deliver.c @ 403:7954b82040b3
Broke long lines.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Wed, 29 Feb 2012 09:46:34 +0100 |
parents | a408411ff8df |
children | 899c97e877a5 |
comparison
equal
deleted
inserted
replaced
402:eedc23877cd5 | 403:7954b82040b3 |
---|---|
42 | 42 |
43 foreach(rcpt_list, rcpt_node) { | 43 foreach(rcpt_list, rcpt_node) { |
44 address *rcpt = (address *) (rcpt_node->data); | 44 address *rcpt = (address *) (rcpt_node->data); |
45 | 45 |
46 if (addr_is_defered(rcpt)) { | 46 if (addr_is_defered(rcpt)) { |
47 if ((now - msg->received_time) >= conf.max_defer_time) { | 47 if ((now - msg->received_time) >= conf.max_defer_time){ |
48 addr_mark_failed(rcpt); | 48 addr_mark_failed(rcpt); |
49 } else { | 49 } else { |
50 defered_list = g_list_prepend(defered_list, rcpt); | 50 defered_list = g_list_prepend(defered_list, |
51 rcpt); | |
51 } | 52 } |
52 } | 53 } |
53 if (addr_is_failed(rcpt)) { | 54 if (addr_is_failed(rcpt)) { |
54 failed_list = g_list_prepend(failed_list, rcpt); | 55 failed_list = g_list_prepend(failed_list, rcpt); |
55 } | 56 } |
56 } | 57 } |
57 if (failed_list) { | 58 if (failed_list) { |
58 ok_fail = fail_msg(msg, conf.errmsg_file, failed_list, err_fmt, args); | 59 ok_fail = fail_msg(msg, conf.errmsg_file, failed_list, |
60 err_fmt, args); | |
59 g_list_free(failed_list); | 61 g_list_free(failed_list); |
60 } | 62 } |
61 if (defered_list) { | 63 if (defered_list) { |
62 ok_warn = warn_msg(msg, conf.warnmsg_file, defered_list, err_fmt, args); | 64 ok_warn = warn_msg(msg, conf.warnmsg_file, defered_list, |
65 err_fmt, args); | |
63 g_list_free(defered_list); | 66 g_list_free(defered_list); |
64 } | 67 } |
65 va_end(args); | 68 va_end(args); |
66 return ok_fail && ok_warn; | 69 return ok_fail && ok_warn; |
67 } | 70 } |
71 { | 74 { |
72 return (gint) strcasecmp(a, b); | 75 return (gint) strcasecmp(a, b); |
73 } | 76 } |
74 | 77 |
75 gboolean | 78 gboolean |
76 deliver_local_mbox(message *msg, GList *hdr_list, address *rcpt, address *env_addr) | 79 deliver_local_mbox(message *msg, GList *hdr_list, address *rcpt, |
80 address *env_addr) | |
77 { | 81 { |
78 DEBUG(1) debugf("attempting to deliver %s with mbox\n", msg->uid); | 82 DEBUG(1) debugf("attempting to deliver %s with mbox\n", msg->uid); |
79 if (append_file(msg, hdr_list, rcpt->local_part)) { | 83 if (append_file(msg, hdr_list, rcpt->local_part)) { |
80 if (env_addr != rcpt) { | 84 if (env_addr != rcpt) { |
81 logwrite(LOG_NOTICE, "%s => %s@%s <%s@%s> with mbox\n", msg->uid, rcpt->local_part, rcpt->domain, env_addr->local_part, env_addr->domain); | 85 logwrite(LOG_NOTICE, "%s => %s@%s <%s@%s> with mbox\n", |
86 msg->uid, rcpt->local_part, | |
87 rcpt->domain, env_addr->local_part, | |
88 env_addr->domain); | |
82 } else { | 89 } else { |
83 logwrite(LOG_NOTICE, "%s => <%s@%s> with mbox\n", msg->uid, rcpt->local_part, rcpt->domain); | 90 logwrite(LOG_NOTICE, "%s => <%s@%s> with mbox\n", |
91 msg->uid, rcpt->local_part, | |
92 rcpt->domain); | |
84 } | 93 } |
85 addr_mark_delivered(rcpt); | 94 addr_mark_delivered(rcpt); |
86 return TRUE; | 95 return TRUE; |
87 } | 96 } |
88 | 97 |
94 } | 103 } |
95 return FALSE; | 104 return FALSE; |
96 } | 105 } |
97 | 106 |
98 gboolean | 107 gboolean |
99 deliver_local_pipe(message *msg, GList *hdr_list, address *rcpt, address *env_addr) | 108 deliver_local_pipe(message *msg, GList *hdr_list, address *rcpt, |
100 { | 109 address *env_addr) |
101 guint flags; | 110 { |
111 guint flags = 0; | |
102 | 112 |
103 DEBUG(1) debugf("attempting to deliver %s with pipe\n", msg->uid); | 113 DEBUG(1) debugf("attempting to deliver %s with pipe\n", msg->uid); |
104 | 114 |
105 flags = (conf.pipe_fromline) ? MSGSTR_FROMLINE : 0; | 115 flags |= (conf.pipe_fromline) ? MSGSTR_FROMLINE : 0; |
106 flags |= (conf.pipe_fromhack) ? MSGSTR_FROMHACK : 0; | 116 flags |= (conf.pipe_fromhack) ? MSGSTR_FROMHACK : 0; |
107 if (pipe_out(msg, hdr_list, rcpt, &(rcpt->local_part[1]), flags)) { | 117 if (pipe_out(msg, hdr_list, rcpt, &(rcpt->local_part[1]), flags)) { |
108 logwrite(LOG_NOTICE, "%s => %s <%s@%s> with pipe\n", | 118 logwrite(LOG_NOTICE, "%s => %s <%s@%s> with pipe\n", |
109 msg->uid, rcpt->local_part, env_addr->local_part, env_addr->domain); | 119 msg->uid, rcpt->local_part, |
120 env_addr->local_part, env_addr->domain); | |
110 addr_mark_delivered(rcpt); | 121 addr_mark_delivered(rcpt); |
111 return TRUE; | 122 return TRUE; |
112 } | 123 } |
113 | 124 |
114 if ((errno != (1024 + EX_TEMPFAIL)) && (errno != EAGAIN)) { | 125 if ((errno != (1024 + EX_TEMPFAIL)) && (errno != EAGAIN)) { |
119 } | 130 } |
120 return FALSE; | 131 return FALSE; |
121 } | 132 } |
122 | 133 |
123 gboolean | 134 gboolean |
124 deliver_local_mda(message *msg, GList *hdr_list, address *rcpt, address *env_addr) | 135 deliver_local_mda(message *msg, GList *hdr_list, address *rcpt, |
136 address *env_addr) | |
125 { | 137 { |
126 gboolean ok = FALSE; | 138 gboolean ok = FALSE; |
127 gchar *cmd = g_malloc(256); | 139 gchar *cmd = g_malloc(256); |
128 GList *var_table = var_table_rcpt(var_table_msg(NULL, msg), rcpt); | 140 GList *var_table = var_table_rcpt(var_table_msg(NULL, msg), rcpt); |
129 guint flags; | 141 guint flags = 0; |
130 | 142 |
131 DEBUG(1) debugf("attempting to deliver %s with mda\n", msg->uid); | 143 DEBUG(1) debugf("attempting to deliver %s with mda\n", msg->uid); |
132 | 144 |
133 if (!expand(var_table, conf.mda, cmd, 256)) { | 145 if (!expand(var_table, conf.mda, cmd, 256)) { |
134 logwrite(LOG_ALERT, "could not expand string %s\n", conf.mda); | 146 logwrite(LOG_ALERT, "could not expand string %s\n", conf.mda); |
135 destroy_table(var_table); | 147 destroy_table(var_table); |
136 return FALSE; | 148 return FALSE; |
137 } | 149 } |
138 | 150 |
139 flags = (conf.mda_fromline) ? MSGSTR_FROMLINE : 0; | 151 flags |= (conf.mda_fromline) ? MSGSTR_FROMLINE : 0; |
140 flags |= (conf.mda_fromhack) ? MSGSTR_FROMHACK : 0; | 152 flags |= (conf.mda_fromhack) ? MSGSTR_FROMHACK : 0; |
141 if (pipe_out(msg, hdr_list, rcpt, cmd, flags)) { | 153 if (pipe_out(msg, hdr_list, rcpt, cmd, flags)) { |
142 logwrite(LOG_NOTICE, "%s => %s@%s with mda (cmd = '%s')\n", | 154 logwrite(LOG_NOTICE, "%s => %s@%s with mda (cmd = '%s')\n", |
143 msg->uid, rcpt->local_part, rcpt->domain, cmd); | 155 msg->uid, rcpt->local_part, rcpt->domain, cmd); |
144 addr_mark_delivered(rcpt); | 156 addr_mark_delivered(rcpt); |
145 ok = TRUE; | 157 ok = TRUE; |
146 } else if ((errno != (1024 + EX_TEMPFAIL)) && (errno != EAGAIN)) { | 158 } else if ((errno != (1024 + EX_TEMPFAIL)) && (errno != EAGAIN)) { |
147 addr_mark_failed(rcpt); | 159 addr_mark_failed(rcpt); |
148 } else { | 160 } else { |
164 | 176 |
165 DEBUG(5) debugf("deliver_local entered\n"); | 177 DEBUG(5) debugf("deliver_local entered\n"); |
166 | 178 |
167 flag = (msg->data_list == NULL); | 179 flag = (msg->data_list == NULL); |
168 if (flag && !spool_read_data(msg)) { | 180 if (flag && !spool_read_data(msg)) { |
169 logwrite(LOG_ALERT, "could not open data spool file for %s\n", msg->uid); | 181 logwrite(LOG_ALERT, "could not open data spool file for %s\n", |
182 msg->uid); | |
170 return FALSE; | 183 return FALSE; |
171 } | 184 } |
172 | 185 |
173 for (rcpt_node = g_list_first(rcpt_list); rcpt_node; rcpt_node = g_list_next(rcpt_node)) { | 186 for (rcpt_node = g_list_first(rcpt_list); rcpt_node; |
187 rcpt_node = g_list_next(rcpt_node)) { | |
174 GList *hdr_list; | 188 GList *hdr_list; |
175 address *rcpt = (address *) (rcpt_node->data); | 189 address *rcpt = (address *) (rcpt_node->data); |
176 address *env_addr = addr_find_ancestor(rcpt); | 190 address *env_addr = addr_find_ancestor(rcpt); |
177 address *ret_path = msg->return_path; | 191 address *ret_path = msg->return_path; |
178 header *retpath_hdr, *envto_hdr; | 192 header *retpath_hdr, *envto_hdr; |
181 ** we need a private copy of the hdr list because we add | 195 ** we need a private copy of the hdr list because we add |
182 ** headers here that belong to the rcpt only. g_list_copy | 196 ** headers here that belong to the rcpt only. g_list_copy |
183 ** copies only the nodes, so it is safe to g_list_free it | 197 ** copies only the nodes, so it is safe to g_list_free it |
184 */ | 198 */ |
185 hdr_list = g_list_copy(msg->hdr_list); | 199 hdr_list = g_list_copy(msg->hdr_list); |
186 retpath_hdr = create_header(HEAD_ENVELOPE_TO, "Envelope-to: %s\n", addr_string(env_addr)); | 200 retpath_hdr = create_header(HEAD_ENVELOPE_TO, |
187 envto_hdr = create_header(HEAD_RETURN_PATH, "Return-path: %s\n", addr_string(ret_path)); | 201 "Envelope-to: %s\n", addr_string(env_addr)); |
202 envto_hdr = create_header(HEAD_RETURN_PATH, | |
203 "Return-path: %s\n", addr_string(ret_path)); | |
188 | 204 |
189 hdr_list = g_list_prepend(hdr_list, envto_hdr); | 205 hdr_list = g_list_prepend(hdr_list, envto_hdr); |
190 hdr_list = g_list_prepend(hdr_list, retpath_hdr); | 206 hdr_list = g_list_prepend(hdr_list, retpath_hdr); |
191 | 207 |
192 if (rcpt->local_part[0] == '|') { | 208 if (*rcpt->local_part == '|') { |
193 /* | 209 /* |
194 ** probably for expanded aliases, but why not done | 210 ** probably for expanded aliases, but why not done |
195 ** like with the mda? //meillo 2010-12-06 | 211 ** like with the mda? //meillo 2010-12-06 |
196 */ | 212 */ |
197 if (deliver_local_pipe(msg, hdr_list, rcpt, env_addr)) { | 213 if (deliver_local_pipe(msg, hdr_list, rcpt, |
214 env_addr)) { | |
198 ok = TRUE; | 215 ok = TRUE; |
199 } | 216 } |
200 } else { | 217 } else { |
201 /* figure out which mailbox type should be used for this user */ | 218 /* figure out which mailbox type should be used |
219 ** for this user */ | |
202 gchar *user = rcpt->local_part; | 220 gchar *user = rcpt->local_part; |
203 gchar *mbox_type = conf.mbox_default; | 221 gchar *mbox_type = conf.mbox_default; |
204 | 222 |
205 if (g_list_find_custom (conf.mbox_users, user, _g_list_strcasecmp)) { | 223 if (g_list_find_custom(conf.mbox_users, user, |
224 _g_list_strcasecmp)) { | |
206 mbox_type = "mbox"; | 225 mbox_type = "mbox"; |
207 } else if (g_list_find_custom (conf.mda_users, user, _g_list_strcasecmp)) { | 226 } else if (g_list_find_custom (conf.mda_users, user, |
227 _g_list_strcasecmp)) { | |
208 mbox_type = "mda"; | 228 mbox_type = "mda"; |
209 } | 229 } |
210 | 230 |
211 if (strcmp(mbox_type, "mbox") == 0) { | 231 if (strcmp(mbox_type, "mbox")==0) { |
212 if (deliver_local_mbox(msg, hdr_list, rcpt, env_addr)) { | 232 if (deliver_local_mbox(msg, hdr_list, rcpt, |
233 env_addr)) { | |
213 ok = TRUE; | 234 ok = TRUE; |
214 } | 235 } |
215 } else if (strcmp(mbox_type, "mda") == 0) { | 236 } else if (strcmp(mbox_type, "mda") == 0) { |
216 if (conf.mda) { | 237 if (conf.mda) { |
217 if (deliver_local_mda(msg, hdr_list, rcpt, env_addr)) { | 238 if (deliver_local_mda(msg, hdr_list, |
239 rcpt, env_addr)) { | |
218 ok = TRUE; | 240 ok = TRUE; |
219 } | 241 } |
220 } else { | 242 } else { |
221 logwrite(LOG_ALERT, "mbox type is mda, but no mda command given in configuration\n"); | 243 logwrite(LOG_ALERT, "mbox type is " |
244 "mda, but no mda " | |
245 "command given in " | |
246 "configuration\n"); | |
222 } | 247 } |
223 | 248 |
224 } else { | 249 } else { |
225 logwrite(LOG_ALERT, "unknown mbox type '%s'\n", mbox_type); | 250 logwrite(LOG_ALERT, "unknown mbox type '%s'\n", |
251 mbox_type); | |
226 } | 252 } |
227 } | 253 } |
228 | 254 |
229 destroy_header(retpath_hdr); | 255 destroy_header(retpath_hdr); |
230 destroy_header(envto_hdr); | 256 destroy_header(envto_hdr); |
231 | 257 |
232 g_list_free(hdr_list); | 258 g_list_free(hdr_list); |
233 } | 259 } |
234 ok_fail = delivery_failures(msg, rcpt_list, "%s (%d)", ext_strerror(errno), errno); | 260 ok_fail = delivery_failures(msg, rcpt_list, "%s (%d)", |
261 ext_strerror(errno), errno); | |
235 | 262 |
236 if (flag) { | 263 if (flag) { |
237 msg_free_data(msg); | 264 msg_free_data(msg); |
238 } | 265 } |
239 if (ok || ok_fail) { | 266 if (ok || ok_fail) { |
259 | 286 |
260 DEBUG(5) debugf("checking address %s\n", rcpt->address); | 287 DEBUG(5) debugf("checking address %s\n", rcpt->address); |
261 | 288 |
262 /* search for local host list: */ | 289 /* search for local host list: */ |
263 foreach(conf.local_hosts, dom_node) { | 290 foreach(conf.local_hosts, dom_node) { |
264 if (fnmatch(dom_node->data, rcpt->domain, FNM_CASEFOLD)==0) { | 291 if (fnmatch(dom_node->data, rcpt->domain, |
265 *p_local_list = g_list_append(*p_local_list, rcpt); | 292 FNM_CASEFOLD)==0) { |
266 DEBUG(5) debugf("<%s@%s> is local\n", rcpt->local_part, rcpt->domain); | 293 *p_local_list = g_list_append(*p_local_list, |
294 rcpt); | |
295 DEBUG(5) debugf("<%s@%s> is local\n", | |
296 rcpt->local_part, | |
297 rcpt->domain); | |
267 break; | 298 break; |
268 } else { | 299 } else { |
269 *p_nonlocal_list = g_list_append(*p_nonlocal_list, rcpt); | 300 *p_nonlocal_list = g_list_append( |
301 *p_nonlocal_list, rcpt); | |
270 } | 302 } |
271 } | 303 } |
272 } | 304 } |
273 } | 305 } |
274 | 306 |
285 msg_out *msgout = (msg_out *) (msgout_node->data); | 317 msg_out *msgout = (msg_out *) (msgout_node->data); |
286 gboolean flag, ok_fail = FALSE; | 318 gboolean flag, ok_fail = FALSE; |
287 message *msg = msgout->msg; | 319 message *msg = msgout->msg; |
288 GList *rcpt_node, *rcpt_list = msgout->rcpt_list; | 320 GList *rcpt_node, *rcpt_list = msgout->rcpt_list; |
289 | 321 |
290 DEBUG(1) debugf("attempting to deliver %s with pipe\n", msg->uid); | 322 DEBUG(1) debugf("attempting to deliver %s with pipe\n", |
323 msg->uid); | |
291 | 324 |
292 flag = (msg->data_list == NULL); | 325 flag = (msg->data_list == NULL); |
293 if (flag && !spool_read_data(msg)) { | 326 if (flag && !spool_read_data(msg)) { |
294 logwrite(LOG_ALERT, "could not open data spool file for %s\n", msg->uid); | 327 logwrite(LOG_ALERT, "could not open data spool file " |
328 "for %s\n", msg->uid); | |
295 continue; | 329 continue; |
296 } | 330 } |
297 | 331 |
298 ok = FALSE; | 332 ok = FALSE; |
299 foreach(rcpt_list, rcpt_node) { | 333 foreach(rcpt_list, rcpt_node) { |
300 address *rcpt = (address *) (rcpt_node->data); | 334 address *rcpt = (address *) (rcpt_node->data); |
301 gchar *cmd = g_malloc(256); | 335 gchar *cmd = g_malloc(256); |
302 GList *var_table = var_table_rcpt(var_table_msg(NULL, msg), rcpt); | 336 GList *var_table = var_table_rcpt(var_table_msg(NULL, |
303 | 337 msg), rcpt); |
304 DEBUG(1) debugf("attempting to deliver %s to %s@%s with pipe\n", | 338 |
305 msg->uid, rcpt->local_part, rcpt->domain); | 339 DEBUG(1) debugf("attempting to deliver %s to %s@%s " |
340 "with pipe\n", msg->uid, | |
341 rcpt->local_part, rcpt->domain); | |
306 | 342 |
307 if (!expand(var_table, route->pipe, cmd, 256)) { | 343 if (!expand(var_table, route->pipe, cmd, 256)) { |
308 logwrite(LOG_ALERT, "could not expand string `%s'\n", route->pipe); | 344 logwrite(LOG_ALERT, "could not expand string `%s'\n", route->pipe); |
309 destroy_table(var_table); | 345 destroy_table(var_table); |
310 continue; | 346 continue; |