return 0;
}
-static char *maildir_canon_filename(char *dest, char *src, size_t l)
+static char *maildir_canon_filename (char *dest, const char *src, size_t l)
{
char *t, *u;
return (modified || occult) ? M_REOPENED : have_new ? M_NEW_MAIL : 0;
}
+
+
+
+
+/*
+ * These functions try to find a message in a maildir folder when it
+ * has moved under our feet. Note that this code is rather expensive, but
+ * then again, it's called rarely.
+ */
+
+FILE *_maildir_open_find_message (const char *folder, const char *unique,
+ const char *subfolder)
+{
+ char dir[_POSIX_PATH_MAX];
+ char tunique[_POSIX_PATH_MAX];
+ char fname[_POSIX_PATH_MAX];
+
+ DIR *dp;
+ struct dirent *de;
+
+ FILE *fp = NULL;
+ int oe = ENOENT;
+
+ snprintf (dir, sizeof (dir), "%s/%s", folder, subfolder);
+
+ if ((dp = opendir (dir)) == NULL)
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+
+ while ((de = readdir (dp)))
+ {
+ maildir_canon_filename (tunique, de->d_name, sizeof (tunique));
+
+ if (!mutt_strcmp (tunique, unique))
+ {
+ snprintf (fname, sizeof (fname), "%s/%s/%s", folder, subfolder, de->d_name);
+ fp = fopen (fname, "r"); /* __FOPEN_CHECKED__ */
+ oe = errno;
+ break;
+ }
+ }
+
+ closedir (dp);
+
+ errno = oe;
+ return fp;
+}
+
+FILE *maildir_open_find_message (const char *folder, const char *msg)
+{
+ char unique[_POSIX_PATH_MAX];
+ FILE *fp;
+
+ maildir_canon_filename (unique, msg, sizeof (unique));
+
+ if ((fp = _maildir_open_find_message (folder, unique, "new")) || errno != ENOENT)
+ return fp;
+ if ((fp = _maildir_open_find_message (folder, unique, "cur")) || errno != ENOENT)
+ return fp;
+
+ return NULL;
+}
char path[_POSIX_PATH_MAX];
snprintf (path, sizeof (path), "%s/%s", ctx->path, cur->path);
- if ((msg->fp = fopen (path, "r")) == NULL)
+
+ if ((msg->fp = fopen (path, "r")) == NULL && errno == ENOENT &&
+ ctx->magic == M_MAILDIR)
+ msg->fp = maildir_open_find_message (ctx->path, cur->path);
+
+ if (msg->fp == NULL)
{
mutt_perror (path);
dprint (1, (debugfile, "mx_open_message: fopen: %s: %s (errno %d).\n",
int maildir_open_new_message (MESSAGE *, CONTEXT *, HEADER *);
int mh_open_new_message (MESSAGE *, CONTEXT *, HEADER *);
+FILE *maildir_open_find_message (const char *, const char *);
+
int mbox_strict_cmp_headers (const HEADER *, const HEADER *);
int mutt_reopen_mailbox (CONTEXT *, int *);