From: Timo Sirainen Date: Tue, 9 Feb 2010 17:50:17 +0000 (+0200) Subject: lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail. X-Git-Tag: 2.0.beta3~113 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fbd918f47f591f8084fd52b207ef29515ddd11b9;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail. --HG-- branch : HEAD --- diff --git a/src/dsync/dsync-worker-local.c b/src/dsync/dsync-worker-local.c index 5e2aca01db..97f3327811 100644 --- a/src/dsync/dsync-worker-local.c +++ b/src/dsync/dsync-worker-local.c @@ -471,6 +471,7 @@ local_worker_mailbox_iter_next(struct dsync_worker_mailbox_iter *_iter, const char *storage_name; struct mailbox *box; struct mailbox_status status; + uint8_t mailbox_guid[MAIL_GUID_128_SIZE]; struct local_dsync_mailbox_change *change; struct local_dsync_dir_change *dir_change; const char *const *fields; @@ -505,7 +506,8 @@ local_worker_mailbox_iter_next(struct dsync_worker_mailbox_iter *_iter, } box = mailbox_alloc(info->ns->list, storage_name, NULL, flags); - if (mailbox_sync(box, 0) < 0) { + if (mailbox_sync(box, 0) < 0 || + mailbox_get_guid(box, mailbox_guid) < 0) { struct mail_storage *storage = mailbox_get_storage(box); i_error("Failed to sync mailbox %s: %s", info->name, @@ -516,17 +518,15 @@ local_worker_mailbox_iter_next(struct dsync_worker_mailbox_iter *_iter, } mailbox_get_status(box, STATUS_UIDNEXT | STATUS_UIDVALIDITY | - STATUS_HIGHESTMODSEQ | STATUS_GUID | - STATUS_CACHE_FIELDS, &status); + STATUS_HIGHESTMODSEQ | STATUS_CACHE_FIELDS, &status); - change = hash_table_lookup(worker->mailbox_changes_hash, - status.mailbox_guid); + change = hash_table_lookup(worker->mailbox_changes_hash, mailbox_guid); if (change != NULL) { /* it shouldn't be marked as deleted, but drop it to be sure */ change->deleted_mailbox = FALSE; } - memcpy(dsync_box_r->mailbox_guid.guid, status.mailbox_guid, + memcpy(dsync_box_r->mailbox_guid.guid, mailbox_guid, sizeof(dsync_box_r->mailbox_guid.guid)); dsync_box_r->uid_validity = status.uidvalidity; dsync_box_r->uid_next = status.uidnext; @@ -691,7 +691,7 @@ static int local_mailbox_open(struct local_dsync_worker *worker, enum mailbox_flags flags = MAILBOX_FLAG_KEEP_RECENT; struct local_dsync_mailbox *lbox; struct mailbox *box; - struct mailbox_status status; + uint8_t mailbox_guid[MAIL_GUID_128_SIZE]; lbox = hash_table_lookup(worker->mailbox_hash, guid); if (lbox == NULL) { @@ -701,7 +701,8 @@ static int local_mailbox_open(struct local_dsync_worker *worker, } box = mailbox_alloc(lbox->ns->list, lbox->storage_name, NULL, flags); - if (mailbox_sync(box, 0) < 0) { + if (mailbox_sync(box, 0) < 0 || + mailbox_get_guid(box, mailbox_guid) < 0) { struct mail_storage *storage = mailbox_get_storage(box); i_error("Failed to sync mailbox %s: %s", lbox->storage_name, @@ -710,12 +711,10 @@ static int local_mailbox_open(struct local_dsync_worker *worker, return -1; } - mailbox_get_status(box, STATUS_GUID, &status); - if (memcmp(status.mailbox_guid, guid->guid, sizeof(guid->guid)) != 0) { + if (memcmp(mailbox_guid, guid->guid, sizeof(guid->guid)) != 0) { i_error("Mailbox %s changed its GUID (%s -> %s)", lbox->storage_name, dsync_guid_to_str(guid), - binary_to_hex(status.mailbox_guid, - sizeof(status.mailbox_guid))); + binary_to_hex(mailbox_guid, sizeof(mailbox_guid))); mailbox_free(&box); return -1; } diff --git a/src/imap/cmd-list.c b/src/imap/cmd-list.c index b6ebb2a298..2c4bd55894 100644 --- a/src/imap/cmd-list.c +++ b/src/imap/cmd-list.c @@ -15,7 +15,7 @@ struct cmd_list_context { const char *ref; const char *const *patterns; enum mailbox_list_iter_flags list_flags; - enum mailbox_status_items status_items; + struct imap_status_items status_items; struct mail_namespace *ns; struct mailbox_list_iterate_context *list_iter; @@ -30,6 +30,7 @@ struct cmd_list_context { unsigned int cur_ns_send_prefix:1; unsigned int cur_ns_skip_trailing_sep:1; unsigned int used_listext:1; + unsigned int used_status:1; }; static void @@ -151,11 +152,11 @@ parse_return_flags(struct cmd_list_context *ctx, const struct imap_arg *args) list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN; else if (strcasecmp(atom, "STATUS") == 0 && args[1].type == IMAP_ARG_LIST) { - /* FIXME: this should probably be a plugin.. */ if (imap_status_parse_items(ctx->cmd, IMAP_ARG_LIST_ARGS(&args[1]), &ctx->status_items) < 0) return FALSE; + ctx->used_status = TRUE; args++; } else { /* skip also optional list value */ @@ -326,18 +327,18 @@ list_namespace_send_prefix(struct cmd_list_context *ctx, bool have_children) static void list_send_status(struct cmd_list_context *ctx, const char *name) { - struct mailbox_status status; + struct imap_status_result result; const char *storage_name, *error; storage_name = mail_namespace_get_storage_name(ctx->ns, name); if (imap_status_get(ctx->cmd, ctx->ns, storage_name, - ctx->status_items, &status, &error) < 0) { + &ctx->status_items, &result, &error) < 0) { client_send_line(ctx->cmd->client, t_strconcat("* ", error, NULL)); return; } - imap_status_send(ctx->cmd->client, name, ctx->status_items, &status); + imap_status_send(ctx->cmd->client, name, &ctx->status_items, &result); } static int @@ -399,7 +400,7 @@ list_namespace_mailboxes(struct cmd_list_context *ctx) mailbox_childinfo2str(ctx, str, flags); ret = client_send_line(ctx->cmd->client, str_c(str)); - if (ctx->status_items != 0 && + if (ctx->used_status && (flags & (MAILBOX_NONEXISTENT | MAILBOX_NOSELECT)) == 0) { T_BEGIN { list_send_status(ctx, name); diff --git a/src/imap/cmd-status.c b/src/imap/cmd-status.c index 142e4e7e96..61ee0dae0c 100644 --- a/src/imap/cmd-status.c +++ b/src/imap/cmd-status.c @@ -10,8 +10,8 @@ bool cmd_status(struct client_command_context *cmd) { struct client *client = cmd->client; const struct imap_arg *args; - struct mailbox_status status; - enum mailbox_status_items items; + struct imap_status_items items; + struct imap_status_result result; struct mail_namespace *ns; const char *mailbox, *real_mailbox, *error; bool selected_mailbox; @@ -38,13 +38,13 @@ bool cmd_status(struct client_command_context *cmd) selected_mailbox = client->mailbox != NULL && mailbox_equals(client->mailbox, ns, real_mailbox); - if (imap_status_get(cmd, ns, real_mailbox, items, - &status, &error) < 0) { + if (imap_status_get(cmd, ns, real_mailbox, &items, + &result, &error) < 0) { client_send_tagline(cmd, error); return TRUE; } - imap_status_send(client, mailbox, items, &status); + imap_status_send(client, mailbox, &items, &result); if (!selected_mailbox) client_send_tagline(cmd, "OK Status completed."); else { diff --git a/src/imap/imap-status.c b/src/imap/imap-status.c index 70f5b330b4..414b107500 100644 --- a/src/imap/imap-status.c +++ b/src/imap/imap-status.c @@ -8,11 +8,12 @@ int imap_status_parse_items(struct client_command_context *cmd, const struct imap_arg *args, - enum mailbox_status_items *items_r) + struct imap_status_items *items_r) { const char *item; enum mailbox_status_items items; + memset(items_r, 0, sizeof(*items_r)); items = 0; for (; args->type != IMAP_ARG_EOL; args++) { if (args->type != IMAP_ARG_ATOM) { @@ -37,7 +38,7 @@ int imap_status_parse_items(struct client_command_context *cmd, else if (strcmp(item, "HIGHESTMODSEQ") == 0) items |= STATUS_HIGHESTMODSEQ; else if (strcmp(item, "X-GUID") == 0) - items |= STATUS_GUID; + items_r->guid = TRUE; else { client_send_tagline(cmd, t_strconcat( "BAD Invalid status item ", item, NULL)); @@ -45,14 +46,14 @@ int imap_status_parse_items(struct client_command_context *cmd, } } - *items_r = items; + items_r->mailbox_items = items; return 0; } int imap_status_get(struct client_command_context *cmd, struct mail_namespace *ns, - const char *mailbox, enum mailbox_status_items items, - struct mailbox_status *status_r, const char **error_r) + const char *mailbox, const struct imap_status_items *items, + struct imap_status_result *result_r, const char **error_r) { struct client *client = cmd->client; struct mailbox *box; @@ -62,36 +63,43 @@ int imap_status_get(struct client_command_context *cmd, if (client->mailbox != NULL && mailbox_equals(client->mailbox, ns, mailbox)) { /* this mailbox is selected */ - mailbox_get_status(client->mailbox, items, status_r); - return TRUE; + box = client->mailbox; + } else { + /* open the mailbox */ + box = mailbox_alloc(ns->list, mailbox, NULL, + MAILBOX_FLAG_READONLY | + MAILBOX_FLAG_KEEP_RECENT); + if (client->enabled_features != 0) + mailbox_enable(box, client->enabled_features); } - /* open the mailbox */ - box = mailbox_alloc(ns->list, mailbox, NULL, MAILBOX_FLAG_READONLY | - MAILBOX_FLAG_KEEP_RECENT); - - if ((items & STATUS_HIGHESTMODSEQ) != 0) + if ((items->mailbox_items & STATUS_HIGHESTMODSEQ) != 0) client_enable(client, MAILBOX_FEATURE_CONDSTORE); - if (client->enabled_features != 0) - mailbox_enable(box, client->enabled_features); - ret = mailbox_sync(box, 0); - if (ret == 0) - mailbox_get_status(box, items, status_r); - else { + ret = box == client->mailbox ? 0 : mailbox_sync(box, 0); + if (ret == 0) { + mailbox_get_status(box, items->mailbox_items, + &result_r->status); + if (items->guid) + ret = mailbox_get_guid(box, result_r->mailbox_guid); + } + + if (ret < 0) { struct mail_storage *storage = mailbox_get_storage(box); *error_r = mail_storage_get_last_error(storage, &error); *error_r = imap_get_error_string(cmd, *error_r, error); } - mailbox_free(&box); + if (box != client->mailbox) + mailbox_free(&box); return ret; } void imap_status_send(struct client *client, const char *mailbox, - enum mailbox_status_items items, - const struct mailbox_status *status) + const struct imap_status_items *items, + const struct imap_status_result *result) { + const struct mailbox_status *status = &result->status; string_t *str; str = t_str_new(128); @@ -99,24 +107,24 @@ void imap_status_send(struct client *client, const char *mailbox, imap_quote_append_string(str, mailbox, FALSE); str_append(str, " ("); - if (items & STATUS_MESSAGES) + if ((items->mailbox_items & STATUS_MESSAGES) != 0) str_printfa(str, "MESSAGES %u ", status->messages); - if (items & STATUS_RECENT) + if ((items->mailbox_items & STATUS_RECENT) != 0) str_printfa(str, "RECENT %u ", status->recent); - if (items & STATUS_UIDNEXT) + if ((items->mailbox_items & STATUS_UIDNEXT) != 0) str_printfa(str, "UIDNEXT %u ", status->uidnext); - if (items & STATUS_UIDVALIDITY) + if ((items->mailbox_items & STATUS_UIDVALIDITY) != 0) str_printfa(str, "UIDVALIDITY %u ", status->uidvalidity); - if (items & STATUS_UNSEEN) + if ((items->mailbox_items & STATUS_UNSEEN) != 0) str_printfa(str, "UNSEEN %u ", status->unseen); - if (items & STATUS_HIGHESTMODSEQ) { + if ((items->mailbox_items & STATUS_HIGHESTMODSEQ) != 0) { str_printfa(str, "HIGHESTMODSEQ %llu ", (unsigned long long)status->highest_modseq); } - if (items & STATUS_GUID) { + if (items->guid) { str_printfa(str, "X-GUID %s ", - binary_to_hex(status->mailbox_guid, - sizeof(status->mailbox_guid))); + binary_to_hex(result->mailbox_guid, + sizeof(result->mailbox_guid))); } if (items != 0) diff --git a/src/imap/imap-status.h b/src/imap/imap-status.h index cfccaff899..23a98b95af 100644 --- a/src/imap/imap-status.h +++ b/src/imap/imap-status.h @@ -1,15 +1,26 @@ #ifndef IMAP_STATUS_H #define IMAP_STATUS_H +struct imap_status_items { + enum mailbox_status_items mailbox_items; + + unsigned int guid:1; +}; + +struct imap_status_result { + struct mailbox_status status; + uint8_t mailbox_guid[MAIL_GUID_128_SIZE]; +}; + int imap_status_parse_items(struct client_command_context *cmd, const struct imap_arg *args, - enum mailbox_status_items *items_r); + struct imap_status_items *items_r); int imap_status_get(struct client_command_context *cmd, struct mail_namespace *ns, - const char *mailbox, enum mailbox_status_items items, - struct mailbox_status *status_r, const char **error_r); + const char *mailbox, const struct imap_status_items *items, + struct imap_status_result *result_r, const char **error_r); void imap_status_send(struct client *client, const char *mailbox, - enum mailbox_status_items items, - const struct mailbox_status *status); + const struct imap_status_items *items, + const struct imap_status_result *result); #endif diff --git a/src/lib-storage/index/cydir/cydir-storage.c b/src/lib-storage/index/cydir/cydir-storage.c index 3368d256e2..02a3b7770c 100644 --- a/src/lib-storage/index/cydir/cydir-storage.c +++ b/src/lib-storage/index/cydir/cydir-storage.c @@ -213,6 +213,7 @@ struct mailbox cydir_mailbox = { index_storage_get_status, NULL, NULL, + NULL, cydir_storage_sync_init, index_mailbox_sync_next, index_mailbox_sync_deinit, diff --git a/src/lib-storage/index/dbox-multi/mdbox-storage.c b/src/lib-storage/index/dbox-multi/mdbox-storage.c index b2a965d051..34071c49c3 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-storage.c +++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c @@ -239,8 +239,8 @@ static int mdbox_mailbox_create_indexes(struct mailbox *box, return ret; } -static void mdbox_storage_get_status_guid(struct mailbox *box, - struct mailbox_status *status_r) +static int +mdbox_mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]) { struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box; struct mdbox_index_header hdr; @@ -252,20 +252,10 @@ static void mdbox_storage_get_status_guid(struct mailbox *box, /* regenerate it */ if (mdbox_write_index_header(box, NULL) < 0 || mdbox_read_header(mbox, &hdr) < 0) - return; + return -1; } - memcpy(status_r->mailbox_guid, hdr.mailbox_guid, - sizeof(status_r->mailbox_guid)); -} - -static void -mdbox_storage_get_status(struct mailbox *box, enum mailbox_status_items items, - struct mailbox_status *status_r) -{ - index_storage_get_status(box, items, status_r); - - if ((items & STATUS_GUID) != 0) - mdbox_storage_get_status_guid(box, status_r); + memcpy(guid, hdr.mailbox_guid, MAIL_GUID_128_SIZE); + return 0; } static int @@ -382,7 +372,8 @@ struct mailbox mdbox_mailbox = { dbox_mailbox_create, mdbox_mailbox_update, mdbox_mailbox_delete, - mdbox_storage_get_status, + index_storage_get_status, + mdbox_mailbox_get_guid, NULL, NULL, mdbox_storage_sync_init, diff --git a/src/lib-storage/index/dbox-single/sdbox-storage.c b/src/lib-storage/index/dbox-single/sdbox-storage.c index 6ef283599d..45760f1755 100644 --- a/src/lib-storage/index/dbox-single/sdbox-storage.c +++ b/src/lib-storage/index/dbox-single/sdbox-storage.c @@ -179,8 +179,8 @@ static int sdbox_mailbox_create_indexes(struct mailbox *box, return ret; } -static void sdbox_storage_get_status_guid(struct mailbox *box, - struct mailbox_status *status_r) +static int +sdbox_mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]) { struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box; struct sdbox_index_header hdr; @@ -192,20 +192,10 @@ static void sdbox_storage_get_status_guid(struct mailbox *box, /* regenerate it */ if (sdbox_write_index_header(box, NULL) < 0 || sdbox_read_header(mbox, &hdr) < 0) - return; + return -1; } - memcpy(status_r->mailbox_guid, hdr.mailbox_guid, - sizeof(status_r->mailbox_guid)); -} - -static void -dbox_storage_get_status(struct mailbox *box, enum mailbox_status_items items, - struct mailbox_status *status_r) -{ - index_storage_get_status(box, items, status_r); - - if ((items & STATUS_GUID) != 0) - sdbox_storage_get_status_guid(box, status_r); + memcpy(guid, hdr.mailbox_guid, MAIL_GUID_128_SIZE); + return 0; } static int @@ -275,7 +265,8 @@ struct mailbox sdbox_mailbox = { dbox_mailbox_create, dbox_mailbox_update, index_storage_mailbox_delete, - dbox_storage_get_status, + index_storage_get_status, + sdbox_mailbox_get_guid, NULL, NULL, sdbox_storage_sync_init, diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index ac0777dd9f..f6c82df566 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -459,14 +459,15 @@ int index_storage_mailbox_delete_dir(struct mailbox *box, bool mailbox_deleted) int index_storage_mailbox_delete(struct mailbox *box) { - struct mailbox_status status; + uint8_t mailbox_guid[MAIL_GUID_128_SIZE]; if (!box->opened) { /* \noselect mailbox, try deleting only the directory */ return index_storage_mailbox_delete_dir(box, FALSE); } - mailbox_get_status(box, STATUS_GUID, &status); + if (mailbox_get_guid(box, mailbox_guid) < 0) + return -1; /* Make sure the indexes are closed before trying to delete the directory that contains them. It can still fail with some NFS @@ -481,7 +482,7 @@ int index_storage_mailbox_delete(struct mailbox *box) } mailbox_list_add_change(box->list, MAILBOX_LOG_RECORD_DELETE_MAILBOX, - status.mailbox_guid); + mailbox_guid); return index_storage_mailbox_delete_dir(box, TRUE); } diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index 26bde02b3c..8ceb83f52d 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -506,17 +506,12 @@ maildir_mailbox_create(struct mailbox *box, const struct mailbox_update *update, return update == NULL ? 0 : maildir_mailbox_update(box, update); } -static void -maildir_storage_get_status(struct mailbox *box, enum mailbox_status_items items, - struct mailbox_status *status_r) +static int +maildir_mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]) { struct maildir_mailbox *mbox = (struct maildir_mailbox *)box; - index_storage_get_status(box, items, status_r); - if ((items & STATUS_GUID) != 0) { - (void)maildir_uidlist_get_mailbox_guid(mbox->uidlist, - status_r->mailbox_guid); - } + return maildir_uidlist_get_mailbox_guid(mbox->uidlist, guid); } static int @@ -816,7 +811,8 @@ struct mailbox maildir_mailbox = { maildir_mailbox_create, maildir_mailbox_update, index_storage_mailbox_delete, - maildir_storage_get_status, + index_storage_get_status, + maildir_mailbox_get_guid, maildir_list_index_has_changed, maildir_list_index_update_sync, maildir_storage_sync_init, diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 21251725fe..91726317cd 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -564,17 +564,13 @@ static void mbox_mailbox_close(struct mailbox *box) index_storage_mailbox_close(box); } -static void -mbox_storage_get_status(struct mailbox *box, enum mailbox_status_items items, - struct mailbox_status *status_r) +static int +mbox_mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]) { struct mbox_mailbox *mbox = (struct mbox_mailbox *)box; - index_storage_get_status(box, items, status_r); - if ((items & STATUS_GUID) != 0) { - memcpy(status_r->mailbox_guid, mbox->mbox_hdr.mailbox_guid, - sizeof(status_r->mailbox_guid)); - } + memcpy(guid, mbox->mbox_hdr.mailbox_guid, MAIL_GUID_128_SIZE); + return 0; } static void mbox_notify_changes(struct mailbox *box) @@ -796,7 +792,8 @@ struct mailbox mbox_mailbox = { mbox_mailbox_create, mbox_mailbox_update, index_storage_mailbox_delete, - mbox_storage_get_status, + index_storage_get_status, + mbox_mailbox_get_guid, NULL, NULL, mbox_storage_sync_init, diff --git a/src/lib-storage/index/raw/raw-storage.c b/src/lib-storage/index/raw/raw-storage.c index c9bba57858..eaed115d0a 100644 --- a/src/lib-storage/index/raw/raw-storage.c +++ b/src/lib-storage/index/raw/raw-storage.c @@ -190,6 +190,7 @@ struct mailbox raw_mailbox = { index_storage_get_status, NULL, NULL, + NULL, raw_storage_sync_init, index_mailbox_sync_next, index_mailbox_sync_deinit, diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 61e68ad38e..0f1514d224 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -100,6 +100,7 @@ struct mailbox_vfuncs { void (*get_status)(struct mailbox *box, enum mailbox_status_items items, struct mailbox_status *status_r); + int (*get_guid)(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]); /* Lookup sync extension record and figure out if it mailbox has changed since. Returns 1 = yes, 0 = no, -1 = error. */ diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index d0fff9373b..3efc10507b 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -690,6 +690,19 @@ void mailbox_get_status(struct mailbox *box, box->v.get_status(box, items, status_r); } +int mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]) +{ + if (box->v.get_guid == NULL) { + mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE, + "Storage doesn't support mailbox GUIDs"); + } + if (!box->opened) { + if (mailbox_open(box) < 0) + return -1; + } + return box->v.get_guid(box, guid); +} + struct mailbox_sync_context * mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) { diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 2a30051769..07e8f10870 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -62,8 +62,7 @@ enum mailbox_status_items { STATUS_FIRST_UNSEEN_SEQ = 0x20, STATUS_KEYWORDS = 0x40, STATUS_HIGHESTMODSEQ = 0x80, - STATUS_GUID = 0x100, - STATUS_CACHE_FIELDS = 0x200 + STATUS_CACHE_FIELDS = 0x100 }; enum mailbox_search_result_flags { @@ -182,7 +181,6 @@ struct mailbox_status { uint32_t first_unseen_seq; uint64_t highest_modseq; - uint8_t mailbox_guid[MAIL_GUID_128_SIZE]; const ARRAY_TYPE(keywords) *keywords; /* Fields that have "temp" or "yes" caching decision. */ @@ -388,6 +386,8 @@ bool mailbox_is_inconsistent(struct mailbox *box); /* Gets the mailbox status information. */ void mailbox_get_status(struct mailbox *box, enum mailbox_status_items items, struct mailbox_status *status_r); +/* Get mailbox GUID, creating it if necessary. */ +int mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]); /* Synchronize the mailbox. */ struct mailbox_sync_context * diff --git a/src/lib-storage/test-mailbox.c b/src/lib-storage/test-mailbox.c index c12e53d917..e130901940 100644 --- a/src/lib-storage/test-mailbox.c +++ b/src/lib-storage/test-mailbox.c @@ -319,6 +319,7 @@ struct mailbox test_mailbox = { test_mailbox_get_status, NULL, NULL, + NULL, test_mailbox_sync_init, test_mailbox_sync_next, test_mailbox_sync_deinit, diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index 7a299c13d9..4e41626c30 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -491,6 +491,7 @@ struct mailbox virtual_mailbox = { index_storage_get_status, NULL, NULL, + NULL, virtual_storage_sync_init, index_mailbox_sync_next, index_mailbox_sync_deinit,