Mercurial > dovecot > core-2.2
annotate src/doveadm/doveadm-mail-fetch.c @ 11247:f05909834219 HEAD
doveadm: Changed mail command handler API.
This should help add some new future features.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 30 Apr 2010 19:14:57 +0300 |
parents | b9efc1ca4c37 |
children | 0c9db163d538 |
rev | line source |
---|---|
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2010 Dovecot authors, see the included COPYING file */ |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
4 #include "array.h" |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "istream.h" |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ostream.h" |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "base64.h" |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "randgen.h" |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "str.h" |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
10 #include "message-size.h" |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
11 #include "imap-util.h" |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "mail-storage.h" |
11236
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
13 #include "mail-search.h" |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "doveadm-mail.h" |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
15 #include "doveadm-mail-list-iter.h" |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
16 #include "doveadm-mail-iter.h" |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
17 |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
18 #include <stdio.h> |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
19 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
20 struct fetch_cmd_context { |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
21 struct doveadm_mail_cmd_context ctx; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
22 |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
23 struct mail_search_args *search_args; |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
24 struct ostream *output; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
25 struct mail *mail; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
26 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
27 ARRAY_DEFINE(fields, const struct fetch_field); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
28 enum mail_fetch_field wanted_fields; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
29 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
30 string_t *hdr; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
31 const char *prefix; |
11237
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
32 |
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
33 bool print_field_prefix; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
34 }; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
35 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
36 static int fetch_mailbox(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
37 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
38 const char *value; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
39 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
40 if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, &value) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
41 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
42 str_append(ctx->hdr, value); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
43 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
44 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
45 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
46 static int fetch_mailbox_guid(struct fetch_cmd_context *ctx) |
11233
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
47 { |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
48 uint8_t guid[MAIL_GUID_128_SIZE]; |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
49 |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
50 if (mailbox_get_guid(ctx->mail->box, guid) < 0) |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
51 return -1; |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
52 str_append(ctx->hdr, mail_guid_128_to_string(guid)); |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
53 return 0; |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
54 } |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
55 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
56 static int fetch_seq(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
57 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
58 str_printfa(ctx->hdr, "%u", ctx->mail->seq); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
59 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
60 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
61 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
62 static int fetch_uid(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
63 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
64 str_printfa(ctx->hdr, "%u", ctx->mail->seq); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
65 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
66 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
67 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
68 static int fetch_guid(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
69 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
70 const char *value; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
71 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
72 if (mail_get_special(ctx->mail, MAIL_FETCH_GUID, &value) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
73 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
74 str_append(ctx->hdr, value); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
75 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
76 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
77 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
78 static int fetch_flags(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
79 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
80 imap_write_flags(ctx->hdr, mail_get_flags(ctx->mail), |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
81 mail_get_keywords(ctx->mail)); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
82 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
83 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
84 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
85 static void flush_hdr(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
86 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
87 o_stream_send(ctx->output, str_data(ctx->hdr), str_len(ctx->hdr)); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
88 str_truncate(ctx->hdr, 0); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
89 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
90 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
91 static int fetch_hdr(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
92 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
93 struct istream *input; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
94 struct message_size hdr_size; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
95 int ret = 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
96 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
97 if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
98 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
99 |
11237
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
100 if (ctx->print_field_prefix) |
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
101 str_append_c(ctx->hdr, '\n'); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
102 flush_hdr(ctx); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
103 input = i_stream_create_limit(input, hdr_size.physical_size); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
104 while (!i_stream_is_eof(input)) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
105 if (o_stream_send_istream(ctx->output, input) <= 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
106 i_fatal("write(stdout) failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
107 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
108 if (input->stream_errno != 0) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
109 i_error("read() failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
110 ret = -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
111 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
112 i_stream_unref(&input); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
113 o_stream_flush(ctx->output); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
114 return ret; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
115 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
116 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
117 static int fetch_body(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
118 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
119 struct istream *input; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
120 struct message_size hdr_size; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
121 int ret = 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
122 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
123 if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
124 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
125 |
11237
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
126 if (ctx->print_field_prefix) |
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
127 str_append_c(ctx->hdr, '\n'); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
128 flush_hdr(ctx); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
129 i_stream_skip(input, hdr_size.physical_size); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
130 while (!i_stream_is_eof(input)) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
131 if (o_stream_send_istream(ctx->output, input) <= 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
132 i_fatal("write(stdout) failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
133 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
134 if (input->stream_errno != 0) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
135 i_error("read() failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
136 ret = -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
137 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
138 o_stream_flush(ctx->output); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
139 return ret; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
140 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
141 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
142 static int fetch_text(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
143 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
144 struct istream *input; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
145 int ret = 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
146 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
147 if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
148 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
149 |
11237
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
150 if (ctx->print_field_prefix) |
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
151 str_append_c(ctx->hdr, '\n'); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
152 flush_hdr(ctx); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
153 while (!i_stream_is_eof(input)) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
154 if (o_stream_send_istream(ctx->output, input) <= 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
155 i_fatal("write(stdout) failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
156 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
157 if (input->stream_errno != 0) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
158 i_error("read() failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
159 ret = -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
160 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
161 o_stream_flush(ctx->output); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
162 return ret; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
163 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
164 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
165 static int fetch_size_physical(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
166 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
167 uoff_t size; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
168 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
169 if (mail_get_physical_size(ctx->mail, &size) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
170 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
171 str_printfa(ctx->hdr, "%"PRIuUOFF_T, size); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
172 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
173 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
174 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
175 static int fetch_size_virtual(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
176 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
177 uoff_t size; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
178 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
179 if (mail_get_virtual_size(ctx->mail, &size) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
180 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
181 str_printfa(ctx->hdr, "%"PRIuUOFF_T, size); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
182 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
183 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
184 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
185 static int fetch_date_received(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
186 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
187 time_t t; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
188 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
189 if (mail_get_received_date(ctx->mail, &t) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
190 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
191 str_printfa(ctx->hdr, "%s", unixdate2str(t)); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
192 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
193 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
194 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
195 static int fetch_date_sent(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
196 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
197 time_t t; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
198 int tz; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
199 char chr; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
200 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
201 if (mail_get_date(ctx->mail, &t, &tz) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
202 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
203 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
204 chr = tz < 0 ? '-' : '+'; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
205 if (tz < 0) tz = -tz; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
206 str_printfa(ctx->hdr, "%s (%c%02u%02u)", unixdate2str(t), |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
207 chr, tz/60, tz%60); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
208 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
209 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
210 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
211 static int fetch_date_saved(struct fetch_cmd_context *ctx) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
212 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
213 time_t t; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
214 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
215 if (mail_get_save_date(ctx->mail, &t) < 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
216 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
217 str_printfa(ctx->hdr, "%s", unixdate2str(t)); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
218 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
219 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
220 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
221 struct fetch_field { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
222 const char *name; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
223 enum mail_fetch_field wanted_fields; |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
224 int (*print)(struct fetch_cmd_context *ctx); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
225 }; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
226 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
227 static const struct fetch_field fetch_fields[] = { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
228 { "mailbox", 0, fetch_mailbox }, |
11233
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
229 { "mailbox-guid", 0, fetch_mailbox_guid }, |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
230 { "seq", 0, fetch_seq }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
231 { "uid", 0, fetch_uid }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
232 { "guid", 0, fetch_guid }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
233 { "flags", MAIL_FETCH_FLAGS, fetch_flags }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
234 { "hdr", MAIL_FETCH_STREAM_HEADER, fetch_hdr }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
235 { "body", MAIL_FETCH_STREAM_BODY, fetch_body }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
236 { "text", MAIL_FETCH_STREAM_HEADER | |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
237 MAIL_FETCH_STREAM_BODY, fetch_text }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
238 { "size.physical", MAIL_FETCH_PHYSICAL_SIZE, fetch_size_physical }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
239 { "size.virtual", MAIL_FETCH_VIRTUAL_SIZE, fetch_size_virtual }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
240 { "date.received", MAIL_FETCH_RECEIVED_DATE, fetch_date_received }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
241 { "date.sent", MAIL_FETCH_DATE, fetch_date_sent }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
242 { "date.saved", MAIL_FETCH_SAVE_DATE, fetch_date_saved } |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
243 }; |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
245 static const struct fetch_field *fetch_field_find(const char *name) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
246 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
247 unsigned int i; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
248 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
249 for (i = 0; i < N_ELEMENTS(fetch_fields); i++) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
250 if (strcmp(fetch_fields[i].name, name) == 0) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
251 return &fetch_fields[i]; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
252 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
253 return NULL; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
254 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
255 |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
256 static void print_fetch_fields(void) |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
257 { |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
258 unsigned int i; |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
259 |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
260 fprintf(stderr, "Available fetch fields: %s", fetch_fields[0].name); |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
261 for (i = 1; i < N_ELEMENTS(fetch_fields); i++) |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
262 fprintf(stderr, " %s", fetch_fields[i].name); |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
263 fprintf(stderr, "\n"); |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
264 } |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
265 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
266 static void parse_fetch_fields(struct fetch_cmd_context *ctx, const char *str) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
267 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
268 const char *const *fields, *name; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
269 const struct fetch_field *field; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
270 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
271 t_array_init(&ctx->fields, 32); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
272 fields = t_strsplit_spaces(str, " "); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
273 for (; *fields != NULL; fields++) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
274 name = t_str_lcase(*fields); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
275 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
276 field = fetch_field_find(name); |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
277 if (field == NULL) { |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
278 print_fetch_fields(); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
279 i_fatal("Unknown fetch field: %s", name); |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
280 } |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
281 ctx->wanted_fields |= field->wanted_fields; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
282 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
283 array_append(&ctx->fields, field, 1); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
284 } |
11237
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
285 ctx->print_field_prefix = array_count(&ctx->fields) > 1; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
286 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
287 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
288 static void cmd_fetch_mail(struct fetch_cmd_context *ctx) |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 { |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
290 const struct fetch_field *field; |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
291 struct mail *mail = ctx->mail; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
292 |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
293 array_foreach(&ctx->fields, field) { |
11237
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
294 if (ctx->print_field_prefix) |
6327433bccb9
doveadm fetch: Don't print field name if fetching only a single field.
Timo Sirainen <tss@iki.fi>
parents:
11236
diff
changeset
|
295 str_printfa(ctx->hdr, "%s: ", field->name); |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
296 if (field->print(ctx) < 0) { |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
297 struct mail_storage *storage = |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
298 mailbox_get_storage(mail->box); |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
300 i_error("fetch(%s) failed for box=%s uid=%u: %s", |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
301 field->name, mailbox_get_vname(mail->box), |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
302 mail->uid, mail_storage_get_last_error(storage, NULL)); |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
303 } |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
304 str_append_c(ctx->hdr, '\n'); |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
305 } |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
306 flush_hdr(ctx); |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
307 } |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
309 static int |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
310 cmd_fetch_box(struct fetch_cmd_context *ctx, const struct mailbox_info *info) |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
311 { |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
312 struct doveadm_mail_iter *iter; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
313 struct mailbox_transaction_context *trans; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
314 struct mail *mail; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
315 |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
316 if (doveadm_mail_iter_init(info, ctx->search_args, &trans, &iter) < 0) |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
317 return -1; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
318 |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
319 mail = mail_alloc(trans, ctx->wanted_fields, NULL); |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
320 while (doveadm_mail_iter_next(iter, mail)) { |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
321 str_truncate(ctx->hdr, 0); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
322 str_append(ctx->hdr, ctx->prefix); |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
324 ctx->mail = mail; |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
325 cmd_fetch_mail(ctx); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
326 ctx->mail = NULL; |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 } |
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 mail_free(&mail); |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
329 return doveadm_mail_iter_deinit(&iter); |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 } |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
331 |
11236
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
332 static bool search_args_have_unique_fetch(struct mail_search_args *args) |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
333 { |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
334 struct mail_search_arg *arg; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
335 const struct seq_range *seqset; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
336 unsigned int count; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
337 bool have_mailbox = FALSE, have_msg = FALSE; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
338 |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
339 for (arg = args->args; arg != NULL; arg = arg->next) { |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
340 switch (arg->type) { |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
341 case SEARCH_MAILBOX: |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
342 case SEARCH_MAILBOX_GUID: |
11239
b9efc1ca4c37
doveadm fetch/search/etc: Handle "NOT" correctly in search query.
Timo Sirainen <tss@iki.fi>
parents:
11237
diff
changeset
|
343 if (!arg->not) |
b9efc1ca4c37
doveadm fetch/search/etc: Handle "NOT" correctly in search query.
Timo Sirainen <tss@iki.fi>
parents:
11237
diff
changeset
|
344 have_mailbox = TRUE; |
11236
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
345 break; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
346 case SEARCH_SEQSET: |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
347 case SEARCH_UIDSET: |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
348 seqset = array_get(&arg->value.seqset, &count); |
11239
b9efc1ca4c37
doveadm fetch/search/etc: Handle "NOT" correctly in search query.
Timo Sirainen <tss@iki.fi>
parents:
11237
diff
changeset
|
349 if (count == 1 && seqset->seq1 == seqset->seq2 && |
b9efc1ca4c37
doveadm fetch/search/etc: Handle "NOT" correctly in search query.
Timo Sirainen <tss@iki.fi>
parents:
11237
diff
changeset
|
350 !arg->not) |
11236
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
351 have_msg = TRUE; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
352 break; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
353 default: |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
354 break; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
355 } |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
356 } |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
357 return have_mailbox && have_msg; |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
358 } |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
359 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
360 static void |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
361 cmd_fetch_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user) |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
362 { |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
363 struct fetch_cmd_context *ctx = (struct fetch_cmd_context *)_ctx; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
364 const enum mailbox_list_iter_flags iter_flags = |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
365 MAILBOX_LIST_ITER_VIRTUAL_NAMES | |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
366 MAILBOX_LIST_ITER_NO_AUTO_INBOX | |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
367 MAILBOX_LIST_ITER_RETURN_NO_FLAGS; |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
368 struct doveadm_mail_list_iter *iter; |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
369 const struct mailbox_info *info; |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
370 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
371 iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
372 while ((info = doveadm_mail_list_iter_next(iter)) != NULL) T_BEGIN { |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
373 (void)cmd_fetch_box(ctx, info); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
374 } T_END; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
375 doveadm_mail_list_iter_deinit(&iter); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
376 } |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
377 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
378 static void cmd_fetch_deinit(struct doveadm_mail_cmd_context *_ctx) |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
379 { |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
380 struct fetch_cmd_context *ctx = (struct fetch_cmd_context *)_ctx; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
381 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
382 o_stream_unref(&ctx->output); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
383 str_free(&ctx->hdr); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
384 } |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
385 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
386 struct doveadm_mail_cmd_context *cmd_fetch(const char *const args[]) |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
387 { |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
388 const char *fetch_fields = args[0]; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
389 struct fetch_cmd_context *ctx; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
390 unsigned char prefix_buf[9]; |
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
391 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
392 if (fetch_fields == NULL || args[1] == NULL) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
393 doveadm_mail_help_name("fetch"); |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
394 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
395 ctx = doveadm_mail_cmd_init(struct fetch_cmd_context); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
396 ctx->ctx.run = cmd_fetch_run; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
397 ctx->ctx.deinit = cmd_fetch_deinit; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
398 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
399 parse_fetch_fields(ctx, fetch_fields); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
400 ctx->search_args = doveadm_mail_build_search_args(args + 1); |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
401 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
402 ctx->output = o_stream_create_fd(STDOUT_FILENO, 0, FALSE); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
403 ctx->hdr = str_new(default_pool, 512); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
404 if (search_args_have_unique_fetch(ctx->search_args)) |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
405 ctx->prefix = ""; |
11236
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
406 else { |
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
407 random_fill_weak(prefix_buf, sizeof(prefix_buf)); |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
408 str_append(ctx->hdr, "==="); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
409 base64_encode(prefix_buf, sizeof(prefix_buf), ctx->hdr); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
410 str_append_c(ctx->hdr, '\n'); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
411 ctx->prefix = t_strdup(str_c(ctx->hdr)); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
412 str_truncate(ctx->hdr, 0); |
11236
47d49b7edb4b
doveadm fetch: Don't print mail separator if fetching only a specific mail.
Timo Sirainen <tss@iki.fi>
parents:
11233
diff
changeset
|
413 } |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
414 return &ctx->ctx; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
415 } |