Mercurial > dovecot > core-2.2
changeset 12572:b78e772cf1d2
lib-storage: Fixed deleting symlinked mailbox.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 30 Dec 2010 13:45:11 +0200 |
parents | c67f4a2a2253 |
children | 6813e76eb29e |
files | src/lib-storage/list/mailbox-list-delete.c src/lib-storage/list/mailbox-list-delete.h src/lib-storage/list/mailbox-list-maildir-iter.c |
diffstat | 3 files changed, 21 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-delete.c Thu Dec 30 13:41:10 2010 +0200 +++ b/src/lib-storage/list/mailbox-list-delete.c Thu Dec 30 13:45:11 2010 +0200 @@ -97,7 +97,7 @@ if (trash_dir == trash_dest) { trash_dest = t_strconcat(trash_dir, "/", unique_fname(), NULL); - } else if (unlink_directory(trash_dest, TRUE) < 0 && + } else if (mailbox_list_delete_trash(trash_dest) < 0 && (errno != ENOTEMPTY || count >= 5)) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", trash_dest); @@ -105,7 +105,7 @@ } } - if (unlink_directory(trash_dir, TRUE) < 0 && + if (mailbox_list_delete_trash(trash_dir) < 0 && errno != ENOTEMPTY && errno != EBUSY) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", trash_dir); @@ -189,7 +189,7 @@ str_append(full_path, d->d_name); if (mailbox_dir) { - if (unlink_directory(str_c(full_path), TRUE) < 0) { + if (mailbox_list_delete_trash(str_c(full_path)) < 0) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", str_c(full_path)); @@ -297,7 +297,7 @@ rmdir_path) < 0) return; } else { - if (unlink_directory(path, TRUE) < 0 && + if (mailbox_list_delete_trash(path) < 0 && errno != ENOENT && errno != ENOTEMPTY) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", path); @@ -314,3 +314,17 @@ mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_CONTROL); mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX); } + +int mailbox_list_delete_trash(const char *path) +{ + if (unlink_directory(path, TRUE) < 0) { + if (errno == ELOOP) { + /* it's a symlink? try just deleting it */ + if (unlink(path) == 0) + return 0; + errno = ELOOP; + return -1; + } + } + return 0; +}
--- a/src/lib-storage/list/mailbox-list-delete.h Thu Dec 30 13:41:10 2010 +0200 +++ b/src/lib-storage/list/mailbox-list-delete.h Thu Dec 30 13:45:11 2010 +0200 @@ -15,5 +15,6 @@ void mailbox_list_delete_until_root(struct mailbox_list *list, const char *path, enum mailbox_list_path_type type); +int mailbox_list_delete_trash(const char *path); #endif
--- a/src/lib-storage/list/mailbox-list-maildir-iter.c Thu Dec 30 13:41:10 2010 +0200 +++ b/src/lib-storage/list/mailbox-list-maildir-iter.c Thu Dec 30 13:45:11 2010 +0200 @@ -6,6 +6,7 @@ #include "unlink-directory.h" #include "imap-match.h" #include "mailbox-tree.h" +#include "mailbox-list-delete.h" #include "mailbox-list-subscriptions.h" #include "mailbox-list-maildir.h" @@ -256,7 +257,7 @@ path = t_strdup_printf("%s/%s", ctx->dir, fname); if (stat(path, &st) == 0 && st.st_mtime < ioloop_time - 3600) - (void)unlink_directory(path, TRUE); + (void)mailbox_list_delete_trash(path); return TRUE; }