sdbox-storage.c revision 1127f3e1ad7135b6ee5d5e13f8fd1e72f85a76f8
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen/* Copyright (c) 2007-2013 Dovecot authors, see the included COPYING file */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenextern struct mail_storage dbox_storage, sdbox_storage;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenextern struct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic struct mail_storage *sdbox_storage_alloc(void)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen pool = pool_alloconly_create("sdbox storage", 512+256);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen storage = p_new(pool, struct sdbox_storage, 1);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen storage->storage.v = sdbox_dbox_storage_vfuncs;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic int sdbox_storage_create(struct mail_storage *_storage,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen const char **error_r)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct dbox_storage *storage = (struct dbox_storage *)_storage;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (dbox_storage_create(_storage, ns, error_r) < 0)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen props = fs_get_properties(storage->attachment_fs);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen "Backend doesn't support renaming";
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic const char *
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainensdbox_storage_find_root_dir(const struct mail_namespace *ns)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen i_debug("sdbox: access(%s, rwx): failed: %m", path);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic bool sdbox_storage_autodetect(const struct mail_namespace *ns,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* NOTE: this check works for mdbox as well. we'll rely on the
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen autodetect ordering to catch mdbox before we get here. */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen path = t_strconcat(root_dir, "/"DBOX_MAILBOX_DIR_NAME, NULL);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen i_debug("sdbox autodetect: stat(%s) failed: %m", path);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen i_debug("sdbox autodetect: %s not a directory", path);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic struct mailbox *
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainensdbox_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* dbox can't work without index files */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen pool = pool_alloconly_create("sdbox mailbox", 1024*3);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen ibox->index_flags |= MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS |
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen mbox->storage = (struct sdbox_storage *)storage;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenint sdbox_read_header(struct sdbox_mailbox *mbox,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct sdbox_index_header *hdr, bool log_error,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen mail_index_get_header_ext(view, mbox->hdr_ext_id,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (data_size < SDBOX_INDEX_HEADER_MIN_SIZE &&
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen "sdbox %s: Invalid dbox header size",
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* data is valid. remember it in case mailbox
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen is being reset */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic void sdbox_update_header(struct sdbox_mailbox *mbox,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE, &need_resize) < 0) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (update != NULL && !guid_128_is_empty(update->mailbox_guid)) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen memcpy(new_hdr.mailbox_guid, update->mailbox_guid,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen } else if (guid_128_is_empty(new_hdr.mailbox_guid)) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen mail_index_ext_resize_hdr(trans, mbox->hdr_ext_id,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen memcpy(mbox->mailbox_guid, new_hdr.mailbox_guid,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainensdbox_mailbox_create_indexes(struct mailbox *box,
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct mail_index_transaction *new_trans = NULL;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen new_trans = mail_index_transaction_begin(box->view, 0);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (update != NULL && update->uid_validity != 0)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen /* set uidvalidity */
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen uid_validity = dbox_get_uidvalidity_next(box->list);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen offsetof(struct mail_index_header, uid_validity),
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (update != NULL && hdr->next_uid < update->min_next_uid) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (update != NULL && update->min_first_recent_uid != 0 &&
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen hdr->first_recent_uid < update->min_first_recent_uid) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen uint32_t first_recent_uid = update->min_first_recent_uid;
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen offsetof(struct mail_index_header, first_recent_uid),
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen &first_recent_uid, sizeof(first_recent_uid), FALSE);
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (update != NULL && update->min_highest_modseq != 0 &&
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen if (mail_index_transaction_commit(&new_trans) < 0) {
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainenstatic const char *
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainensdbox_get_attachment_path_suffix(struct dbox_file *_file)
fb15bb48cf8be41cd94738c868b64608b4fda1adTimo Sirainen struct sdbox_file *file = (struct sdbox_file *)_file;
bool need_resize;
sizeof(struct sdbox_index_header), 0, 0);
bool need_resize;
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,