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);
}
}
- 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);
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));
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);
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;
+}
#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"
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;
}