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;