X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mh.c;h=c9f3d4776a2dff40d63d8c0f51fccf57eaeff46c;hp=7028dbfb62fb76805c0d086eb354b5a141ab5f69;hb=b777618bc61046875b5c79c7126f64496c6e5a93;hpb=f335a8c113b45a45d2546630fd62ee950641a45e diff --git a/mh.c b/mh.c index 7028dbf..c9f3d47 100644 --- a/mh.c +++ b/mh.c @@ -18,8 +18,9 @@ #endif #include "mutt.h" -#include "mailbox.h" #include "mx.h" +#include "mh.h" +#include "mbox.h" #include "copy.h" #include "buffy.h" #include "sort.h" @@ -150,11 +151,11 @@ static void mh_read_sequences (struct mh_sequences *mhs, const char *path) if (!(t = strtok (buff, " \t:"))) continue; - if (!mutt_strcmp (t, MhUnseen)) + if (!safe_strcmp (t, MhUnseen)) f = MH_SEQ_UNSEEN; - else if (!mutt_strcmp (t, MhFlagged)) + else if (!safe_strcmp (t, MhFlagged)) f = MH_SEQ_FLAGGED; - else if (!mutt_strcmp (t, MhReplied)) + else if (!safe_strcmp (t, MhReplied)) f = MH_SEQ_REPLIED; else /* unknown sequence */ continue; @@ -297,11 +298,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 (!mutt_strncmp (buff, seq_unseen, mutt_strlen (seq_unseen))) + if (!safe_strncmp (buff, seq_unseen, safe_strlen (seq_unseen))) continue; - if (!mutt_strncmp (buff, seq_flagged, mutt_strlen (seq_flagged))) + if (!safe_strncmp (buff, seq_flagged, safe_strlen (seq_flagged))) continue; - if (!mutt_strncmp (buff, seq_replied, mutt_strlen (seq_replied))) + if (!safe_strncmp (buff, seq_replied, safe_strlen (seq_replied))) continue; fprintf (nfp, "%s\n", buff); @@ -388,17 +389,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, mutt_strlen (seq_unseen))) { + if (unseen && !strncmp (buff, seq_unseen, safe_strlen (seq_unseen))) { fprintf (nfp, "%s %d\n", buff, n); unseen_done = 1; } else if (flagged - && !strncmp (buff, seq_flagged, mutt_strlen (seq_flagged))) { + && !strncmp (buff, seq_flagged, safe_strlen (seq_flagged))) { fprintf (nfp, "%s %d\n", buff, n); flagged_done = 1; } else if (replied - && !strncmp (buff, seq_replied, mutt_strlen (seq_replied))) { + && !strncmp (buff, seq_replied, safe_strlen (seq_replied))) { fprintf (nfp, "%s %d\n", buff, n); replied_done = 1; } @@ -481,10 +482,10 @@ static void maildir_parse_flags (HEADER * h, const char *path) h->read = 0; h->replied = 0; - if ((p = strrchr (path, ':')) != NULL && mutt_strncmp (p + 1, "2,", 2) == 0) { + if ((p = strrchr (path, ':')) != NULL && safe_strncmp (p + 1, "2,", 2) == 0) { p += 3; - mutt_str_replace (&h->maildir_flags, p); + str_replace (&h->maildir_flags, p); q = h->maildir_flags; while (*p) { @@ -676,7 +677,7 @@ static int maildir_parse_dir (CONTEXT * ctx, struct maildir ***last, if (subdir) { snprintf (buf, sizeof (buf), "%s/%s", ctx->path, subdir); - is_old = (mutt_strcmp ("cur", subdir) == 0); + is_old = (safe_strcmp ("cur", subdir) == 0); } else strfcpy (buf, ctx->path, sizeof (buf)); @@ -834,7 +835,7 @@ static size_t maildir_hcache_keylen (const char *fn) { const char *p = strchr (fn, ':'); - return p ? (size_t) (p - fn) : mutt_strlen (fn); + return p ? (size_t) (p - fn) : safe_strlen (fn); } #endif @@ -911,7 +912,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; @@ -946,13 +947,17 @@ int mh_read_dir (CONTEXT * ctx, const char *subdir) return 0; } +int mh_read_dir (CONTEXT* ctx) { + return (_mh_read_dir (ctx, NULL)); +} + /* read a maildir style mailbox */ 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; @@ -996,7 +1001,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, mutt_strlen (tmp), 1, ch_compar); + qsort (tmp, safe_strlen (tmp), 1, ch_compar); snprintf (dest, destlen, ":2,%s", tmp); } } @@ -1122,7 +1127,7 @@ int maildir_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr) if (safe_rename (msg->path, full) == 0) { if (hdr) - mutt_str_replace (&hdr->path, path); + str_replace (&hdr->path, path); FREE (&msg->path); /* @@ -1208,7 +1213,7 @@ static int _mh_commit_message (CONTEXT * ctx, MESSAGE * msg, HEADER * hdr, snprintf (path, sizeof (path), "%s/%s", ctx->path, tmp); if (safe_rename (msg->path, path) == 0) { if (hdr) - mutt_str_replace (&hdr->path, tmp); + str_replace (&hdr->path, tmp); FREE (&msg->path); break; } @@ -1289,7 +1294,7 @@ static int mh_rewrite_message (CONTEXT * ctx, int msgno) if (ctx->magic == M_MH && rc == 0) { snprintf (newpath, _POSIX_PATH_MAX, "%s/%s", ctx->path, h->path); if ((rc = safe_rename (newpath, oldpath)) == 0) - mutt_str_replace (&h->path, partpath); + str_replace (&h->path, partpath); } } else @@ -1356,7 +1361,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 (mutt_strcmp (fullpath, oldpath) == 0) { + if (safe_strcmp (fullpath, oldpath) == 0) { /* message hasn't really changed */ return 0; } @@ -1368,7 +1373,7 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) mutt_perror ("rename"); return (-1); } - mutt_str_replace (&h->path, partpath); + str_replace (&h->path, partpath); } return (0); } @@ -1624,8 +1629,8 @@ 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 (mutt_strcmp (ctx->hdrs[i]->path, p->h->path)) - mutt_str_replace (&ctx->hdrs[i]->path, p->h->path); + if (safe_strcmp (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 * the flags we just detected. @@ -1809,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 (!mutt_strcmp (tunique, unique)) { + if (!safe_strcmp (tunique, unique)) { snprintf (fname, sizeof (fname), "%s/%s/%s", folder, subfolder, de->d_name); fp = fopen (fname, "r"); /* __FOPEN_CHECKED__ */ @@ -1921,3 +1926,83 @@ int mh_check_empty (const char *path) return r; } + +int mh_is_magic (const char* path) { + struct stat st; + char tmp[_POSIX_PATH_MAX]; + + if (stat (path, &st) == -1) + return (-1); + + 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); +} + +int maildir_is_magic (const char* path) { + struct stat st; + char tmp[_POSIX_PATH_MAX]; + + if (stat (path, &st) == -1) + return (-1); + if (S_ISDIR (st.st_mode)) { + snprintf (tmp, sizeof (tmp), "%s/cur", path); + if (stat (tmp, &st) == 0 && S_ISDIR (st.st_mode)) + return (M_MAILDIR); + } + return (-1); +} + +/* routines common to maildir and mh */ +static mx_t* reg_mx (void) { + mx_t* fmt = safe_calloc (1, sizeof (mx_t)); + fmt->local = 1; + fmt->mx_access = access; + return (fmt); +} + +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; + 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; + return (fmt); +}