annotate src/doveadm/doveadm-mail-fetch.c @ 12550:2c299c0e3bc8

lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata(). The idea is now that all status items are tracked all the time after mailbox is opened and they can always be looked up without failure. The metadata items are looked up lazily and the lookups may fail at any time. mailbox_get_status() can be used after mailbox_alloc() to indicate that the mailbox doesn't necessarily have to be opened, just that the status fields get returned. If mailbox is already known to be open, mailbox_get_open_status() can be used. It never fails.
author Timo Sirainen <tss@iki.fi>
date Sat, 01 Jan 2011 15:52:39 +0200
parents 3b13bd2d64f4
children b748c622e896
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 "str.h"
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
8 #include "message-size.h"
11409
93eaae8617c8 doveadm fetch: mailbox field value is printed as UTF-8, not mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11395
diff changeset
9 #include "imap-utf7.h"
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
10 #include "imap-util.h"
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
11 #include "mail-user.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"
11588
9a852084bbeb doveadm: Fixed assert-crash when listing mailbox foo/*
Timo Sirainen <tss@iki.fi>
parents: 11511
diff changeset
14 #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
15 #include "doveadm-print.h"
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #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
17 #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
18 #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
19
11207
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
20 #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
21
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
22 struct fetch_cmd_context {
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
23 struct doveadm_mail_cmd_context ctx;
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
24
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
25 struct ostream *output;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
26 struct mail *mail;
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
27
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
28 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
29 ARRAY_TYPE(const_string) header_fields;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
30 enum mail_fetch_field wanted_fields;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
31
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
32 const struct fetch_field *cur_field;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
33 };
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
34
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
35 struct fetch_field {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
36 const char *name;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
37 enum mail_fetch_field wanted_fields;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
38 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
39 };
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
40
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
41 static int fetch_user(struct fetch_cmd_context *ctx)
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
42 {
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
43 doveadm_print(ctx->ctx.cur_mail_user->username);
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
44 return 0;
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
45 }
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
46
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
47 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
48 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
49 const char *value;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
50 string_t *str = t_str_new(128);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
51
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
52 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
53 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
54
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
55 if (imap_utf7_to_utf8(value, str) == 0)
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
56 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
57 else {
11409
93eaae8617c8 doveadm fetch: mailbox field value is printed as UTF-8, not mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11395
diff changeset
58 /* not a valid mUTF-7 name, fallback to showing it as-is */
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
59 doveadm_print(value);
11409
93eaae8617c8 doveadm fetch: mailbox field value is printed as UTF-8, not mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 11395
diff changeset
60 }
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
61 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
62 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
63
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
64 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
65 {
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
66 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
67
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
68 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
69 &metadata) < 0)
11233
5d0027f17bd8 doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents: 11209
diff changeset
70 return -1;
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
71 doveadm_print(mail_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
72 return 0;
5d0027f17bd8 doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents: 11209
diff changeset
73 }
5d0027f17bd8 doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents: 11209
diff changeset
74
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
75 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
76 {
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
77 doveadm_print_num(ctx->mail->seq);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
78 return 0;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
81 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
82 {
12213
d6582f3ee54d doveadm fetch: Fixed fetching uid field.
Timo Sirainen <tss@iki.fi>
parents: 11790
diff changeset
83 doveadm_print_num(ctx->mail->uid);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
84 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
85 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
86
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
87 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
88 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
89 const char *value;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
90
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
91 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
92 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
93 doveadm_print(value);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
94 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
95 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
96
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
97 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
98 {
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
99 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
100
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
101 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
102 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
103 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
104 return 0;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
105 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
106
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
107 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
108 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
109 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
110 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
111 const unsigned char *data;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
112 size_t size;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
113 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
114
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
115 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
116 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
117
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
118 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
119 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
120 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
121 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
122 if (size == 0)
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
123 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
124 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
125 i_stream_skip(input, size);
11206
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 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
128 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
129 ret = -1;
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 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
132 doveadm_print_stream(NULL, 0);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
133 return ret;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
134 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
135
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
136 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
137 {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
138 const char *const *value;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
139 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
140 bool add_lf = FALSE;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
141
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
142 if (mail_get_headers(ctx->mail, ctx->cur_field->name, &value) < 0)
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 }
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
151 doveadm_print(str_c(str));
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
152 return 0;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
153 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
154
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
155 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
156 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
157 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
158 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
159 const unsigned char *data;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
160 size_t size;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
161 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
162
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
163 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
164 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
165
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
166 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
167 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
168 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
169 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
170 if (size == 0)
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
171 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
172 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
173 i_stream_skip(input, size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
174 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
175 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
176 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
177 ret = -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
178 }
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
179 doveadm_print_stream(NULL, 0);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
180 return ret;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
181 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
182
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
183 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
184 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
185 struct istream *input;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
186 const unsigned char *data;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
187 size_t size;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
188 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
189
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
190 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
191 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
192
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_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
210 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
211 uoff_t size;
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 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
214 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
215 doveadm_print_num(size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
216 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
217 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
218
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
219 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
220 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
221 uoff_t size;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
222
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
223 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
224 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
225 doveadm_print_num(size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
226 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
227 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
228
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
229 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
230 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
231 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
232
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
233 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
234 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
235 doveadm_print(unixdate2str(t));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
236 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
237 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
238
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
239 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
240 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
241 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
242 int tz;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
243 char chr;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
244
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
245 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
246 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
247
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
248 chr = tz < 0 ? '-' : '+';
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
249 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
250 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
251 chr, tz/60, tz%60));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
252 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
253 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
254
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
255 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
256 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
257 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
258
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
259 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
260 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
261 doveadm_print(unixdate2str(t));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
262 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
263 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
264
11337
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
265 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
266 {
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
267 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
268
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
269 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
270 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
271 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
272 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
273 }
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
274
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
275 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
276 {
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
277 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
278
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
279 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
280 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
281 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
282 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
283 }
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
284
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
285 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
286 {
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
287 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
288
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
289 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
290 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
291 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
292 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
293 }
12341
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
294 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
295 {
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
296 const char *value;
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
297
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
298 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
299 return -1;
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
300 doveadm_print(value);
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
301 return 0;
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
302 }
11337
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
303
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
304 static const struct fetch_field fetch_fields[] = {
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
305 { "user", 0, fetch_user },
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
306 { "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
307 { "mailbox-guid", 0, fetch_mailbox_guid },
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
308 { "seq", 0, fetch_seq },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
309 { "uid", 0, fetch_uid },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
310 { "guid", 0, fetch_guid },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
311 { "flags", MAIL_FETCH_FLAGS, fetch_flags },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
312 { "hdr", MAIL_FETCH_STREAM_HEADER, fetch_hdr },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
313 { "body", MAIL_FETCH_STREAM_BODY, fetch_body },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
314 { "text", MAIL_FETCH_STREAM_HEADER |
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
315 MAIL_FETCH_STREAM_BODY, fetch_text },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
316 { "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
317 { "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
318 { "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
319 { "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
320 { "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
321 { "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
322 { "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
323 { "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
324 { "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
325 };
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
327 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
328 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
329 unsigned int i;
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 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
332 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
333 return &fetch_fields[i];
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
334 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
335 return NULL;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
336 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
337
11207
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
338 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
339 {
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
340 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
341
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
342 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
343 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
344 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
345 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
346 }
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
347
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
348 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
349 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
350 const char *const *fields, *name;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
351 const struct fetch_field *field;
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
352 struct fetch_field hdr_field;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
353
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
354 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
355 hdr_field.print = fetch_hdr_field;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
356
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
357 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
358 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
359 fields = t_strsplit_spaces(str, " ");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
360 for (; *fields != NULL; fields++) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
361 name = t_str_lcase(*fields);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
362
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
363 doveadm_print_header_simple(name);
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
364 if (strncmp(name, "hdr.", 4) == 0) {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
365 name += 4;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
366 hdr_field.name = name;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
367 array_append(&ctx->fields, &hdr_field, 1);
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
368 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
369 } else {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
370 field = fetch_field_find(name);
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
371 if (field == NULL) {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
372 print_fetch_fields();
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
373 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
374 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
375 ctx->wanted_fields |= field->wanted_fields;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
376 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
377 }
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
378 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
379 (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
380 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
381
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
382 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
383 {
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
384 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
385 struct mail *mail = ctx->mail;
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
386
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
387 array_foreach(&ctx->fields, field) {
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
388 ctx->cur_field = field;
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
389 if (field->print(ctx) < 0) {
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
390 struct mail_storage *storage =
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
391 mailbox_get_storage(mail->box);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
393 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
394 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
395 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
396 }
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
397 }
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
398 }
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
400 static int
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
401 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
402 {
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
403 struct doveadm_mail_iter *iter;
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
404 struct mailbox_transaction_context *trans;
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
405 struct mail *mail;
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
406 struct mailbox_header_lookup_ctx *headers = NULL;
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
407
11395
07c9d1115029 doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents: 11342
diff changeset
408 if (doveadm_mail_iter_init(info, ctx->ctx.search_args,
07c9d1115029 doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents: 11342
diff changeset
409 &trans, &iter) < 0)
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
410 return -1;
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
411
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
412 if (array_count(&ctx->header_fields) > 1) {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
413 headers = mailbox_header_lookup_init(
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
414 mailbox_transaction_get_mailbox(trans),
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
415 array_idx(&ctx->header_fields, 0));
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
416 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
417 mail = mail_alloc(trans, ctx->wanted_fields, headers);
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
418 if (headers != NULL)
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
419 mailbox_header_lookup_unref(&headers);
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
420 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
421 ctx->mail = mail;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
422 T_BEGIN {
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
423 cmd_fetch_mail(ctx);
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
424 } T_END;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
425 ctx->mail = NULL;
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 mail_free(&mail);
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
428 return doveadm_mail_iter_deinit(&iter);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 }
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
430
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
431 static void
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
432 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
433 {
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
434 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
435 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
436 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
437 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
438 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
439 const struct mailbox_info *info;
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
440
11395
07c9d1115029 doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents: 11342
diff changeset
441 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
442 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
443 (void)cmd_fetch_box(ctx, info);
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
444 } T_END;
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
445 doveadm_mail_list_iter_deinit(&iter);
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
446 }
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
447
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
448 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
449 {
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
450 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
451
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
452 o_stream_unref(&ctx->output);
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
453 }
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
454
11294
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
455 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
456 const char *const args[])
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
457 {
11294
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
458 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
459 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
460
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
461 if (fetch_fields == NULL || args[1] == NULL)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
462 doveadm_mail_help_name("fetch");
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
463
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
464 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
465 _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
466
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
467 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
468 }
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
469
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
470 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
471 {
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
472 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
473
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
474 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
475 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
476 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
477 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
478 doveadm_print_init("pager");
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
479 return &ctx->ctx;
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
480 }
11294
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
481
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
482 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
483 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
484 };