Mercurial > dovecot > core-2.2
annotate src/doveadm/doveadm-mail-fetch.c @ 14001:a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 26 Jan 2012 21:25:39 +0200 |
parents | 2418871d09f5 |
children | afeabe28a499 |
rev | line source |
---|---|
12822
44d0474a451e
Updated copyright notices to include year 2011.
Timo Sirainen <tss@iki.fi>
parents:
12341
diff
changeset
|
1 /* Copyright (c) 2010-2011 Dovecot authors, see the included COPYING file */ |
11147
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 "str.h" |
14001
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
8 #include "message-address.h" |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
9 #include "message-size.h" |
13999
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
10 #include "message-parser.h" |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
11 #include "message-decoder.h" |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
12 #include "imap-util.h" |
11511
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
13 #include "mail-user.h" |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #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
|
15 #include "mail-search.h" |
11588
9a852084bbeb
doveadm: Fixed assert-crash when listing mailbox foo/*
Timo Sirainen <tss@iki.fi>
parents:
11511
diff
changeset
|
16 #include "mail-namespace.h" |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
17 #include "doveadm-print.h" |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #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
|
19 #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
|
20 #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
|
21 |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
22 #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
|
23 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
24 struct fetch_cmd_context { |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
25 struct doveadm_mail_cmd_context ctx; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
26 |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
27 struct ostream *output; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
28 struct mail *mail; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
29 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
30 ARRAY_DEFINE(fields, const struct fetch_field); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
31 ARRAY_TYPE(const_string) header_fields; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
32 enum mail_fetch_field wanted_fields; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
33 |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
34 const struct fetch_field *cur_field; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
35 }; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
36 |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
37 struct fetch_field { |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
38 const char *name; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
39 enum mail_fetch_field wanted_fields; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
40 int (*print)(struct fetch_cmd_context *ctx); |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
41 }; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
42 |
11511
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
43 static int fetch_user(struct fetch_cmd_context *ctx) |
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
44 { |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
45 doveadm_print(ctx->ctx.cur_mail_user->username); |
11511
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
46 return 0; |
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
47 } |
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
48 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
49 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
|
50 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
51 const char *value; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
52 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
53 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
|
54 return -1; |
11409
93eaae8617c8
doveadm fetch: mailbox field value is printed as UTF-8, not mUTF-7.
Timo Sirainen <tss@iki.fi>
parents:
11395
diff
changeset
|
55 |
12629
02370eda76f8
lib-storage: Mailbox virtual names are now in UTF-8 format, not IMAP mUTF-7.
Timo Sirainen <tss@iki.fi>
parents:
12585
diff
changeset
|
56 doveadm_print(value); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
57 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
58 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
59 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
60 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
|
61 { |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12341
diff
changeset
|
62 struct mailbox_metadata metadata; |
11233
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
63 |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12341
diff
changeset
|
64 if (mailbox_get_metadata(ctx->mail->box, MAILBOX_METADATA_GUID, |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12341
diff
changeset
|
65 &metadata) < 0) |
11233
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
66 return -1; |
13287
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12973
diff
changeset
|
67 doveadm_print(guid_128_to_string(metadata.guid)); |
11233
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
68 return 0; |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
69 } |
5d0027f17bd8
doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents:
11209
diff
changeset
|
70 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
71 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
|
72 { |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
73 doveadm_print_num(ctx->mail->seq); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
74 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
75 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
76 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
77 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
|
78 { |
12213
d6582f3ee54d
doveadm fetch: Fixed fetching uid field.
Timo Sirainen <tss@iki.fi>
parents:
11790
diff
changeset
|
79 doveadm_print_num(ctx->mail->uid); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
80 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
81 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
82 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
83 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
|
84 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
85 const char *value; |
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 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
|
88 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
89 doveadm_print(value); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
90 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
91 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
92 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
93 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
|
94 { |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
95 string_t *str = t_str_new(64); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
96 |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
97 imap_write_flags(str, mail_get_flags(ctx->mail), |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
98 mail_get_keywords(ctx->mail)); |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
99 doveadm_print(str_c(str)); |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
100 return 0; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
101 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
102 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
103 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
|
104 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
105 struct istream *input; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
106 struct message_size hdr_size; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
107 const unsigned char *data; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
108 size_t size; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
109 int ret = 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
110 |
13601
276a39ebda4d
lib-storage: Added mail_get_hdr_stream() and use it where possible.
Timo Sirainen <tss@iki.fi>
parents:
13287
diff
changeset
|
111 if (mail_get_hdr_stream(ctx->mail, &hdr_size, &input) < 0) |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
112 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
113 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
114 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
|
115 while (!i_stream_is_eof(input)) { |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
116 if (i_stream_read_data(input, &data, &size, 0) == -1) |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
117 break; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
118 if (size == 0) |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
119 break; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
120 doveadm_print_stream(data, size); |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
121 i_stream_skip(input, size); |
11206
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 (input->stream_errno != 0) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
124 i_error("read() failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
125 ret = -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
126 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
127 i_stream_unref(&input); |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
128 doveadm_print_stream(NULL, 0); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
129 return ret; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
130 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
131 |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
132 static int fetch_hdr_field(struct fetch_cmd_context *ctx) |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
133 { |
14001
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
134 const char *const *value, *filter, *name = ctx->cur_field->name; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
135 string_t *str = t_str_new(256); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
136 bool add_lf = FALSE; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
137 |
14001
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
138 filter = strchr(name, '.'); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
139 if (filter != NULL) |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
140 name = t_strdup_until(name, filter++); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
141 |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
142 if (mail_get_headers(ctx->mail, name, &value) < 0) |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
143 return -1; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
144 |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
145 for (; *value != NULL; value++) { |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
146 if (add_lf) |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
147 str_append_c(str, '\n'); |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
148 str_append(str, *value); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
149 add_lf = TRUE; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
150 } |
14001
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
151 |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
152 if (filter == NULL) { |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
153 /* print the header as-is */ |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
154 } else if (strcmp(filter, "address") == 0 || |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
155 strcmp(filter, "address_name") == 0) { |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
156 struct message_address *addr; |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
157 |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
158 addr = message_address_parse(pool_datastack_create(), |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
159 str_data(str), str_len(str), -1U, |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
160 FALSE); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
161 str_truncate(str, 0); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
162 add_lf = FALSE; |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
163 for (; addr != NULL; addr = addr->next) { |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
164 if (add_lf) |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
165 str_append_c(str, '\n'); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
166 if (strcmp(filter, "address") == 0) { |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
167 str_printfa(str, "%s@%s", |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
168 addr->mailbox, addr->domain); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
169 } else { |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
170 str_append(str, addr->name); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
171 } |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
172 add_lf = TRUE; |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
173 } |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
174 } else { |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
175 i_fatal("Unknown header filter: %s", filter); |
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
176 } |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
177 doveadm_print(str_c(str)); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
178 return 0; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
179 } |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
180 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
181 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
|
182 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
183 struct istream *input; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
184 struct message_size hdr_size; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
185 const unsigned char *data; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
186 size_t size; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
187 int ret = 0; |
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_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
|
190 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
191 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
192 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
|
193 while (!i_stream_is_eof(input)) { |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
194 if (i_stream_read_data(input, &data, &size, 0) == -1) |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
195 break; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
196 if (size == 0) |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
197 break; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
198 doveadm_print_stream(data, size); |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
199 i_stream_skip(input, size); |
11206
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 (input->stream_errno != 0) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
202 i_error("read() failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
203 ret = -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
204 } |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
205 doveadm_print_stream(NULL, 0); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
206 return ret; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
207 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
208 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
209 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
|
210 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
211 struct istream *input; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
212 const unsigned char *data; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
213 size_t size; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
214 int ret = 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
215 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
216 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
|
217 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
218 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
219 while (!i_stream_is_eof(input)) { |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
220 if (i_stream_read_data(input, &data, &size, 0) == -1) |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
221 break; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
222 if (size == 0) |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
223 break; |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
224 doveadm_print_stream(data, size); |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
225 i_stream_skip(input, size); |
11206
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 if (input->stream_errno != 0) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
228 i_error("read() failed: %m"); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
229 ret = -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
230 } |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
231 doveadm_print_stream(NULL, 0); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
232 return ret; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
233 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
234 |
13999
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
235 static int fetch_text_utf8(struct fetch_cmd_context *ctx) |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
236 { |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
237 struct istream *input; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
238 struct message_parser_ctx *parser; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
239 struct message_decoder_context *decoder; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
240 struct message_block raw_block, block; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
241 struct message_part *parts; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
242 int ret = 0; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
243 |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
244 if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0) |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
245 return -1; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
246 |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
247 parser = message_parser_init(pool_datastack_create(), input, |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
248 MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE, |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
249 0); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
250 decoder = message_decoder_init(0); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
251 |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
252 while ((ret = message_parser_parse_next_block(parser, &raw_block)) > 0) { |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
253 if (!message_decoder_decode_next_block(decoder, &raw_block, |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
254 &block)) |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
255 continue; |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
256 |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
257 if (block.hdr == NULL) { |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
258 if (block.size > 0) |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
259 doveadm_print_stream(block.data, block.size); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
260 } else if (block.hdr->eoh) |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
261 doveadm_print_stream("\n", 1); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
262 else { |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
263 i_assert(block.hdr->name_len > 0); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
264 doveadm_print_stream(block.hdr->name, |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
265 block.hdr->name_len); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
266 doveadm_print_stream(": ", 2); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
267 if (block.hdr->full_value_len > 0) { |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
268 doveadm_print_stream(block.hdr->full_value, |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
269 block.hdr->full_value_len); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
270 } |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
271 doveadm_print_stream("\n", 1); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
272 } |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
273 } |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
274 i_assert(ret != 0); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
275 message_decoder_deinit(&decoder); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
276 (void)message_parser_deinit(&parser, &parts); |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
277 |
14000
2418871d09f5
doveadm fetch text.utf8: Don't return failure on success.
Timo Sirainen <tss@iki.fi>
parents:
13999
diff
changeset
|
278 doveadm_print_stream(NULL, 0); |
13999
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
279 if (input->stream_errno != 0) { |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
280 i_error("read() failed: %m"); |
14000
2418871d09f5
doveadm fetch text.utf8: Don't return failure on success.
Timo Sirainen <tss@iki.fi>
parents:
13999
diff
changeset
|
281 return -1; |
13999
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
282 } |
14000
2418871d09f5
doveadm fetch text.utf8: Don't return failure on success.
Timo Sirainen <tss@iki.fi>
parents:
13999
diff
changeset
|
283 return 0; |
13999
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
284 } |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
285 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
286 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
|
287 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
288 uoff_t size; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
289 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
290 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
|
291 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
292 doveadm_print_num(size); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
293 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
294 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
295 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
296 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
|
297 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
298 uoff_t size; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
299 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
300 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
|
301 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
302 doveadm_print_num(size); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
303 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
304 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
305 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
306 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
|
307 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
308 time_t t; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
309 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
310 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
|
311 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
312 doveadm_print(unixdate2str(t)); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
313 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
314 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
315 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
316 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
|
317 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
318 time_t t; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
319 int tz; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
320 char chr; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
321 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
322 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
|
323 return -1; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
324 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
325 chr = tz < 0 ? '-' : '+'; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
326 if (tz < 0) tz = -tz; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
327 doveadm_print(t_strdup_printf("%s (%c%02u%02u)", unixdate2str(t), |
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
328 chr, tz/60, tz%60)); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
329 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
330 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
331 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
332 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
|
333 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
334 time_t t; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
335 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
336 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
|
337 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
338 doveadm_print(unixdate2str(t)); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
339 return 0; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
340 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
341 |
11337
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
342 static int fetch_imap_envelope(struct fetch_cmd_context *ctx) |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
343 { |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
344 const char *value; |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
345 |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
346 if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_ENVELOPE, &value) < 0) |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
347 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
348 doveadm_print(value); |
11337
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
349 return 0; |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
350 } |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
351 |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
352 static int fetch_imap_body(struct fetch_cmd_context *ctx) |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
353 { |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
354 const char *value; |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
355 |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
356 if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_BODY, &value) < 0) |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
357 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
358 doveadm_print(value); |
11337
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
359 return 0; |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
360 } |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
361 |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
362 static int fetch_imap_bodystructure(struct fetch_cmd_context *ctx) |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
363 { |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
364 const char *value; |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
365 |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
366 if (mail_get_special(ctx->mail, MAIL_FETCH_IMAP_BODYSTRUCTURE, &value) < 0) |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
367 return -1; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
368 doveadm_print(value); |
11337
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
369 return 0; |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
370 } |
12341
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
371 static int fetch_pop3_uidl(struct fetch_cmd_context *ctx) |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
372 { |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
373 const char *value; |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
374 |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
375 if (mail_get_special(ctx->mail, MAIL_FETCH_UIDL_BACKEND, &value) < 0) |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
376 return -1; |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
377 doveadm_print(value); |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
378 return 0; |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
379 } |
11337
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
380 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
381 static const struct fetch_field fetch_fields[] = { |
11511
9f9f9d9e4a79
doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents:
11409
diff
changeset
|
382 { "user", 0, fetch_user }, |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
383 { "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
|
384 { "mailbox-guid", 0, fetch_mailbox_guid }, |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
385 { "seq", 0, fetch_seq }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
386 { "uid", 0, fetch_uid }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
387 { "guid", 0, fetch_guid }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
388 { "flags", MAIL_FETCH_FLAGS, fetch_flags }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
389 { "hdr", MAIL_FETCH_STREAM_HEADER, fetch_hdr }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
390 { "body", MAIL_FETCH_STREAM_BODY, fetch_body }, |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
391 { "text", MAIL_FETCH_STREAM_HEADER | |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
392 MAIL_FETCH_STREAM_BODY, fetch_text }, |
13999
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
393 { "text.utf8", MAIL_FETCH_STREAM_HEADER | |
89a637820edd
doveadm fetch: Added text.utf8 field, which translates headers/body to UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
13601
diff
changeset
|
394 MAIL_FETCH_STREAM_BODY, fetch_text_utf8 }, |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
395 { "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
|
396 { "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
|
397 { "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
|
398 { "date.sent", MAIL_FETCH_DATE, fetch_date_sent }, |
11337
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
399 { "date.saved", MAIL_FETCH_SAVE_DATE, fetch_date_saved }, |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
400 { "imap.envelope", MAIL_FETCH_IMAP_ENVELOPE, fetch_imap_envelope }, |
4ec22f3bfd9f
doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents:
11294
diff
changeset
|
401 { "imap.body", MAIL_FETCH_IMAP_BODY, fetch_imap_body }, |
12341
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
402 { "imap.bodystructure", MAIL_FETCH_IMAP_BODYSTRUCTURE, fetch_imap_bodystructure }, |
3b13bd2d64f4
doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents:
12213
diff
changeset
|
403 { "pop3.uidl", MAIL_FETCH_UIDL_BACKEND, fetch_pop3_uidl } |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
404 }; |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
406 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
|
407 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
408 unsigned int i; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
409 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
410 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
|
411 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
|
412 return &fetch_fields[i]; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
413 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
414 return NULL; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
415 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
416 |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
417 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
|
418 { |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
419 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
|
420 |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
421 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
|
422 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
|
423 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
|
424 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
|
425 } |
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
426 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
427 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
|
428 { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
429 const char *const *fields, *name; |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
430 const struct fetch_field *field; |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
431 struct fetch_field hdr_field; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
432 |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
433 memset(&hdr_field, 0, sizeof(hdr_field)); |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
434 hdr_field.print = fetch_hdr_field; |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
435 |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
436 t_array_init(&ctx->fields, 32); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
437 t_array_init(&ctx->header_fields, 32); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
438 fields = t_strsplit_spaces(str, " "); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
439 for (; *fields != NULL; fields++) { |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
440 name = t_str_lcase(*fields); |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
441 |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
442 doveadm_print_header_simple(name); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
443 if (strncmp(name, "hdr.", 4) == 0) { |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
444 name += 4; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
445 hdr_field.name = name; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
446 array_append(&ctx->fields, &hdr_field, 1); |
14001
a6a787f0aba1
doveadm fetch: hdr.*.address and hdr.*.address_name expand to parsed mail addresses.
Timo Sirainen <tss@iki.fi>
parents:
14000
diff
changeset
|
447 name = t_strcut(name, '.'); |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
448 array_append(&ctx->header_fields, &name, 1); |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
449 } else { |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
450 field = fetch_field_find(name); |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
451 if (field == NULL) { |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
452 print_fetch_fields(); |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
453 i_fatal("Unknown fetch field: %s", name); |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
454 } |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
455 ctx->wanted_fields |= field->wanted_fields; |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
456 array_append(&ctx->fields, field, 1); |
11207
1ec4eb879f0e
doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents:
11206
diff
changeset
|
457 } |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
458 } |
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
459 (void)array_append_space(&ctx->header_fields); |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
460 } |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
461 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
462 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
|
463 { |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
464 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
|
465 struct mail *mail = ctx->mail; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
466 |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
467 array_foreach(&ctx->fields, field) { |
11342
b43d6d2ef2fb
doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents:
11337
diff
changeset
|
468 ctx->cur_field = field; |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
469 if (field->print(ctx) < 0) { |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
470 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
|
471 field->name, mailbox_get_vname(mail->box), |
12585
b748c622e896
lib-storage: Added mailbox_get_last_*error() wrappers and use them.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
472 mail->uid, mailbox_get_last_error(mail->box, NULL)); |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
473 } |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
474 } |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
475 } |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 |
11209
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
477 static int |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
478 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
|
479 { |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
480 struct doveadm_mail_iter *iter; |
c7cb58f1d2c6
doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents:
11208
diff
changeset
|
481 struct mailbox_transaction_context *trans; |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12862
diff
changeset
|
482 |
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12862
diff
changeset
|
483 if (doveadm_mail_iter_init(info, ctx->ctx.search_args, |
12973
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
484 ctx->wanted_fields, |
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
485 array_idx(&ctx->header_fields, 0), |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12862
diff
changeset
|
486 &trans, &iter) < 0) |
12973
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
487 return -1; |
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
488 |
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
489 while (doveadm_mail_iter_next(iter, &ctx->mail)) { |
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
490 T_BEGIN { |
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
491 cmd_fetch_mail(ctx); |
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
492 } T_END; |
12870
1fbd59c48414
lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents:
12862
diff
changeset
|
493 } |
12973
24a983a9ff6f
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents:
12870
diff
changeset
|
494 return doveadm_mail_iter_deinit(&iter); |
11147
51eea5bb3336
doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 } |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
496 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
497 static void |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
498 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
|
499 { |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
500 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
|
501 const enum mailbox_list_iter_flags iter_flags = |
12862
d805c7ce8d67
lib-storage: Renamed MAILBOX_LIST_ITER_NO_AUTO_INBOX to _NO_AUTO_BOXES.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
502 MAILBOX_LIST_ITER_NO_AUTO_BOXES | |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
503 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
|
504 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
|
505 const struct mailbox_info *info; |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
506 |
11395
07c9d1115029
doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents:
11342
diff
changeset
|
507 iter = doveadm_mail_list_iter_init(user, _ctx->search_args, iter_flags); |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
508 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
|
509 (void)cmd_fetch_box(ctx, info); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
510 } T_END; |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
511 doveadm_mail_list_iter_deinit(&iter); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
512 } |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
513 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
514 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
|
515 { |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
516 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
|
517 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
518 o_stream_unref(&ctx->output); |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
519 } |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
520 |
11294
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
521 static void cmd_fetch_init(struct doveadm_mail_cmd_context *_ctx, |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
522 const char *const args[]) |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
523 { |
11294
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
524 struct fetch_cmd_context *ctx = (struct fetch_cmd_context *)_ctx; |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
525 const char *fetch_fields = args[0]; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
526 |
11206
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
527 if (fetch_fields == NULL || args[1] == NULL) |
c8981561c5f2
doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents:
11205
diff
changeset
|
528 doveadm_mail_help_name("fetch"); |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
529 |
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
530 parse_fetch_fields(ctx, fetch_fields); |
11395
07c9d1115029
doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents:
11342
diff
changeset
|
531 _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
|
532 |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
533 ctx->output = o_stream_create_fd(STDOUT_FILENO, 0, FALSE); |
11294
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
534 } |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
535 |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
536 static struct doveadm_mail_cmd_context *cmd_fetch_alloc(void) |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
537 { |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
538 struct fetch_cmd_context *ctx; |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
539 |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
540 ctx = doveadm_mail_cmd_alloc(struct fetch_cmd_context); |
11395
07c9d1115029
doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents:
11342
diff
changeset
|
541 ctx->ctx.v.init = cmd_fetch_init; |
07c9d1115029
doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents:
11342
diff
changeset
|
542 ctx->ctx.v.run = cmd_fetch_run; |
07c9d1115029
doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents:
11342
diff
changeset
|
543 ctx->ctx.v.deinit = cmd_fetch_deinit; |
11605
bc03e6443ca7
doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents:
11602
diff
changeset
|
544 doveadm_print_init("pager"); |
11247
f05909834219
doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents:
11239
diff
changeset
|
545 return &ctx->ctx; |
11205
dab4fb9f8140
doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11175
diff
changeset
|
546 } |
11294
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
547 |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
548 struct doveadm_mail_cmd cmd_fetch = { |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
549 cmd_fetch_alloc, "fetch", "<fields> <search query>" |
0c9db163d538
doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents:
11247
diff
changeset
|
550 }; |