X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=9a781dd73204b829f6989548667c4fb2cd7b77b8;hp=67326c95d70169750f91777d155ddef338cf0177;hb=e83ad1be25aefea3ed21ec08edbaf2d5a72c4a9d;hpb=74a2265af51ce89bca845adc1d68f273c9933c13 diff --git a/muttlib.c b/muttlib.c index 67326c9..9a781dd 100644 --- a/muttlib.c +++ b/muttlib.c @@ -15,7 +15,6 @@ #include "mutt.h" #include "mutt_curses.h" #include "mime.h" -#include "mailbox.h" #include "mx.h" #include "url.h" @@ -23,6 +22,7 @@ #ifdef USE_IMAP #include "imap.h" +#include "imap/mx_imap.h" #endif #include "mutt_crypt.h" @@ -30,6 +30,7 @@ #include "lib/mem.h" #include "lib/intl.h" #include "lib/str.h" +#include "lib/debug.h" #include #include @@ -170,13 +171,11 @@ void mutt_free_body (BODY ** p) if (b->parameter) mutt_free_parameter (&b->parameter); if (b->unlink && b->filename) { - dprint (1, (debugfile, "mutt_free_body: Unlinking %s.\n", b->filename)); + debug_print (1, ("unlinking %s.\n", b->filename)); unlink (b->filename); } else if (b->filename) - dprint (1, - (debugfile, "mutt_free_body: Not unlinking %s.\n", - b->filename)); + debug_print (1, ("not unlinking %s.\n", b->filename)); FREE (&b->filename); FREE (&b->content); @@ -363,10 +362,9 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '+': { #ifdef USE_IMAP - /* if folder = {host} or imap[s]://host/: don't append slash */ - if (mx_is_imap (NONULL (Maildir)) && - (Maildir[mutt_strlen (Maildir) - 1] == '}' || - Maildir[mutt_strlen (Maildir) - 1] == '/')) + /* if folder = imap[s]://host/: don't append slash */ + if (imap_is_magic (NONULL (Maildir), NULL) == M_IMAP && + Maildir[mutt_strlen (Maildir) - 1] == '/') strfcpy (p, NONULL (Maildir), sizeof (p)); else #endif @@ -458,13 +456,6 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) } while (recurse); -#ifdef USE_IMAP - /* Rewrite IMAP path in canonical form - aids in string comparisons of - * folders. May possibly fail, in which case s should be the same. */ - if (mx_is_imap (s)) - imap_expand_path (s, slen); -#endif - return (s); } @@ -534,7 +525,7 @@ void mutt_set_parameter (const char *attribute, const char *value, for (q = *p; q; q = q->next) { if (ascii_strcasecmp (attribute, q->attribute) == 0) { - mutt_str_replace (&q->value, value); + str_replace (&q->value, value); return; } } @@ -646,12 +637,53 @@ void mutt_free_envelope (ENVELOPE ** p) FREE (p); } +/* move all the headers from extra not present in base into base */ +void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra) +{ + /* copies each existing element if necessary, and sets the element + * to NULL in the source so that mutt_free_envelope doesn't leave us + * with dangling pointers. */ +#define MOVE_ELEM(h) if (!base->h) { base->h = (*extra)->h; (*extra)->h = NULL; } + MOVE_ELEM(return_path); + MOVE_ELEM(from); + MOVE_ELEM(to); + MOVE_ELEM(cc); + MOVE_ELEM(bcc); + MOVE_ELEM(sender); + MOVE_ELEM(reply_to); + MOVE_ELEM(mail_followup_to); + MOVE_ELEM(list_post); + MOVE_ELEM(message_id); + MOVE_ELEM(supersedes); + MOVE_ELEM(date); + MOVE_ELEM(x_label); + MOVE_ELEM(references); + MOVE_ELEM(in_reply_to); + /* real_subj is subordinate to subject */ + if (!base->subject) { + base->subject = (*extra)->subject; + base->real_subj = (*extra)->real_subj; + (*extra)->subject = NULL; + (*extra)->real_subj = NULL; + } + /* spam and user headers should never be hashed, and the new envelope may + * have better values. Use new versions regardless. */ + mutt_buffer_free (&base->spam); + mutt_free_list (&base->userhdrs); + MOVE_ELEM(spam); + MOVE_ELEM(userhdrs); +#undef MOVE_ELEM + + mutt_free_envelope(extra); +} + void _mutt_mktemp (char *s, const char *src, int line) { - snprintf (s, _POSIX_PATH_MAX, "%s/mutt-%s-%d-%d-%d", NONULL (Tempdir), - NONULL (Hostname), (int) getuid (), (int) getpid (), Counter++); - dprint (1, - (debugfile, "%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s)); + + snprintf (s, _POSIX_PATH_MAX, "%s/muttng-%s-%d-%d-%d-%x%x", NONULL (Tempdir), + NONULL (Hostname), (int) getuid (), (int) getpid (), Counter++, + (unsigned int) rand(), (unsigned int) rand()); + debug_print (1, ("%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s)); unlink (s); } @@ -709,12 +741,12 @@ void mutt_pretty_mailbox (char *s) } *q = 0; - if (mutt_strncmp (s, Maildir, (len = mutt_strlen (Maildir))) == 0 && + if (safe_strncmp (s, Maildir, (len = mutt_strlen (Maildir))) == 0 && s[len] == '/') { *s++ = '='; memmove (s, s + len, mutt_strlen (s + len) + 1); } - else if (mutt_strncmp (s, Homedir, (len = mutt_strlen (Homedir))) == 0 && + else if (safe_strncmp (s, Homedir, (len = mutt_strlen (Homedir))) == 0 && s[len] == '/') { *s++ = '~'; memmove (s, s + len - 1, mutt_strlen (s + len - 1) + 1); @@ -815,7 +847,7 @@ int mutt_check_overwrite (const char *attname, const char *path, (_("File is a directory, save under it? [(y)es, (n)o, (a)ll]"), _("yna"))) { case 3: /* all */ - mutt_str_replace (directory, fname); + str_replace (directory, fname); break; case 1: /* yes */ FREE (directory); @@ -875,7 +907,7 @@ void mutt_save_path (char *d, size_t dsize, ADDRESS * a) if ((p = strpbrk (d, "%@"))) *p = 0; } - mutt_strlower (d); + str_tolower (d); } else *d = 0; @@ -1058,7 +1090,7 @@ void mutt_FormatString (char *dest, /* output buffer */ data, flags); if (tolower) - mutt_strlower (buf); + str_tolower (buf); if (nodots) { char *p = buf; @@ -1432,45 +1464,11 @@ const char *mutt_make_version (void) { static char vstring[STRING]; - snprintf (vstring, sizeof (vstring), "Mutt-ng %s (%s)", + snprintf (vstring, sizeof (vstring), "Mutt-ng %s (%s) based on Mutt 1.5.9", MUTT_VERSION, ReleaseDate); return vstring; } -REGEXP *mutt_compile_regexp (const char *s, int flags) -{ - REGEXP *pp = safe_calloc (sizeof (REGEXP), 1); - - pp->pattern = safe_strdup (s); - pp->rx = safe_calloc (sizeof (regex_t), 1); - if (REGCOMP (pp->rx, NONULL (s), flags) != 0) - mutt_free_regexp (&pp); - - return pp; -} - -void mutt_free_regexp (REGEXP ** pp) -{ - FREE (&(*pp)->pattern); - regfree ((*pp)->rx); - FREE (&(*pp)->rx); - FREE (pp); -} - -void mutt_free_rx_list (RX_LIST ** list) -{ - RX_LIST *p; - - if (!list) - return; - while (*list) { - p = *list; - *list = (*list)->next; - mutt_free_regexp (&p->rx); - FREE (&p); - } -} - void mutt_free_spam_list (SPAM_LIST ** list) { SPAM_LIST *p; @@ -1480,29 +1478,12 @@ void mutt_free_spam_list (SPAM_LIST ** list) while (*list) { p = *list; *list = (*list)->next; - mutt_free_regexp (&p->rx); + rx_free (&p->rx); FREE(&p->template); FREE(&p); } } -int mutt_match_rx_list (const char *s, RX_LIST * l) -{ - if (!s) - return 0; - - for (; l; l = l->next) { - if (regexec (l->rx->rx, s, (size_t) 0, (regmatch_t *) 0, (int) 0) == 0) { - dprint (5, - (debugfile, "mutt_match_rx_list: %s matches %s\n", s, - l->rx->pattern)); - return 1; - } - } - - return 0; -} - int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) { static regmatch_t *pmatch = NULL; @@ -1526,12 +1507,7 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) if (regexec (l->rx->rx, s, (size_t) l->nmatch, (regmatch_t *) pmatch, (int) 0) == 0) { - dprint (5, - (debugfile, "mutt_match_spam_list: %s matches %s\n", s, - l->rx->pattern)); - dprint (5, - (debugfile, "mutt_match_spam_list: %d subs\n", - l->rx->rx->re_nsub)); + debug_print (5, ("%s matches %s\n%d subst", s, l->rx->pattern, l->rx->rx->re_nsub)); /* Copy template into text, with substitutions. */ for (p = l->template; *p;) { @@ -1547,7 +1523,7 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) } } text[tlen] = '\0'; - dprint (5, (debugfile, "mutt_match_spam_list: \"%s\"\n", text)); + debug_print (5, ("\"%s\"\n", text)); return 1; } }