annotate src/doveadm/doveadm-mail-fetch.c @ 12973:24a983a9ff6f

doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
author Timo Sirainen <tss@iki.fi>
date Wed, 11 May 2011 22:34:27 +0300
parents 1fbd59c48414
children 957060ca5b69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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"
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
8 #include "message-size.h"
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
9 #include "imap-util.h"
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
10 #include "mail-user.h"
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #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
12 #include "mail-search.h"
11588
9a852084bbeb doveadm: Fixed assert-crash when listing mailbox foo/*
Timo Sirainen <tss@iki.fi>
parents: 11511
diff changeset
13 #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
14 #include "doveadm-print.h"
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #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
16 #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
17 #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
18
11207
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
19 #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
20
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
21 struct fetch_cmd_context {
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
22 struct doveadm_mail_cmd_context ctx;
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
23
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
24 struct ostream *output;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
25 struct mail *mail;
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
26
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
27 ARRAY_DEFINE(fields, const struct fetch_field);
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
28 ARRAY_TYPE(const_string) header_fields;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
29 enum mail_fetch_field wanted_fields;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
30
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
31 const struct fetch_field *cur_field;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
32 };
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 struct fetch_field {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
35 const char *name;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
36 enum mail_fetch_field wanted_fields;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
37 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
38 };
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
39
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
40 static int fetch_user(struct fetch_cmd_context *ctx)
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
41 {
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
42 doveadm_print(ctx->ctx.cur_mail_user->username);
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
43 return 0;
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
44 }
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
45
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
46 static int fetch_mailbox(struct fetch_cmd_context *ctx)
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
47 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
48 const char *value;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
49
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
50 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
51 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
52
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
53 doveadm_print(value);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
54 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
55 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
56
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
57 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
58 {
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
59 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
60
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
61 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
62 &metadata) < 0)
11233
5d0027f17bd8 doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents: 11209
diff changeset
63 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
64 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
65 return 0;
5d0027f17bd8 doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents: 11209
diff changeset
66 }
5d0027f17bd8 doveadm fetch: Added support for mailbox-guid search key/fetch field.
Timo Sirainen <tss@iki.fi>
parents: 11209
diff changeset
67
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
68 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
69 {
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
70 doveadm_print_num(ctx->mail->seq);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
71 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
72 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
73
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
74 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
75 {
12213
d6582f3ee54d doveadm fetch: Fixed fetching uid field.
Timo Sirainen <tss@iki.fi>
parents: 11790
diff changeset
76 doveadm_print_num(ctx->mail->uid);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
77 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
78 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
79
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
80 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
81 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
82 const char *value;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
83
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
84 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
85 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
86 doveadm_print(value);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
87 return 0;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
90 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
91 {
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
92 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
93
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
94 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
95 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
96 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
97 return 0;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
98 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
99
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
100 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
101 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
102 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
103 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
104 const unsigned char *data;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
105 size_t size;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
106 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
107
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
108 if (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
109 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
110
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
111 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
112 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
113 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
114 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
115 if (size == 0)
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
116 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
117 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
118 i_stream_skip(input, size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
119 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
120 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
121 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
122 ret = -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
123 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
124 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
125 doveadm_print_stream(NULL, 0);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
126 return ret;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
127 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
128
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
129 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
130 {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
131 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
132 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
133 bool add_lf = FALSE;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
134
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
135 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
136 return -1;
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 for (; *value != NULL; value++) {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
139 if (add_lf)
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
140 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
141 str_append(str, *value);
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
142 add_lf = TRUE;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
143 }
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
144 doveadm_print(str_c(str));
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
145 return 0;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
146 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
147
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
148 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
149 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
150 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
151 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
152 const unsigned char *data;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
153 size_t size;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
154 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
155
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
156 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
157 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
158
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
159 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
160 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
161 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
162 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
163 if (size == 0)
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
164 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
165 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
166 i_stream_skip(input, size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
167 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
168 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
169 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
170 ret = -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
171 }
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
172 doveadm_print_stream(NULL, 0);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
173 return ret;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
176 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
177 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
178 struct istream *input;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
179 const unsigned char *data;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
180 size_t size;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
181 int ret = 0;
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 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
184 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
185
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
186 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
187 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
188 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
189 if (size == 0)
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
190 break;
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
191 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
192 i_stream_skip(input, size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
193 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
194 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
195 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
196 ret = -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
197 }
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
198 doveadm_print_stream(NULL, 0);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
199 return ret;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
202 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
203 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
204 uoff_t size;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
205
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
206 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
207 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
208 doveadm_print_num(size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
209 return 0;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
212 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
213 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
214 uoff_t size;
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_virtual_size(ctx->mail, &size) < 0)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
217 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
218 doveadm_print_num(size);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
219 return 0;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
222 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
223 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
224 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
225
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
226 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
227 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
228 doveadm_print(unixdate2str(t));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
229 return 0;
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
232 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
233 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
234 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
235 int tz;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
236 char chr;
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 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
239 return -1;
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 chr = tz < 0 ? '-' : '+';
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
242 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
243 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
244 chr, tz/60, tz%60));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
245 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
246 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
247
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
248 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
249 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
250 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
251
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
252 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
253 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
254 doveadm_print(unixdate2str(t));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
255 return 0;
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
11337
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
258 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
259 {
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
260 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
261
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
262 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
263 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
264 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
265 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
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
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
268 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
269 {
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
270 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
271
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
272 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
273 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
274 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
275 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
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
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
278 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
279 {
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
280 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
281
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
282 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
283 return -1;
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
284 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
285 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
286 }
12341
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
287 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
288 {
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
289 const char *value;
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
290
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
291 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
292 return -1;
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
293 doveadm_print(value);
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
294 return 0;
3b13bd2d64f4 doveadm fetch: Added support for pop3.uidl field.
Timo Sirainen <tss@iki.fi>
parents: 12213
diff changeset
295 }
11337
4ec22f3bfd9f doveadm fetch: Added support for imap.envelope, imap.body and imap.bodystructure fields.
Timo Sirainen <tss@iki.fi>
parents: 11294
diff changeset
296
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
297 static const struct fetch_field fetch_fields[] = {
11511
9f9f9d9e4a79 doveadm fetch: Added "user" field.
Timo Sirainen <tss@iki.fi>
parents: 11409
diff changeset
298 { "user", 0, fetch_user },
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
299 { "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
300 { "mailbox-guid", 0, fetch_mailbox_guid },
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
301 { "seq", 0, fetch_seq },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
302 { "uid", 0, fetch_uid },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
303 { "guid", 0, fetch_guid },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
304 { "flags", MAIL_FETCH_FLAGS, fetch_flags },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
305 { "hdr", MAIL_FETCH_STREAM_HEADER, fetch_hdr },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
306 { "body", MAIL_FETCH_STREAM_BODY, fetch_body },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
307 { "text", MAIL_FETCH_STREAM_HEADER |
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
308 MAIL_FETCH_STREAM_BODY, fetch_text },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
309 { "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
310 { "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
311 { "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
312 { "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
313 { "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
314 { "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
315 { "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
316 { "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
317 { "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
318 };
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
320 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
321 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
322 unsigned int i;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
323
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
324 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
325 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
326 return &fetch_fields[i];
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
327 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
328 return NULL;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
329 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
330
11207
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
331 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
332 {
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
333 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
334
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
335 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
336 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
337 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
338 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
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
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
341 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
342 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
343 const char *const *fields, *name;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
344 const struct fetch_field *field;
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
345 struct fetch_field hdr_field;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
346
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
347 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
348 hdr_field.print = fetch_hdr_field;
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 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
351 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
352 fields = t_strsplit_spaces(str, " ");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
353 for (; *fields != NULL; fields++) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
354 name = t_str_lcase(*fields);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
355
11605
bc03e6443ca7 doveadm fetch: Write output using formatter. Use pager as default.
Timo Sirainen <tss@iki.fi>
parents: 11602
diff changeset
356 doveadm_print_header_simple(name);
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
357 if (strncmp(name, "hdr.", 4) == 0) {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
358 name += 4;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
359 hdr_field.name = name;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
360 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
361 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
362 } else {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
363 field = fetch_field_find(name);
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
364 if (field == NULL) {
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
365 print_fetch_fields();
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
366 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
367 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
368 ctx->wanted_fields |= field->wanted_fields;
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
369 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
370 }
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
371 }
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
372 (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
373 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
374
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
375 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
376 {
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
377 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
378 struct mail *mail = ctx->mail;
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
379
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
380 array_foreach(&ctx->fields, field) {
11342
b43d6d2ef2fb doveadm fetch: Added support for hdr.<name> field.
Timo Sirainen <tss@iki.fi>
parents: 11337
diff changeset
381 ctx->cur_field = field;
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
382 if (field->print(ctx) < 0) {
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
383 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
384 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
385 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
386 }
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
387 }
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
388 }
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389
11209
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
390 static int
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
391 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
392 {
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
393 struct doveadm_mail_iter *iter;
c7cb58f1d2c6 doveadm: Removed more code duplication from altmove/fetch commands.
Timo Sirainen <tss@iki.fi>
parents: 11208
diff changeset
394 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
395
1fbd59c48414 lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents: 12862
diff changeset
396 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
397 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
398 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
399 &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
400 return -1;
24a983a9ff6f doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents: 12870
diff changeset
401
24a983a9ff6f doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents: 12870
diff changeset
402 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
403 T_BEGIN {
24a983a9ff6f doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents: 12870
diff changeset
404 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
405 } T_END;
12870
1fbd59c48414 lib-storage: Changed mailbox_search_*() API to return pointer struct mail.
Timo Sirainen <tss@iki.fi>
parents: 12862
diff changeset
406 }
12973
24a983a9ff6f doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
Timo Sirainen <tss@iki.fi>
parents: 12870
diff changeset
407 return doveadm_mail_iter_deinit(&iter);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 }
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
409
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
410 static void
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
411 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
412 {
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
413 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
414 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
415 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
416 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
417 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
418 const struct mailbox_info *info;
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
419
11395
07c9d1115029 doveadm: mail commands can now be extended more easily by plugins.
Timo Sirainen <tss@iki.fi>
parents: 11342
diff changeset
420 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
421 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
422 (void)cmd_fetch_box(ctx, info);
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
423 } T_END;
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
424 doveadm_mail_list_iter_deinit(&iter);
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
425 }
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
426
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
427 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
428 {
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
429 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
430
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
431 o_stream_unref(&ctx->output);
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
432 }
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
433
11294
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
434 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
435 const char *const args[])
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
436 {
11294
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
437 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
438 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
439
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
440 if (fetch_fields == NULL || args[1] == NULL)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
441 doveadm_mail_help_name("fetch");
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
442
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
443 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
444 _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
445
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
446 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
447 }
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
448
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
449 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
450 {
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
451 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
452
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
453 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
454 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
455 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
456 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
457 doveadm_print_init("pager");
11247
f05909834219 doveadm: Changed mail command handler API.
Timo Sirainen <tss@iki.fi>
parents: 11239
diff changeset
458 return &ctx->ctx;
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
459 }
11294
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
460
0c9db163d538 doveadm: Changed mail command API to be more easily extensible.
Timo Sirainen <tss@iki.fi>
parents: 11247
diff changeset
461 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
462 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
463 };