annotate src/doveadm/doveadm-mail-fetch.c @ 11247:f05909834219 HEAD

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