annotate src/doveadm/dsync/dsync-ibc-stream.c @ 18351:b4dbe64c0032

dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync. I'm not sure if that's actually necessary, but just trying to follow the different possibilities on how dsync run can finish made me unsure about it. This should make it at least clear that if a slave-dsync has a failure flag set at deinit master-dsync will know about it before it returns success.
author Timo Sirainen <tss@iki.fi>
date Fri, 13 Mar 2015 20:08:34 +0200
parents 35e4a6ae8d85
children b900b50085fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18137
3009a1a6f6d5 global: freshen copyright
Phil Carmody <phil@dovecot.fi>
parents: 17845
diff changeset
1 /* Copyright (c) 2013-2015 Dovecot authors, see the included COPYING file */
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "fd-set-nonblock.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "safe-mkstemp.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ioloop.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "istream.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "istream-seekable.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "istream-dot.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "ostream.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "str.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "strescape.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "master-service.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "mail-cache.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "mail-storage-private.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "dsync-serializer.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include "dsync-deserializer.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "dsync-mail.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include "dsync-mailbox.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include "dsync-mailbox-state.h"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include "dsync-mailbox-tree.h"
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
23 #include "dsync-ibc-private.h"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 #include <stdlib.h>
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
27 #define DSYNC_IBC_STREAM_TIMEOUT_MSECS (60*10*1000)
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
28 #define DSYNC_IBC_STREAM_OUTBUF_THROTTLE_SIZE (1024*128)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 #define DSYNC_PROTOCOL_VERSION_MAJOR 3
18351
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
31 #define DSYNC_PROTOCOL_VERSION_MINOR 3
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
32 #define DSYNC_HANDSHAKE_VERSION "VERSION\tdsync\t3\t3\n"
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
33
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
34 #define DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES 1
16381
e0156c479a12 dsync: Previous have_save_guids change somewhat broke compatibility with earlier dsync versions.
Timo Sirainen <tss@iki.fi>
parents: 16380
diff changeset
35 #define DSYNC_PROTOCOL_MINOR_HAVE_SAVE_GUID 2
18351
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
36 #define DSYNC_PROTOCOL_MINOR_HAVE_FINISH 3
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 enum item_type {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 ITEM_NONE,
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
40 ITEM_DONE,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 ITEM_HANDSHAKE,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 ITEM_MAILBOX_STATE,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 ITEM_MAILBOX_TREE_NODE,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 ITEM_MAILBOX_DELETE,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 ITEM_MAILBOX,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
48 ITEM_MAILBOX_ATTRIBUTE,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 ITEM_MAIL_CHANGE,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 ITEM_MAIL_REQUEST,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 ITEM_MAIL,
18351
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
52 ITEM_FINISH,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 ITEM_MAILBOX_CACHE_FIELD,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 ITEM_END_OF_LIST
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 };
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 #define END_OF_LIST_LINE "."
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 static const struct {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 /* full human readable name of the item */
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 const char *name;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 /* unique character identifying the item */
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 char chr;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 const char *required_keys;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 const char *optional_keys;
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
67 unsigned int min_minor_version;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 } items[ITEM_END_OF_LIST+1] = {
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
69 { NULL, '\0', NULL, NULL, 0 },
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
70 { .name = "done",
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
71 .chr = 'X',
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
72 .optional_keys = ""
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
73 },
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 { .name = "handshake",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 .chr = 'H',
15782
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
76 .required_keys = "hostname",
16110
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
77 .optional_keys = "sync_ns_prefix sync_box sync_box_guid sync_type "
18177
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
78 "debug sync_visible_namespaces exclude_mailboxes "
16563
c2c09416d8a4 dsync: Recent changes broke remote dsync
Timo Sirainen <tss@iki.fi>
parents: 16561
diff changeset
79 "send_mail_requests backup_send backup_recv lock_timeout "
18177
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
80 "no_mail_sync no_backup_overwrite purge_remote "
18181
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
81 "sync_since_timestamp sync_flags virtual_all_box"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 { .name = "mailbox_state",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 .chr = 'S',
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 .required_keys = "mailbox_guid last_uidvalidity last_common_uid "
17284
cd6079c61c2b dsync: Fixed new dsync versions to work again with older versions.
Timo Sirainen <tss@iki.fi>
parents: 17282
diff changeset
86 "last_common_modseq last_common_pvt_modseq",
cd6079c61c2b dsync: Fixed new dsync versions to work again with older versions.
Timo Sirainen <tss@iki.fi>
parents: 17282
diff changeset
87 .optional_keys = "last_messages_count changes_during_sync"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 { .name = "mailbox_tree_node",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 .chr = 'N',
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 .required_keys = "name existence",
15231
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
92 .optional_keys = "mailbox_guid uid_validity uid_next "
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
93 "last_renamed_or_created subscribed last_subscription_change"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 { .name = "mailbox_delete",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 .chr = 'D',
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 .required_keys = "hierarchy_sep",
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
98 .optional_keys = "mailboxes dirs unsubscribes"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 { .name = "mailbox",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 .chr = 'B',
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
102 .required_keys = "mailbox_guid uid_validity uid_next messages_count "
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
103 "first_recent_uid highest_modseq highest_pvt_modseq",
16977
8a7ecddca4ad dsync: Support syncing storages with 128bit GUIDs <-> string GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 16940
diff changeset
104 .optional_keys = "mailbox_lost cache_fields have_guids have_save_guids have_only_guid128"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 },
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
106 { .name = "mailbox_attribute",
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
107 .chr = 'A',
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
108 .required_keys = "type key",
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
109 .optional_keys = "value stream deleted last_change modseq",
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
110 .min_minor_version = DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
111 },
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 { .name = "mail_change",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 .chr = 'C',
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 .required_keys = "type uid",
17296
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
115 .optional_keys = "guid hdr_hash modseq pvt_modseq "
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 "add_flags remove_flags final_flags "
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 "keywords_reset keyword_changes"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 { .name = "mail_request",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 .chr = 'R',
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 .optional_keys = "guid uid"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 { .name = "mail",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 .chr = 'M',
17296
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
125 .optional_keys = "guid uid pop3_uidl pop3_order received_date saved_date stream"
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 },
18351
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
127 { .name = "finish",
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
128 .chr = 'F',
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
129 .optional_keys = "error"
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
130 },
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 { .name = "mailbox_cache_field",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 .chr = 'c',
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 .required_keys = "name decision",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 .optional_keys = "last_used"
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 },
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
137 { "end_of_list", '\0', NULL, NULL, 0 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 };
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
140 struct dsync_ibc_stream {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
141 struct dsync_ibc ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 char *name, *temp_path_prefix;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 struct istream *input;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 struct ostream *output;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 struct io *io;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 struct timeout *to;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
149 unsigned int minor_version;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 struct dsync_serializer *serializers[ITEM_END_OF_LIST];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 struct dsync_deserializer *deserializers[ITEM_END_OF_LIST];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 pool_t ret_pool;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 struct dsync_deserializer_decoder *cur_decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
156 struct istream *value_output, *value_input;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 struct dsync_mail *cur_mail;
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
158 struct dsync_mailbox_attribute *cur_attr;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
159 char value_output_last;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 unsigned int version_received:1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 unsigned int handshake_received:1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 unsigned int has_pending_data:1;
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
164 unsigned int stopped:1;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 };
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
167 static void dsync_ibc_stream_stop(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 {
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
169 ibc->stopped = TRUE;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
170 i_stream_close(ibc->input);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
171 o_stream_close(ibc->output);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 io_loop_stop(current_ioloop);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
175 static int dsync_ibc_stream_read_mail_stream(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 {
15483
fc6873897e8b dsync: Minor (probably unnecessary) fix for i_stream_read() API usage.
Timo Sirainen <tss@iki.fi>
parents: 15482
diff changeset
177 do {
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
178 i_stream_skip(ibc->value_input,
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
179 i_stream_get_data_size(ibc->value_input));
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
180 } while (i_stream_read(ibc->value_input) > 0);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
181 if (ibc->value_input->eof) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
182 if (ibc->value_input->stream_errno != 0) {
16940
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
183 i_error("dsync(%s): read() failed: %s", ibc->name,
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
184 i_stream_get_error(ibc->value_input));
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
185 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 return -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 /* finished reading the mail stream */
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
189 i_assert(ibc->value_input->eof);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
190 i_stream_seek(ibc->value_input, 0);
15463
f9e8cbb2792d dsync: Fixed hangs with remote dsyncing
Timo Sirainen <tss@iki.fi>
parents: 15231
diff changeset
191 ibc->has_pending_data = TRUE;
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
192 ibc->value_input = NULL;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 return 1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 return 0;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
198 static void dsync_ibc_stream_input(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 {
17777
647162da8423 dsync: Reset I/O timeout every time when receiving input.
Timo Sirainen <tss@iki.fi>
parents: 17497
diff changeset
200 timeout_reset(ibc->to);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
201 if (ibc->value_input != NULL) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
202 if (dsync_ibc_stream_read_mail_stream(ibc) == 0)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 return;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 }
15594
5bb80a6491eb dsync: Fixes to handling output stream buffering.
Timo Sirainen <tss@iki.fi>
parents: 15592
diff changeset
205 o_stream_cork(ibc->output);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
206 ibc->ibc.io_callback(ibc->ibc.io_context);
15594
5bb80a6491eb dsync: Fixes to handling output stream buffering.
Timo Sirainen <tss@iki.fi>
parents: 15592
diff changeset
207 o_stream_uncork(ibc->output);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
210 static int dsync_ibc_stream_send_value_stream(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 const unsigned char *data;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 unsigned char add;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 size_t i, size;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 int ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
217 while ((ret = i_stream_read_data(ibc->value_output,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 &data, &size, 0)) > 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 add = '\0';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 for (i = 0; i < size; i++) {
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
221 if (data[i] == '.' &&
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
222 ((i == 0 && ibc->value_output_last == '\n') ||
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
223 (i > 0 && data[i-1] == '\n'))) {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 /* escape the dot */
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 add = '.';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 if (i > 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
231 o_stream_nsend(ibc->output, data, i);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
232 ibc->value_output_last = data[i-1];
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
233 i_stream_skip(ibc->value_output, i);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
236 if (o_stream_get_buffer_used_size(ibc->output) >= 4096) {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
237 if ((ret = o_stream_flush(ibc->output)) < 0) {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
238 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 return -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 if (ret == 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 /* continue later */
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
243 o_stream_set_flush_pending(ibc->output, TRUE);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 return 0;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 if (add != '\0') {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
249 o_stream_nsend(ibc->output, &add, 1);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
250 ibc->value_output_last = add;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 i_assert(ret == -1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
255 if (ibc->value_output->stream_errno != 0) {
16940
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
256 i_error("dsync(%s): read(%s) failed: %s",
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
257 ibc->name, i_stream_get_name(ibc->value_output),
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
258 i_stream_get_error(ibc->value_output));
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
259 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 return -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
263 /* finished sending the stream. use "CRLF." instead of "LF." just in
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
264 case we're sending binary data that ends with CR. */
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
265 o_stream_nsend_str(ibc->output, "\r\n.\r\n");
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
266 i_stream_unref(&ibc->value_output);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 return 1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
270 static int dsync_ibc_stream_output(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
272 struct ostream *output = ibc->output;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 int ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274
15482
6f940b2bfbe6 dsync: Fixed hang when sending mail stream to remote dsync.
Timo Sirainen <tss@iki.fi>
parents: 15481
diff changeset
275 o_stream_cork(ibc->output);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 if ((ret = o_stream_flush(output)) < 0)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 ret = 1;
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
278 else if (ibc->value_output != NULL) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
279 if (dsync_ibc_stream_send_value_stream(ibc) < 0)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 ret = 1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
282 timeout_reset(ibc->to);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
284 if (!dsync_ibc_is_send_queue_full(&ibc->ibc))
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
285 ibc->ibc.io_callback(ibc->ibc.io_context);
15482
6f940b2bfbe6 dsync: Fixed hang when sending mail stream to remote dsync.
Timo Sirainen <tss@iki.fi>
parents: 15481
diff changeset
286 o_stream_uncork(ibc->output);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
290 static void dsync_ibc_stream_timeout(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 i_error("dsync(%s): I/O has stalled, no activity for %u seconds",
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
293 ibc->name, DSYNC_IBC_STREAM_TIMEOUT_MSECS/1000);
15986
f6377e089dee dsync: If I/O gets stalled, log the state in which it happened.
Timo Sirainen <tss@iki.fi>
parents: 15836
diff changeset
294 ibc->ibc.timeout = TRUE;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
295 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
298 static void dsync_ibc_stream_init(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 unsigned int i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301
17192
a1c153c70bb9 Use io_add_istream() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 17170
diff changeset
302 ibc->io = io_add_istream(ibc->input, dsync_ibc_stream_input, ibc);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
303 o_stream_set_no_error_handling(ibc->output, TRUE);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
304 o_stream_set_flush_callback(ibc->output, dsync_ibc_stream_output, ibc);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
305 ibc->to = timeout_add(DSYNC_IBC_STREAM_TIMEOUT_MSECS,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
306 dsync_ibc_stream_timeout, ibc);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
307 o_stream_cork(ibc->output);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
308 o_stream_nsend_str(ibc->output, DSYNC_HANDSHAKE_VERSION);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 /* initialize serializers and send their headers to remote */
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
311 for (i = ITEM_DONE + 1; i < ITEM_END_OF_LIST; i++) T_BEGIN {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 const char *keys;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 keys = items[i].required_keys == NULL ? items[i].optional_keys :
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 t_strconcat(items[i].required_keys, " ",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 items[i].optional_keys, NULL);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 if (keys != NULL) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 i_assert(items[i].chr != '\0');
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
320 ibc->serializers[i] =
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 dsync_serializer_init(t_strsplit_spaces(keys, " "));
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
322 o_stream_nsend(ibc->output, &items[i].chr, 1);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
323 o_stream_nsend_str(ibc->output,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
324 dsync_serializer_encode_header_line(ibc->serializers[i]));
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 } T_END;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
327 o_stream_nsend_str(ibc->output, ".\n");
15594
5bb80a6491eb dsync: Fixes to handling output stream buffering.
Timo Sirainen <tss@iki.fi>
parents: 15592
diff changeset
328 o_stream_uncork(ibc->output);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
331 static void dsync_ibc_stream_deinit(struct dsync_ibc *_ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
333 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
16669
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
334 unsigned int i;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
16669
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
336 for (i = ITEM_DONE + 1; i < ITEM_END_OF_LIST; i++) {
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
337 if (ibc->serializers[i] != NULL)
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
338 dsync_serializer_deinit(&ibc->serializers[i]);
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
339 if (ibc->deserializers[i] != NULL)
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
340 dsync_deserializer_deinit(&ibc->deserializers[i]);
960f827b7579 dsync: Memory leak fix at deinit.
Timo Sirainen <tss@iki.fi>
parents: 16665
diff changeset
341 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
342 if (ibc->cur_decoder != NULL)
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
343 dsync_deserializer_decode_finish(&ibc->cur_decoder);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
344 if (ibc->value_output != NULL)
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
345 i_stream_unref(&ibc->value_output);
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
346 else {
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
347 /* notify remote that we're closing. this is mainly to avoid
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
348 "read() failed: EOF" errors on failing dsyncs */
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
349 o_stream_nsend_str(ibc->output,
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
350 t_strdup_printf("%c\n", items[ITEM_DONE].chr));
17497
de20b4fa60ac Added (void) prefix for ignoring return values we don't care about.
Timo Sirainen <tss@iki.fi>
parents: 17296
diff changeset
351 (void)o_stream_nfinish(ibc->output);
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
352 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
354 timeout_remove(&ibc->to);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
355 if (ibc->io != NULL)
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
356 io_remove(&ibc->io);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
357 i_stream_destroy(&ibc->input);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
358 o_stream_destroy(&ibc->output);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
359 pool_unref(&ibc->ret_pool);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
360 i_free(ibc->temp_path_prefix);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
361 i_free(ibc->name);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
362 i_free(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
365 static int dsync_ibc_stream_next_line(struct dsync_ibc_stream *ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
366 const char **line_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 {
16673
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
368 string_t *error;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 const char *line;
17252
e20a6192ddcf dsync: Added assert
Timo Sirainen <tss@iki.fi>
parents: 17192
diff changeset
370 ssize_t ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
372 line = i_stream_next_line(ibc->input);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 if (line != NULL) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 *line_r = line;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 return 1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 /* try reading some */
17252
e20a6192ddcf dsync: Added assert
Timo Sirainen <tss@iki.fi>
parents: 17192
diff changeset
378 if ((ret = i_stream_read(ibc->input)) == -1) {
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
379 if (ibc->stopped)
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
380 return -1;
16673
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
381 error = t_str_new(128);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
382 if (ibc->input->stream_errno != 0) {
16940
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
383 str_printfa(error, "read(%s) failed: %s", ibc->name,
38f404297728 dsync: Use i_stream_get_error() instead of just errno in stream error messages.
Timo Sirainen <tss@iki.fi>
parents: 16801
diff changeset
384 i_stream_get_error(ibc->input));
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 } else {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
386 i_assert(ibc->input->eof);
16673
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
387 str_printfa(error, "read(%s) failed: EOF", ibc->name);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 }
16673
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
389 if (!ibc->version_received)
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
390 str_append(error, " (version not received)");
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
391 else if (!ibc->handshake_received)
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
392 str_append(error, " (handshake not received)");
64464646c020 dsync: Stream disconnection error message improvement
Timo Sirainen <tss@iki.fi>
parents: 16669
diff changeset
393 i_error("%s", str_c(error));
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
394 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 return -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 }
17252
e20a6192ddcf dsync: Added assert
Timo Sirainen <tss@iki.fi>
parents: 17192
diff changeset
397 i_assert(ret >= 0);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
398 *line_r = i_stream_next_line(ibc->input);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 if (*line_r == NULL) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
400 ibc->has_pending_data = FALSE;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 return 0;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
403 ibc->has_pending_data = TRUE;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 return 1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14584
diff changeset
407 static void ATTR_FORMAT(3, 4) ATTR_NULL(2)
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
408 dsync_ibc_input_error(struct dsync_ibc_stream *ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
409 struct dsync_deserializer_decoder *decoder,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
410 const char *fmt, ...)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 va_list args;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 const char *error;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 va_start(args, fmt);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 error = t_strdup_vprintf(fmt, args);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 if (decoder == NULL)
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
418 i_error("dsync(%s): %s", ibc->name, error);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 else {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
420 i_error("dsync(%s): %s: %s", ibc->name,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 dsync_deserializer_decoder_get_name(decoder), error);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 va_end(args);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
425 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
429 dsync_ibc_stream_send_string(struct dsync_ibc_stream *ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
430 const string_t *str)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 {
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
432 i_assert(ibc->value_output == NULL);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
433 o_stream_nsend(ibc->output, str_data(str), str_len(str));
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
436 static int seekable_fd_callback(const char **path_r, void *context)
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
437 {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
438 struct dsync_ibc_stream *ibc = context;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
439 string_t *path;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
440 int fd;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
441
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
442 path = t_str_new(128);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
443 str_append(path, ibc->temp_path_prefix);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
444 fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
445 if (fd == -1) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
446 i_error("safe_mkstemp(%s) failed: %m", str_c(path));
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
447 return -1;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
448 }
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
449
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
450 /* we just want the fd, unlink it */
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
451 if (unlink(str_c(path)) < 0) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
452 /* shouldn't happen.. */
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
453 i_error("unlink(%s) failed: %m", str_c(path));
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
454 i_close_fd(&fd);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
455 return -1;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
456 }
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
457
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
458 *path_r = str_c(path);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
459 return fd;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
460 }
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
461
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
462 static struct istream *
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
463 dsync_ibc_stream_input_stream(struct dsync_ibc_stream *ibc)
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
464 {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
465 struct istream *inputs[2];
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
466
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
467 inputs[0] = i_stream_create_dot(ibc->input, FALSE);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
468 inputs[1] = NULL;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
469 ibc->value_input = i_stream_create_seekable(inputs, MAIL_READ_FULL_BLOCK_SIZE,
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
470 seekable_fd_callback, ibc);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
471 i_stream_unref(&inputs[0]);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
472
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
473 return ibc->value_input;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
474 }
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
475
15036
5943cace4e05 dsync: Renamed "io" slave to "stream".
Timo Sirainen <tss@iki.fi>
parents: 15035
diff changeset
476 static int
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
477 dsync_ibc_check_missing_deserializers(struct dsync_ibc_stream *ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 unsigned int i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 int ret = 0;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
482 for (i = ITEM_DONE + 1; i < ITEM_END_OF_LIST; i++) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
483 if (ibc->deserializers[i] == NULL &&
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
484 ibc->minor_version >= items[i].min_minor_version &&
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 (items[i].required_keys != NULL ||
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 items[i].optional_keys != NULL)) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
487 dsync_ibc_input_error(ibc, NULL,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 "Remote didn't handshake deserializer for %s",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 items[i].name);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 ret = -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 static bool
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
497 dsync_ibc_stream_handshake(struct dsync_ibc_stream *ibc, const char *line)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 enum item_type item = ITEM_NONE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 const char *const *required_keys, *error;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 unsigned int i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
503 if (ibc->handshake_received)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 return TRUE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
506 if (!ibc->version_received) {
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
507 if (!version_string_verify_full(line, "dsync",
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
508 DSYNC_PROTOCOL_VERSION_MAJOR,
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
509 &ibc->minor_version)) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
510 dsync_ibc_input_error(ibc, NULL,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 "Remote dsync doesn't use compatible protocol");
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
512 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
514 ibc->version_received = TRUE;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 return FALSE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 if (strcmp(line, END_OF_LIST_LINE) == 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 /* finished handshaking */
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
520 if (dsync_ibc_check_missing_deserializers(ibc) < 0)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 return FALSE;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
522 ibc->handshake_received = TRUE;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 return FALSE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 for (i = 1; i < ITEM_END_OF_LIST; i++) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 if (items[i].chr == line[0]) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 item = i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 if (item == ITEM_NONE) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 /* unknown deserializer, ignore */
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534 return FALSE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 required_keys = items[item].required_keys == NULL ? NULL :
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 t_strsplit(items[item].required_keys, " ");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 if (dsync_deserializer_init(items[item].name,
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 required_keys, line + 1,
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
541 &ibc->deserializers[item], &error) < 0) {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
542 dsync_ibc_input_error(ibc, NULL,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 "Remote sent invalid handshake for %s: %s",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 items[item].name, error);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 return FALSE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
549 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
550 dsync_ibc_stream_input_next(struct dsync_ibc_stream *ibc, enum item_type item,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
551 struct dsync_deserializer_decoder **decoder_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 enum item_type line_item = ITEM_NONE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 const char *line, *error;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 unsigned int i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
557 i_assert(ibc->value_input == NULL);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
559 timeout_reset(ibc->to);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 do {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
562 if (dsync_ibc_stream_next_line(ibc, &line) <= 0)
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
563 return DSYNC_IBC_RECV_RET_TRYAGAIN;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
564 } while (!dsync_ibc_stream_handshake(ibc, line));
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 if (strcmp(line, END_OF_LIST_LINE) == 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 /* end of this list */
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
568 return DSYNC_IBC_RECV_RET_FINISHED;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 }
15767
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
570 if (line[0] == items[ITEM_DONE].chr) {
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
571 /* remote cleanly closed the connection, possibly because of
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
572 some failure (which it should have logged). we don't want to
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
573 log any stream errors anyway after this. */
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
574 dsync_ibc_stream_stop(ibc);
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
575 return DSYNC_IBC_RECV_RET_TRYAGAIN;
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
576
93a8a32adfd8 dsync: Don't log read() failed: EOF when remote intentionally fails early.
Timo Sirainen <tss@iki.fi>
parents: 15750
diff changeset
577 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 for (i = 1; i < ITEM_END_OF_LIST; i++) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 if (*line == items[i].chr) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 line_item = i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584 if (line_item != item) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
585 dsync_ibc_input_error(ibc, NULL,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 "Received unexpected input %c != %c",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 *line, items[item].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
588 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
591 if (ibc->cur_decoder != NULL)
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
592 dsync_deserializer_decode_finish(&ibc->cur_decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
593 if (dsync_deserializer_decode_begin(ibc->deserializers[item],
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
594 line+1, &ibc->cur_decoder,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 &error) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
596 dsync_ibc_input_error(ibc, NULL, "Invalid input to %s: %s",
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
597 items[item].name, error);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
598 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
600 *decoder_r = ibc->cur_decoder;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
601 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
605 dsync_ibc_stream_send_handshake(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
606 const struct dsync_ibc_settings *set)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
608 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610 string_t *str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 char sync_type[2];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 str_append_c(str, items[ITEM_HANDSHAKE].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
614 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_HANDSHAKE]);
15782
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
615 dsync_serializer_encode_add(encoder, "hostname", set->hostname);
17170
08f1c7af0ac0 dsync: Support multiple -n parameters.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
616 if (set->sync_ns_prefixes != NULL) {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617 dsync_serializer_encode_add(encoder, "sync_ns_prefix",
17170
08f1c7af0ac0 dsync: Support multiple -n parameters.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
618 set->sync_ns_prefixes);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619 }
15471
88ac919f8afe dsync: Added back support for syncing only one mailbox (-m parameter)
Timo Sirainen <tss@iki.fi>
parents: 15470
diff changeset
620 if (set->sync_box != NULL)
88ac919f8afe dsync: Added back support for syncing only one mailbox (-m parameter)
Timo Sirainen <tss@iki.fi>
parents: 15470
diff changeset
621 dsync_serializer_encode_add(encoder, "sync_box", set->sync_box);
18180
39d00448490f dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
Timo Sirainen <tss@iki.fi>
parents: 18177
diff changeset
622 if (set->virtual_all_box != NULL) {
39d00448490f dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
Timo Sirainen <tss@iki.fi>
parents: 18177
diff changeset
623 dsync_serializer_encode_add(encoder, "virtual_all_box",
39d00448490f dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
Timo Sirainen <tss@iki.fi>
parents: 18177
diff changeset
624 set->virtual_all_box);
39d00448490f dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
Timo Sirainen <tss@iki.fi>
parents: 18177
diff changeset
625 }
16398
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
626 if (set->exclude_mailboxes != NULL) {
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
627 string_t *substr = t_str_new(64);
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
628 unsigned int i;
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
629
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
630 for (i = 0; set->exclude_mailboxes[i] != NULL; i++) {
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
631 if (i != 0)
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
632 str_append_c(substr, '\t');
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
633 str_append_tabescaped(substr, set->exclude_mailboxes[i]);
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
634 }
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
635 dsync_serializer_encode_add(encoder, "exclude_mailboxes",
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
636 str_c(substr));
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
637 }
16110
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
638 if (!guid_128_is_empty(set->sync_box_guid)) {
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
639 dsync_serializer_encode_add(encoder, "sync_box_guid",
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
640 guid_128_to_string(set->sync_box_guid));
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
641 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 sync_type[0] = sync_type[1] = '\0';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 switch (set->sync_type) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 case DSYNC_BRAIN_SYNC_TYPE_UNKNOWN:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 case DSYNC_BRAIN_SYNC_TYPE_FULL:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 sync_type[0] = 'f';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 case DSYNC_BRAIN_SYNC_TYPE_CHANGED:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 sync_type[0] = 'c';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 case DSYNC_BRAIN_SYNC_TYPE_STATE:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 sync_type[0] = 's';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 }
15782
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
657 if (sync_type[0] != '\0')
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
658 dsync_serializer_encode_add(encoder, "sync_type", sync_type);
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
659 if (set->lock_timeout > 0) {
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
660 dsync_serializer_encode_add(encoder, "lock_timeout",
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
661 t_strdup_printf("%u", set->lock_timeout));
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
662 }
18177
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
663 if (set->sync_since_timestamp > 0) {
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
664 dsync_serializer_encode_add(encoder, "sync_since_timestamp",
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
665 t_strdup_printf("%ld", (long)set->sync_since_timestamp));
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
666 }
18181
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
667 if (set->sync_flags != NULL) {
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
668 dsync_serializer_encode_add(encoder, "sync_flags",
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
669 set->sync_flags);
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
670 }
15744
b4e2b3b54f0a dsync: Renamed "guid_requests" to "mail_requests"
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
671 if ((set->brain_flags & DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS) != 0)
b4e2b3b54f0a dsync: Renamed "guid_requests" to "mail_requests"
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
672 dsync_serializer_encode_add(encoder, "send_mail_requests", "");
15231
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
673 if ((set->brain_flags & DSYNC_BRAIN_FLAG_BACKUP_SEND) != 0)
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
674 dsync_serializer_encode_add(encoder, "backup_send", "");
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
675 if ((set->brain_flags & DSYNC_BRAIN_FLAG_BACKUP_RECV) != 0)
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
676 dsync_serializer_encode_add(encoder, "backup_recv", "");
15464
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
677 if ((set->brain_flags & DSYNC_BRAIN_FLAG_DEBUG) != 0)
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
678 dsync_serializer_encode_add(encoder, "debug", "");
15836
607758d425e7 dsync: Renamed -a parameter to -N. It also now skips invisible namespaces.
Timo Sirainen <tss@iki.fi>
parents: 15783
diff changeset
679 if ((set->brain_flags & DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES) != 0)
607758d425e7 dsync: Renamed -a parameter to -N. It also now skips invisible namespaces.
Timo Sirainen <tss@iki.fi>
parents: 15783
diff changeset
680 dsync_serializer_encode_add(encoder, "sync_visible_namespaces", "");
16560
2e6829462405 dsync: Send DSYNC_BRAIN_FLAG_NO_MAIL_SYNC via ibc-stream to slave brain.
Timo Sirainen <tss@iki.fi>
parents: 16415
diff changeset
681 if ((set->brain_flags & DSYNC_BRAIN_FLAG_NO_MAIL_SYNC) != 0)
2e6829462405 dsync: Send DSYNC_BRAIN_FLAG_NO_MAIL_SYNC via ibc-stream to slave brain.
Timo Sirainen <tss@iki.fi>
parents: 16415
diff changeset
682 dsync_serializer_encode_add(encoder, "no_mail_sync", "");
16561
0144704e1b99 dsync: Added -1 parameter to do a "one way sync" without reverting changes.
Timo Sirainen <tss@iki.fi>
parents: 16560
diff changeset
683 if ((set->brain_flags & DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE) != 0)
0144704e1b99 dsync: Added -1 parameter to do a "one way sync" without reverting changes.
Timo Sirainen <tss@iki.fi>
parents: 16560
diff changeset
684 dsync_serializer_encode_add(encoder, "no_backup_overwrite", "");
16801
56be613e8ece dsync: Added -P parameter to do a purge for the remote storage after syncing.
Timo Sirainen <tss@iki.fi>
parents: 16681
diff changeset
685 if ((set->brain_flags & DSYNC_BRAIN_FLAG_PURGE_REMOTE) != 0)
56be613e8ece dsync: Added -P parameter to do a purge for the remote storage after syncing.
Timo Sirainen <tss@iki.fi>
parents: 16681
diff changeset
686 dsync_serializer_encode_add(encoder, "purge_remote", "");
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
689 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
692 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
693 dsync_ibc_stream_recv_handshake(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
694 const struct dsync_ibc_settings **set_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
696 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 struct dsync_deserializer_decoder *decoder;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
698 struct dsync_ibc_settings *set;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
700 pool_t pool = ibc->ret_pool;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
701 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
703 ret = dsync_ibc_stream_input_next(ibc, ITEM_HANDSHAKE, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
704 if (ret != DSYNC_IBC_RECV_RET_OK) {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
705 if (ret != DSYNC_IBC_RECV_RET_TRYAGAIN) {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 i_error("dsync(%s): Unexpected input in handshake",
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
707 ibc->name);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
708 dsync_ibc_stream_stop(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
710 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 p_clear(pool);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
714 set = p_new(pool, struct dsync_ibc_settings, 1);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715
15782
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
716 value = dsync_deserializer_decode_get(decoder, "hostname");
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
717 set->hostname = p_strdup(pool, value);
16665
7057d4ad8891 dsync: After reading remote hostname, use it for the log messages instead of IP.
Timo Sirainen <tss@iki.fi>
parents: 16563
diff changeset
718 /* now that we know the remote's hostname, use it for the
7057d4ad8891 dsync: After reading remote hostname, use it for the log messages instead of IP.
Timo Sirainen <tss@iki.fi>
parents: 16563
diff changeset
719 stream's name */
7057d4ad8891 dsync: After reading remote hostname, use it for the log messages instead of IP.
Timo Sirainen <tss@iki.fi>
parents: 16563
diff changeset
720 i_free(ibc->name);
7057d4ad8891 dsync: After reading remote hostname, use it for the log messages instead of IP.
Timo Sirainen <tss@iki.fi>
parents: 16563
diff changeset
721 ibc->name = i_strdup(set->hostname);
7057d4ad8891 dsync: After reading remote hostname, use it for the log messages instead of IP.
Timo Sirainen <tss@iki.fi>
parents: 16563
diff changeset
722
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723 if (dsync_deserializer_decode_try(decoder, "sync_ns_prefix", &value))
17170
08f1c7af0ac0 dsync: Support multiple -n parameters.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
724 set->sync_ns_prefixes = p_strdup(pool, value);
15471
88ac919f8afe dsync: Added back support for syncing only one mailbox (-m parameter)
Timo Sirainen <tss@iki.fi>
parents: 15470
diff changeset
725 if (dsync_deserializer_decode_try(decoder, "sync_box", &value))
88ac919f8afe dsync: Added back support for syncing only one mailbox (-m parameter)
Timo Sirainen <tss@iki.fi>
parents: 15470
diff changeset
726 set->sync_box = p_strdup(pool, value);
18180
39d00448490f dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
Timo Sirainen <tss@iki.fi>
parents: 18177
diff changeset
727 if (dsync_deserializer_decode_try(decoder, "virtual_all_box", &value))
39d00448490f dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
Timo Sirainen <tss@iki.fi>
parents: 18177
diff changeset
728 set->virtual_all_box = p_strdup(pool, value);
16110
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
729 if (dsync_deserializer_decode_try(decoder, "sync_box_guid", &value) &&
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
730 guid_128_from_string(value, set->sync_box_guid) < 0) {
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
731 dsync_ibc_input_error(ibc, decoder,
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
732 "Invalid sync_box_guid: %s", value);
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
733 return DSYNC_IBC_RECV_RET_TRYAGAIN;
c51873a8e0d9 doveadm sync/backup: Added -g <guid> to sync only the specified mailbox (by GUID)
Timo Sirainen <tss@iki.fi>
parents: 16109
diff changeset
734 }
16398
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
735 if (dsync_deserializer_decode_try(decoder, "exclude_mailboxes", &value) &&
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
736 *value != '\0') {
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
737 char **boxes = p_strsplit_tabescaped(pool, value);
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
738 set->exclude_mailboxes = (const void *)boxes;
4883a8e1db13 dsync: Added -x parameter to exclude mailboxes from sync.
Timo Sirainen <tss@iki.fi>
parents: 16381
diff changeset
739 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 if (dsync_deserializer_decode_try(decoder, "sync_type", &value)) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 switch (value[0]) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 case 'f':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 set->sync_type = DSYNC_BRAIN_SYNC_TYPE_FULL;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 case 'c':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746 set->sync_type = DSYNC_BRAIN_SYNC_TYPE_CHANGED;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 case 's':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 set->sync_type = DSYNC_BRAIN_SYNC_TYPE_STATE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751 default:
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
752 dsync_ibc_input_error(ibc, decoder,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
753 "Unknown sync_type: %s", value);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
754 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756 }
15782
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
757 if (dsync_deserializer_decode_try(decoder, "lock_timeout", &value)) {
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
758 if (str_to_uint(value, &set->lock_timeout) < 0 ||
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
759 set->lock_timeout == 0) {
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
760 dsync_ibc_input_error(ibc, decoder,
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
761 "Invalid lock_timeout: %s", value);
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
762 return DSYNC_IBC_RECV_RET_TRYAGAIN;
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
763 }
6f024e0289da dsync: -l parameter locking is now done on the server with "lower" hostname.
Timo Sirainen <tss@iki.fi>
parents: 15767
diff changeset
764 }
18177
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
765 if (dsync_deserializer_decode_try(decoder, "sync_since_timestamp", &value)) {
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
766 if (str_to_time(value, &set->sync_since_timestamp) < 0 ||
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
767 set->sync_since_timestamp == 0) {
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
768 dsync_ibc_input_error(ibc, decoder,
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
769 "Invalid sync_since_timestamp: %s", value);
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
770 return DSYNC_IBC_RECV_RET_TRYAGAIN;
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
771 }
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
772 }
18181
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
773 if (dsync_deserializer_decode_try(decoder, "sync_flags", &value))
35e4a6ae8d85 dsync: Added -F parameter to sync only mails with[out] specific flag.
Timo Sirainen <tss@iki.fi>
parents: 18180
diff changeset
774 set->sync_flags = p_strdup(pool, value);
15744
b4e2b3b54f0a dsync: Renamed "guid_requests" to "mail_requests"
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
775 if (dsync_deserializer_decode_try(decoder, "send_mail_requests", &value))
b4e2b3b54f0a dsync: Renamed "guid_requests" to "mail_requests"
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
776 set->brain_flags |= DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS;
15231
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
777 if (dsync_deserializer_decode_try(decoder, "backup_send", &value))
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
778 set->brain_flags |= DSYNC_BRAIN_FLAG_BACKUP_SEND;
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
779 if (dsync_deserializer_decode_try(decoder, "backup_recv", &value))
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
780 set->brain_flags |= DSYNC_BRAIN_FLAG_BACKUP_RECV;
15464
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
781 if (dsync_deserializer_decode_try(decoder, "debug", &value))
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
782 set->brain_flags |= DSYNC_BRAIN_FLAG_DEBUG;
15836
607758d425e7 dsync: Renamed -a parameter to -N. It also now skips invisible namespaces.
Timo Sirainen <tss@iki.fi>
parents: 15783
diff changeset
783 if (dsync_deserializer_decode_try(decoder, "sync_visible_namespaces", &value))
607758d425e7 dsync: Renamed -a parameter to -N. It also now skips invisible namespaces.
Timo Sirainen <tss@iki.fi>
parents: 15783
diff changeset
784 set->brain_flags |= DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES;
16560
2e6829462405 dsync: Send DSYNC_BRAIN_FLAG_NO_MAIL_SYNC via ibc-stream to slave brain.
Timo Sirainen <tss@iki.fi>
parents: 16415
diff changeset
785 if (dsync_deserializer_decode_try(decoder, "no_mail_sync", &value))
2e6829462405 dsync: Send DSYNC_BRAIN_FLAG_NO_MAIL_SYNC via ibc-stream to slave brain.
Timo Sirainen <tss@iki.fi>
parents: 16415
diff changeset
786 set->brain_flags |= DSYNC_BRAIN_FLAG_NO_MAIL_SYNC;
16561
0144704e1b99 dsync: Added -1 parameter to do a "one way sync" without reverting changes.
Timo Sirainen <tss@iki.fi>
parents: 16560
diff changeset
787 if (dsync_deserializer_decode_try(decoder, "no_backup_overwrite", &value))
0144704e1b99 dsync: Added -1 parameter to do a "one way sync" without reverting changes.
Timo Sirainen <tss@iki.fi>
parents: 16560
diff changeset
788 set->brain_flags |= DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE;
16801
56be613e8ece dsync: Added -P parameter to do a purge for the remote storage after syncing.
Timo Sirainen <tss@iki.fi>
parents: 16681
diff changeset
789 if (dsync_deserializer_decode_try(decoder, "purge_remote", &value))
56be613e8ece dsync: Added -P parameter to do a purge for the remote storage after syncing.
Timo Sirainen <tss@iki.fi>
parents: 16681
diff changeset
790 set->brain_flags |= DSYNC_BRAIN_FLAG_PURGE_REMOTE;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
791
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
792 *set_r = set;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
793 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
795
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 static void
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
797 dsync_ibc_stream_send_end_of_list(struct dsync_ibc *_ibc,
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
798 enum dsync_ibc_eol_type type)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
800 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
802 i_assert(ibc->value_output == NULL);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803
16222
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
804 switch (type) {
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
805 case DSYNC_IBC_EOL_MAILBOX_ATTRIBUTE:
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
806 if (ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES)
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
807 return;
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
808 break;
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
809 default:
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
810 break;
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
811 }
d79cf48f1072 dsync: Fixed talking to earlier dsync without mailbox attribute support.
Timo Sirainen <tss@iki.fi>
parents: 16110
diff changeset
812
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
813 o_stream_nsend_str(ibc->output, END_OF_LIST_LINE"\n");
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
817 dsync_ibc_stream_send_mailbox_state(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
818 const struct dsync_mailbox_state *state)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
819 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
820 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
821 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
822 string_t *str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
823
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
824 str_append_c(str, items[ITEM_MAILBOX_STATE].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
825 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_STATE]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
826 dsync_serializer_encode_add(encoder, "mailbox_guid",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 guid_128_to_string(state->mailbox_guid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 dsync_serializer_encode_add(encoder, "last_uidvalidity",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
829 dec2str(state->last_uidvalidity));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 dsync_serializer_encode_add(encoder, "last_common_uid",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 dec2str(state->last_common_uid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 dsync_serializer_encode_add(encoder, "last_common_modseq",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 dec2str(state->last_common_modseq));
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
834 dsync_serializer_encode_add(encoder, "last_common_pvt_modseq",
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
835 dec2str(state->last_common_pvt_modseq));
17282
9669c9a8984f dsync: Include messages_count in the mailbox states.
Timo Sirainen <tss@iki.fi>
parents: 17252
diff changeset
836 dsync_serializer_encode_add(encoder, "last_messages_count",
9669c9a8984f dsync: Include messages_count in the mailbox states.
Timo Sirainen <tss@iki.fi>
parents: 17252
diff changeset
837 dec2str(state->last_messages_count));
15783
502a50925641 dsync: Merge last-common-* values from both local and remote when they differ.
Timo Sirainen <tss@iki.fi>
parents: 15782
diff changeset
838 if (state->changes_during_sync)
502a50925641 dsync: Merge last-common-* values from both local and remote when they differ.
Timo Sirainen <tss@iki.fi>
parents: 15782
diff changeset
839 dsync_serializer_encode_add(encoder, "changes_during_sync", "");
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
842 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
843 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
845 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
846 dsync_ibc_stream_recv_mailbox_state(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
847 struct dsync_mailbox_state *state_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
849 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
852 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 memset(state_r, 0, sizeof(*state_r));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
856 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAILBOX_STATE, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
857 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
858 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 value = dsync_deserializer_decode_get(decoder, "mailbox_guid");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 if (guid_128_from_string(value, state_r->mailbox_guid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
862 dsync_ibc_input_error(ibc, decoder, "Invalid mailbox_guid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
863 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 value = dsync_deserializer_decode_get(decoder, "last_uidvalidity");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 if (str_to_uint32(value, &state_r->last_uidvalidity) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
867 dsync_ibc_input_error(ibc, decoder, "Invalid last_uidvalidity");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
868 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870 value = dsync_deserializer_decode_get(decoder, "last_common_uid");
15494
b7d8027a8f74 dsync: Fixed parsing mailbox state from remote dsync.
Timo Sirainen <tss@iki.fi>
parents: 15483
diff changeset
871 if (str_to_uint32(value, &state_r->last_common_uid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
872 dsync_ibc_input_error(ibc, decoder, "Invalid last_common_uid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
873 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 value = dsync_deserializer_decode_get(decoder, "last_common_modseq");
15494
b7d8027a8f74 dsync: Fixed parsing mailbox state from remote dsync.
Timo Sirainen <tss@iki.fi>
parents: 15483
diff changeset
876 if (str_to_uint64(value, &state_r->last_common_modseq) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
877 dsync_ibc_input_error(ibc, decoder, "Invalid last_common_modseq");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
878 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879 }
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
880 value = dsync_deserializer_decode_get(decoder, "last_common_pvt_modseq");
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
881 if (str_to_uint64(value, &state_r->last_common_pvt_modseq) < 0) {
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
882 dsync_ibc_input_error(ibc, decoder, "Invalid last_common_pvt_modseq");
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
883 return DSYNC_IBC_RECV_RET_TRYAGAIN;
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
884 }
17286
507aee5fef6d dsync: Yet another fix to working with old versions.
Timo Sirainen <tss@iki.fi>
parents: 17284
diff changeset
885 if (dsync_deserializer_decode_try(decoder, "last_messages_count", &value) &&
507aee5fef6d dsync: Yet another fix to working with old versions.
Timo Sirainen <tss@iki.fi>
parents: 17284
diff changeset
886 str_to_uint32(value, &state_r->last_messages_count) < 0) {
17282
9669c9a8984f dsync: Include messages_count in the mailbox states.
Timo Sirainen <tss@iki.fi>
parents: 17252
diff changeset
887 dsync_ibc_input_error(ibc, decoder, "Invalid last_messages_count");
9669c9a8984f dsync: Include messages_count in the mailbox states.
Timo Sirainen <tss@iki.fi>
parents: 17252
diff changeset
888 return DSYNC_IBC_RECV_RET_TRYAGAIN;
9669c9a8984f dsync: Include messages_count in the mailbox states.
Timo Sirainen <tss@iki.fi>
parents: 17252
diff changeset
889 }
15783
502a50925641 dsync: Merge last-common-* values from both local and remote when they differ.
Timo Sirainen <tss@iki.fi>
parents: 15782
diff changeset
890 if (dsync_deserializer_decode_try(decoder, "changes_during_sync", &value))
502a50925641 dsync: Merge last-common-* values from both local and remote when they differ.
Timo Sirainen <tss@iki.fi>
parents: 15782
diff changeset
891 state_r->changes_during_sync = TRUE;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
892 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
896 dsync_ibc_stream_send_mailbox_tree_node(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
897 const char *const *name,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
898 const struct dsync_mailbox_node *node)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
899 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
900 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
902 string_t *str, *namestr;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
903
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
904 i_assert(*name != NULL);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
905
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
906 str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
907 str_append_c(str, items[ITEM_MAILBOX_TREE_NODE].chr);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
908
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 /* convert all hierarchy separators to tabs. mailbox names really
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
910 aren't supposed to have any tabs, but escape them anyway if there
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
911 are. */
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912 namestr = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
913 for (; *name != NULL; name++) {
15068
002e0a120c2a Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents: 15037
diff changeset
914 str_append_tabescaped(namestr, *name);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915 str_append_c(namestr, '\t');
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
916 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 str_truncate(namestr, str_len(namestr)-1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
919 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_TREE_NODE]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 dsync_serializer_encode_add(encoder, "name", str_c(namestr));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
921 switch (node->existence) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
922 case DSYNC_MAILBOX_NODE_NONEXISTENT:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923 dsync_serializer_encode_add(encoder, "existence", "n");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 case DSYNC_MAILBOX_NODE_EXISTS:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926 dsync_serializer_encode_add(encoder, "existence", "y");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 case DSYNC_MAILBOX_NODE_DELETED:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 dsync_serializer_encode_add(encoder, "existence", "d");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
930 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 if (!guid_128_is_empty(node->mailbox_guid)) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 dsync_serializer_encode_add(encoder, "mailbox_guid",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 guid_128_to_string(node->mailbox_guid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 if (node->uid_validity != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 dsync_serializer_encode_add(encoder, "uid_validity",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 dec2str(node->uid_validity));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
940 }
15231
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
941 if (node->uid_next != 0) {
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
942 dsync_serializer_encode_add(encoder, "uid_next",
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
943 dec2str(node->uid_next));
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
944 }
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
945 if (node->last_renamed_or_created != 0) {
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
946 dsync_serializer_encode_add(encoder, "last_renamed_or_created",
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
947 dec2str(node->last_renamed_or_created));
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
948 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
949 if (node->last_subscription_change != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
950 dsync_serializer_encode_add(encoder, "last_subscription_change",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
951 dec2str(node->last_subscription_change));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
952 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
953 if (node->subscribed)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
954 dsync_serializer_encode_add(encoder, "subscribed", "");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
955 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
956 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
957 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
959 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
960 dsync_ibc_stream_recv_mailbox_tree_node(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
961 const char *const **name_r,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
962 const struct dsync_mailbox_node **node_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
963 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
964 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
965 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
966 struct dsync_mailbox_node *node;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
967 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
968 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
969
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
970 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAILBOX_TREE_NODE, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
971 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
972 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
973
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
974 p_clear(ibc->ret_pool);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
975 node = p_new(ibc->ret_pool, struct dsync_mailbox_node, 1);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
976
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
977 value = dsync_deserializer_decode_get(decoder, "name");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
978 if (*value == '\0') {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
979 dsync_ibc_input_error(ibc, decoder, "Empty name");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
980 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
981 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
982 *name_r = (void *)p_strsplit_tabescaped(ibc->ret_pool, value);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
983
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
984 value = dsync_deserializer_decode_get(decoder, "existence");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
985 switch (*value) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
986 case 'n':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
987 node->existence = DSYNC_MAILBOX_NODE_NONEXISTENT;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
988 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
989 case 'y':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
990 node->existence = DSYNC_MAILBOX_NODE_EXISTS;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
991 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
992 case 'd':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
993 node->existence = DSYNC_MAILBOX_NODE_DELETED;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
994 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
995 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
996
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
997 if (dsync_deserializer_decode_try(decoder, "mailbox_guid", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
998 guid_128_from_string(value, node->mailbox_guid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
999 dsync_ibc_input_error(ibc, decoder, "Invalid mailbox_guid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1000 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1001 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1002 if (dsync_deserializer_decode_try(decoder, "uid_validity", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1003 str_to_uint32(value, &node->uid_validity) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1004 dsync_ibc_input_error(ibc, decoder, "Invalid uid_validity");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1005 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1006 }
15231
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
1007 if (dsync_deserializer_decode_try(decoder, "uid_next", &value) &&
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
1008 str_to_uint32(value, &node->uid_next) < 0) {
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
1009 dsync_ibc_input_error(ibc, decoder, "Invalid uid_next");
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
1010 return DSYNC_IBC_RECV_RET_TRYAGAIN;
454d0563927d doveadm: "backup" command is working again.
Timo Sirainen <tss@iki.fi>
parents: 15068
diff changeset
1011 }
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1012 if (dsync_deserializer_decode_try(decoder, "last_renamed_or_created", &value) &&
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1013 str_to_time(value, &node->last_renamed_or_created) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1014 dsync_ibc_input_error(ibc, decoder, "Invalid last_renamed_or_created");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1015 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1016 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1017 if (dsync_deserializer_decode_try(decoder, "last_subscription_change", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1018 str_to_time(value, &node->last_subscription_change) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1019 dsync_ibc_input_error(ibc, decoder, "Invalid last_subscription_change");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1020 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1021 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1022 if (dsync_deserializer_decode_try(decoder, "subscribed", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1023 node->subscribed = TRUE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1024
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1025 *node_r = node;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1026 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1027 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1028
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1029 static void
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1030 dsync_ibc_stream_encode_delete(string_t *str,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1031 struct dsync_serializer_encoder *encoder,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1032 const struct dsync_mailbox_delete *deletes,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1033 unsigned int count, const char *key,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1034 enum dsync_mailbox_delete_type type)
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1035 {
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1036 unsigned int i;
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1037
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1038 str_truncate(str, 0);
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1039 for (i = 0; i < count; i++) {
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1040 if (deletes[i].type == type) {
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1041 str_append(str, guid_128_to_string(deletes[i].guid));
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1042 str_printfa(str, " %ld ", (long)deletes[i].timestamp);
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1043 }
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1044 }
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1045 if (str_len(str) > 0) {
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1046 str_truncate(str, str_len(str)-1);
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1047 dsync_serializer_encode_add(encoder, key, str_c(str));
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1048 }
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1049 }
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1050
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1051 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1052 dsync_ibc_stream_send_mailbox_deletes(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1053 const struct dsync_mailbox_delete *deletes,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1054 unsigned int count, char hierarchy_sep)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1055 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1056 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1057 struct dsync_serializer_encoder *encoder;
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1058 string_t *str, *substr;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1059 char sep[2];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1060
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1061 str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1062 str_append_c(str, items[ITEM_MAILBOX_DELETE].chr);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1063
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1064 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_DELETE]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1065 sep[0] = hierarchy_sep; sep[1] = '\0';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1066 dsync_serializer_encode_add(encoder, "hierarchy_sep", sep);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1067
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1068 substr = t_str_new(128);
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1069 dsync_ibc_stream_encode_delete(substr, encoder, deletes, count,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1070 "mailboxes",
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1071 DSYNC_MAILBOX_DELETE_TYPE_MAILBOX);
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1072 dsync_ibc_stream_encode_delete(substr, encoder, deletes, count,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1073 "dirs",
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1074 DSYNC_MAILBOX_DELETE_TYPE_DIR);
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1075 dsync_ibc_stream_encode_delete(substr, encoder, deletes, count,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1076 "unsubscribes",
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1077 DSYNC_MAILBOX_DELETE_TYPE_UNSUBSCRIBE);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1078 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1079 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1080 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1081
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1082 ARRAY_DEFINE_TYPE(dsync_mailbox_delete, struct dsync_mailbox_delete);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1083 static int
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1084 decode_mailbox_deletes(ARRAY_TYPE(dsync_mailbox_delete) *deletes,
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1085 const char *value, enum dsync_mailbox_delete_type type)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1086 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1087 struct dsync_mailbox_delete *del;
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1088 const char *const *tmp;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1089 unsigned int i;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1090
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1091 tmp = t_strsplit(value, " ");
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1092 for (i = 0; tmp[i] != NULL; i += 2) {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1093 del = array_append_space(deletes);
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1094 del->type = type;
15035
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1095 if (guid_128_from_string(tmp[i], del->guid) < 0)
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1096 return -1;
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1097 if (tmp[i+1] == NULL ||
0af20585964d dsync: Rewritten syncing for mailbox renames.
Timo Sirainen <tss@iki.fi>
parents: 14691
diff changeset
1098 str_to_time(tmp[i+1], &del->timestamp) < 0)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1099 return -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1100 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1101 return 0;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1102 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1103
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1104 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1105 dsync_ibc_stream_recv_mailbox_deletes(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1106 const struct dsync_mailbox_delete **deletes_r,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1107 unsigned int *count_r, char *hierarchy_sep_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1108 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1109 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1110 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1111 ARRAY_TYPE(dsync_mailbox_delete) deletes;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1112 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1113 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1114
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1115 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAILBOX_DELETE, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1116 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1117 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1118
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1119 p_clear(ibc->ret_pool);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1120 p_array_init(&deletes, ibc->ret_pool, 16);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1121
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1122 value = dsync_deserializer_decode_get(decoder, "hierarchy_sep");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1123 if (strlen(value) != 1) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1124 dsync_ibc_input_error(ibc, decoder, "Invalid hierarchy_sep");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1125 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1126 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1127 *hierarchy_sep_r = value[0];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1128
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1129 if (dsync_deserializer_decode_try(decoder, "mailboxes", &value) &&
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1130 decode_mailbox_deletes(&deletes, value,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1131 DSYNC_MAILBOX_DELETE_TYPE_MAILBOX) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1132 dsync_ibc_input_error(ibc, decoder, "Invalid mailboxes");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1133 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1134 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1135 if (dsync_deserializer_decode_try(decoder, "dirs", &value) &&
16380
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1136 decode_mailbox_deletes(&deletes, value,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1137 DSYNC_MAILBOX_DELETE_TYPE_DIR) < 0) {
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1138 dsync_ibc_input_error(ibc, decoder, "Invalid dirs");
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1139 return DSYNC_IBC_RECV_RET_TRYAGAIN;
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1140 }
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1141 if (dsync_deserializer_decode_try(decoder, "unsubscribes", &value) &&
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1142 decode_mailbox_deletes(&deletes, value,
9878986a028d dsync: Fixed unsubscribing from an already deleted mailbox.
Timo Sirainen <tss@iki.fi>
parents: 16376
diff changeset
1143 DSYNC_MAILBOX_DELETE_TYPE_UNSUBSCRIBE) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1144 dsync_ibc_input_error(ibc, decoder, "Invalid dirs");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1145 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1146 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1147 *deletes_r = array_get(&deletes, count_r);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1148 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1149 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1150
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1151 static const char *
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1152 get_cache_fields(struct dsync_ibc_stream *ibc,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1153 const struct dsync_mailbox *dsync_box)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1154 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1155 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1156 string_t *str;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1157 const struct mailbox_cache_field *cache_fields;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1158 unsigned int i, count;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1159 char decision[3];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1160
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1161 cache_fields = array_get(&dsync_box->cache_fields, &count);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1162 if (count == 0)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1163 return "";
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1164
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1165 str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1166 for (i = 0; i < count; i++) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1167 const struct mailbox_cache_field *field = &cache_fields[i];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1168
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1169 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_CACHE_FIELD]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1170 dsync_serializer_encode_add(encoder, "name", field->name);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1171
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1172 memset(decision, 0, sizeof(decision));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1173 switch (field->decision & ~MAIL_CACHE_DECISION_FORCED) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1174 case MAIL_CACHE_DECISION_NO:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1175 decision[0] = 'n';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1176 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1177 case MAIL_CACHE_DECISION_TEMP:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1178 decision[0] = 't';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1179 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1180 case MAIL_CACHE_DECISION_YES:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181 decision[0] = 'y';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1182 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1183 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1184 i_assert(decision[0] != '\0');
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1185 if ((field->decision & MAIL_CACHE_DECISION_FORCED) != 0)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1186 decision[1] = 'F';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1187 dsync_serializer_encode_add(encoder, "decision", decision);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1188 if (field->last_used != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1189 dsync_serializer_encode_add(encoder, "last_used",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1190 dec2str(field->last_used));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1191 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1192 dsync_serializer_encode_finish(&encoder, str);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1193 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1194 if (i > 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1195 /* remove the trailing LF */
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1196 str_truncate(str, str_len(str)-1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1197 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1198 return str_c(str);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1199 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1200
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1201 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1202 dsync_ibc_stream_send_mailbox(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1203 const struct dsync_mailbox *dsync_box)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1204 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1205 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1206 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1207 string_t *str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1208 const char *value;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1209
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1210 str_append_c(str, items[ITEM_MAILBOX].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1211 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1212 dsync_serializer_encode_add(encoder, "mailbox_guid",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1213 guid_128_to_string(dsync_box->mailbox_guid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1214
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1215 if (dsync_box->mailbox_lost)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1216 dsync_serializer_encode_add(encoder, "mailbox_lost", "");
15750
5a1fc3723371 dsync: Automatically figure out which mailboxes can sync with message GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 15744
diff changeset
1217 if (dsync_box->have_guids)
5a1fc3723371 dsync: Automatically figure out which mailboxes can sync with message GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 15744
diff changeset
1218 dsync_serializer_encode_add(encoder, "have_guids", "");
16376
c6fee677172a dsync: Don't try to sync with GUIDs if we can't set them on the needed side.
Timo Sirainen <tss@iki.fi>
parents: 16222
diff changeset
1219 if (dsync_box->have_save_guids)
c6fee677172a dsync: Don't try to sync with GUIDs if we can't set them on the needed side.
Timo Sirainen <tss@iki.fi>
parents: 16222
diff changeset
1220 dsync_serializer_encode_add(encoder, "have_save_guids", "");
16977
8a7ecddca4ad dsync: Support syncing storages with 128bit GUIDs <-> string GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 16940
diff changeset
1221 if (dsync_box->have_only_guid128)
8a7ecddca4ad dsync: Support syncing storages with 128bit GUIDs <-> string GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 16940
diff changeset
1222 dsync_serializer_encode_add(encoder, "have_only_guid128", "");
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1223 dsync_serializer_encode_add(encoder, "uid_validity",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1224 dec2str(dsync_box->uid_validity));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225 dsync_serializer_encode_add(encoder, "uid_next",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1226 dec2str(dsync_box->uid_next));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1227 dsync_serializer_encode_add(encoder, "messages_count",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1228 dec2str(dsync_box->messages_count));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1229 dsync_serializer_encode_add(encoder, "first_recent_uid",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1230 dec2str(dsync_box->first_recent_uid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1231 dsync_serializer_encode_add(encoder, "highest_modseq",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1232 dec2str(dsync_box->highest_modseq));
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1233 dsync_serializer_encode_add(encoder, "highest_pvt_modseq",
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1234 dec2str(dsync_box->highest_pvt_modseq));
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1235
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1236 value = get_cache_fields(ibc, dsync_box);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1237 if (value != NULL)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1238 dsync_serializer_encode_add(encoder, "cache_fields", value);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1239
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1240 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1241 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1242 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1243
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1244 static int
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1245 parse_cache_field(struct dsync_ibc_stream *ibc, struct dsync_mailbox *box,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1246 const char *value)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1247 {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1248 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1249 struct mailbox_cache_field field;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1250 const char *error;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1251 int ret = 0;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1252
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1253 if (dsync_deserializer_decode_begin(ibc->deserializers[ITEM_MAILBOX_CACHE_FIELD],
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1254 value, &decoder, &error) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1255 dsync_ibc_input_error(ibc, NULL,
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1256 "cache_field: Invalid input: %s", error);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1257 return -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1258 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1259
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1260 memset(&field, 0, sizeof(field));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1261 value = dsync_deserializer_decode_get(decoder, "name");
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1262 field.name = p_strdup(ibc->ret_pool, value);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1263
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1264 value = dsync_deserializer_decode_get(decoder, "decision");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1265 switch (*value) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1266 case 'n':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1267 field.decision = MAIL_CACHE_DECISION_NO;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1268 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1269 case 't':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1270 field.decision = MAIL_CACHE_DECISION_TEMP;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1271 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1272 case 'y':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1273 field.decision = MAIL_CACHE_DECISION_YES;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1274 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1275 default:
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1276 dsync_ibc_input_error(ibc, decoder, "Invalid decision: %s",
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1277 value);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1278 ret = -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1279 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1280 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1281 if (value[1] == 'F')
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1282 field.decision |= MAIL_CACHE_DECISION_FORCED;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1283
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1284 if (dsync_deserializer_decode_try(decoder, "last_used", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1285 str_to_time(value, &field.last_used) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1286 dsync_ibc_input_error(ibc, decoder, "Invalid last_used");
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1287 ret = -1;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1288 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1289 array_append(&box->cache_fields, &field, 1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1290
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1291 dsync_deserializer_decode_finish(&decoder);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1292 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1293 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1294
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1295 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1296 dsync_ibc_stream_recv_mailbox(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1297 const struct dsync_mailbox **dsync_box_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1298 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1299 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1300 pool_t pool = ibc->ret_pool;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1301 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1302 struct dsync_mailbox *box;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1303 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1304 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1305
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1306 p_clear(pool);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1307 box = p_new(pool, struct dsync_mailbox, 1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1308
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1309 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAILBOX, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1310 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1311 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1312
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1313 value = dsync_deserializer_decode_get(decoder, "mailbox_guid");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1314 if (guid_128_from_string(value, box->mailbox_guid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1315 dsync_ibc_input_error(ibc, decoder, "Invalid mailbox_guid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1316 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1317 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1318
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1319 if (dsync_deserializer_decode_try(decoder, "mailbox_lost", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1320 box->mailbox_lost = TRUE;
15750
5a1fc3723371 dsync: Automatically figure out which mailboxes can sync with message GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 15744
diff changeset
1321 if (dsync_deserializer_decode_try(decoder, "have_guids", &value))
5a1fc3723371 dsync: Automatically figure out which mailboxes can sync with message GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 15744
diff changeset
1322 box->have_guids = TRUE;
16381
e0156c479a12 dsync: Previous have_save_guids change somewhat broke compatibility with earlier dsync versions.
Timo Sirainen <tss@iki.fi>
parents: 16380
diff changeset
1323 if (dsync_deserializer_decode_try(decoder, "have_save_guids", &value) ||
e0156c479a12 dsync: Previous have_save_guids change somewhat broke compatibility with earlier dsync versions.
Timo Sirainen <tss@iki.fi>
parents: 16380
diff changeset
1324 (box->have_guids && ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_SAVE_GUID))
16376
c6fee677172a dsync: Don't try to sync with GUIDs if we can't set them on the needed side.
Timo Sirainen <tss@iki.fi>
parents: 16222
diff changeset
1325 box->have_save_guids = TRUE;
16977
8a7ecddca4ad dsync: Support syncing storages with 128bit GUIDs <-> string GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 16940
diff changeset
1326 if (dsync_deserializer_decode_try(decoder, "have_only_guid128", &value))
8a7ecddca4ad dsync: Support syncing storages with 128bit GUIDs <-> string GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 16940
diff changeset
1327 box->have_only_guid128 = TRUE;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1328 value = dsync_deserializer_decode_get(decoder, "uid_validity");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1329 if (str_to_uint32(value, &box->uid_validity) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1330 dsync_ibc_input_error(ibc, decoder, "Invalid uid_validity");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1331 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1332 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1333 value = dsync_deserializer_decode_get(decoder, "uid_next");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1334 if (str_to_uint32(value, &box->uid_next) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1335 dsync_ibc_input_error(ibc, decoder, "Invalid uid_next");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1336 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1337 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1338 value = dsync_deserializer_decode_get(decoder, "messages_count");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1339 if (str_to_uint32(value, &box->messages_count) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1340 dsync_ibc_input_error(ibc, decoder, "Invalid messages_count");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1341 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1342 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1343 value = dsync_deserializer_decode_get(decoder, "first_recent_uid");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1344 if (str_to_uint32(value, &box->first_recent_uid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1345 dsync_ibc_input_error(ibc, decoder, "Invalid first_recent_uid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1346 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1347 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1348 value = dsync_deserializer_decode_get(decoder, "highest_modseq");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1349 if (str_to_uint64(value, &box->highest_modseq) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1350 dsync_ibc_input_error(ibc, decoder, "Invalid highest_modseq");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1351 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1352 }
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1353 value = dsync_deserializer_decode_get(decoder, "highest_pvt_modseq");
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1354 if (str_to_uint64(value, &box->highest_pvt_modseq) < 0) {
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1355 dsync_ibc_input_error(ibc, decoder, "Invalid highest_pvt_modseq");
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1356 return DSYNC_IBC_RECV_RET_TRYAGAIN;
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1357 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1358
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1359 p_array_init(&box->cache_fields, pool, 32);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1360 if (dsync_deserializer_decode_try(decoder, "cache_fields", &value)) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1361 const char *const *fields = t_strsplit(value, "\n");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1362 for (; *fields != NULL; fields++) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1363 if (parse_cache_field(ibc, box, *fields) < 0)
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1364 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1365 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1366 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1367
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1368 *dsync_box_r = box;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1369 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1370 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1371
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1372 static void
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1373 dsync_ibc_stream_send_mailbox_attribute(struct dsync_ibc *_ibc,
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1374 const struct dsync_mailbox_attribute *attr)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1375 {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1376 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1377 struct dsync_serializer_encoder *encoder;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1378 string_t *str = t_str_new(128);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1379 char type[2];
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1380
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1381 if (ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1382 return;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1383
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1384 str_append_c(str, items[ITEM_MAILBOX_ATTRIBUTE].chr);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1385 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_ATTRIBUTE]);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1386
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1387 type[0] = type[1] = '\0';
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1388 switch (attr->type) {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1389 case MAIL_ATTRIBUTE_TYPE_PRIVATE:
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1390 type[0] = 'p';
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1391 break;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1392 case MAIL_ATTRIBUTE_TYPE_SHARED:
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1393 type[0] = 's';
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1394 break;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1395 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1396 i_assert(type[0] != '\0');
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1397 dsync_serializer_encode_add(encoder, "type", type);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1398 dsync_serializer_encode_add(encoder, "key", attr->key);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1399 if (attr->value != NULL)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1400 dsync_serializer_encode_add(encoder, "value", attr->value);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1401 else if (attr->value_stream != NULL)
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1402 dsync_serializer_encode_add(encoder, "stream", "");
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1403
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1404 if (attr->deleted)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1405 dsync_serializer_encode_add(encoder, "deleted", "");
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1406 if (attr->last_change != 0) {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1407 dsync_serializer_encode_add(encoder, "last_change",
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1408 dec2str(attr->last_change));
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1409 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1410 if (attr->modseq != 0) {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1411 dsync_serializer_encode_add(encoder, "modseq",
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1412 dec2str(attr->modseq));
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1413 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1414
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1415 dsync_serializer_encode_finish(&encoder, str);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1416 dsync_ibc_stream_send_string(ibc, str);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1417
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1418 if (attr->value_stream != NULL) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1419 ibc->value_output_last = '\0';
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1420 ibc->value_output = attr->value_stream;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1421 i_stream_ref(ibc->value_output);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1422 (void)dsync_ibc_stream_send_value_stream(ibc);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1423 }
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1424 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1425
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1426 static enum dsync_ibc_recv_ret
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1427 dsync_ibc_stream_recv_mailbox_attribute(struct dsync_ibc *_ibc,
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1428 const struct dsync_mailbox_attribute **attr_r)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1429 {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1430 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1431 pool_t pool = ibc->ret_pool;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1432 struct dsync_deserializer_decoder *decoder;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1433 struct dsync_mailbox_attribute *attr;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1434 const char *value;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1435 enum dsync_ibc_recv_ret ret;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1436
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1437 if (ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1438 return DSYNC_IBC_RECV_RET_FINISHED;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1439
16109
acb88f199704 dsync: Fixed syncing attribute streams.
Timo Sirainen <tss@iki.fi>
parents: 16052
diff changeset
1440 if (ibc->value_input != NULL) {
acb88f199704 dsync: Fixed syncing attribute streams.
Timo Sirainen <tss@iki.fi>
parents: 16052
diff changeset
1441 /* wait until the mail's stream has been read */
acb88f199704 dsync: Fixed syncing attribute streams.
Timo Sirainen <tss@iki.fi>
parents: 16052
diff changeset
1442 return DSYNC_IBC_RECV_RET_TRYAGAIN;
acb88f199704 dsync: Fixed syncing attribute streams.
Timo Sirainen <tss@iki.fi>
parents: 16052
diff changeset
1443 }
acb88f199704 dsync: Fixed syncing attribute streams.
Timo Sirainen <tss@iki.fi>
parents: 16052
diff changeset
1444
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1445 if (ibc->cur_attr != NULL) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1446 /* finished reading the stream, return the mail now */
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1447 *attr_r = ibc->cur_attr;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1448 ibc->cur_attr = NULL;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1449 return DSYNC_IBC_RECV_RET_OK;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1450 }
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1451
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1452 p_clear(pool);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1453 attr = p_new(pool, struct dsync_mailbox_attribute, 1);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1454
16051
46b223892373 dsync: Fixed sending mailbox attributes with stream ibc.
Timo Sirainen <tss@iki.fi>
parents: 16025
diff changeset
1455 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAILBOX_ATTRIBUTE, &decoder);
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1456 if (ret != DSYNC_IBC_RECV_RET_OK)
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1457 return ret;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1458
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1459 value = dsync_deserializer_decode_get(decoder, "type");
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1460 switch (*value) {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1461 case 'p':
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1462 attr->type = MAIL_ATTRIBUTE_TYPE_PRIVATE;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1463 break;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1464 case 's':
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1465 attr->type = MAIL_ATTRIBUTE_TYPE_SHARED;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1466 break;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1467 default:
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1468 dsync_ibc_input_error(ibc, decoder, "Invalid type: %s", value);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1469 return DSYNC_IBC_RECV_RET_TRYAGAIN;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1470 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1471
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1472 value = dsync_deserializer_decode_get(decoder, "key");
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1473 attr->key = p_strdup(pool, value);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1474
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1475 if (dsync_deserializer_decode_try(decoder, "stream", &value)) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1476 attr->value_stream = dsync_ibc_stream_input_stream(ibc);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1477 if (dsync_ibc_stream_read_mail_stream(ibc) <= 0) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1478 ibc->cur_attr = attr;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1479 return DSYNC_IBC_RECV_RET_TRYAGAIN;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1480 }
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1481 /* already finished reading the stream */
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1482 i_assert(ibc->value_input == NULL);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1483 } else if (dsync_deserializer_decode_try(decoder, "value", &value))
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1484 attr->value = p_strdup(pool, value);
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1485 if (dsync_deserializer_decode_try(decoder, "deleted", &value))
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1486 attr->deleted = TRUE;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1487 if (dsync_deserializer_decode_try(decoder, "last_change", &value) &&
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1488 str_to_time(value, &attr->last_change) < 0) {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1489 dsync_ibc_input_error(ibc, decoder, "Invalid last_change");
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1490 return DSYNC_IBC_RECV_RET_TRYAGAIN;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1491 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1492 if (dsync_deserializer_decode_try(decoder, "modseq", &value) &&
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1493 str_to_uint64(value, &attr->modseq) < 0) {
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1494 dsync_ibc_input_error(ibc, decoder, "Invalid modseq");
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1495 return DSYNC_IBC_RECV_RET_TRYAGAIN;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1496 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1497
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1498 *attr_r = attr;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1499 return DSYNC_IBC_RECV_RET_OK;
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1500 }
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1501
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1502 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1503 dsync_ibc_stream_send_change(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1504 const struct dsync_mail_change *change)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1505 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1506 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1507 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1508 string_t *str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1509 char type[2];
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1510
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1511 str_append_c(str, items[ITEM_MAIL_CHANGE].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1512 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAIL_CHANGE]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1513
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1514 type[0] = type[1] = '\0';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1515 switch (change->type) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1516 case DSYNC_MAIL_CHANGE_TYPE_SAVE:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1517 type[0] = 's';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1518 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1519 case DSYNC_MAIL_CHANGE_TYPE_EXPUNGE:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1520 type[0] = 'e';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1521 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1522 case DSYNC_MAIL_CHANGE_TYPE_FLAG_CHANGE:
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1523 type[0] = 'f';
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1524 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1525 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1526 i_assert(type[0] != '\0');
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1527 dsync_serializer_encode_add(encoder, "type", type);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1528 dsync_serializer_encode_add(encoder, "uid", dec2str(change->uid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1529 if (change->guid != NULL)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1530 dsync_serializer_encode_add(encoder, "guid", change->guid);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1531 if (change->hdr_hash != NULL) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1532 dsync_serializer_encode_add(encoder, "hdr_hash",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1533 change->hdr_hash);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1534 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1535 if (change->modseq != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1536 dsync_serializer_encode_add(encoder, "modseq",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1537 dec2str(change->modseq));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1538 }
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1539 if (change->pvt_modseq != 0) {
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1540 dsync_serializer_encode_add(encoder, "pvt_modseq",
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1541 dec2str(change->pvt_modseq));
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1542 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1543 if (change->add_flags != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1544 dsync_serializer_encode_add(encoder, "add_flags",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1545 t_strdup_printf("%x", change->add_flags));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1546 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1547 if (change->remove_flags != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1548 dsync_serializer_encode_add(encoder, "remove_flags",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1549 t_strdup_printf("%x", change->remove_flags));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1550 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1551 if (change->final_flags != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1552 dsync_serializer_encode_add(encoder, "final_flags",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1553 t_strdup_printf("%x", change->final_flags));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1554 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1555 if (change->keywords_reset)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1556 dsync_serializer_encode_add(encoder, "keywords_reset", "");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1557
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1558 if (array_is_created(&change->keyword_changes) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1559 array_count(&change->keyword_changes) > 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1560 string_t *kw_str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1561 const char *const *changes;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1562 unsigned int i, count;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1563
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1564 changes = array_get(&change->keyword_changes, &count);
15068
002e0a120c2a Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents: 15037
diff changeset
1565 str_append_tabescaped(kw_str, changes[0]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1566 for (i = 1; i < count; i++) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1567 str_append_c(kw_str, '\t');
15068
002e0a120c2a Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents: 15037
diff changeset
1568 str_append_tabescaped(kw_str, changes[i]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1569 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1570 dsync_serializer_encode_add(encoder, "keyword_changes",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1571 str_c(kw_str));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1572 }
18177
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1573 if (change->received_timestamp > 0) {
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1574 dsync_serializer_encode_add(encoder, "received_timestamp",
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1575 t_strdup_printf("%lx", (unsigned long)change->received_timestamp));
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1576 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1577
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1578 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1579 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1580 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1581
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1582 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1583 dsync_ibc_stream_recv_change(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1584 const struct dsync_mail_change **change_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1585 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1586 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1587 pool_t pool = ibc->ret_pool;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1588 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1589 struct dsync_mail_change *change;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1590 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1591 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1592
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1593 p_clear(pool);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1594 change = p_new(pool, struct dsync_mail_change, 1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1595
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1596 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAIL_CHANGE, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1597 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1598 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1599
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1600 value = dsync_deserializer_decode_get(decoder, "type");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1601 switch (*value) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1602 case 's':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1603 change->type = DSYNC_MAIL_CHANGE_TYPE_SAVE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1604 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1605 case 'e':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1606 change->type = DSYNC_MAIL_CHANGE_TYPE_EXPUNGE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1607 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1608 case 'f':
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1609 change->type = DSYNC_MAIL_CHANGE_TYPE_FLAG_CHANGE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1610 break;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1611 default:
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1612 dsync_ibc_input_error(ibc, decoder, "Invalid type: %s", value);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1613 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1614 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1615
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1616 value = dsync_deserializer_decode_get(decoder, "uid");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1617 if (str_to_uint32(value, &change->uid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1618 dsync_ibc_input_error(ibc, decoder, "Invalid uid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1619 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1620 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1621
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1622 if (dsync_deserializer_decode_try(decoder, "guid", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1623 change->guid = p_strdup(pool, value);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1624 if (dsync_deserializer_decode_try(decoder, "hdr_hash", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1625 change->hdr_hash = p_strdup(pool, value);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1626 if (dsync_deserializer_decode_try(decoder, "modseq", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1627 str_to_uint64(value, &change->modseq) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1628 dsync_ibc_input_error(ibc, decoder, "Invalid modseq");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1629 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1630 }
15496
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1631 if (dsync_deserializer_decode_try(decoder, "pvt_modseq", &value) &&
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1632 str_to_uint64(value, &change->pvt_modseq) < 0) {
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1633 dsync_ibc_input_error(ibc, decoder, "Invalid pvt_modseq");
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1634 return DSYNC_IBC_RECV_RET_TRYAGAIN;
5d90e2aa1ba8 dsync: Use private modseqs to support syncing private flags in shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 15494
diff changeset
1635 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1636
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1637 if (dsync_deserializer_decode_try(decoder, "add_flags", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1638 change->add_flags = strtoul(value, NULL, 16);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1639 if (dsync_deserializer_decode_try(decoder, "remove_flags", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1640 change->remove_flags = strtoul(value, NULL, 16);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1641 if (dsync_deserializer_decode_try(decoder, "final_flags", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1642 change->final_flags = strtoul(value, NULL, 16);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1643 if (dsync_deserializer_decode_try(decoder, "keywords_reset", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1644 change->keywords_reset = TRUE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1645
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1646 if (dsync_deserializer_decode_try(decoder, "keyword_changes", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1647 *value != '\0') {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1648 const char *const *changes = t_strsplit_tab(value);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1649 unsigned int i, count = str_array_length(changes);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1650
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1651 p_array_init(&change->keyword_changes, pool, count);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1652 for (i = 0; i < count; i++) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1653 value = p_strdup(pool, changes[i]);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1654 array_append(&change->keyword_changes, &value, 1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1655 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1656 }
18177
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1657 if (dsync_deserializer_decode_try(decoder, "received_timestamp", &value) &&
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1658 str_to_time(value, &change->received_timestamp) < 0) {
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1659 dsync_ibc_input_error(ibc, decoder, "Invalid received_timestamp");
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1660 return DSYNC_IBC_RECV_RET_TRYAGAIN;
f393f63764e0 dsync: Added -t <timestamp> parameter to save only mails newer than <timestamp>
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
1661 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1662
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1663 *change_r = change;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1664 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1665 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1666
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1667 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1668 dsync_ibc_stream_send_mail_request(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1669 const struct dsync_mail_request *request)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1670 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1671 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1672 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1673 string_t *str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1674
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1675 str_append_c(str, items[ITEM_MAIL_REQUEST].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1676 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAIL_REQUEST]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1677 if (request->guid != NULL)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1678 dsync_serializer_encode_add(encoder, "guid", request->guid);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1679 if (request->uid != 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1680 dsync_serializer_encode_add(encoder, "uid",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1681 dec2str(request->uid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1682 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1683 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1684 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1685 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1686
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1687 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1688 dsync_ibc_stream_recv_mail_request(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1689 const struct dsync_mail_request **request_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1690 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1691 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1692 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1693 struct dsync_mail_request *request;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1694 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1695 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1696
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1697 p_clear(ibc->ret_pool);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1698 request = p_new(ibc->ret_pool, struct dsync_mail_request, 1);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1699
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1700 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAIL_REQUEST, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1701 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1702 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1703
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1704 if (dsync_deserializer_decode_try(decoder, "guid", &value))
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1705 request->guid = p_strdup(ibc->ret_pool, value);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1706 if (dsync_deserializer_decode_try(decoder, "uid", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1707 str_to_uint32(value, &request->uid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1708 dsync_ibc_input_error(ibc, decoder, "Invalid uid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1709 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1710 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1711
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1712 *request_r = request;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1713 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1714 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1715
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1716 static void
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1717 dsync_ibc_stream_send_mail(struct dsync_ibc *_ibc,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1718 const struct dsync_mail *mail)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1719 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1720 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1721 struct dsync_serializer_encoder *encoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1722 string_t *str = t_str_new(128);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1723
17845
d2e1b3f6d13b dsync: Added DSYNC_BRAIN_FLAG_NO_MAIL_PREFETCH to avoid opening mails unnecessarily.
Timo Sirainen <tss@iki.fi>
parents: 17777
diff changeset
1724 i_assert(!mail->minimal_fields);
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1725 i_assert(ibc->value_output == NULL);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1726
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1727 str_append_c(str, items[ITEM_MAIL].chr);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1728 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAIL]);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1729 if (mail->guid != NULL)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1730 dsync_serializer_encode_add(encoder, "guid", mail->guid);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1731 if (mail->uid != 0)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1732 dsync_serializer_encode_add(encoder, "uid", dec2str(mail->uid));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1733 if (mail->pop3_uidl != NULL) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1734 dsync_serializer_encode_add(encoder, "pop3_uidl",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1735 mail->pop3_uidl);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1736 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1737 if (mail->pop3_order > 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1738 dsync_serializer_encode_add(encoder, "pop3_order",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1739 dec2str(mail->pop3_order));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1740 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1741 if (mail->received_date > 0) {
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1742 dsync_serializer_encode_add(encoder, "received_date",
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1743 dec2str(mail->received_date));
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1744 }
17296
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1745 if (mail->saved_date != 0) {
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1746 dsync_serializer_encode_add(encoder, "saved_date",
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1747 dec2str(mail->saved_date));
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1748 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1749 if (mail->input != NULL)
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1750 dsync_serializer_encode_add(encoder, "stream", "");
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1751
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1752 dsync_serializer_encode_finish(&encoder, str);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1753 dsync_ibc_stream_send_string(ibc, str);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1754
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1755 if (mail->input != NULL) {
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1756 ibc->value_output_last = '\0';
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1757 ibc->value_output = mail->input;
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1758 i_stream_ref(ibc->value_output);
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1759 (void)dsync_ibc_stream_send_value_stream(ibc);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1760 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1761 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1762
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1763 static enum dsync_ibc_recv_ret
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1764 dsync_ibc_stream_recv_mail(struct dsync_ibc *_ibc, struct dsync_mail **mail_r)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1765 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1766 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1767 pool_t pool = ibc->ret_pool;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1768 struct dsync_deserializer_decoder *decoder;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1769 struct dsync_mail *mail;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1770 const char *value;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1771 enum dsync_ibc_recv_ret ret;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1772
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1773 if (ibc->value_input != NULL) {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1774 /* wait until the mail's stream has been read */
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1775 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1776 }
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1777 if (ibc->cur_mail != NULL) {
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1778 /* finished reading the stream, return the mail now */
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1779 *mail_r = ibc->cur_mail;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1780 ibc->cur_mail = NULL;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1781 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1782 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1783
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1784 p_clear(pool);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1785 mail = p_new(pool, struct dsync_mail, 1);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1786
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1787 ret = dsync_ibc_stream_input_next(ibc, ITEM_MAIL, &decoder);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1788 if (ret != DSYNC_IBC_RECV_RET_OK)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1789 return ret;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1790
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1791 if (dsync_deserializer_decode_try(decoder, "guid", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1792 mail->guid = p_strdup(pool, value);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1793 if (dsync_deserializer_decode_try(decoder, "uid", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1794 str_to_uint32(value, &mail->uid) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1795 dsync_ibc_input_error(ibc, decoder, "Invalid uid");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1796 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1797 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1798 if (dsync_deserializer_decode_try(decoder, "pop3_uidl", &value))
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1799 mail->pop3_uidl = p_strdup(pool, value);
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1800 if (dsync_deserializer_decode_try(decoder, "pop3_order", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1801 str_to_uint(value, &mail->pop3_order) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1802 dsync_ibc_input_error(ibc, decoder, "Invalid pop3_order");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1803 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1804 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1805 if (dsync_deserializer_decode_try(decoder, "received_date", &value) &&
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1806 str_to_time(value, &mail->received_date) < 0) {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1807 dsync_ibc_input_error(ibc, decoder, "Invalid received_date");
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1808 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1809 }
17296
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1810 if (dsync_deserializer_decode_try(decoder, "saved_date", &value) &&
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1811 str_to_time(value, &mail->saved_date) < 0) {
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1812 dsync_ibc_input_error(ibc, decoder, "Invalid saved_date");
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1813 return DSYNC_IBC_RECV_RET_TRYAGAIN;
99a4788770cb dsync: saved-date doesn't need to be looked up until mail body is being read.
Timo Sirainen <tss@iki.fi>
parents: 17286
diff changeset
1814 }
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1815 if (dsync_deserializer_decode_try(decoder, "stream", &value)) {
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1816 mail->input = dsync_ibc_stream_input_stream(ibc);
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1817 if (dsync_ibc_stream_read_mail_stream(ibc) <= 0) {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1818 ibc->cur_mail = mail;
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1819 return DSYNC_IBC_RECV_RET_TRYAGAIN;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1820 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1821 /* already finished reading the stream */
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1822 i_assert(ibc->value_input == NULL);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1823 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1824
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1825 *mail_r = mail;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1826 return DSYNC_IBC_RECV_RET_OK;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1827 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1828
18351
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1829 static void
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1830 dsync_ibc_stream_send_finish(struct dsync_ibc *_ibc, const char *error)
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1831 {
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1832 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1833 struct dsync_serializer_encoder *encoder;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1834 string_t *str = t_str_new(128);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1835
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1836 str_append_c(str, items[ITEM_FINISH].chr);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1837 encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_FINISH]);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1838 if (error != NULL)
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1839 dsync_serializer_encode_add(encoder, "error", error);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1840 dsync_serializer_encode_finish(&encoder, str);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1841 dsync_ibc_stream_send_string(ibc, str);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1842 }
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1843
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1844 static enum dsync_ibc_recv_ret
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1845 dsync_ibc_stream_recv_finish(struct dsync_ibc *_ibc, const char **error_r)
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1846 {
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1847 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1848 struct dsync_deserializer_decoder *decoder;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1849 const char *value;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1850 enum dsync_ibc_recv_ret ret;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1851
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1852 *error_r = NULL;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1853 p_clear(ibc->ret_pool);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1854
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1855 if (ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_FINISH)
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1856 return DSYNC_IBC_RECV_RET_OK;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1857
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1858 ret = dsync_ibc_stream_input_next(ibc, ITEM_FINISH, &decoder);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1859 if (ret != DSYNC_IBC_RECV_RET_OK)
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1860 return ret;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1861
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1862 if (dsync_deserializer_decode_try(decoder, "error", &value))
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1863 *error_r = p_strdup(ibc->ret_pool, value);
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1864 return DSYNC_IBC_RECV_RET_OK;
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1865 }
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1866
15632
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1867 static void dsync_ibc_stream_close_mail_streams(struct dsync_ibc *_ibc)
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1868 {
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1869 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1870
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1871 if (ibc->value_output != NULL) {
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1872 i_stream_unref(&ibc->value_output);
15632
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1873 dsync_ibc_stream_stop(ibc);
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1874 }
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1875 }
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1876
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1877 static bool dsync_ibc_stream_is_send_queue_full(struct dsync_ibc *_ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1878 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1879 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1880 size_t bytes;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1881
16052
0e5a359b7b7f lib-storage: Mailbox attributes can now be accessed via istreams.
Timo Sirainen <tss@iki.fi>
parents: 16051
diff changeset
1882 if (ibc->value_output != NULL)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1883 return TRUE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1884
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1885 bytes = o_stream_get_buffer_used_size(ibc->output);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1886 if (bytes < DSYNC_IBC_STREAM_OUTBUF_THROTTLE_SIZE)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1887 return FALSE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1888
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1889 o_stream_set_flush_pending(ibc->output, TRUE);
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1890 return TRUE;
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1891 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1892
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1893 static bool dsync_ibc_stream_has_pending_data(struct dsync_ibc *_ibc)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1894 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1895 struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1896
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1897 return ibc->has_pending_data;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1898 }
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1899
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1900 static const struct dsync_ibc_vfuncs dsync_ibc_stream_vfuncs = {
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1901 dsync_ibc_stream_deinit,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1902 dsync_ibc_stream_send_handshake,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1903 dsync_ibc_stream_recv_handshake,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1904 dsync_ibc_stream_send_end_of_list,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1905 dsync_ibc_stream_send_mailbox_state,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1906 dsync_ibc_stream_recv_mailbox_state,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1907 dsync_ibc_stream_send_mailbox_tree_node,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1908 dsync_ibc_stream_recv_mailbox_tree_node,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1909 dsync_ibc_stream_send_mailbox_deletes,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1910 dsync_ibc_stream_recv_mailbox_deletes,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1911 dsync_ibc_stream_send_mailbox,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1912 dsync_ibc_stream_recv_mailbox,
16025
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1913 dsync_ibc_stream_send_mailbox_attribute,
c6082de4bf5b dsync: Added support for syncing mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents: 15986
diff changeset
1914 dsync_ibc_stream_recv_mailbox_attribute,
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1915 dsync_ibc_stream_send_change,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1916 dsync_ibc_stream_recv_change,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1917 dsync_ibc_stream_send_mail_request,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1918 dsync_ibc_stream_recv_mail_request,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1919 dsync_ibc_stream_send_mail,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1920 dsync_ibc_stream_recv_mail,
18351
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1921 dsync_ibc_stream_send_finish,
b4dbe64c0032 dsync: Added an extra "finish" state to allow slave-dsync to report error to master-dsync.
Timo Sirainen <tss@iki.fi>
parents: 18181
diff changeset
1922 dsync_ibc_stream_recv_finish,
15632
40dd9a080b6e dsync: Close mail streams earlier on failures to avoid assert-crashing
Timo Sirainen <tss@iki.fi>
parents: 15594
diff changeset
1923 dsync_ibc_stream_close_mail_streams,
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1924 dsync_ibc_stream_is_send_queue_full,
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1925 dsync_ibc_stream_has_pending_data
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1926 };
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1927
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1928 struct dsync_ibc *
15464
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
1929 dsync_ibc_init_stream(struct istream *input, struct ostream *output,
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
1930 const char *name, const char *temp_path_prefix)
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1931 {
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1932 struct dsync_ibc_stream *ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1933
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1934 ibc = i_new(struct dsync_ibc_stream, 1);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1935 ibc->ibc.v = dsync_ibc_stream_vfuncs;
15464
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
1936 ibc->input = input;
af3b86a16ac3 dsync: Added debugging and rawlogging support.
Timo Sirainen <tss@iki.fi>
parents: 15463
diff changeset
1937 ibc->output = output;
15037
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1938 ibc->name = i_strdup(name);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1939 ibc->temp_path_prefix = i_strdup(temp_path_prefix);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1940 ibc->ret_pool = pool_alloconly_create("ibc stream data", 2048);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1941 dsync_ibc_stream_init(ibc);
920756cd29b8 dsync: Renamed "slave" to "ibc" (= inter-brain communicator)
Timo Sirainen <tss@iki.fi>
parents: 15036
diff changeset
1942 return &ibc->ibc;
14584
b2076acc3715 Initial version of dsync rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1943 }