]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
authorTimo Sirainen <tss@iki.fi>
Tue, 9 Feb 2010 17:50:17 +0000 (19:50 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 9 Feb 2010 17:50:17 +0000 (19:50 +0200)
--HG--
branch : HEAD

17 files changed:
src/dsync/dsync-worker-local.c
src/imap/cmd-list.c
src/imap/cmd-status.c
src/imap/imap-status.c
src/imap/imap-status.h
src/lib-storage/index/cydir/cydir-storage.c
src/lib-storage/index/dbox-multi/mdbox-storage.c
src/lib-storage/index/dbox-single/sdbox-storage.c
src/lib-storage/index/index-storage.c
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/mail-storage-private.h
src/lib-storage/mail-storage.c
src/lib-storage/mail-storage.h
src/lib-storage/test-mailbox.c
src/plugins/virtual/virtual-storage.c

index 5e2aca01db10e4fbfccd2cdade4e849e6cb35131..97f3327811960ec56a8ea2578faf54761ebe209a 100644 (file)
@@ -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;
        }
index b6ebb2a2982582887174e9dc7f58550b1964ed1f..2c4bd55894b4fbcbb20f0baa3c88c3cc16d154d7 100644 (file)
@@ -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);
index 142e4e7e961bf7a77b6643dd876444e4b9da3180..61ee0dae0cb87b113e44b5d4985d744c774762de 100644 (file)
@@ -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 {
index 70f5b330b42e407b55bb0894cfe749fa106c711e..414b1075001d5801d16c3747d060bb43df673ad2 100644 (file)
@@ -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)
index cfccaff899bbc3fd06390363268d4f9a8bded394..23a98b95af339736b9a31bb56432422ed1431af3 100644 (file)
@@ -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
index 3368d256e2ff89e1fa456dec0e95d87276abb262..02a3b7770c77d60c36f8d9d04362b8f576a7db77 100644 (file)
@@ -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,
index b2a965d051979a3334c65fefc5a757e85c82ca9c..34071c49c3a2e728b56b5b2e22a03e6e608cc4b9 100644 (file)
@@ -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,
index 6ef283599d5e7147849e11af55eb66323da259d1..45760f1755d14001422a8d57e4cd61b765471006 100644 (file)
@@ -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,
index ac0777dd9fadb304041e59371ce74ed3b6d7a3df..f6c82df566f59daca87b92f5eaed80dafacf47af 100644 (file)
@@ -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);
 }
 
index 26bde02b3cf845b7773e6595cdda92050cb82421..8ceb83f52d3c88c94ae4606619067f421466e698 100644 (file)
@@ -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,
index 21251725fec605ab2e47e6cfcec11e09c3b69662..91726317cdbe50f86b6f04506961880f36e50611 100644 (file)
@@ -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,
index c9bba57858d7f626e4ac8e9a08e3aedaab99f337..eaed115d0a4247b0d6f5c6897533b36d2fe77d2a 100644 (file)
@@ -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,
index 61e68ad38e17925b619ee0b59ec9bd2538464b8b..0f1514d224a95512fd825e4012c5647476da4865 100644 (file)
@@ -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. */
index d0fff9373b5f9f95d4876efa6745c11ead6a8b8c..3efc10507be855e2517200c23020e863ed6be616 100644 (file)
@@ -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)
 {
index 2a300517694e9ff15da370bc00b12c8e9fcde440..07e8f10870a74e796803814e7841aa76df205f59 100644 (file)
@@ -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 *
index c12e53d917a71f6009da16b290bc8ddf4333d315..e130901940e39ab9c4732ea197934531ad1ee05a 100644 (file)
@@ -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,
index 7a299c13d9c904afbfb8bcfe6eabb1e0f8085764..4e41626c30355db706152db7d47a069f1544e6c5 100644 (file)
@@ -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,