dsync-proxy.c revision 16aef418492cb8d18c5196fd573a487177a9cab2
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen const char *const *fields;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen unsigned int i, count;
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen for (i = 0; i < count; i++) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ((msg->flags & DSYNC_MAIL_FLAG_EXPUNGED) != 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen imap_write_flags(str, msg->flags & MAIL_FLAGS_MASK, msg->keywords);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen str_printfa(str, "\t%ld", (long)msg->save_date);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenint dsync_proxy_msg_parse_flags(pool_t pool, const char *str,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen for (args = t_strsplit_spaces(str, " "); *args != NULL; args++) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen } else if (strcasecmp(*args, "\\dsync-expunged") == 0) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenint dsync_proxy_msg_import_unescaped(pool_t pool, const char *const *args,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **error_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* guid uid modseq flags save_date */
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen if (dsync_proxy_msg_parse_flags(pool, args[3], msg_r) < 0) {
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen msg_r->save_date = strtoul(args[4], NULL, 10);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainenint dsync_proxy_msg_import(pool_t pool, const char *str,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen struct dsync_message *msg_r, const char **error_r)
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen unsigned int i;
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen args = p_strsplit(pool_datastack_create(), str, "\t");
4b41116563110d00330896a568eff1078c382827Timo Sirainen (const char *const *)args,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid dsync_proxy_msg_static_export(string_t *str,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen str_printfa(str, "%ld\t", (long)msg->received_date);
4d2211dac61c615c5bdfd501ea54d46c89d41b0fTimo Sirainenint dsync_proxy_msg_static_import_unescaped(pool_t pool,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *const *args,
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen const char **error_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* received_date pop3_uidl */
e3796bfd2bc0fd5ba664893d346df9334a5b3af0Timo Sirainen msg_r->received_date = strtoul(args[0], NULL, 10);
408e5be344c9131fdebe771718a5bf49f88cc51cTimo Sirainenint dsync_proxy_msg_static_import(pool_t pool, const char *str,
923eb3dde28e4d8841c14fd6b4a69635b7070c3eTimo Sirainen const char **error_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen args = p_strsplit(pool_datastack_create(), str, "\t");
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen ret = dsync_proxy_msg_static_import_unescaped(pool,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen (const char *const *)args,
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen str_printfa(str, "\t%lu\t%u", (unsigned long)box->last_change,
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen dsync_proxy_mailbox_guid_export(str, &box->mailbox_guid);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen dsync_proxy_strings_export(str, &box->cache_fields);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenint dsync_proxy_mailbox_import_unescaped(pool_t pool, const char *const *args,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen const char **error_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen unsigned int i = 0, count;
f23ede27743c1aa03eacbfc634d6a10de9110c91Timo Sirainen /* name dir_guid mailbox_guid uid_validity uid_next highest_modseq */
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen dsync_str_sha_to_guid(box_r->name, &box_r->name_sha1);
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen *error_r = "Invalid mailbox name hierarchy separator";
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen box_r->last_change = strtoul(args[i++], &p, 10);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen if (*p != '\0') {
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen if (*p != '\0' ||
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen (dsync_mailbox_is_noselect(box_r) != (args[i] == NULL))) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* \noselect mailbox */
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen if (dsync_proxy_mailbox_guid_import(args[i++],
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen box_r->uid_validity = strtoul(args[i++], &p, 10);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen box_r->highest_modseq = strtoull(args[i++], &p, 10);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (*p != '\0') {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen p_array_init(&box_r->cache_fields, pool, count + 1);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen for (i = 0; i < count; i++) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *field_name = p_strdup(pool, args[i]);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen array_append(&box_r->cache_fields, &field_name, 1);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenint dsync_proxy_mailbox_import(pool_t pool, const char *str,
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen const char **error_r)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen args = p_strsplit(pool_datastack_create(), str, "\t");
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ret = dsync_proxy_mailbox_import_unescaped(pool,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen (const char *const *)args,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenvoid dsync_proxy_mailbox_guid_export(string_t *str,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint dsync_proxy_mailbox_guid_import(const char *str, mailbox_guid_t *guid_r)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen buf = buffer_create_dynamic(pool_datastack_create(),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (hex_to_binary(str, buf) < 0 || buf->used != sizeof(guid_r->guid))
194603b35061fea1ee8d171a7104b6985c610966Timo Sirainen memcpy(guid_r->guid, buf->data, sizeof(guid_r->guid));
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenvoid dsync_proxy_send_dot_output(struct ostream *output, bool *last_lf,
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen o_stream_send(output, data + start, i - start);