X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mh.c;h=1bcf9c1b1300f46cb8166ff5a63c367ea8edf6ba;hp=43e9c350361ae8d5df58d031b99f656cf4e760ed;hb=820b351118c174e9a5413a42ffbe778d837aecb5;hpb=ee1d4d931ca3ebec494694b74a1868a7a2e631e3 diff --git a/mh.c b/mh.c index 43e9c35..1bcf9c1 100644 --- a/mh.c +++ b/mh.c @@ -28,6 +28,7 @@ #include "lib/mem.h" #include "lib/intl.h" #include "lib/str.h" +#include "lib/debug.h" #include #include @@ -68,6 +69,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; @@ -693,9 +699,7 @@ 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); } @@ -710,16 +714,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); @@ -912,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; @@ -947,13 +947,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 +967,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); } @@ -1011,7 +1015,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 +1044,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,7 +1054,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) } } else { - dprint (2, (debugfile, "maildir_open_new_message (): Success.\n")); + debug_print (2, ("success.\n")); msg->path = safe_strdup (path); break; } @@ -1118,8 +1121,7 @@ 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) @@ -1337,10 +1339,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++; @@ -1374,7 +1373,7 @@ 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; @@ -1384,9 +1383,9 @@ int mh_sync_mailbox (CONTEXT * ctx, int *index_hint) #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; @@ -1549,7 +1548,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 +1563,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; @@ -1689,7 +1685,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; @@ -1867,7 +1863,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 +1918,82 @@ 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 = safe_calloc (1, sizeof (mx_t)); + fmt->local = 1; + fmt->mx_access = access; + fmt->mx_sync_mailbox = mh_sync_mailbox; + 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; + fmt->mx_open_new_message = mh_open_new_message; + fmt->mx_check_mailbox = mh_check_mailbox; + 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; + return (fmt); +}