Mass renaming part II.
Nicholas Marriott
17 years ago
34 | 34 | int |
35 | 35 | deliver_add_header_deliver(struct deliver_ctx *dctx, struct action *t) |
36 | 36 | { |
37 | struct account *a = dctx->account; | |
38 | struct mail *m = dctx->mail; | |
39 | struct add_header_data *data = t->data; | |
40 | char *value; | |
37 | struct account *a = dctx->account; | |
38 | struct mail *m = dctx->mail; | |
39 | struct deliver_add_header_data *data = t->data; | |
40 | char *value; | |
41 | 41 | |
42 | 42 | value = replace(data->value, m->tags, m, *dctx->pm_valid, dctx->pm); |
43 | 43 | if (value == NULL) { |
66 | 66 | void |
67 | 67 | deliver_add_header_desc(struct action *t, char *buf, size_t len) |
68 | 68 | { |
69 | struct add_header_data *data = t->data; | |
69 | struct deliver_add_header_data *data = t->data; | |
70 | 70 | |
71 | 71 | xsnprintf(buf, len, "add-header \"%s\" \"%s\"", data->hdr, data->value); |
72 | 72 | } |
66 | 66 | int |
67 | 67 | deliver_mbox_deliver(struct deliver_ctx *dctx, struct action *t) |
68 | 68 | { |
69 | struct account *a = dctx->account; | |
70 | struct mail *m = dctx->mail; | |
71 | struct mbox_data *data = t->data; | |
72 | char *path, *ptr, *ptr2, *from = NULL; | |
73 | size_t len, len2; | |
74 | int exists, fd = -1, fd2, res = DELIVER_FAILURE; | |
75 | gzFile gzf = NULL; | |
69 | struct account *a = dctx->account; | |
70 | struct mail *m = dctx->mail; | |
71 | struct deliver_mbox_data *data = t->data; | |
72 | char *path, *ptr, *ptr2, *from = NULL; | |
73 | size_t len, len2; | |
74 | int exists, fd = -1, fd2; | |
75 | int res = DELIVER_FAILURE; | |
76 | gzFile gzf = NULL; | |
76 | 77 | |
77 | 78 | path = replace(data->path, m->tags, m, *dctx->pm_valid, dctx->pm); |
78 | 79 | if (path == NULL || *path == '\0') { |
200 | 201 | void |
201 | 202 | deliver_mbox_desc(struct action *t, char *buf, size_t len) |
202 | 203 | { |
203 | struct mbox_data *data = t->data; | |
204 | struct deliver_mbox_data *data = t->data; | |
204 | 205 | |
205 | 206 | if (data->compress) |
206 | 207 | xsnprintf(buf, len, "mbox \"%s\" compress", data->path); |
63 | 63 | int |
64 | 64 | deliver_smtp_deliver(struct deliver_ctx *dctx, struct action *t) |
65 | 65 | { |
66 | struct account *a = dctx->account; | |
67 | struct mail *m = dctx->mail; | |
68 | struct smtp_data *data = t->data; | |
69 | int done, code; | |
70 | struct io *io; | |
71 | char *cause, *to, *from, *line, *ptr, *lbuf; | |
72 | enum smtp_state state; | |
73 | size_t len, llen; | |
66 | struct account *a = dctx->account; | |
67 | struct mail *m = dctx->mail; | |
68 | struct deliver_smtp_data *data = t->data; | |
69 | int done, code; | |
70 | struct io *io; | |
71 | char *cause, *to, *from, *line, *ptr, *lbuf; | |
72 | enum smtp_state state; | |
73 | size_t len, llen; | |
74 | 74 | |
75 | 75 | io = connectproxy(&data->server, conf.proxy, IO_CRLF, |
76 | 76 | conf.timeout * 1000, &cause); |
196 | 196 | void |
197 | 197 | deliver_smtp_desc(struct action *t, char *buf, size_t len) |
198 | 198 | { |
199 | struct smtp_data *data = t->data; | |
199 | struct deliver_smtp_data *data = t->data; | |
200 | 200 | |
201 | 201 | xsnprintf(buf, len, "smtp%s server \"%s\" port %s to \"%s\"", |
202 | 202 | data->server.ssl ? "s" : "", data->server.host, data->server.port, |
35 | 35 | int |
36 | 36 | deliver_stdout_deliver(struct deliver_ctx *dctx, struct action *t) |
37 | 37 | { |
38 | struct account *a = dctx->account; | |
39 | struct mail *m = dctx->mail; | |
40 | struct stdout_data *data = t->data; | |
41 | char *from; | |
38 | struct account *a = dctx->account; | |
39 | struct mail *m = dctx->mail; | |
40 | struct deliver_stdout_data *data = t->data; | |
41 | char *from; | |
42 | 42 | |
43 | 43 | log_debug("%s: writing to stdout", a->name); |
44 | 44 | |
68 | 68 | void |
69 | 69 | deliver_stdout_desc(struct action *t, char *buf, size_t len) |
70 | 70 | { |
71 | struct stdout_data *data = t->data; | |
71 | struct deliver_stdout_data *data = t->data; | |
72 | 72 | |
73 | 73 | xsnprintf(buf, len, "stdout%s", data->add_from ? " add-from" : ""); |
74 | 74 | } |
63 | 63 | }; |
64 | 64 | |
65 | 65 | /* Deliver smtp data. */ |
66 | struct smtp_data { | |
66 | struct deliver_smtp_data { | |
67 | 67 | struct server server; |
68 | 68 | char *to; |
69 | 69 | }; |
70 | 70 | |
71 | 71 | /* Deliver mbox data. */ |
72 | struct mbox_data { | |
72 | struct deliver_mbox_data { | |
73 | 73 | char *path; |
74 | 74 | int compress; |
75 | 75 | }; |
76 | 76 | |
77 | 77 | /* Deliver stdout data. */ |
78 | struct stdout_data { | |
78 | struct deliver_stdout_data { | |
79 | 79 | int add_from; |
80 | 80 | }; |
81 | 81 | |
82 | 82 | /* Deliver add-header data. */ |
83 | struct add_header_data { | |
83 | struct deliver_add_header_data { | |
84 | 84 | char *hdr; |
85 | 85 | char *value; |
86 | 86 | }; |
298 | 298 | #define STRBENTRIES 64 |
299 | 299 | #define STRBBLOCK 512 |
300 | 300 | |
301 | /* String block acsess macros. */ | |
301 | /* String block access macros. */ | |
302 | 302 | #define STRB_KEY(sb, sbe) (((char *) (sb)) + (sizeof *(sb)) + sbe->key) |
303 | 303 | #define STRB_VALUE(sb, sbe) (((char *) (sb)) + (sizeof *(sb)) + sbe->value) |
304 | 304 | |
599 | 599 | |
600 | 600 | /* Privsep message data. */ |
601 | 601 | struct msgdata { |
602 | int error; | |
603 | struct mail mail; | |
604 | ||
605 | int pm_valid; | |
606 | regmatch_t pm[NPMATCH]; | |
602 | int error; | |
603 | struct mail mail; | |
604 | ||
605 | int pm_valid; | |
606 | regmatch_t pm[NPMATCH]; | |
607 | 607 | |
608 | 608 | /* these only work so long as they aren't moved in either process */ |
609 | struct account *account; | |
610 | struct action *action; | |
611 | struct command_data *cmddata; | |
612 | ||
613 | uid_t uid; | |
609 | struct account *account; | |
610 | struct action *action; | |
611 | struct match_command_data *cmddata; | |
612 | ||
613 | uid_t uid; | |
614 | 614 | }; |
615 | 615 | |
616 | 616 | /* Privsep message. */ |
47 | 47 | int printflike2 |
48 | 48 | imap_putln(struct account *a, const char *fmt, ...) |
49 | 49 | { |
50 | struct imap_data *data = a->data; | |
50 | struct fetch_imap_data *data = a->data; | |
51 | 51 | |
52 | 52 | va_list ap; |
53 | 53 | |
61 | 61 | char * |
62 | 62 | imap_getln(struct account *a, int type) |
63 | 63 | { |
64 | struct imap_data *data = a->data; | |
64 | struct fetch_imap_data *data = a->data; | |
65 | 65 | char **lbuf = &data->lbuf; |
66 | 66 | size_t *llen = &data->llen; |
67 | 67 | char *line, *cause; |
112 | 112 | void |
113 | 113 | imap_flush(struct account *a) |
114 | 114 | { |
115 | struct imap_data *data = a->data; | |
115 | struct fetch_imap_data *data = a->data; | |
116 | 116 | |
117 | 117 | io_flush(data->io, NULL); |
118 | 118 | } |
120 | 120 | int |
121 | 121 | fetch_imap_connect(struct account *a) |
122 | 122 | { |
123 | struct imap_data *data = a->data; | |
123 | struct fetch_imap_data *data = a->data; | |
124 | 124 | char *cause; |
125 | 125 | |
126 | 126 | data->io = connectproxy(&data->server, conf.proxy, IO_CRLF, |
152 | 152 | int |
153 | 153 | fetch_imap_disconnect(struct account *a) |
154 | 154 | { |
155 | struct imap_data *data = a->data; | |
155 | struct fetch_imap_data *data = a->data; | |
156 | 156 | |
157 | 157 | if (imap_close(a) != 0) |
158 | 158 | goto error; |
176 | 176 | void |
177 | 177 | fetch_imap_desc(struct account *a, char *buf, size_t len) |
178 | 178 | { |
179 | struct imap_data *data = a->data; | |
179 | struct fetch_imap_data *data = a->data; | |
180 | 180 | |
181 | 181 | xsnprintf(buf, len, |
182 | 182 | "imap%s server \"%s\" port %s user \"%s\" folder \"%s\"", |
47 | 47 | int printflike2 |
48 | 48 | imappipe_putln(struct account *a, const char *fmt, ...) |
49 | 49 | { |
50 | struct imap_data *data = a->data; | |
50 | struct fetch_imap_data *data = a->data; | |
51 | 51 | |
52 | 52 | va_list ap; |
53 | 53 | |
61 | 61 | char * |
62 | 62 | imappipe_getln(struct account *a, int type) |
63 | 63 | { |
64 | struct imap_data *data = a->data; | |
64 | struct fetch_imap_data *data = a->data; | |
65 | 65 | char **lbuf = &data->lbuf; |
66 | 66 | size_t *llen = &data->llen; |
67 | 67 | char *out, *err, *cause; |
119 | 119 | void |
120 | 120 | imappipe_flush(struct account *a) |
121 | 121 | { |
122 | struct imap_data *data = a->data; | |
122 | struct fetch_imap_data *data = a->data; | |
123 | 123 | |
124 | 124 | io_flush(data->cmd->io_in, NULL); |
125 | 125 | } |
127 | 127 | int |
128 | 128 | fetch_imappipe_connect(struct account *a) |
129 | 129 | { |
130 | struct imap_data *data = a->data; | |
130 | struct fetch_imap_data *data = a->data; | |
131 | 131 | char *cause; |
132 | 132 | |
133 | 133 | data->cmd = cmd_start(data->pipecmd, CMD_IN|CMD_OUT, NULL, 0, &cause); |
160 | 160 | int |
161 | 161 | fetch_imappipe_disconnect(struct account *a) |
162 | 162 | { |
163 | struct imap_data *data = a->data; | |
163 | struct fetch_imap_data *data = a->data; | |
164 | 164 | |
165 | 165 | if (imap_close(a) != 0) |
166 | 166 | goto error; |
182 | 182 | void |
183 | 183 | fetch_imappipe_desc(struct account *a, char *buf, size_t len) |
184 | 184 | { |
185 | struct imap_data *data = a->data; | |
185 | struct fetch_imap_data *data = a->data; | |
186 | 186 | |
187 | 187 | if (data->user == NULL) { |
188 | 188 | xsnprintf(buf, len, "imap pipe \"%s\" folder \"%s\"", |
59 | 59 | int |
60 | 60 | maildir_makepaths(struct account *a) |
61 | 61 | { |
62 | struct maildir_data *data = a->data; | |
63 | char *s, *path; | |
64 | u_int i, j; | |
65 | glob_t g; | |
66 | struct stat sb; | |
67 | struct strb *tags; | |
62 | struct fetch_maildir_data *data = a->data; | |
63 | char *s, *path; | |
64 | u_int i, j; | |
65 | glob_t g; | |
66 | struct stat sb; | |
67 | struct strb *tags; | |
68 | 68 | |
69 | 69 | strb_create(&tags); |
70 | 70 | default_tags(&tags, NULL, a); |
131 | 131 | void |
132 | 132 | maildir_freepaths(struct account *a) |
133 | 133 | { |
134 | struct maildir_data *data = a->data; | |
135 | u_int i; | |
134 | struct fetch_maildir_data *data = a->data; | |
135 | u_int i; | |
136 | 136 | |
137 | 137 | for (i = 0; i < ARRAY_LENGTH(data->paths); i++) |
138 | 138 | xfree(ARRAY_ITEM(data->paths, i, char *)); |
143 | 143 | int |
144 | 144 | fetch_maildir_connect(struct account *a) |
145 | 145 | { |
146 | struct maildir_data *data = a->data; | |
146 | struct fetch_maildir_data *data = a->data; | |
147 | 147 | |
148 | 148 | data->dirp = NULL; |
149 | 149 | |
159 | 159 | int |
160 | 160 | fetch_maildir_poll(struct account *a, u_int *n) |
161 | 161 | { |
162 | struct maildir_data *data = a->data; | |
163 | u_int i; | |
164 | char *path, entry[MAXPATHLEN]; | |
165 | DIR *dirp; | |
166 | struct dirent *dp; | |
167 | struct stat sb; | |
162 | struct fetch_maildir_data *data = a->data; | |
163 | u_int i; | |
164 | char *path, entry[MAXPATHLEN]; | |
165 | DIR *dirp; | |
166 | struct dirent *dp; | |
167 | struct stat sb; | |
168 | 168 | |
169 | 169 | *n = 0; |
170 | 170 | for (i = 0; i < ARRAY_LENGTH(data->paths); i++) { |
204 | 204 | int |
205 | 205 | fetch_maildir_fetch(struct account *a, struct mail *m) |
206 | 206 | { |
207 | struct maildir_data *data = a->data; | |
208 | struct dirent *dp; | |
209 | char *ptr, path[MAXPATHLEN]; | |
210 | struct stat sb; | |
211 | int fd; | |
207 | struct fetch_maildir_data *data = a->data; | |
208 | struct dirent *dp; | |
209 | char *ptr, path[MAXPATHLEN]; | |
210 | struct stat sb; | |
211 | int fd; | |
212 | 212 | |
213 | 213 | restart: |
214 | 214 | if (data->dirp == NULL) { |
297 | 297 | int |
298 | 298 | fetch_maildir_delete(struct account *a) |
299 | 299 | { |
300 | struct maildir_data *data = a->data; | |
300 | struct fetch_maildir_data *data = a->data; | |
301 | 301 | |
302 | 302 | if (unlink(data->entry) != 0) { |
303 | 303 | log_warn("%s: %s: unlink", a->name, data->entry); |
310 | 310 | int |
311 | 311 | fetch_maildir_disconnect(struct account *a) |
312 | 312 | { |
313 | struct maildir_data *data = a->data; | |
313 | struct fetch_maildir_data *data = a->data; | |
314 | 314 | |
315 | 315 | maildir_freepaths(a); |
316 | 316 | |
323 | 323 | void |
324 | 324 | fetch_maildir_desc(struct account *a, char *buf, size_t len) |
325 | 325 | { |
326 | struct maildir_data *data = a->data; | |
327 | char *maildirs; | |
326 | struct fetch_maildir_data *data = a->data; | |
327 | char *maildirs; | |
328 | 328 | |
329 | 329 | maildirs = fmt_strings("maildirs ", data->maildirs); |
330 | 330 | strlcpy(buf, maildirs, len); |
86 | 86 | char * |
87 | 87 | nntp_line(struct account *a, char **lbuf, size_t *llen) |
88 | 88 | { |
89 | struct nntp_data *data = a->data; | |
89 | struct fetch_nntp_data *data = a->data; | |
90 | 90 | char *line, *cause; |
91 | 91 | |
92 | 92 | switch (io_pollline2(data->io, &line, lbuf, llen, &cause)) { |
165 | 165 | int |
166 | 166 | nntp_group(struct account *a, char **lbuf, size_t *llen) |
167 | 167 | { |
168 | struct nntp_data *data = a->data; | |
168 | struct fetch_nntp_data *data = a->data; | |
169 | 169 | struct nntp_group *group; |
170 | 170 | char *line, *id; |
171 | 171 | u_int n, last; |
231 | 231 | int |
232 | 232 | nntp_load(struct account *a) |
233 | 233 | { |
234 | struct nntp_data *data = a->data; | |
234 | struct fetch_nntp_data *data = a->data; | |
235 | 235 | struct nntp_group *group; |
236 | 236 | int fd = -1, fd2; |
237 | 237 | FILE *f = NULL; |
316 | 316 | int |
317 | 317 | nntp_save(struct account *a) |
318 | 318 | { |
319 | struct nntp_data *data = a->data; | |
319 | struct fetch_nntp_data *data = a->data; | |
320 | 320 | struct nntp_group *group; |
321 | 321 | char tmp[MAXPATHLEN]; |
322 | 322 | int fd = -1; |
366 | 366 | int |
367 | 367 | fetch_nntp_init(struct account *a) |
368 | 368 | { |
369 | struct nntp_data *data = a->data; | |
369 | struct fetch_nntp_data *data = a->data; | |
370 | 370 | struct nntp_group *group; |
371 | 371 | u_int i; |
372 | 372 | |
387 | 387 | int |
388 | 388 | fetch_nntp_free(struct account *a) |
389 | 389 | { |
390 | struct nntp_data *data = a->data; | |
390 | struct fetch_nntp_data *data = a->data; | |
391 | 391 | struct nntp_group *group; |
392 | 392 | u_int i; |
393 | 393 | |
406 | 406 | int |
407 | 407 | fetch_nntp_connect(struct account *a) |
408 | 408 | { |
409 | struct nntp_data *data = a->data; | |
409 | struct fetch_nntp_data *data = a->data; | |
410 | 410 | char *lbuf, *line, *cause; |
411 | 411 | size_t llen; |
412 | 412 | |
459 | 459 | int |
460 | 460 | fetch_nntp_disconnect(struct account *a) |
461 | 461 | { |
462 | struct nntp_data *data = a->data; | |
462 | struct fetch_nntp_data *data = a->data; | |
463 | 463 | char *lbuf, *line; |
464 | 464 | size_t llen; |
465 | 465 | |
492 | 492 | int |
493 | 493 | fetch_nntp_poll(struct account *a, u_int *n) |
494 | 494 | { |
495 | struct nntp_data *data = a->data; | |
495 | struct fetch_nntp_data *data = a->data; | |
496 | 496 | char *lbuf; |
497 | 497 | size_t llen; |
498 | 498 | |
523 | 523 | int |
524 | 524 | fetch_nntp_fetch(struct account *a, struct mail *m) |
525 | 525 | { |
526 | struct nntp_data *data = a->data; | |
526 | struct fetch_nntp_data *data = a->data; | |
527 | 527 | struct nntp_group *group; |
528 | 528 | char *lbuf, *line, *id; |
529 | 529 | size_t llen, off, len; |
623 | 623 | void |
624 | 624 | fetch_nntp_desc(struct account *a, char *buf, size_t len) |
625 | 625 | { |
626 | struct nntp_data *data = a->data; | |
626 | struct fetch_nntp_data *data = a->data; | |
627 | 627 | char *names; |
628 | 628 | |
629 | 629 | names = fmt_strings("groups ", data->names); |
57 | 57 | char * |
58 | 58 | pop3_line(struct account *a, char **lbuf, size_t *llen) |
59 | 59 | { |
60 | struct pop3_data *data = a->data; | |
60 | struct fetch_pop3_data *data = a->data; | |
61 | 61 | char *line, *cause; |
62 | 62 | |
63 | 63 | switch (io_pollline2(data->io, &line, lbuf, llen, &cause)) { |
92 | 92 | int |
93 | 93 | fetch_pop3_free(struct account *a) |
94 | 94 | { |
95 | struct pop3_data *data = a->data; | |
95 | struct fetch_pop3_data *data = a->data; | |
96 | 96 | u_int i; |
97 | 97 | |
98 | 98 | if (data->uid != NULL) |
108 | 108 | int |
109 | 109 | fetch_pop3_init(struct account *a) |
110 | 110 | { |
111 | struct pop3_data *data = a->data; | |
111 | struct fetch_pop3_data *data = a->data; | |
112 | 112 | |
113 | 113 | ARRAY_INIT(&data->kept); |
114 | 114 | |
118 | 118 | int |
119 | 119 | fetch_pop3_connect(struct account *a) |
120 | 120 | { |
121 | struct pop3_data *data = a->data; | |
121 | struct fetch_pop3_data *data = a->data; | |
122 | 122 | char *lbuf, *line, *cause; |
123 | 123 | size_t llen; |
124 | 124 | |
173 | 173 | int |
174 | 174 | fetch_pop3_disconnect(struct account *a) |
175 | 175 | { |
176 | struct pop3_data *data = a->data; | |
176 | struct fetch_pop3_data *data = a->data; | |
177 | 177 | char *lbuf; |
178 | 178 | size_t llen; |
179 | 179 | |
204 | 204 | int |
205 | 205 | fetch_pop3_poll(struct account *a, u_int *n) |
206 | 206 | { |
207 | struct pop3_data *data = a->data; | |
207 | struct fetch_pop3_data *data = a->data; | |
208 | 208 | |
209 | 209 | *n = data->num; |
210 | 210 | |
214 | 214 | int |
215 | 215 | fetch_pop3_fetch(struct account *a, struct mail *m) |
216 | 216 | { |
217 | struct pop3_data *data = a->data; | |
217 | struct fetch_pop3_data *data = a->data; | |
218 | 218 | char *lbuf, *line, *uid; |
219 | 219 | size_t llen, size, off, len; |
220 | 220 | u_int lines, n, i; |
368 | 368 | int |
369 | 369 | fetch_pop3_delete(struct account *a) |
370 | 370 | { |
371 | struct pop3_data *data = a->data; | |
371 | struct fetch_pop3_data *data = a->data; | |
372 | 372 | char *lbuf; |
373 | 373 | size_t llen; |
374 | 374 | |
390 | 390 | int |
391 | 391 | fetch_pop3_keep(struct account *a) |
392 | 392 | { |
393 | struct pop3_data *data = a->data; | |
393 | struct fetch_pop3_data *data = a->data; | |
394 | 394 | |
395 | 395 | ARRAY_ADD(&data->kept, xstrdup(data->uid), char *); |
396 | 396 | |
400 | 400 | void |
401 | 401 | fetch_pop3_desc(struct account *a, char *buf, size_t len) |
402 | 402 | { |
403 | struct pop3_data *data = a->data; | |
403 | struct fetch_pop3_data *data = a->data; | |
404 | 404 | |
405 | 405 | xsnprintf(buf, len, "pop3%s server \"%s\" port %s user \"%s\"", |
406 | 406 | data->server.ssl ? "s" : "", data->server.host, data->server.port, |
50 | 50 | int |
51 | 51 | fetch_stdin_connect(struct account *a) |
52 | 52 | { |
53 | struct stdin_data *data = a->data; | |
53 | struct fetch_stdin_data *data = a->data; | |
54 | 54 | |
55 | 55 | if (isatty(STDIN_FILENO)) { |
56 | 56 | log_warnx("%s: stdin is a tty. ignoring", a->name); |
76 | 76 | int |
77 | 77 | fetch_stdin_disconnect(struct account *a) |
78 | 78 | { |
79 | struct stdin_data *data = a->data; | |
79 | struct fetch_stdin_data *data = a->data; | |
80 | 80 | |
81 | 81 | io_free(data->io); |
82 | 82 | |
88 | 88 | int |
89 | 89 | fetch_stdin_delete(struct account *a) |
90 | 90 | { |
91 | struct stdin_data *data = a->data; | |
91 | struct fetch_stdin_data *data = a->data; | |
92 | 92 | char *line, *lbuf; |
93 | 93 | size_t llen; |
94 | 94 | |
105 | 105 | int |
106 | 106 | fetch_stdin_fetch(struct account *a, struct mail *m) |
107 | 107 | { |
108 | struct stdin_data *data = a->data; | |
108 | struct fetch_stdin_data *data = a->data; | |
109 | 109 | u_int lines; |
110 | 110 | int error, bodylines; |
111 | 111 | char *line, *cause, *lbuf; |
47 | 47 | }; |
48 | 48 | |
49 | 49 | /* Fetch maildir data. */ |
50 | struct maildir_data { | |
50 | struct fetch_maildir_data { | |
51 | 51 | struct strings *maildirs; |
52 | 52 | |
53 | 53 | struct strings *paths; |
73 | 73 | ARRAY_DECL(nntp_groups, struct nntp_group *); |
74 | 74 | |
75 | 75 | /* Fetch nntp data. */ |
76 | struct nntp_data { | |
76 | struct fetch_nntp_data { | |
77 | 77 | char *path; |
78 | 78 | |
79 | 79 | struct server server; |
90 | 90 | #define ADD_GROUP(d, g) ARRAY_ADD(&d->groups, g, struct nntp_group *) |
91 | 91 | |
92 | 92 | /* Fetch stdin data. */ |
93 | struct stdin_data { | |
93 | struct fetch_stdin_data { | |
94 | 94 | int complete; |
95 | 95 | |
96 | 96 | struct io *io; |
97 | 97 | }; |
98 | 98 | |
99 | 99 | /* Fetch pop3 data. */ |
100 | struct pop3_data { | |
100 | struct fetch_pop3_data { | |
101 | 101 | char *user; |
102 | 102 | char *pass; |
103 | 103 | |
124 | 124 | #define IMAP_RAW 3 |
125 | 125 | |
126 | 126 | /* Fetch imap data. */ |
127 | struct imap_data { | |
127 | struct fetch_imap_data { | |
128 | 128 | struct server server; |
129 | 129 | char *pipecmd; |
130 | 130 |
65 | 65 | int |
66 | 66 | imap_init(struct account *a) |
67 | 67 | { |
68 | struct imap_data *data = a->data; | |
68 | struct fetch_imap_data *data = a->data; | |
69 | 69 | |
70 | 70 | ARRAY_INIT(&data->kept); |
71 | 71 | |
80 | 80 | int |
81 | 81 | imap_free(struct account *a) |
82 | 82 | { |
83 | struct imap_data *data = a->data; | |
83 | struct fetch_imap_data *data = a->data; | |
84 | 84 | |
85 | 85 | ARRAY_FREE(&data->kept); |
86 | 86 | |
92 | 92 | int |
93 | 93 | imap_login(struct account *a) |
94 | 94 | { |
95 | struct imap_data *data = a->data; | |
95 | struct fetch_imap_data *data = a->data; | |
96 | 96 | char *line; |
97 | 97 | |
98 | 98 | if ((line = data->getln(a, IMAP_UNTAGGED)) == NULL) |
128 | 128 | int |
129 | 129 | imap_select(struct account *a) |
130 | 130 | { |
131 | struct imap_data *data = a->data; | |
131 | struct fetch_imap_data *data = a->data; | |
132 | 132 | char *line; |
133 | 133 | |
134 | 134 | if (data->putln(a, "%u SELECT %s", ++data->tag, data->folder) != 0) |
149 | 149 | int |
150 | 150 | imap_close(struct account *a) |
151 | 151 | { |
152 | struct imap_data *data = a->data; | |
152 | struct fetch_imap_data *data = a->data; | |
153 | 153 | char *line; |
154 | 154 | |
155 | 155 | if (data->putln(a, "%u CLOSE", ++data->tag) != 0) |
165 | 165 | int |
166 | 166 | imap_logout(struct account *a) |
167 | 167 | { |
168 | struct imap_data *data = a->data; | |
168 | struct fetch_imap_data *data = a->data; | |
169 | 169 | char *line; |
170 | 170 | |
171 | 171 | if (data->putln(a, "%u LOGOUT", ++data->tag) != 0) |
181 | 181 | void |
182 | 182 | imap_abort(struct account *a) |
183 | 183 | { |
184 | struct imap_data *data = a->data; | |
184 | struct fetch_imap_data *data = a->data; | |
185 | 185 | |
186 | 186 | data->putln(a, "%u LOGOUT", ++data->tag); |
187 | 187 | data->flush(a); |
190 | 190 | int |
191 | 191 | imap_poll(struct account *a, u_int *n) |
192 | 192 | { |
193 | struct imap_data *data = a->data; | |
193 | struct fetch_imap_data *data = a->data; | |
194 | 194 | |
195 | 195 | *n = data->num; |
196 | 196 | |
200 | 200 | int |
201 | 201 | imap_fetch(struct account *a, struct mail *m) |
202 | 202 | { |
203 | struct imap_data *data = a->data; | |
203 | struct fetch_imap_data *data = a->data; | |
204 | 204 | char *line, *ptr; |
205 | 205 | u_int n, i, lines; |
206 | 206 | size_t size, off, len; |
340 | 340 | int |
341 | 341 | imap_keep(struct account *a) |
342 | 342 | { |
343 | struct imap_data *data = a->data; | |
343 | struct fetch_imap_data *data = a->data; | |
344 | 344 | |
345 | 345 | ARRAY_ADD(&data->kept, data->uid, u_int); |
346 | 346 | |
350 | 350 | int |
351 | 351 | imap_delete(struct account *a) |
352 | 352 | { |
353 | struct imap_data *data = a->data; | |
353 | struct fetch_imap_data *data = a->data; | |
354 | 354 | char *line; |
355 | 355 | |
356 | 356 | if (data->putln(a, "%u STORE %u +FLAGS \\Deleted", ++data->tag, |
367 | 367 | int |
368 | 368 | imap_purge(struct account *a) |
369 | 369 | { |
370 | struct imap_data *data = a->data; | |
370 | struct fetch_imap_data *data = a->data; | |
371 | 371 | char *line; |
372 | 372 | |
373 | 373 | if (data->putln(a, "%u EXPUNGE", ++data->tag) != 0) |
80 | 80 | int |
81 | 81 | match_age_match(struct match_ctx *mctx, struct expritem *ei) |
82 | 82 | { |
83 | struct age_data *data = ei->data; | |
84 | struct account *a = mctx->account; | |
85 | struct mail *m = mctx->mail; | |
86 | char *s, *ptr, *endptr, *hdr; | |
87 | const char *errstr; | |
88 | size_t len; | |
89 | struct tm tm; | |
90 | time_t then, now; | |
91 | long long diff; | |
92 | int tz; | |
83 | struct match_age_data *data = ei->data; | |
84 | struct account *a = mctx->account; | |
85 | struct mail *m = mctx->mail; | |
86 | char *s, *ptr, *endptr, *hdr; | |
87 | const char *errstr; | |
88 | size_t len; | |
89 | struct tm tm; | |
90 | time_t then, now; | |
91 | long long diff; | |
92 | int tz; | |
93 | 93 | |
94 | 94 | memset(&tm, 0, sizeof tm); |
95 | 95 | |
173 | 173 | void |
174 | 174 | match_age_desc(struct expritem *ei, char *buf, size_t len) |
175 | 175 | { |
176 | struct age_data *data = ei->data; | |
176 | struct match_age_data *data = ei->data; | |
177 | 177 | const char *cmp = ""; |
178 | 178 | |
179 | 179 | if (data->time < 0) { |
33 | 33 | int |
34 | 34 | match_attachment_match(struct match_ctx *mctx, struct expritem *ei) |
35 | 35 | { |
36 | struct attachment_data *data = ei->data; | |
37 | struct account *a = mctx->account; | |
38 | struct mail *m = mctx->mail; | |
39 | struct attach *at; | |
40 | size_t size; | |
41 | u_int n; | |
36 | struct match_attachment_data *data = ei->data; | |
37 | struct account *a = mctx->account; | |
38 | struct mail *m = mctx->mail; | |
39 | struct attach *at; | |
40 | size_t size; | |
41 | u_int n; | |
42 | 42 | |
43 | 43 | if (!m->attach_built) { |
44 | 44 | /* fill attachments */ |
148 | 148 | void |
149 | 149 | match_attachment_desc(struct expritem *ei, char *buf, size_t len) |
150 | 150 | { |
151 | struct attachment_data *data = ei->data; | |
152 | const char *cmp = ""; | |
151 | struct match_attachment_data *data = ei->data; | |
152 | const char *cmp = ""; | |
153 | 153 | |
154 | 154 | if (data->cmp == CMP_LT) |
155 | 155 | cmp = "<"; |
33 | 33 | int |
34 | 34 | match_command_match(struct match_ctx *mctx, struct expritem *ei) |
35 | 35 | { |
36 | struct command_data *data = ei->data; | |
37 | struct account *a = mctx->account; | |
38 | struct mail *m = mctx->mail; | |
39 | struct io *io = mctx->io; | |
40 | struct msg msg; | |
36 | struct match_command_data *data = ei->data; | |
37 | struct account *a = mctx->account; | |
38 | struct mail *m = mctx->mail; | |
39 | struct io *io = mctx->io; | |
40 | struct msg msg; | |
41 | 41 | |
42 | 42 | /* we are called as the child so to change uid this needs to be done |
43 | 43 | largely in the parent */ |
65 | 65 | void |
66 | 66 | match_command_desc(struct expritem *ei, char *buf, size_t len) |
67 | 67 | { |
68 | struct command_data *data = ei->data; | |
69 | char ret[11]; | |
70 | const char *type; | |
68 | struct match_command_data *data = ei->data; | |
69 | char ret[11]; | |
70 | const char *type; | |
71 | 71 | |
72 | 72 | *ret = '\0'; |
73 | 73 | if (data->ret != -1) |
33 | 33 | int |
34 | 34 | match_regexp_match(struct match_ctx *mctx, struct expritem *ei) |
35 | 35 | { |
36 | struct regexp_data *data = ei->data; | |
37 | struct account *a = mctx->account; | |
38 | struct mail *m = mctx->mail; | |
39 | int res; | |
40 | char *cause; | |
36 | struct match_regexp_data *data = ei->data; | |
37 | struct account *a = mctx->account; | |
38 | struct mail *m = mctx->mail; | |
39 | int res; | |
40 | char *cause; | |
41 | 41 | |
42 | 42 | if (data->area == AREA_BODY && m->body == -1) |
43 | 43 | return (MATCH_FALSE); |
77 | 77 | void |
78 | 78 | match_regexp_desc(struct expritem *ei, char *buf, size_t len) |
79 | 79 | { |
80 | struct regexp_data *data = ei->data; | |
81 | const char *area = NULL; | |
80 | struct match_regexp_data *data = ei->data; | |
81 | const char *area = NULL; | |
82 | 82 | |
83 | 83 | switch (data->area) { |
84 | 84 | case AREA_BODY: |
33 | 33 | int |
34 | 34 | match_size_match(struct match_ctx *mctx, struct expritem *ei) |
35 | 35 | { |
36 | struct size_data *data = ei->data; | |
36 | struct match_size_data *data = ei->data; | |
37 | 37 | struct mail *m = mctx->mail; |
38 | 38 | |
39 | 39 | if (data->cmp == CMP_LT && m->size < data->size) |
46 | 46 | void |
47 | 47 | match_size_desc(struct expritem *ei, char *buf, size_t len) |
48 | 48 | { |
49 | struct size_data *data = ei->data; | |
49 | struct match_size_data *data = ei->data; | |
50 | 50 | const char *cmp = ""; |
51 | 51 | |
52 | 52 | if (data->cmp == CMP_LT) |
34 | 34 | int |
35 | 35 | match_string_match(struct match_ctx *mctx, struct expritem *ei) |
36 | 36 | { |
37 | struct string_data *data = ei->data; | |
38 | struct account *a = mctx->account; | |
39 | struct mail *m = mctx->mail; | |
40 | int res; | |
41 | char *s, *cause; | |
37 | struct match_string_data *data = ei->data; | |
38 | struct account *a = mctx->account; | |
39 | struct mail *m = mctx->mail; | |
40 | int res; | |
41 | char *s, *cause; | |
42 | 42 | |
43 | 43 | if (!mctx->pm_valid) { |
44 | 44 | log_warnx("%s: string match but no regexp match data", a->name); |
65 | 65 | void |
66 | 66 | match_string_desc(struct expritem *ei, char *buf, size_t len) |
67 | 67 | { |
68 | struct string_data *data = ei->data; | |
68 | struct match_string_data *data = ei->data; | |
69 | 69 | |
70 | 70 | xsnprintf(buf, len, "string \"%s\" to \"%s\"", data->str, data->re.str); |
71 | 71 | } |
34 | 34 | int |
35 | 35 | match_tagged_match(struct match_ctx *mctx, struct expritem *ei) |
36 | 36 | { |
37 | struct tagged_data *data = ei->data; | |
38 | struct mail *m = mctx->mail; | |
37 | struct match_tagged_data *data = ei->data; | |
38 | struct mail *m = mctx->mail; | |
39 | 39 | |
40 | 40 | if (match_tag(m->tags, data->tag) != NULL) |
41 | 41 | return (MATCH_TRUE); |
45 | 45 | void |
46 | 46 | match_tagged_desc(struct expritem *ei, char *buf, size_t len) |
47 | 47 | { |
48 | struct tagged_data *data = ei->data; | |
48 | struct match_tagged_data *data = ei->data; | |
49 | 49 | |
50 | 50 | xsnprintf(buf, len, "tagged %s", data->tag); |
51 | 51 | } |
45 | 45 | }; |
46 | 46 | |
47 | 47 | /* Match attachment data. */ |
48 | struct attachment_data { | |
48 | struct match_attachment_data { | |
49 | 49 | enum { |
50 | 50 | ATTACHOP_COUNT, |
51 | 51 | ATTACHOP_TOTALSIZE, |
64 | 64 | }; |
65 | 65 | |
66 | 66 | /* Match age data. */ |
67 | struct age_data { | |
67 | struct match_age_data { | |
68 | 68 | long long time; |
69 | 69 | enum cmp cmp; |
70 | 70 | }; |
71 | 71 | |
72 | 72 | /* Match size data. */ |
73 | struct size_data { | |
73 | struct match_size_data { | |
74 | 74 | size_t size; |
75 | 75 | enum cmp cmp; |
76 | 76 | }; |
77 | 77 | |
78 | 78 | /* Match tagged data. */ |
79 | struct tagged_data { | |
79 | struct match_tagged_data { | |
80 | 80 | char *tag; |
81 | 81 | }; |
82 | 82 | |
83 | 83 | /* Match string data. */ |
84 | struct string_data { | |
84 | struct match_string_data { | |
85 | 85 | struct re re; |
86 | 86 | |
87 | 87 | char *str; |
88 | 88 | }; |
89 | 89 | |
90 | 90 | /* Match regexp data. */ |
91 | struct regexp_data { | |
91 | struct match_regexp_data { | |
92 | 92 | struct re re; |
93 | 93 | |
94 | 94 | enum area area; |
95 | 95 | }; |
96 | 96 | |
97 | 97 | /* Match command data. */ |
98 | struct command_data { | |
98 | struct match_command_data { | |
99 | 99 | char *cmd; |
100 | 100 | uid_t uid; |
101 | 101 | int pipe; /* pipe mail to command */ |
29 | 29 | #include "match.h" |
30 | 30 | |
31 | 31 | int parent_action(struct action *, struct deliver_ctx *, uid_t); |
32 | int parent_command(struct match_ctx *, struct command_data *, uid_t); | |
32 | int parent_command(struct match_ctx *, struct match_command_data *, uid_t); | |
33 | 33 | |
34 | 34 | int |
35 | 35 | do_parent(struct child *child) |
258 | 258 | } |
259 | 259 | |
260 | 260 | int |
261 | parent_command(struct match_ctx *mctx, struct command_data *data, uid_t uid) | |
261 | parent_command(struct match_ctx *mctx, struct match_command_data *data, | |
262 | uid_t uid) | |
262 | 263 | { |
263 | 264 | struct account *a = mctx->account; |
264 | 265 | struct mail *m = mctx->mail; |
2109 | 2109 | /** [$1: poptype (int)] [$2: server (struct { ... } server)] */ |
2110 | 2110 | /** [$4: strv (char *)] [$6: strv (char *)] */ |
2111 | 2111 | { |
2112 | struct pop3_data *data; | |
2112 | struct fetch_pop3_data *data; | |
2113 | 2113 | |
2114 | 2114 | if (*$4 == '\0') |
2115 | 2115 | yyerror("invalid user"); |
2133 | 2133 | /** [$1: imaptype (int)] [$2: server (struct { ... } server)] */ |
2134 | 2134 | /** [$4: strv (char *)] [$6: strv (char *)] [$7: folder (char *)] */ |
2135 | 2135 | { |
2136 | struct imap_data *data; | |
2136 | struct fetch_imap_data *data; | |
2137 | 2137 | |
2138 | 2138 | if (*$4 == '\0') |
2139 | 2139 | yyerror("invalid user"); |
2160 | 2160 | /** [$3: strv (char *)] */ |
2161 | 2161 | /** [$4: userpass (struct { ... } userpass)] [$5: folder (char *)] */ |
2162 | 2162 | { |
2163 | struct imap_data *data; | |
2164 | struct strb *tags; | |
2163 | struct fetch_imap_data *data; | |
2164 | struct strb *tags; | |
2165 | 2165 | |
2166 | 2166 | if ($5 != NULL && *$5 == '\0') |
2167 | 2167 | yyerror("invalid folder"); |
2181 | 2181 | } |
2182 | 2182 | | TOKSTDIN |
2183 | 2183 | { |
2184 | struct stdin_data *data; | |
2184 | struct fetch_stdin_data *data; | |
2185 | 2185 | |
2186 | 2186 | $$.fetch = &fetch_stdin; |
2187 | 2187 | data = xcalloc(1, sizeof *data); |
2190 | 2190 | | maildirs |
2191 | 2191 | /** [$1: maildirs (struct strings *)] */ |
2192 | 2192 | { |
2193 | struct maildir_data *data; | |
2193 | struct fetch_maildir_data *data; | |
2194 | 2194 | |
2195 | 2195 | $$.fetch = &fetch_maildir; |
2196 | 2196 | data = xcalloc(1, sizeof *data); |
2201 | 2201 | /** [$2: server (struct { ... } server)] */ |
2202 | 2202 | /** [$3: groups (struct strings *)] [$5: strv (char *)] */ |
2203 | 2203 | { |
2204 | struct nntp_data *data; | |
2205 | char *group; | |
2204 | struct fetch_nntp_data *data; | |
2205 | char *group; | |
2206 | 2206 | struct strb *tags; |
2207 | 2207 | |
2208 | 2208 | if (*$5 == '\0') |