return mdbox_file_init_full(storage, 0, TRUE);
}
+int mdbox_file_open(struct dbox_file *file, bool *deleted_r)
+{
+ struct mdbox_file *mfile = (struct mdbox_file *)file;
+ struct stat st;
+ int ret;
+
+ if ((ret = dbox_file_open(file, deleted_r)) <= 0 || !*deleted_r)
+ return ret;
+
+ /* file appears to be deleted. check if the alt path root even exists
+ to avoid reindexing errors if alt path isn't mounted currently */
+ if (stat(mfile->storage->alt_storage_dir, &st) == 0)
+ return 1;
+ else if (errno == ENOENT) {
+ mail_storage_set_critical(&file->storage->storage,
+ "mdbox: User's alt path lost: %s",
+ mfile->storage->alt_storage_dir);
+ return -1;
+ } else {
+ mail_storage_set_critical(&file->storage->storage,
+ "stat(%s) failed: %m", mfile->storage->alt_storage_dir);
+ return -1;
+ }
+}
+
+
int mdbox_file_assign_file_id(struct mdbox_file *file, uint32_t file_id)
{
const char *old_path;
struct dbox_file *
mdbox_file_init_new_alt(struct mdbox_storage *storage);
+int mdbox_file_open(struct dbox_file *file, bool *deleted_r);
+
/* Assign file ID for a newly created file. */
int mdbox_file_assign_file_id(struct mdbox_file *file, uint32_t file_id);
if (!dbox_file_is_open(mail->open_file))
mail->imail.mail.stats_open_lookup_count++;
- if (dbox_file_open(mail->open_file, &deleted) <= 0)
+ if (mdbox_file_open(mail->open_file, &deleted) <= 0)
return -1;
if (deleted) {
/* either it's expunged now or moved to another file. */
while (ret == 0 &&
seq_range_array_iter_nth(&iter, i++, &file_id)) T_BEGIN {
file = mdbox_file_init(storage, file_id);
- if (dbox_file_open(file, &deleted) > 0 && !deleted) {
+ if (mdbox_file_open(file, &deleted) > 0 && !deleted) {
if (mdbox_file_purge(ctx, file) < 0)
ret = -1;
} else {
seq_range_array_add(&ctx->seen_file_ids, 0, file_id);
file = mdbox_file_init(ctx->storage, file_id);
- if ((ret = dbox_file_open(file, &deleted)) > 0 && !deleted)
+ if ((ret = mdbox_file_open(file, &deleted)) > 0 && !deleted)
ret = rebuild_file_mails(ctx, file, file_id);
if (ret == 0)
i_error("mdbox rebuild: Failed to fix file %s/%s", dir, fname);
/* first see if message contains the mailbox it was originally
saved to */
file = mdbox_file_init(ctx->storage, msg->file_id);
- ret = dbox_file_open(file, &deleted);
+ ret = mdbox_file_open(file, &deleted);
if (ret > 0 && !deleted)
ret = dbox_file_seek(file, msg->offset);
if (ret > 0 && !deleted && dbox_file_metadata_read(file) > 0) {
dbox_file_free(file);
}
+int sdbox_file_open(struct dbox_file *file, bool *deleted_r)
+{
+ struct sdbox_file *sfile = (struct sdbox_file *)file;
+ struct stat st;
+ const char *alt_root;
+ int ret;
+
+ if ((ret = dbox_file_open(file, deleted_r)) <= 0 || !*deleted_r)
+ return ret;
+
+ /* file appears to be deleted. check if the alt path root even exists
+ to avoid reindexing errors if alt path isn't mounted currently */
+ alt_root = mailbox_list_get_path(sfile->mbox->box.list, NULL,
+ MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX);
+ if (stat(alt_root, &st) == 0)
+ return 1;
+ else if (errno == ENOENT) {
+ mail_storage_set_critical(&file->storage->storage,
+ "sdbox: User's alt path lost: %s", alt_root);
+ return -1;
+ } else {
+ mail_storage_set_critical(&file->storage->storage,
+ "stat(%s) failed: %m", alt_root);
+ return -1;
+ }
+}
+
int sdbox_file_get_attachments(struct dbox_file *file, const char **extrefs_r)
{
const char *line;
*extrefs_r = NULL;
/* read the metadata */
- ret = dbox_file_open(file, &deleted);
+ ret = sdbox_file_open(file, &deleted);
if (ret > 0) {
if (deleted)
return 0;
/* file was successfully moved - reopen it */
dbox_file_close(file);
- if (dbox_file_open(file, &deleted) <= 0) {
+ if (sdbox_file_open(file, &deleted) <= 0) {
mail_storage_set_critical(storage,
"dbox_file_move(%s): reopening file failed", dest_path);
return -1;
struct dbox_file *sdbox_file_create(struct sdbox_mailbox *mbox);
void sdbox_file_free(struct dbox_file *file);
+int sdbox_file_open(struct dbox_file *file, bool *deleted_r);
+
/* Get file's extrefs metadata. */
int sdbox_file_get_attachments(struct dbox_file *file, const char **extrefs_r);
/* Returns attachment path for this file, given the source path. The result is
mail->open_file->refcount++;
/* it doesn't have input stream yet */
- ret = dbox_file_open(mail->open_file, &deleted);
+ ret = sdbox_file_open(mail->open_file, &deleted);
i_assert(ret > 0);
return TRUE;
}
if (!sdbox_mail_file_set(mail)) {
if (!dbox_file_is_open(mail->open_file))
mail->imail.mail.stats_open_lookup_count++;
- if (dbox_file_open(mail->open_file, &deleted) <= 0)
+ if (sdbox_file_open(mail->open_file, &deleted) <= 0)
return -1;
if (deleted) {
sdbox_mail_set_expunged(mail);
bool deleted;
int ret;
- if ((ret = dbox_file_open(file, &deleted)) > 0) {
+ if ((ret = sdbox_file_open(file, &deleted)) > 0) {
if (deleted)
return 0;
ret = dbox_file_seek(file, 0);
if (move_to_alt != dbox_file_is_in_alt(file)) {
/* move the file. if it fails, nothing broke so
don't worry about it. */
- if (dbox_file_open(file, &deleted) > 0 && !deleted)
+ if (sdbox_file_open(file, &deleted) > 0 && !deleted)
(void)sdbox_file_move(file, move_to_alt);
}
}