X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mh.c;h=f40bbd1575515721da88c78ed872497c6788c9de;hp=1b9c7a63c8e10d4c85a0ac71ee5cc44ca4f49a2a;hb=1ee89902de184a640c171ae3285bff6882a791bd;hpb=9274cbe8e6410ddb95ddc667faa678a29da85420 diff --git a/mh.c b/mh.c index 1b9c7a6..f40bbd1 100644 --- a/mh.c +++ b/mh.c @@ -13,13 +13,10 @@ * mailboxes. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include +#include -#include -#include -#include +#include #include "mutt.h" #include "mx.h" @@ -31,33 +28,10 @@ #include "thread.h" #include "hcache.h" -#include "lib/debug.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#if HAVE_SYS_TIME_H -#include -#endif - struct maildir { HEADER *h; char *canon_fname; unsigned header_parsed:1; -#ifdef USE_INODESORT - ino_t inode; -#endif /* USE_INODESORT */ struct maildir *next; }; @@ -144,7 +118,7 @@ static void mh_read_sequences (struct mh_sequences *mhs, const char *path) int line = 1; char *buff = NULL; char *t; - size_t sz = 0; + ssize_t sz = 0; short f; int first, last; @@ -160,11 +134,11 @@ static void mh_read_sequences (struct mh_sequences *mhs, const char *path) if (!(t = strtok (buff, " \t:"))) continue; - if (!str_cmp (t, MhUnseen)) + if (!m_strcmp(t, MhUnseen)) f = MH_SEQ_UNSEEN; - else if (!str_cmp (t, MhFlagged)) + else if (!m_strcmp(t, MhFlagged)) f = MH_SEQ_FLAGGED; - else if (!str_cmp (t, MhReplied)) + else if (!m_strcmp(t, MhReplied)) f = MH_SEQ_REPLIED; else /* unknown sequence */ continue; @@ -200,7 +174,7 @@ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) int fd; char path[_POSIX_PATH_MAX]; - FOREVER { + for (;;) { snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d", dest->path, NONULL (Hostname), (int) getpid (), Counter++); umask (Umask); @@ -267,7 +241,7 @@ static void mhs_write_one_sequence (FILE * fp, struct mh_sequences *mhs, /* XXX - we don't currently remove deleted messages from sequences we don't know. Should we? */ -void mh_update_sequences (CONTEXT * ctx) +static void mh_update_sequences (CONTEXT * ctx) { FILE *ofp, *nfp; @@ -275,7 +249,7 @@ void mh_update_sequences (CONTEXT * ctx) char *tmpfname; char *buff = NULL; char *p; - size_t s; + ssize_t s; int l = 0; int i; @@ -307,11 +281,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 (!str_ncmp (buff, seq_unseen, m_strlen(seq_unseen))) + if (!m_strncmp(buff, seq_unseen, m_strlen(seq_unseen))) continue; - if (!str_ncmp (buff, seq_flagged, m_strlen(seq_flagged))) + if (!m_strncmp(buff, seq_flagged, m_strlen(seq_flagged))) continue; - if (!str_ncmp (buff, seq_replied, m_strlen(seq_replied))) + if (!m_strncmp(buff, seq_replied, m_strlen(seq_replied))) continue; fprintf (nfp, "%s\n", buff); @@ -386,7 +360,7 @@ static void mh_sequences_add_one (CONTEXT * ctx, int n, short unseen, char *buff = NULL; int line; - size_t sz; + ssize_t sz; if (mh_mkstemp (ctx, &nfp, &tmpfname) == -1) return; @@ -465,7 +439,7 @@ static void maildir_free_entry (struct maildir **md) p_delete(&(*md)->canon_fname); if ((*md)->h) - mutt_free_header (&(*md)->h); + header_delete(&(*md)->h); p_delete(md); } @@ -491,10 +465,10 @@ static void maildir_parse_flags (HEADER * h, const char *path) h->read = 0; h->replied = 0; - if ((p = strrchr (path, ':')) != NULL && str_ncmp (p + 1, "2,", 2) == 0) { + if ((p = strrchr (path, ':')) != NULL && m_strncmp(p + 1, "2,", 2) == 0) { p += 3; - str_replace (&h->maildir_flags, p); + m_strreplace(&h->maildir_flags, p); q = h->maildir_flags; while (*p) { @@ -549,7 +523,7 @@ static void maildir_update_mtime (CONTEXT * ctx) if (stat (buf, &st) == 0) ctx->mtime_cur = st.st_mtime; - strfcpy (buf, ctx->path, sizeof (buf)); + m_strcpy(buf, sizeof(buf), ctx->path); } if (stat (buf, &st) == 0) @@ -569,7 +543,7 @@ static HEADER *maildir_parse_message (int magic, const char *fname, if ((f = fopen (fname, "r")) != NULL) { if (!h) - h = mutt_new_header (); + h = header_new(); h->env = mutt_read_rfc822_header (f, h, 0, 0); fstat (fileno (f), &st); @@ -612,7 +586,7 @@ static HEADER *maildir_parse_message (int magic, const char *fname, static int maildir_parse_entry (CONTEXT * ctx, struct maildir ***last, const char *subdir, const char *fname, - int *count, int is_old, ino_t inode) + int *count, int is_old, ino_t inode __attribute__ ((unused))) { struct maildir *entry; HEADER *h = NULL; @@ -626,7 +600,7 @@ static int maildir_parse_entry (CONTEXT * ctx, struct maildir ***last, if (ctx->magic == M_MH) h = maildir_parse_message (ctx->magic, buf, is_old, NULL); else { - h = mutt_new_header (); + h = header_new(); h->old = is_old; maildir_parse_flags (h, buf); } @@ -648,9 +622,6 @@ static int maildir_parse_entry (CONTEXT * ctx, struct maildir ***last, entry = p_new(struct maildir, 1); entry->h = h; entry->header_parsed = (ctx->magic == M_MH); -#ifdef USE_INODESORT - entry->inode = inode; -#endif /* USE_INODESORT */ **last = entry; *last = &entry->next; @@ -686,10 +657,10 @@ static int maildir_parse_dir (CONTEXT * ctx, struct maildir ***last, if (subdir) { snprintf (buf, sizeof (buf), "%s/%s", ctx->path, subdir); - is_old = (str_cmp ("cur", subdir) == 0); + is_old = (m_strcmp("cur", subdir) == 0); } else - strfcpy (buf, ctx->path, sizeof (buf)); + m_strcpy(buf, sizeof(buf), ctx->path); if ((dirp = opendir (buf)) == NULL) return -1; @@ -702,7 +673,6 @@ static int maildir_parse_dir (CONTEXT * ctx, struct maildir ***last, /* FOO - really ignore the return value? */ - debug_print (2, ("parsing %s\n", de->d_name)); maildir_parse_entry (ctx, last, subdir, de->d_name, count, is_old, #if HAVE_DIRENT_D_INO de->d_ino @@ -722,12 +692,7 @@ static int maildir_add_to_context (CONTEXT * ctx, struct maildir *md) while (md) { - debug_print (2, ("considering %s\n", NONULL (md->canon_fname))); - if (md->h) { - 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); @@ -759,91 +724,10 @@ static int maildir_move_to_context (CONTEXT * ctx, struct maildir **md) return r; } -#ifdef USE_INODESORT -/* - * Merge two maildir lists according to the inode numbers. - */ -static struct maildir *maildir_merge_inode (struct maildir *left, - struct maildir *right) -{ - struct maildir *head; - struct maildir *tail; - - if (left && right) { - if (left->inode < right->inode) { - head = left; - left = left->next; - } - else { - head = right; - right = right->next; - } - } - else { - if (left) - return left; - else - return right; - } - - tail = head; - - while (left && right) { - if (left->inode < right->inode) { - tail->next = left; - left = left->next; - } - else { - tail->next = right; - right = right->next; - } - tail = tail->next; - } - - if (left) { - tail->next = left; - } - else { - tail->next = right; - } - - return head; -} - -/* - * Sort maildir list according to inode. - */ -static struct maildir *maildir_sort_inode (struct maildir *list) -{ - struct maildir *left = list; - struct maildir *right = list; - - if (!list || !list->next) { - return list; - } - - list = list->next; - while (list && list->next) { - right = right->next; - list = list->next->next; - } - - list = right; - right = right->next; - list->next = 0; - - left = maildir_sort_inode (left); - right = maildir_sort_inode (right); - return maildir_merge_inode (left, right); -} -#endif /* USE_INODESORT */ - #ifdef USE_HCACHE -static size_t maildir_hcache_keylen (const char *fn) +static ssize_t maildir_hcache_keylen (const char *fn) { - const char *p = strchr (fn, ':'); - - return p ? (size_t) (p - fn) : m_strlen(fn); + return m_strchrnul(fn, ':') - fn; } #endif @@ -851,7 +735,7 @@ static size_t maildir_hcache_keylen (const char *fn) * This function does the second parsing pass for a maildir-style * folder. */ -void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) +static void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) { struct maildir *p; char fn[_POSIX_PATH_MAX]; @@ -903,7 +787,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) #endif } else - mutt_free_header (&p->h); + header_delete(&p->h); #ifdef USE_HCACHE p_delete(&data); #endif @@ -944,10 +828,6 @@ static int _mh_read_dir (CONTEXT * ctx, const char *subdir) mhs_free_sequences (&mhs); } -#ifdef USE_INODESORT - md = maildir_sort_inode (md); -#endif /* USE_INODESORT */ - if (ctx->magic == M_MAILDIR) maildir_delayed_parsing (ctx, md); @@ -975,17 +855,17 @@ static int maildir_read_dir (CONTEXT * ctx) * Open a new (temporary) message in an MH folder. */ -static int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) +static int mh_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr __attribute__ ((unused))) { return mh_mkstemp (dest, &msg->fp, &msg->path); } -int ch_compar (const void *a, const void *b) +static int ch_compar (const void *a, const void *b) { return (int) (*((const char *) a) - *((const char *) b)); } -static void maildir_flags (char *dest, size_t destlen, HEADER * hdr) +static void maildir_flags (char *dest, ssize_t destlen, HEADER * hdr) { *dest = '\0'; @@ -1043,26 +923,22 @@ static int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr *suffix = '\0'; if (hdr && (hdr->read || hdr->old)) - strfcpy (subdir, "cur", sizeof (subdir)); + m_strcpy(subdir, sizeof(subdir), "cur"); else - strfcpy (subdir, "new", sizeof (subdir)); + m_strcpy(subdir, sizeof(subdir), "new"); - FOREVER { + for (;;) { snprintf (path, _POSIX_PATH_MAX, "%s/tmp/%s.%ld.%u_%d.%s%s", dest->path, subdir, (long) time (NULL), (unsigned int) getpid (), Counter++, NONULL (Hostname), suffix); - debug_print (2, ("trying %s.\n", path)); - umask (Umask); if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1) { if (errno != EEXIST) { mutt_perror (path); return -1; } - } - else { - debug_print (2, ("success.\n")); + } else { msg->path = m_strdup(path); break; } @@ -1114,26 +990,24 @@ static int maildir_commit_message (MESSAGE * msg, CONTEXT * ctx, HEADER * hdr) /* extract the subdir */ s = strrchr (msg->path, '/') + 1; - strfcpy (subdir, s, 4); + m_strcpy(subdir, sizeof(subdir), s); /* extract the flags */ if ((s = strchr (s, ':'))) - strfcpy (suffix, s, sizeof (suffix)); + m_strcpy(suffix, sizeof(suffix), s); else suffix[0] = '\0'; /* construct a new file name. */ - FOREVER { + for (;;) { snprintf (path, _POSIX_PATH_MAX, "%s/%ld.%u_%d.%s%s", subdir, (long) time (NULL), (unsigned int) getpid (), Counter++, NONULL (Hostname), suffix); snprintf (full, _POSIX_PATH_MAX, "%s/%s", ctx->path, path); - 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); + m_strreplace(&hdr->path, path); p_delete(&msg->path); /* @@ -1213,13 +1087,13 @@ static int _mh_commit_message (MESSAGE * msg, CONTEXT * ctx, HEADER * hdr, * slot. */ - FOREVER { + for (;;) { hi++; snprintf (tmp, sizeof (tmp), "%d", hi); snprintf (path, sizeof (path), "%s/%s", ctx->path, tmp); if (safe_rename (msg->path, path) == 0) { if (hdr) - str_replace (&hdr->path, tmp); + m_strreplace(&hdr->path, tmp); p_delete(&msg->path); break; } @@ -1265,8 +1139,8 @@ static int mh_rewrite_message (CONTEXT * ctx, int msgno) if ((rc = mutt_copy_message (dest->fp, ctx, h, M_CM_UPDATE, CH_UPDATE | CH_UPDATE_LEN)) == 0) { - snprintf (oldpath, _POSIX_PATH_MAX, "%s/%s", ctx->path, h->path); - strfcpy (partpath, h->path, _POSIX_PATH_MAX); + snprintf (oldpath, sizeof(oldpath), "%s/%s", ctx->path, h->path); + m_strcpy(partpath, sizeof(partpath), h->path); if (ctx->magic == M_MAILDIR) rc = maildir_commit_message (dest, ctx, h); @@ -1298,7 +1172,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) - str_replace (&h->path, partpath); + m_strreplace(&h->path, partpath); } } else @@ -1310,7 +1184,7 @@ static int mh_rewrite_message (CONTEXT * ctx, int msgno) h->lines = old_hdr_lines; } - mutt_free_body (&h->content->parts); + body_list_wipe(&h->content->parts); return rc; } @@ -1347,11 +1221,10 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) char *p; if ((p = strrchr (h->path, '/')) == NULL) { - debug_print (1, ("%s: unable to find subdir!\n", h->path)); return (-1); } p++; - strfcpy (newpath, p, sizeof (newpath)); + m_strcpy(newpath, sizeof(newpath), p); /* kill the previous flags */ if ((p = strchr (newpath, ':')) != NULL) @@ -1364,7 +1237,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 (str_cmp (fullpath, oldpath) == 0) { + if (m_strcmp(fullpath, oldpath) == 0) { /* message hasn't really changed */ return 0; } @@ -1376,12 +1249,12 @@ static int maildir_sync_message (CONTEXT * ctx, int msgno) mutt_perror ("rename"); return (-1); } - str_replace (&h->path, partpath); + m_strreplace(&h->path, partpath); } return (0); } -static int mh_sync_mailbox (CONTEXT * ctx, int unused, int *index_hint) +static int mh_sync_mailbox (CONTEXT * ctx, int unused __attribute__ ((unused)), int *index_hint) { char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX]; int i, j; @@ -1474,14 +1347,14 @@ err: return -1; } -static char *maildir_canon_filename (char *dest, const char *src, size_t l) +static char *maildir_canon_filename (char *dest, const char *src, ssize_t l) { char *t, *u; if ((t = strrchr (src, '/'))) src = t + 1; - strfcpy (dest, src, l); + m_strcpy(dest, l, src); if ((u = strrchr (dest, ':'))) *u = '\0'; @@ -1556,7 +1429,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. */ -static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) +static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused __attribute__ ((unused))) { struct stat st_new; /* status of the "new" subdirectory */ struct stat st_cur; /* status of the "cur" subdirectory */ @@ -1629,8 +1502,8 @@ static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) /* check to see if the message has moved to a different * subdirectory. If so, update the associated filename. */ - if (str_cmp (ctx->hdrs[i]->path, p->h->path)) - str_replace (&ctx->hdrs[i]->path, p->h->path); + if (m_strcmp(ctx->hdrs[i]->path, p->h->path)) + m_strreplace(&ctx->hdrs[i]->path, p->h->path); /* if the user hasn't modified the flags on this message, update * the flags we just detected. @@ -1643,7 +1516,7 @@ static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) ctx->hdrs[i]->trash = p->h->trash; /* this is a duplicate of an existing header, so remove it */ - mutt_free_header (&p->h); + header_delete(&p->h); } /* This message was not in the list of messages we just scanned. * Check to see if we have enough information to know if the @@ -1693,7 +1566,7 @@ static int maildir_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) * */ -static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) +static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused __attribute__ ((unused))) { char buf[_POSIX_PATH_MAX]; struct stat st, st_cur; @@ -1707,7 +1580,7 @@ static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) if (!option (OPTCHECKNEW)) return 0; - strfcpy (buf, ctx->path, sizeof (buf)); + m_strcpy(buf, sizeof(buf), ctx->path); if (stat (buf, &st) == -1) return -1; @@ -1762,7 +1635,7 @@ static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) if (!ctx->hdrs[i]->changed) maildir_update_flags (ctx, ctx->hdrs[i], p->h); - mutt_free_header (&p->h); + header_delete(&p->h); } else /* message has disappeared */ occult = 1; @@ -1791,8 +1664,8 @@ static int mh_check_mailbox (CONTEXT * ctx, int *index_hint, int unused) * then again, it's called rarely. */ -FILE *_maildir_open_find_message (const char *folder, const char *unique, - const char *subfolder) +static FILE *_maildir_open_find_message (const char *folder, const char *unique, + const char *subfolder) { char dir[_POSIX_PATH_MAX]; char tunique[_POSIX_PATH_MAX]; @@ -1814,7 +1687,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 (!str_cmp (tunique, unique)) { + if (!m_strcmp(tunique, unique)) { snprintf (fname, sizeof (fname), "%s/%s/%s", folder, subfolder, de->d_name); fp = fopen (fname, "r"); /* __FOPEN_CHECKED__ */ @@ -1876,7 +1749,7 @@ static int maildir_check_empty (const char *path) DIR *dp; struct dirent *de; int r = 1; /* assume empty until we find a message */ - char realpath[_POSIX_PATH_MAX]; + char frealpath[_POSIX_PATH_MAX]; int iter = 0; /* Strategy here is to look for any file not beginning with a period */ @@ -1885,9 +1758,9 @@ static int maildir_check_empty (const char *path) /* we do "cur" on the first iteration since its more likely that we'll * find old messages without having to scan both subdirs */ - snprintf (realpath, sizeof (realpath), "%s/%s", path, + snprintf (frealpath, sizeof (frealpath), "%s/%s", path, iter == 0 ? "cur" : "new"); - if ((dp = opendir (realpath)) == NULL) + if ((dp = opendir (frealpath)) == NULL) return -1; while ((de = readdir (dp))) { if (*de->d_name != '.') { @@ -1908,7 +1781,7 @@ static int maildir_check_empty (const char *path) * 0 if there are messages in the mailbox * -1 on error */ -int mh_check_empty (const char *path) +static int mh_check_empty (const char *path) { DIR *dp; struct dirent *de;