annotate src/doveadm/doveadm-mail-fetch.c @ 11207:1ec4eb879f0e HEAD

doveadm fetch: If invalid fetch field is given, print list of available fields.
author Timo Sirainen <tss@iki.fi>
date Wed, 28 Apr 2010 23:15:50 +0300
parents c8981561c5f2
children f10ad708d748
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"
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
12 #include "mail-namespace.h"
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mail-storage.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "mail-search-build.h"
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
15 #include "mail-search-parser.h"
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "doveadm-mail.h"
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
17 #include "doveadm-mail-list-iter.h"
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
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
21 struct fetch_context {
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
22 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
23 struct ostream *output;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
24 struct mail *mail;
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
25
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
26 ARRAY_DEFINE(fields, const struct fetch_field);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
27 enum mail_fetch_field wanted_fields;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
28
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
29 string_t *hdr;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
30 const char *prefix;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
31 };
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 static int fetch_mailbox(struct fetch_context *ctx)
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 const char *value;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
36
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
37 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
38 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
39 str_append(ctx->hdr, value);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
40 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
41 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
42
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
43 static int fetch_seq(struct fetch_context *ctx)
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 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
46 return 0;
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
49 static int fetch_uid(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
50 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
51 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
52 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
53 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
54
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
55 static int fetch_guid(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
56 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
57 const char *value;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
58
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
59 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
60 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
61 str_append(ctx->hdr, value);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
62 return 0;
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
65 static int fetch_flags(struct fetch_context *ctx)
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 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
68 mail_get_keywords(ctx->mail));
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
69 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
70 }
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 static void flush_hdr(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
73 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
74 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
75 str_truncate(ctx->hdr, 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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
78 static int fetch_hdr(struct fetch_context *ctx)
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 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
81 struct message_size hdr_size;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
82 int ret = 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 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
85 return -1;
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 str_append_c(ctx->hdr, '\n');
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
88 flush_hdr(ctx);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
89 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
90 while (!i_stream_is_eof(input)) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
91 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
92 i_fatal("write(stdout) failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
93 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
94 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
95 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
96 ret = -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
97 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
98 i_stream_unref(&input);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
99 o_stream_flush(ctx->output);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
100 return ret;
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
103 static int fetch_body(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
104 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
105 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
106 struct message_size hdr_size;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
107 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
108
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
109 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
110 return -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 str_append_c(ctx->hdr, '\n');
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
113 flush_hdr(ctx);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
114 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
115 while (!i_stream_is_eof(input)) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
116 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
117 i_fatal("write(stdout) failed: %m");
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 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
120 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
121 ret = -1;
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 o_stream_flush(ctx->output);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
124 return ret;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
125 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
126
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
127 static int fetch_text(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
128 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
129 struct istream *input;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
130 int ret = 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
131
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
132 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
133 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
134
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
135 str_append_c(ctx->hdr, '\n');
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
136 flush_hdr(ctx);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
137 while (!i_stream_is_eof(input)) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
138 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
139 i_fatal("write(stdout) failed: %m");
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 if (input->stream_errno != 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
142 i_error("read() failed: %m");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
143 ret = -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
144 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
145 o_stream_flush(ctx->output);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
146 return ret;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
147 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
148
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
149 static int fetch_size_physical(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
150 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
151 uoff_t size;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
152
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
153 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
154 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
155 str_printfa(ctx->hdr, "%"PRIuUOFF_T, size);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
156 return 0;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
157 }
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 static int fetch_size_virtual(struct fetch_context *ctx)
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 uoff_t size;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
162
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
163 if (mail_get_virtual_size(ctx->mail, &size) < 0)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
164 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
165 str_printfa(ctx->hdr, "%"PRIuUOFF_T, size);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
166 return 0;
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
169 static int fetch_date_received(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
170 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
171 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
172
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
173 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
174 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
175 str_printfa(ctx->hdr, "%s", unixdate2str(t));
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
176 return 0;
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
179 static int fetch_date_sent(struct fetch_context *ctx)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
180 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
181 time_t t;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
182 int tz;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
183 char chr;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
184
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
185 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
186 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
187
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
188 chr = tz < 0 ? '-' : '+';
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
189 if (tz < 0) tz = -tz;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
190 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
191 chr, tz/60, tz%60);
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
195 static int fetch_date_saved(struct fetch_context *ctx)
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
199 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
200 return -1;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
201 str_printfa(ctx->hdr, "%s", unixdate2str(t));
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
202 return 0;
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
205 struct fetch_field {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
206 const char *name;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
207 enum mail_fetch_field wanted_fields;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
208 int (*print)(struct fetch_context *ctx);
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
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
211 static const struct fetch_field fetch_fields[] = {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
212 { "mailbox", 0, fetch_mailbox },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
213 { "seq", 0, fetch_seq },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
214 { "uid", 0, fetch_uid },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
215 { "guid", 0, fetch_guid },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
216 { "flags", MAIL_FETCH_FLAGS, fetch_flags },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
217 { "hdr", MAIL_FETCH_STREAM_HEADER, fetch_hdr },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
218 { "body", MAIL_FETCH_STREAM_BODY, fetch_body },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
219 { "text", MAIL_FETCH_STREAM_HEADER |
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
220 MAIL_FETCH_STREAM_BODY, fetch_text },
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
221 { "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
222 { "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
223 { "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
224 { "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
225 { "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
226 };
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
228 static struct mail_search_args *build_search_args(const char *const args[])
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
230 struct mail_search_parser *parser;
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 struct mail_search_args *sargs;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 const char *error;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
234 parser = mail_search_parser_init_cmdline(args);
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
235 if (mail_search_build(mail_search_register_human, parser, "UTF-8",
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
236 &sargs, &error) < 0)
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 i_fatal("%s", error);
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
238 mail_search_parser_deinit(&parser);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 return sargs;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
242 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
243 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
244 unsigned int i;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
245
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
246 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
247 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
248 return &fetch_fields[i];
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 return NULL;
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
11207
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
253 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
254 {
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
255 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
256
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
257 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
258 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
259 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
260 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
261 }
1ec4eb879f0e doveadm fetch: If invalid fetch field is given, print list of available fields.
Timo Sirainen <tss@iki.fi>
parents: 11206
diff changeset
262
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
263 static void parse_fetch_fields(struct fetch_context *ctx, const char *str)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
264 {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
265 const char *const *fields, *name;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
266 const struct fetch_field *field;
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 t_array_init(&ctx->fields, 32);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
269 fields = t_strsplit_spaces(str, " ");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
270 for (; *fields != NULL; fields++) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
271 name = t_str_lcase(*fields);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
272
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
273 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
274 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
275 print_fetch_fields();
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
276 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
277 }
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
278 ctx->wanted_fields |= field->wanted_fields;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
279
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
280 array_append(&ctx->fields, field, 1);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
281 }
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
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
284 static void
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
285 cmd_fetch_box(struct fetch_context *ctx, struct mailbox *box)
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 {
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
287 struct mail_storage *storage = mailbox_get_storage(box);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 struct mailbox_transaction_context *t;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 struct mail_search_context *search_ctx;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 struct mail *mail;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
291 const struct fetch_field *field;
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
293 if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
294 i_error("Syncing mailbox %s failed: %s", mailbox_get_vname(box),
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
295 mail_storage_get_last_error(storage, NULL));
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
296 return;
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
297 }
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
299 mail_search_args_init(ctx->search_args, box, FALSE, NULL);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 t = mailbox_transaction_begin(box, 0);
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
301 search_ctx = mailbox_search_init(t, ctx->search_args, NULL);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
302 mail = mail_alloc(t, ctx->wanted_fields, NULL);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 while (mailbox_search_next(search_ctx, mail)) {
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
304 str_truncate(ctx->hdr, 0);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
305 str_append(ctx->hdr, ctx->prefix);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
307 ctx->mail = mail;
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
308 array_foreach(&ctx->fields, field) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
309 str_printfa(ctx->hdr, "%s: ", field->name);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
310 if (field->print(ctx) < 0) {
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
311 i_error("fetch(%s) failed for box=%s uid=%u: %s",
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
312 field->name, mailbox_get_vname(box),
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
313 mail->uid, mail_storage_get_last_error(storage, NULL));
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
314 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
315 str_append_c(ctx->hdr, '\n');
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
316 }
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
317 flush_hdr(ctx);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
319 ctx->mail = NULL;
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 mail_free(&mail);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 if (mailbox_search_deinit(&search_ctx) < 0) {
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
323 i_error("Search failed: %s",
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 mail_storage_get_last_error(storage, NULL));
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
326 mail_search_args_deinit(ctx->search_args);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 (void)mailbox_transaction_commit(&t);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 }
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
329
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
330 void cmd_fetch(struct mail_user *user, const char *const args[])
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
331 {
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
332 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
333 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
334 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
335 MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
336 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
337 struct fetch_context ctx;
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
338 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
339 const struct mailbox_info *info;
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
340 struct mailbox *box;
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
341 const char *storage_name;
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
342 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
343
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
344 memset(&ctx, 0, sizeof(ctx));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
345 if (fetch_fields == NULL || args[1] == NULL)
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
346 doveadm_mail_help_name("fetch");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
347 parse_fetch_fields(&ctx, fetch_fields);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
348 ctx.search_args = build_search_args(args + 1);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
349
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
350 ctx.output = o_stream_create_fd(STDOUT_FILENO, 0, FALSE);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
351
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
352 random_fill_weak(prefix_buf, sizeof(prefix_buf));
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
353 ctx.hdr = str_new(default_pool, 512);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
354 str_append(ctx.hdr, "===");
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
355 base64_encode(prefix_buf, sizeof(prefix_buf), ctx.hdr);
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
356 str_append_c(ctx.hdr, '\n');
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
357 ctx.prefix = t_strdup(str_c(ctx.hdr));
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
358 str_truncate(ctx.hdr, 0);
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
359
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
360 iter = doveadm_mail_list_iter_init(user, ctx.search_args, iter_flags);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
361 while ((info = doveadm_mail_list_iter_next(iter)) != NULL) T_BEGIN {
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
362 storage_name = mail_namespace_get_storage_name(info->ns,
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
363 info->name);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
364 box = mailbox_alloc(info->ns->list, storage_name,
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
365 MAILBOX_FLAG_KEEP_RECENT |
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
366 MAILBOX_FLAG_IGNORE_ACLS);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
367 (void)cmd_fetch_box(&ctx, box);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
368 mailbox_free(&box);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
369 } T_END;
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
370 doveadm_mail_list_iter_deinit(&iter);
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
371 o_stream_unref(&ctx.output);
11206
c8981561c5f2 doveadm fetch: Added "fields to fetch" parameter.
Timo Sirainen <tss@iki.fi>
parents: 11205
diff changeset
372 str_free(&ctx.hdr);
11205
dab4fb9f8140 doveadm fetch: Added support for fetching mails from multiple mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11175
diff changeset
373 }