"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "src/doveadm/dsync/dsync-brain-mailbox-tree.c" between
dovecot-2.3.16.tar.gz and dovecot-2.3.17.tar.gz

About: Dovecot is an IMAP and POP3 server, written with security primarily in mind.

dsync-brain-mailbox-tree.c  (dovecot-2.3.16):dsync-brain-mailbox-tree.c  (dovecot-2.3.17)
skipping to change at line 320 skipping to change at line 320
static void dsync_brain_mailbox_trees_sync(struct dsync_brain *brain) static void dsync_brain_mailbox_trees_sync(struct dsync_brain *brain)
{ {
struct dsync_mailbox_tree_sync_ctx *ctx; struct dsync_mailbox_tree_sync_ctx *ctx;
const struct dsync_mailbox_tree_sync_change *change; const struct dsync_mailbox_tree_sync_change *change;
enum dsync_mailbox_trees_sync_type sync_type; enum dsync_mailbox_trees_sync_type sync_type;
enum dsync_mailbox_trees_sync_flags sync_flags = enum dsync_mailbox_trees_sync_flags sync_flags =
(brain->debug ? DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG : 0) | (brain->debug ? DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG : 0) |
(brain->master_brain ? DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN : 0) | (brain->master_brain ? DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN : 0) |
(brain->no_mailbox_renames ? DSYNC_MAILBOX_TREES_SYNC_FLAG_NO_REN AMES : 0); (brain->no_mailbox_renames ? DSYNC_MAILBOX_TREES_SYNC_FLAG_NO_REN AMES : 0);
int ret;
if (brain->no_backup_overwrite) if (brain->no_backup_overwrite)
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY; sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY;
else if (brain->backup_send) else if (brain->backup_send)
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL; sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL;
else if (brain->backup_recv) else if (brain->backup_recv)
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE; sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE;
else else
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY; sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY;
ctx = dsync_mailbox_trees_sync_init(brain->local_mailbox_tree, ctx = dsync_mailbox_trees_sync_init(brain->local_mailbox_tree,
brain->remote_mailbox_tree, brain->remote_mailbox_tree,
sync_type, sync_flags); sync_type, sync_flags);
while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) { while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
if (dsync_brain_mailbox_tree_sync_change(brain, change, T_BEGIN {
&brain->mail_error) < 0) ret = dsync_brain_mailbox_tree_sync_change(
{ brain, change, &brain->mail_error);
} T_END;
if (ret < 0) {
brain->failed = TRUE; brain->failed = TRUE;
break; break;
} }
} }
if (dsync_mailbox_trees_sync_deinit(&ctx) < 0) if (dsync_mailbox_trees_sync_deinit(&ctx) < 0)
brain->failed = TRUE; brain->failed = TRUE;
} }
static int
dsync_brain_recv_mailbox_tree_add(struct dsync_brain *brain,
const char *const *parts,
const struct dsync_mailbox_node *remote_node,
const char *sep)
{
struct dsync_mailbox_node *node;
struct mail_namespace *ns;
const char *name;
if (dsync_get_mailbox_name(brain, parts, &name, &ns) < 0)
return -1;
if (brain->debug) {
i_debug("brain %c: Remote mailbox tree: %s %s",
brain->master_brain ? 'M' : 'S',
t_strarray_join(parts, sep),
dsync_mailbox_node_to_string(remote_node));
}
node = dsync_mailbox_tree_get(brain->remote_mailbox_tree, name);
node->ns = ns;
dsync_mailbox_node_copy_data(node, remote_node);
return 0;
}
bool dsync_brain_recv_mailbox_tree(struct dsync_brain *brain) bool dsync_brain_recv_mailbox_tree(struct dsync_brain *brain)
{ {
const struct dsync_mailbox_node *remote_node; const struct dsync_mailbox_node *remote_node;
struct dsync_mailbox_node *node, *dup_node1, *dup_node2; struct dsync_mailbox_node *dup_node1, *dup_node2;
const char *const *parts, *name; const char *const *parts;
struct mail_namespace *ns;
enum dsync_ibc_recv_ret ret; enum dsync_ibc_recv_ret ret;
int ret2;
char sep[2]; char sep[2];
bool changed = FALSE; bool changed = FALSE;
sep[0] = brain->hierarchy_sep; sep[1] = '\0'; sep[0] = brain->hierarchy_sep; sep[1] = '\0';
while ((ret = dsync_ibc_recv_mailbox_tree_node(brain->ibc, &parts, while ((ret = dsync_ibc_recv_mailbox_tree_node(brain->ibc, &parts,
&remote_node)) > 0) { &remote_node)) > 0) {
if (dsync_get_mailbox_name(brain, parts, &name, &ns) < 0) { T_BEGIN {
ret2 = dsync_brain_recv_mailbox_tree_add(
brain, parts, remote_node, sep);
} T_END;
if (ret2 < 0) {
i_error("Couldn't find namespace for mailbox %s", i_error("Couldn't find namespace for mailbox %s",
t_strarray_join(parts, sep)); t_strarray_join(parts, sep));
brain->failed = TRUE; brain->failed = TRUE;
return TRUE; return TRUE;
} }
if (brain->debug) {
i_debug("brain %c: Remote mailbox tree: %s %s",
brain->master_brain ? 'M' : 'S',
t_strarray_join(parts, sep),
dsync_mailbox_node_to_string(remote_node));
}
node = dsync_mailbox_tree_get(brain->remote_mailbox_tree, name);
node->ns = ns;
dsync_mailbox_node_copy_data(node, remote_node);
} }
if (ret != DSYNC_IBC_RECV_RET_FINISHED) if (ret != DSYNC_IBC_RECV_RET_FINISHED)
return changed; return changed;
if (dsync_mailbox_tree_build_guid_hash(brain->remote_mailbox_tree, if (dsync_mailbox_tree_build_guid_hash(brain->remote_mailbox_tree,
&dup_node1, &dup_node2) < 0) { &dup_node1, &dup_node2) < 0) {
i_error("Remote sent duplicate mailbox GUID %s for mailboxes %s a nd %s", i_error("Remote sent duplicate mailbox GUID %s for mailboxes %s a nd %s",
guid_128_to_string(dup_node1->mailbox_guid), guid_128_to_string(dup_node1->mailbox_guid),
dsync_mailbox_node_get_full_name(brain->remote_mailbox_tr ee, dsync_mailbox_node_get_full_name(brain->remote_mailbox_tr ee,
dup_node1), dup_node1),
 End of changes. 7 change blocks. 
16 lines changed or deleted 38 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)