X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mh.c;h=8c9bbc7a049c21fe8204d3a6c0a95e03610d46b6;hp=43e9c350361ae8d5df58d031b99f656cf4e760ed;hb=617e7d83d14e14e6a520a48e75437211b16c8834;hpb=ee1d4d931ca3ebec494694b74a1868a7a2e631e3 diff --git a/mh.c b/mh.c index 43e9c35..8c9bbc7 100644 --- a/mh.c +++ b/mh.c @@ -17,6 +17,8 @@ # include "config.h" #endif +#include + #include "mutt.h" #include "mx.h" #include "mh.h" @@ -24,10 +26,12 @@ #include "copy.h" #include "buffy.h" #include "sort.h" +#include "thread.h" +#include "hcache.h" -#include "lib/mem.h" #include "lib/intl.h" #include "lib/str.h" +#include "lib/debug.h" #include #include @@ -68,6 +72,11 @@ struct mh_sequences { #define MH_SEQ_REPLIED (1 << 1) #define MH_SEQ_FLAGGED (1 << 2) +/* prototypes */ +static int maildir_check_empty (const char*); +static int maildir_check_mailbox (CONTEXT*, int*, int); +static int mh_check_mailbox (CONTEXT*, int*, int); + static void mhs_alloc (struct mh_sequences *mhs, int i) { int j; @@ -75,7 +84,7 @@ static void mhs_alloc (struct mh_sequences *mhs, int i) if (i > mhs->max || !mhs->flags) { newmax = i + 128; - safe_realloc (&mhs->flags, sizeof (mhs->flags[0]) * (newmax + 1)); + p_realloc(&mhs->flags, newmax + 1); for (j = mhs->max + 1; j <= newmax; j++) mhs->flags[j] = 0; @@ -85,7 +94,7 @@ static void mhs_alloc (struct mh_sequences *mhs, int i) static void mhs_free_sequences (struct mh_sequences *mhs) { - FREE (&mhs->flags); + p_delete(&mhs->flags); } static short mhs_check (struct mh_sequences *mhs, int i) @@ -151,11 +160,11 @@ static void mh_read_sequences (struct mh_sequences *mhs, const char *path) if (!(t = strtok (buff, " \t:"))) continue; - if (!safe_strcmp (t, MhUnseen)) + if (!str_cmp (t, MhUnseen)) f = MH_SEQ_UNSEEN; - else if (!safe_strcmp (t, MhFlagged)) + else if (!str_cmp (t, MhFlagged)) f = MH_SEQ_FLAGGED; - else if (!safe_strcmp (t, MhReplied)) + else if (!str_cmp (t, MhReplied)) f = MH_SEQ_REPLIED; else /* unknown sequence */ continue; @@ -167,7 +176,7 @@ static void mh_read_sequences (struct mh_sequences *mhs, const char *path) } } - FREE (&buff); + p_delete(&buff); safe_fclose (&fp); } @@ -202,13 +211,13 @@ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) } } else { - *tgt = safe_strdup (path); + *tgt = str_dup (path); break; } } if ((*fp = fdopen (fd, "w")) == NULL) { - FREE (tgt); + p_delete(tgt); close (fd); unlink (path); return (-1); @@ -298,11 +307,11 @@ void mh_update_sequences (CONTEXT * ctx) /* first, copy unknown sequences */ if ((ofp = fopen (sequences, "r"))) { while ((buff = mutt_read_line (buff, &s, ofp, &l))) { - if (!safe_strncmp (buff, seq_unseen, safe_strlen (seq_unseen))) + if (!str_ncmp (buff, seq_unseen, str_len (seq_unseen))) continue; - if (!safe_strncmp (buff, seq_flagged, safe_strlen (seq_flagged))) + if (!str_ncmp (buff, seq_flagged, str_len (seq_flagged))) continue; - if (!safe_strncmp (buff, seq_replied, safe_strlen (seq_replied))) + if (!str_ncmp (buff, seq_replied, str_len (seq_replied))) continue; fprintf (nfp, "%s\n", buff); @@ -356,7 +365,7 @@ void mh_update_sequences (CONTEXT * ctx) unlink (tmpfname); } - FREE (&tmpfname); + p_delete(&tmpfname); } static void mh_sequences_add_one (CONTEXT * ctx, int n, short unseen, @@ -389,17 +398,17 @@ static void mh_sequences_add_one (CONTEXT * ctx, int n, short unseen, snprintf (sequences, sizeof (sequences), "%s/.mh_sequences", ctx->path); if ((ofp = fopen (sequences, "r"))) { while ((buff = mutt_read_line (buff, &sz, ofp, &line))) { - if (unseen && !strncmp (buff, seq_unseen, safe_strlen (seq_unseen))) { + if (unseen && !strncmp (buff, seq_unseen, str_len (seq_unseen))) { fprintf (nfp, "%s %d\n", buff, n); unseen_done = 1; } else if (flagged - && !strncmp (buff, seq_flagged, safe_strlen (seq_flagged))) { + && !strncmp (buff, seq_flagged, str_len (seq_flagged))) { fprintf (nfp, "%s %d\n", buff, n); flagged_done = 1; } else if (replied - && !strncmp (buff, seq_replied, safe_strlen (seq_replied))) { + && !strncmp (buff, seq_replied, str_len (seq_replied))) { fprintf (nfp, "%s %d\n", buff, n); replied_done = 1; } @@ -408,7 +417,7 @@ static void mh_sequences_add_one (CONTEXT * ctx, int n, short unseen, } } safe_fclose (&ofp); - FREE (&buff); + p_delete(&buff); if (!unseen_done && unseen) fprintf (nfp, "%s: %d\n", NONULL (MhUnseen), n); @@ -423,7 +432,7 @@ static void mh_sequences_add_one (CONTEXT * ctx, int n, short unseen, if (safe_rename (tmpfname, sequences) != 0) unlink (tmpfname); - FREE (&tmpfname); + p_delete(&tmpfname); } static void mh_update_maildir (struct maildir *md, struct mh_sequences *mhs) @@ -454,11 +463,11 @@ static void maildir_free_entry (struct maildir **md) if (!md || !*md) return; - FREE (&(*md)->canon_fname); + p_delete(&(*md)->canon_fname); if ((*md)->h) mutt_free_header (&(*md)->h); - FREE (md); + p_delete(md); } static void maildir_free_maildir (struct maildir **md) @@ -482,7 +491,7 @@ static void maildir_parse_flags (HEADER * h, const char *path) h->read = 0; h->replied = 0; - if ((p = strrchr (path, ':')) != NULL && safe_strncmp (p + 1, "2,", 2) == 0) { + if ((p = strrchr (path, ':')) != NULL && str_ncmp (p + 1, "2,", 2) == 0) { p += 3; str_replace (&h->maildir_flags, p); @@ -519,7 +528,7 @@ static void maildir_parse_flags (HEADER * h, const char *path) } if (q == h->maildir_flags) - FREE (&h->maildir_flags); + p_delete(&h->maildir_flags); else if (q) *q = '\0'; } @@ -631,12 +640,12 @@ static int maildir_parse_entry (CONTEXT * ctx, struct maildir ***last, if (subdir) { snprintf (buf, sizeof (buf), "%s/%s", subdir, fname); - h->path = safe_strdup (buf); + h->path = str_dup (buf); } else - h->path = safe_strdup (fname); + h->path = str_dup (fname); - entry = safe_calloc (sizeof (struct maildir), 1); + entry = p_new(struct maildir, 1); entry->h = h; entry->header_parsed = (ctx->magic == M_MH); #ifdef USE_INODESORT @@ -677,7 +686,7 @@ static int maildir_parse_dir (CONTEXT * ctx, struct maildir ***last, if (subdir) { snprintf (buf, sizeof (buf), "%s/%s", ctx->path, subdir); - is_old = (safe_strcmp ("cur", subdir) == 0); + is_old = (str_cmp ("cur", subdir) == 0); } else strfcpy (buf, ctx->path, sizeof (buf)); @@ -693,11 +702,14 @@ static int maildir_parse_dir (CONTEXT * ctx, struct maildir ***last, /* FOO - really ignore the return value? */ - dprint (2, - (debugfile, "%s:%d: parsing %s\n", __FILE__, __LINE__, - de->d_name)); + debug_print (2, ("parsing %s\n", de->d_name)); maildir_parse_entry (ctx, last, subdir, de->d_name, count, is_old, - de->d_ino); +#if HAVE_DIRENT_D_INO + de->d_ino +#else + 0 +#endif + ); } closedir (dirp); @@ -710,16 +722,12 @@ static int maildir_add_to_context (CONTEXT * ctx, struct maildir *md) while (md) { - dprint (2, (debugfile, "%s:%d maildir_add_to_context(): Considering %s\n", - __FILE__, __LINE__, NONULL (md->canon_fname))); + debug_print (2, ("considering %s\n", NONULL (md->canon_fname))); if (md->h) { - dprint (2, - (debugfile, - "%s:%d Adding header structure. Flags: %s%s%s%s%s\n", __FILE__, - __LINE__, md->h->flagged ? "f" : "", md->h->deleted ? "D" : "", - md->h->replied ? "r" : "", md->h->old ? "O" : "", - md->h->read ? "R" : "")); + debug_print (2, ("flags: %s%s%s%s%s\n", md->h->flagged ? "f" : "", + md->h->deleted ? "D" : "", md->h->replied ? "r" : "", + md->h->old ? "O" : "", md->h->read ? "R" : "")); if (ctx->msgcount == ctx->hdrmax) mx_alloc_memory (ctx); @@ -830,12 +838,12 @@ static struct maildir *maildir_sort_inode (struct maildir *list) } #endif /* USE_INODESORT */ -#if USE_HCACHE +#ifdef USE_HCACHE static size_t maildir_hcache_keylen (const char *fn) { const char *p = strchr (fn, ':'); - return p ? (size_t) (p - fn) : safe_strlen (fn); + return p ? (size_t) (p - fn) : str_len (fn); } #endif @@ -849,7 +857,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) char fn[_POSIX_PATH_MAX]; int count; -#if USE_HCACHE +#ifdef USE_HCACHE void *hc = NULL; void *data; struct timeval *when = NULL; @@ -863,7 +871,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) if (!(p && p->h && !p->header_parsed)) continue; -#if USE_HCACHE +#ifdef USE_HCACHE data = mutt_hcache_fetch (hc, p->h->path + 3, &maildir_hcache_keylen); when = (struct timeval *) data; #endif @@ -872,7 +880,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) mutt_message (_("Reading %s... %d"), ctx->path, count); snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path); -#if USE_HCACHE +#ifdef USE_HCACHE if (option (OPTHCACHEVERIFY)) { ret = stat (fn, &lastchanged); } @@ -890,17 +898,17 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h)) { p->header_parsed = 1; maildir_parse_flags (p->h, fn); -#if USE_HCACHE +#ifdef USE_HCACHE mutt_hcache_store (hc, p->h->path + 3, p->h, 0, &maildir_hcache_keylen); #endif } else mutt_free_header (&p->h); -#if USE_HCACHE - FREE (&data); +#ifdef USE_HCACHE + p_delete(&data); #endif } -#if USE_HCACHE +#ifdef USE_HCACHE mutt_hcache_close (hc); #endif } @@ -912,7 +920,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) * subdir [IN] NULL for MH mailboxes, otherwise the subdir of the * maildir mailbox to read from */ -int mh_read_dir (CONTEXT * ctx, const char *subdir) +static int _mh_read_dir (CONTEXT * ctx, const char *subdir) { struct maildir *md; struct mh_sequences mhs; @@ -947,13 +955,17 @@ int mh_read_dir (CONTEXT * ctx, const char *subdir) return 0; } +static int mh_read_dir (CONTEXT* ctx) { + return (_mh_read_dir (ctx, NULL)); +} + /* read a maildir style mailbox */ -int maildir_read_dir (CONTEXT * ctx) +static int maildir_read_dir (CONTEXT * ctx) { /* maildir looks sort of like MH, except that there are two subdirectories * of the main folder path from which to read messages */ - if (mh_read_dir (ctx, "new") == -1 || mh_read_dir (ctx, "cur") == -1) + if (_mh_read_dir (ctx, "new") == -1 || _mh_read_dir (ctx, "cur") == -1) return (-1); return 0; @@ -963,7 +975,7 @@ int maildir_read_dir (CONTEXT * ctx) * Open a new (temporary) message in an MH folder. */ -int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) +static int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) { return mh_mkstemp (dest, &msg->fp, &msg->path); } @@ -997,7 +1009,7 @@ static void maildir_flags (char *dest, size_t destlen, HEADER * hdr) hdr->read ? "S" : "", hdr->deleted ? "T" : "", NONULL (hdr->maildir_flags)); if (hdr->maildir_flags) - qsort (tmp, safe_strlen (tmp), 1, ch_compar); + qsort (tmp, str_len (tmp), 1, ch_compar); snprintf (dest, destlen, ":2,%s", tmp); } } @@ -1011,7 +1023,7 @@ static void maildir_flags (char *dest, size_t destlen, HEADER * hdr) * */ -int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) +static int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) { int fd; char path[_POSIX_PATH_MAX]; @@ -1040,8 +1052,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) dest->path, subdir, (long) time (NULL), (unsigned int) getpid (), Counter++, NONULL (Hostname), suffix); - dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n", - path)); + debug_print (2, ("trying %s.\n", path)); umask (Umask); if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1) { @@ -1051,14 +1062,14 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) } } else { - dprint (2, (debugfile, "maildir_open_new_message (): Success.\n")); - msg->path = safe_strdup (path); + debug_print (2, ("success.\n")); + msg->path = str_dup (path); break; } } if ((msg->fp = fdopen (fd, "w")) == NULL) { - FREE (&msg->path); + p_delete(&msg->path); close (fd); unlink (path); return (-1); @@ -1090,7 +1101,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) * */ -int maildir_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr) +static int maildir_commit_message (MESSAGE * msg, CONTEXT * ctx, HEADER * hdr) { char subdir[4]; char suffix[16]; @@ -1118,13 +1129,12 @@ int maildir_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr) NONULL (Hostname), suffix); snprintf (full, _POSIX_PATH_MAX, "%s/%s", ctx->path, path); - dprint (2, (debugfile, "maildir_commit_message (): renaming %s to %s.\n", - msg->path, full)); + debug_print (2, ("renaming %s to %s.\n", msg->path, full)); if (safe_rename (msg->path, full) == 0) { if (hdr) str_replace (&hdr->path, path); - FREE (&msg->path); + p_delete(&msg->path); /* * Adjust the mtime on the file to match the time at which this @@ -1159,7 +1169,7 @@ int maildir_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr) */ -static int _mh_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr, +static int _mh_commit_message (MESSAGE * msg, CONTEXT * ctx, HEADER * hdr, short updseq) { DIR *dirp; @@ -1210,7 +1220,7 @@ static int _mh_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr, if (safe_rename (msg->path, path) == 0) { if (hdr) str_replace (&hdr->path, tmp); - FREE (&msg->path); + p_delete(&msg->path); break; } else if (errno != EEXIST) { @@ -1224,12 +1234,10 @@ static int _mh_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr, return 0; } -int mh_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr) -{ - return _mh_commit_message (ctx, msg, hdr, 1); +static int mh_commit_message (MESSAGE * msg, CONTEXT * ctx, HEADER * hdr) { + return _mh_commit_message (msg, ctx, hdr, 1); } - /* Sync a message in an MH folder. * * This code is also used for attachment deletion in maildir @@ -1261,9 +1269,9 @@ static int mh_rewrite_message (CONTEXT * ctx, int msgno) strfcpy (partpath, h->path, _POSIX_PATH_MAX); if (ctx->magic == M_MAILDIR) - rc = maildir_commit_message (ctx, dest, h); + rc = maildir_commit_message (dest, ctx, h); else - rc = _mh_commit_message (ctx, dest, h, 0); + rc = _mh_commit_message (dest, ctx, h, 0); mx_close_message (&dest); @@ -1310,7 +1318,8 @@ static int mh_sync_message (CONTEXT * ctx, int msgno) { HEADER *h = ctx->hdrs[msgno]; - if (h->attach_del || h->refs_changed || h->irt_changed) + if (h->attach_del || + (h->env && (h->env->refs_changed || h->env->irt_changed))) if (mh_rewrite_message (ctx, msgno) != 0) return -1; @@ -1321,7 +1330,8 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) { HEADER *h = ctx->hdrs[msgno]; - if (h->attach_del || h->refs_changed || h->irt_changed) { + if (h->attach_del || + (h->env && (h->env->refs_changed || h->env->irt_changed))) { /* when doing attachment deletion/rethreading, fall back to the MH case. */ if (mh_rewrite_message (ctx, msgno) != 0) return (-1); @@ -1337,10 +1347,7 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) char *p; if ((p = strrchr (h->path, '/')) == NULL) { - dprint (1, - (debugfile, - "maildir_sync_message: %s: unable to find subdir!\n", - h->path)); + debug_print (1, ("%s: unable to find subdir!\n", h->path)); return (-1); } p++; @@ -1357,7 +1364,7 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) snprintf (fullpath, sizeof (fullpath), "%s/%s", ctx->path, partpath); snprintf (oldpath, sizeof (oldpath), "%s/%s", ctx->path, h->path); - if (safe_strcmp (fullpath, oldpath) == 0) { + if (str_cmp (fullpath, oldpath) == 0) { /* message hasn't really changed */ return 0; } @@ -1374,24 +1381,24 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) return (0); } -int mh_sync_mailbox (CONTEXT * ctx, int *index_hint) +static int mh_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint) { char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX]; int i, j; -#if USE_HCACHE +#ifdef USE_HCACHE void *hc = NULL; #endif /* USE_HCACHE */ if (ctx->magic == M_MH) - i = mh_check_mailbox (ctx, index_hint); + i = mh_check_mailbox (ctx, index_hint, 0); else - i = maildir_check_mailbox (ctx, index_hint); + i = maildir_check_mailbox (ctx, index_hint, 0); if (i != 0) return i; -#if USE_HCACHE +#ifdef USE_HCACHE if (ctx->magic == M_MAILDIR) hc = mutt_hcache_open (HeaderCache, ctx->path); #endif /* USE_HCACHE */ @@ -1402,7 +1409,7 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint) snprintf (path, sizeof (path), "%s/%s", ctx->path, ctx->hdrs[i]->path); if (ctx->magic == M_MAILDIR || (option (OPTMHPURGE) && ctx->magic == M_MH)) { -#if USE_HCACHE +#ifdef USE_HCACHE if (ctx->magic == M_MAILDIR) mutt_hcache_delete (hc, ctx->hdrs[i]->path + 3, &maildir_hcache_keylen); @@ -1435,7 +1442,7 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint) } } -#if USE_HCACHE +#ifdef USE_HCACHE if (ctx->magic == M_MAILDIR) mutt_hcache_close (hc); #endif /* USE_HCACHE */ @@ -1460,7 +1467,7 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint) return 0; err: -#if USE_HCACHE +#ifdef USE_HCACHE if (ctx->magic == M_MAILDIR) mutt_hcache_close (hc); #endif /* USE_HCACHE */ @@ -1549,7 +1556,7 @@ static void maildir_update_flags (CONTEXT * ctx, HEADER * o, HEADER * n) * either subdirectory differently, as mail could be copied directly into * the cur directory from another agent. */ -int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) +static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) { struct stat st_new; /* status of the "new" subdirectory */ struct stat st_cur; /* status of the "cur" subdirectory */ @@ -1564,9 +1571,6 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) HASH *fnames; /* hash table for quickly looking up the base filename for a maildir message */ - /* XXX seems like this check belongs in mx_check_mailbox() - * rather than here. - */ if (!option (OPTCHECKNEW)) return 0; @@ -1609,7 +1613,7 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) for (p = md; p; p = p->next) { maildir_canon_filename (buf, p->h->path, sizeof (buf)); - p->canon_fname = safe_strdup (buf); + p->canon_fname = str_dup (buf); hash_insert (fnames, p->canon_fname, p, 0); } @@ -1625,7 +1629,7 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) /* check to see if the message has moved to a different * subdirectory. If so, update the associated filename. */ - if (safe_strcmp (ctx->hdrs[i]->path, p->h->path)) + if (str_cmp (ctx->hdrs[i]->path, p->h->path)) str_replace (&ctx->hdrs[i]->path, p->h->path); /* if the user hasn't modified the flags on this message, update @@ -1689,7 +1693,7 @@ int maildir_check_mailbox (CONTEXT * ctx, int *index_hint) * */ -int mh_check_mailbox (CONTEXT * ctx, int *index_hint) +static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) { char buf[_POSIX_PATH_MAX]; struct stat st, st_cur; @@ -1717,7 +1721,7 @@ int mh_check_mailbox (CONTEXT * ctx, int *index_hint) safe_fclose (&fp); if (safe_rename (tmp, buf) == -1) unlink (tmp); - FREE (&tmp); + p_delete(&tmp); } } @@ -1752,7 +1756,7 @@ int mh_check_mailbox (CONTEXT * ctx, int *index_hint) ctx->hdrs[i]->active = 0; if ((p = hash_find (fnames, ctx->hdrs[i]->path)) && p->h && - (mbox_strict_cmp_headers (ctx->hdrs[i], p->h))) { + (mutt_cmp_header (ctx->hdrs[i], p->h))) { ctx->hdrs[i]->active = 1; /* found the right message */ if (!ctx->hdrs[i]->changed) @@ -1810,7 +1814,7 @@ FILE *_maildir_open_find_message (const char *folder, const char *unique, while ((de = readdir (dp))) { maildir_canon_filename (tunique, de->d_name, sizeof (tunique)); - if (!safe_strcmp (tunique, unique)) { + if (!str_cmp (tunique, unique)) { snprintf (fname, sizeof (fname), "%s/%s/%s", folder, subfolder, de->d_name); fp = fopen (fname, "r"); /* __FOPEN_CHECKED__ */ @@ -1867,7 +1871,7 @@ FILE *maildir_open_find_message (const char *folder, const char *msg) * 0 if there are messages in the mailbox * -1 on error */ -int maildir_check_empty (const char *path) +static int maildir_check_empty (const char *path) { DIR *dp; struct dirent *de; @@ -1922,3 +1926,92 @@ int mh_check_empty (const char *path) return r; } + +static int mh_is_magic (const char* path, struct stat* st) { + char tmp[_POSIX_PATH_MAX]; + + if (S_ISDIR (st->st_mode)) { + snprintf (tmp, sizeof (tmp), "%s/.mh_sequences", path); + if (access (tmp, F_OK) == 0) + return (M_MH); + + snprintf (tmp, sizeof (tmp), "%s/.xmhcache", path); + if (access (tmp, F_OK) == 0) + return (M_MH); + + snprintf (tmp, sizeof (tmp), "%s/.mew_cache", path); + if (access (tmp, F_OK) == 0) + return (M_MH); + + snprintf (tmp, sizeof (tmp), "%s/.mew-cache", path); + if (access (tmp, F_OK) == 0) + return (M_MH); + + snprintf (tmp, sizeof (tmp), "%s/.sylpheed_cache", path); + if (access (tmp, F_OK) == 0) + return (M_MH); + + /* + * ok, this isn't an mh folder, but mh mode can be used to read + * Usenet news from the spool. ;-) + */ + + snprintf (tmp, sizeof (tmp), "%s/.overview", path); + if (access (tmp, F_OK) == 0) + return (M_MH); + } + return (-1); +} + +static int maildir_is_magic (const char* path, struct stat* st) { + struct stat sb; + char tmp[_POSIX_PATH_MAX]; + + if (S_ISDIR (st->st_mode)) { + snprintf (tmp, sizeof (tmp), "%s/cur", path); + if (stat (tmp, &sb) == 0 && S_ISDIR (sb.st_mode)) + return (M_MAILDIR); + } + return (-1); +} + +/* routines common to maildir and mh */ +static mx_t* reg_mx (void) { + mx_t* fmt = p_new(mx_t, 1); + fmt->local = 1; + fmt->mx_access = access; + fmt->mx_sync_mailbox = mh_sync_mailbox; + return (fmt); +} + +static int mh_commit (MESSAGE* msg, CONTEXT* ctx) { + return (mh_commit_message (msg, ctx, NULL)); +} + +static int maildir_commit (MESSAGE* msg, CONTEXT* ctx) { + return (maildir_commit_message (msg, ctx, NULL)); +} + +mx_t* mh_reg_mx (void) { + mx_t* fmt = reg_mx (); + fmt->type = M_MH; + fmt->mx_check_empty = mh_check_empty; + fmt->mx_is_magic = mh_is_magic; + fmt->mx_open_mailbox = mh_read_dir; + fmt->mx_open_new_message = mh_open_new_message; + fmt->mx_check_mailbox = mh_check_mailbox; + fmt->mx_commit_message = mh_commit; + return (fmt); +} + +mx_t* maildir_reg_mx (void) { + mx_t* fmt = reg_mx (); + fmt->type = M_MAILDIR; + fmt->mx_check_empty = maildir_check_empty; + fmt->mx_is_magic = maildir_is_magic; + fmt->mx_open_mailbox = maildir_read_dir; + fmt->mx_open_new_message = maildir_open_new_message; + fmt->mx_check_mailbox = maildir_check_mailbox; + fmt->mx_commit_message = maildir_commit; + return (fmt); +}