annotate src/doveadm/doveadm-mail-fetch.c @ 11175:4a98f01eaaac HEAD

Added support for mail search input parsers. doveadm now uses command line parser.
author Timo Sirainen <tss@iki.fi>
date Tue, 20 Apr 2010 14:57:19 +0300
parents 51eea5bb3336
children dab4fb9f8140
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"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "istream.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ostream.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "base64.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "randgen.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "str.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mail-storage.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #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
11 #include "mail-search-parser.h"
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "doveadm-mail.h"
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
14 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
15 {
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
16 struct mail_search_parser *parser;
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct mail_search_args *sargs;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 const char *error;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
20 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
21 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
22 &sargs, &error) < 0)
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 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
24 mail_search_parser_deinit(&parser);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 return sargs;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 void cmd_fetch(struct mail_user *user, const char *const args[])
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 {
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 const char *mailbox = args[0];
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 struct mail_storage *storage;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 struct mailbox *box;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 struct mail_search_args *search_args;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct mailbox_transaction_context *t;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 struct mail_search_context *search_ctx;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct mail *mail;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 struct istream *input;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 struct ostream *output;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 string_t *prefix;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 unsigned char prefix_buf[9];
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 unsigned int prefix_len;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 if (mailbox == NULL || args[1] == NULL)
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 doveadm_mail_help_name("fetch");
11175
4a98f01eaaac Added support for mail search input parsers. doveadm now uses command line parser.
Timo Sirainen <tss@iki.fi>
parents: 11147
diff changeset
45 search_args = build_search_args(args+1);
11147
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 random_fill_weak(prefix_buf, sizeof(prefix_buf));
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 prefix = t_str_new(32);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 str_append(prefix, "===");
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 base64_encode(prefix_buf, sizeof(prefix_buf), prefix);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 str_append_c(prefix, ' ');
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 prefix_len = str_len(prefix);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 output = o_stream_create_fd(STDOUT_FILENO, 0, FALSE);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 box = doveadm_mailbox_find_and_sync(user, mailbox);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 storage = mailbox_get_storage(box);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 t = mailbox_transaction_begin(box, 0);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 search_ctx = mailbox_search_init(t, search_args, NULL);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 mail = mail_alloc(t, 0, NULL);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 while (mailbox_search_next(search_ctx, mail)) {
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 if (mail_get_stream(mail, NULL, NULL, &input) < 0) {
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 i_error("Couldn't open mail uid=%u: %s", mail->uid,
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 mail_storage_get_last_error(storage, NULL));
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 continue;
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 str_truncate(prefix, prefix_len);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 str_printfa(prefix, "seq=%u uid=%u\n", mail->seq, mail->uid);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 if (o_stream_send(output, str_data(prefix), str_len(prefix)) < 0)
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 i_fatal("write(stdout) failed: %m");
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 while (!i_stream_is_eof(input)) {
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 if (o_stream_send_istream(output, input) <= 0)
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 i_fatal("write(stdout) failed: %m");
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 mail_free(&mail);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 if (mailbox_search_deinit(&search_ctx) < 0) {
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 i_fatal("Search failed: %s",
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 mail_storage_get_last_error(storage, NULL));
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 }
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 (void)mailbox_transaction_commit(&t);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 mailbox_free(&box);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 o_stream_unref(&output);
51eea5bb3336 doveadm: Added initial code for fetch command.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }