X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=recvattach.c;h=74a59fa2ced442d82a37e1e78ecbe85980db1b60;hp=2c65fae5f9d8aa55779eebde076f5ff1b8184f18;hb=916e4872caf252a5850e64f79427b9dd7808435d;hpb=df70e07e24add1869bcc9b7af2277d9d0c09a281 diff --git a/recvattach.c b/recvattach.c index 2c65fae..74a59fa 100644 --- a/recvattach.c +++ b/recvattach.c @@ -1,45 +1,31 @@ /* + * Copyright notice from original mutt: * Copyright (C) 1996-2000 Michael R. Elkins * Copyright (C) 1999-2000 Thomas Roessler - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include + +#include + +#include +#include +#include +#include + +#include #include "mutt.h" -#include "mutt_curses.h" -#include "mutt_menu.h" -#include "rfc1524.h" -#include "mime.h" -#include "mailbox.h" +#include "handler.h" +#include "recvattach.h" #include "attach.h" -#include "mapping.h" -#include "mx.h" #include "copy.h" -#include "mutt_crypt.h" +#include -#include -#include -#include -#include -#include -#include -#include static const char *Mailbox_is_read_only = N_("Mailbox is read-only."); static char LastSaveFolder[_POSIX_PATH_MAX] = ""; @@ -51,18 +37,20 @@ static char LastSaveFolder[_POSIX_PATH_MAX] = ""; break; \ } +#define SW (option(OPTMBOXPANE)?SidebarWidth:0) + static struct mapping_t AttachHelp[] = { {N_("Exit"), OP_EXIT}, {N_("Save"), OP_SAVE}, {N_("Pipe"), OP_PIPE}, {N_("Print"), OP_PRINT}, {N_("Help"), OP_HELP}, - {NULL} + {NULL, OP_NULL} }; -int mutt_extract_path (char *filename, char *path) +static int mutt_extract_path (char *filename, char *path) { - char *tmp = safe_malloc (sizeof (char) * _POSIX_PATH_MAX); + char *tmp = p_new(char, _POSIX_PATH_MAX); char *help_ptr; help_ptr = tmp; @@ -76,7 +64,7 @@ int mutt_extract_path (char *filename, char *path) } *help_ptr++ = *filename++; } - FREE (&tmp); + p_delete(&tmp); return 0; } @@ -88,7 +76,7 @@ void mutt_update_tree (ATTACHPTR ** idx, short idxlen) for (x = 0; x < idxlen; x++) { idx[x]->num = x; - if (2 * (idx[x]->level + 2) < sizeof (buf)) { + if (2 * (idx[x]->level + 2) < ssizeof (buf)) { if (idx[x]->level) { s = buf + 2 * (idx[x]->level - 1); *s++ = (idx[x]->content->next) ? M_TREE_LTEE : M_TREE_LLCORNER; @@ -101,13 +89,13 @@ void mutt_update_tree (ATTACHPTR ** idx, short idxlen) } if (idx[x]->tree) { - if (mutt_strcmp (idx[x]->tree, buf) != 0) - mutt_str_replace (&idx[x]->tree, buf); + if (m_strcmp(idx[x]->tree, buf) != 0) + m_strreplace(&idx[x]->tree, buf); } else - idx[x]->tree = safe_strdup (buf); + idx[x]->tree = m_strdup(buf); - if (2 * (idx[x]->level + 2) < sizeof (buf) && idx[x]->level) { + if (2 * (idx[x]->level + 2) < ssizeof (buf) && idx[x]->level) { s = buf + 2 * (idx[x]->level - 1); *s++ = (idx[x]->content->next) ? '\005' : '\006'; *s++ = '\006'; @@ -126,7 +114,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m, for (; m; m = m->next) { if (*idxlen == *idxmax) { - safe_realloc (&idx, sizeof (ATTACHPTR *) * ((*idxmax) += 5)); + p_realloc(&idx, (*idxmax) += 5); for (i = *idxlen; i < *idxmax; i++) idx[i] = NULL; } @@ -135,8 +123,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m, && (compose || (parent_type == -1 && ascii_strcasecmp ("alternative", m->subtype))) - && (!(WithCrypto & APPLICATION_PGP) - || !mutt_is_multipart_encrypted (m)) + && (!mutt_is_multipart_encrypted (m)) ) { idx = mutt_gen_attach_list (m->parts, m->type, idx, idxlen, idxmax, level, @@ -144,7 +131,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m, } else { if (!idx[*idxlen]) - idx[*idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR)); + idx[*idxlen] = p_new(ATTACHPTR, 1); new = idx[(*idxlen)++]; new->content = m; @@ -153,14 +140,12 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m, new->level = level; /* We don't support multipart messages in the compose menu yet */ - if (!compose && !m->collapsed && - ((m->type == TYPEMULTIPART && (!(WithCrypto & APPLICATION_PGP) - || !mutt_is_multipart_encrypted (m)) - ) - || mutt_is_message_type (m->type, m->subtype))) { - idx = - mutt_gen_attach_list (m->parts, m->type, idx, idxlen, idxmax, - level + 1, compose); + if (!compose && !m->collapsed + && ((m->type == TYPEMULTIPART && !mutt_is_multipart_encrypted(m)) + || mutt_is_message_type (m->type, m->subtype))) + { + idx = mutt_gen_attach_list (m->parts, m->type, idx, idxlen, idxmax, + level + 1, compose); } } } @@ -187,7 +172,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m, * %u = unlink */ const char *mutt_attach_fmt (char *dest, - size_t destlen, + ssize_t destlen, char op, const char *src, const char *prefix, @@ -200,7 +185,7 @@ const char *mutt_attach_fmt (char *dest, char charset[SHORT_STRING]; ATTACHPTR *aptr = (ATTACHPTR *) data; int optional = (flags & M_FORMAT_OPTIONAL); - size_t l; + ssize_t l; switch (op) { case 'C': @@ -260,7 +245,7 @@ const char *mutt_attach_fmt (char *dest, if (aptr->content->filename && *aptr->content->filename == '/') { char path[_POSIX_PATH_MAX]; - strfcpy (path, aptr->content->filename, sizeof (path)); + m_strcpy(path, sizeof(path), aptr->content->filename); mutt_pretty_mailbox (path); mutt_format_s (dest, destlen, prefix, path); } @@ -304,6 +289,14 @@ const char *mutt_attach_fmt (char *dest, snprintf (dest, destlen, fmt, aptr->num + 1); } break; + case 'Q': + if (optional) + optional = aptr->content->attach_qualifies; + else { + snprintf (fmt, sizeof (fmt), "%%%sc", prefix); + mutt_format_s (dest, destlen, fmt, "Q"); + } + break; case 's': if (flags & M_FORMAT_STAT_FILE) { struct stat st; @@ -340,6 +333,14 @@ const char *mutt_attach_fmt (char *dest, else if (!aptr->content->unlink) optional = 0; break; + case 'X': + if (optional) + optional = (aptr->content->attach_count + aptr->content->attach_qualifies) != 0; + else { + snprintf (fmt, sizeof (fmt), "%%%sd", prefix); + snprintf (dest, destlen, fmt, aptr->content->attach_count + aptr->content->attach_qualifies); + } + break; default: *dest = 0; } @@ -351,9 +352,10 @@ const char *mutt_attach_fmt (char *dest, return (src); } -void attach_entry (char *b, size_t blen, MUTTMENU * menu, int num) +static void attach_entry (char *b, ssize_t blen, MUTTMENU * menu, int num) { - mutt_FormatString (b, blen, NONULL (AttachFormat), mutt_attach_fmt, + int w=(COLS-SW)>blen?blen:(COLS-SW); + mutt_FormatString (b, w, NONULL (AttachFormat), mutt_attach_fmt, (unsigned long) (((ATTACHPTR **) menu->data)[num]), M_FORMAT_ARROWCURSOR); } @@ -390,10 +392,10 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr, if (body->filename) { if (directory && *directory) - mutt_concat_path (buf, *directory, mutt_basename (body->filename), - sizeof (buf)); + mutt_concat_path(buf, sizeof(buf), *directory, + mutt_basename(body->filename)); else - strfcpy (buf, body->filename, sizeof (buf)); + m_strcpy(buf, sizeof(buf), body->filename); } else if (body->hdr && body->encoding != ENCBASE64 && @@ -415,7 +417,7 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr, char tmpbuf[_POSIX_PATH_MAX]; snprintf (tmpbuf, sizeof (tmpbuf), "%s%s", LastSaveFolder, buf); - strfcpy (buf, tmpbuf, sizeof (buf)); + m_strcpy(buf, sizeof(buf), tmpbuf); ret = mutt_get_field (_("Save to file: ") , buf, sizeof (buf), M_FILE); if ((ret != 0) || (!buf[0])) @@ -423,7 +425,7 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr, } else { mutt_extract_path (buf, path); - strfcpy (LastSaveFolder, path, sizeof (LastSaveFolder)); + m_strcpy(LastSaveFolder, sizeof(LastSaveFolder), path); } prompt = NULL; @@ -445,7 +447,7 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr, } else if (rc == -1) return -1; - strfcpy (tfile, buf, sizeof (tfile)); + m_strcpy(tfile, sizeof(tfile), buf); } else { if ((rc = @@ -492,7 +494,7 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr, if (!buf[0]) { int append = 0; - strfcpy (buf, NONULL (top->filename), sizeof (buf)); + m_strcpy(buf, sizeof(buf), NONULL(top->filename)); if (mutt_get_field (_("Save to file: "), buf, sizeof (buf), M_FILE | M_CLEAR) != 0 || !buf[0]) return; @@ -503,14 +505,14 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr, rc = mutt_save_attachment (fp, top, tfile, append, hdr); if (rc == 0 && AttachSep && (fpout = fopen (tfile, "a")) != NULL) { fprintf (fpout, "%s", AttachSep); - fclose (fpout); + m_fclose(&fpout); } } else { rc = mutt_save_attachment (fp, top, tfile, M_SAVE_APPEND, hdr); if (rc == 0 && AttachSep && (fpout = fopen (tfile, "a")) != NULL) { fprintf (fpout, "%s", AttachSep); - fclose (fpout); + m_fclose(&fpout); } } } @@ -533,7 +535,7 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr, break; } - FREE (&directory); + p_delete(&directory); if (tag && menu) { menu->oldcurrent = menu->current; @@ -547,12 +549,12 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr, } static void -mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int filter) +mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int afilter) { char tfile[_POSIX_PATH_MAX]; char warning[STRING + _POSIX_PATH_MAX]; - if (filter) { + if (afilter) { snprintf (warning, sizeof (warning), _("WARNING! You are about to overwrite %s, continue?"), body->filename); @@ -566,7 +568,7 @@ mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int filter) tfile[0] = 0; if (mutt_pipe_attachment (fp, body, command, tfile)) { - if (filter) { + if (afilter) { mutt_unlink (body->filename); mutt_rename_file (tfile, body->filename); mutt_update_encoding (body); @@ -574,7 +576,7 @@ mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int filter) } } else { - if (filter && tfile[0]) + if (afilter && tfile[0]) mutt_unlink (tfile); } } @@ -595,7 +597,7 @@ static void pipe_attachment (FILE * fp, BODY * b, STATE * state) return; } mutt_copy_stream (ifp, state->fpout); - fclose (ifp); + m_fclose(&ifp); if (AttachSep) state_puts (AttachSep, state); } @@ -603,50 +605,50 @@ static void pipe_attachment (FILE * fp, BODY * b, STATE * state) static void pipe_attachment_list (char *command, FILE * fp, int tag, BODY * top, - int filter, STATE * state) + int afilter, STATE * state) { for (; top; top = top->next) { if (!tag || top->tagged) { - if (!filter && !option (OPTATTACHSPLIT)) + if (!afilter && !option (OPTATTACHSPLIT)) pipe_attachment (fp, top, state); else - mutt_query_pipe_attachment (command, fp, top, filter); + mutt_query_pipe_attachment (command, fp, top, afilter); } else if (top->parts) - pipe_attachment_list (command, fp, tag, top->parts, filter, state); + pipe_attachment_list (command, fp, tag, top->parts, afilter, state); if (!tag) break; } } -void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int filter) +void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int afilter) { STATE state; char buf[SHORT_STRING]; pid_t thepid; if (fp) - filter = 0; /* sanity check: we can't filter in the recv case yet */ + afilter = 0; /* sanity check: we can't filter in the recv case yet */ buf[0] = 0; - memset (&state, 0, sizeof (STATE)); + p_clear(&state, 1); - if (mutt_get_field ((filter ? _("Filter through: ") : _("Pipe to: ")), + if (mutt_get_field ((afilter ? _("Filter through: ") : _("Pipe to: ")), buf, sizeof (buf), M_CMD) != 0 || !buf[0]) return; mutt_expand_path (buf, sizeof (buf)); - if (!filter && !option (OPTATTACHSPLIT)) { + if (!afilter && !option (OPTATTACHSPLIT)) { mutt_endwin (NULL); thepid = mutt_create_filter (buf, &state.fpout, NULL, NULL); - pipe_attachment_list (buf, fp, tag, top, filter, &state); - fclose (state.fpout); + pipe_attachment_list (buf, fp, tag, top, afilter, &state); + m_fclose(&state.fpout); if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY)) mutt_any_key_to_continue (NULL); } else - pipe_attachment_list (buf, fp, tag, top, filter, &state); + pipe_attachment_list (buf, fp, tag, top, afilter, &state); } static int can_print (BODY * top, int tag) @@ -699,7 +701,7 @@ static void print_attachment_list (FILE * fp, int tag, BODY * top, 0) { if ((ifp = fopen (newfile, "r")) != NULL) { mutt_copy_stream (ifp, state->fpout); - fclose (ifp); + m_fclose(&ifp); if (AttachSep) state_puts (AttachSep, state); } @@ -733,10 +735,10 @@ void mutt_print_attachment_list (FILE * fp, int tag, BODY * top) if (!can_print (top, tag)) return; mutt_endwin (NULL); - memset (&state, 0, sizeof (STATE)); + p_clear(&state, 1); thepid = mutt_create_filter (NONULL (PrintCmd), &state.fpout, NULL, NULL); print_attachment_list (fp, tag, top, &state); - fclose (state.fpout); + m_fclose(&state.fpout); if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY)) mutt_any_key_to_continue (NULL); } @@ -744,7 +746,7 @@ void mutt_print_attachment_list (FILE * fp, int tag, BODY * top) print_attachment_list (fp, tag, top, &state); } -void +static void mutt_update_attach_index (BODY * cur, ATTACHPTR *** idxp, short *idxlen, short *idxmax, MUTTMENU * menu) { @@ -821,8 +823,7 @@ mutt_attach_display_loop (MUTTMENU * menu, int op, FILE * fp, HEADER * hdr, break; /* functions which are passed through from the pager */ case OP_CHECK_TRADITIONAL: - if (!(WithCrypto & APPLICATION_PGP) - || (hdr && hdr->security & PGP_TRADITIONAL_CHECKED)) { + if (hdr && hdr->security & PGP_TRADITIONAL_CHECKED) { op = OP_NULL; break; } @@ -892,7 +893,7 @@ void mutt_view_attachments (HEADER * hdr) char helpstr[SHORT_STRING]; MUTTMENU *menu; - BODY *cur; + BODY *cur = NULL; MESSAGE *msg; FILE *fp; ATTACHPTR **idx = NULL; @@ -910,17 +911,16 @@ void mutt_view_attachments (HEADER * hdr) return; - if (WithCrypto && ((hdr->security & ENCRYPT) || - (mutt_is_application_smime (hdr->content) & - SMIMEOPAQUE))) { + if ((hdr->security & ENCRYPT) || + (mutt_is_application_smime (hdr->content) & SMIMEOPAQUE)) + { need_secured = 1; if ((hdr->security & ENCRYPT) && !crypt_valid_passphrase (hdr->security)) { mx_close_message (&msg); return; } - if ((WithCrypto & APPLICATION_SMIME) - && (hdr->security & APPLICATION_SMIME)) { + if (hdr->security & APPLICATION_SMIME) { if (hdr->env) crypt_smime_getkeys (hdr->env); @@ -937,14 +937,14 @@ void mutt_view_attachments (HEADER * hdr) cur = NULL; secured = !crypt_smime_decrypt_mime (_fp, &fp, _cur, &cur); - mutt_free_body (&_cur); - safe_fclose (&_fp); + body_list_wipe(&_cur); + m_fclose(&_fp); } } else need_secured = 0; } - if ((WithCrypto & APPLICATION_PGP) && (hdr->security & APPLICATION_PGP)) { + if (hdr->security & APPLICATION_PGP) { if (mutt_is_multipart_encrypted (hdr->content)) secured = !crypt_pgp_decrypt_mime (msg->fp, &fp, hdr->content, &cur); else @@ -959,7 +959,7 @@ void mutt_view_attachments (HEADER * hdr) } } - if (!WithCrypto || !need_secured) { + if (!need_secured) { fp = msg->fp; cur = hdr->content; } @@ -976,7 +976,7 @@ void mutt_view_attachments (HEADER * hdr) attach_collapse (cur, 0, 1, 0); mutt_update_attach_index (cur, &idx, &idxlen, &idxmax, menu); - FOREVER { + for (;;) { if (op == OP_NULL) op = mutt_menuLoop (menu); switch (op) { @@ -1018,21 +1018,19 @@ void mutt_view_attachments (HEADER * hdr) break; case OP_EXTRACT_KEYS: - if ((WithCrypto & APPLICATION_PGP)) { - crypt_pgp_extract_keys_from_attachment_list (fp, menu->tagprefix, - menu-> - tagprefix ? cur : - idx[menu->current]-> - content); - menu->redraw = REDRAW_FULL; - } + crypt_pgp_extract_keys_from_attachment_list (fp, menu->tagprefix, + menu-> + tagprefix ? cur : + idx[menu->current]-> + content); + menu->redraw = REDRAW_FULL; break; case OP_CHECK_TRADITIONAL: - if ((WithCrypto & APPLICATION_PGP) - && crypt_pgp_check_traditional (fp, menu->tagprefix ? cur + if (crypt_pgp_check_traditional (fp, menu->tagprefix ? cur : idx[menu->current]->content, - menu->tagprefix)) { + menu->tagprefix)) + { hdr->security = crypt_query (cur); menu->redraw = REDRAW_FULL; } @@ -1065,14 +1063,12 @@ void mutt_view_attachments (HEADER * hdr) case OP_DELETE: CHECK_READONLY; -#ifdef USE_POP if (Context->magic == M_POP) { mutt_flushinp (); mutt_error _("Can't delete attachment from POP server."); break; } -#endif #ifdef USE_NNTP if (Context->magic == M_NNTP) { @@ -1083,10 +1079,9 @@ void mutt_view_attachments (HEADER * hdr) } #endif - if (WithCrypto && hdr->security) { + if (hdr->security & (~PGP_TRADITIONAL_CHECKED)) { mutt_message - _ - ("Deletion of attachments from encrypted messages is unsupported."); + _("Deletion of attachments from encrypted messages is unsupported."); } else { if (!menu->tagprefix) { @@ -1181,7 +1176,7 @@ void mutt_view_attachments (HEADER * hdr) CHECK_ATTACH; if (!idx[menu->current]->content->hdr->env->followup_to || - mutt_strcasecmp (idx[menu->current]->content->hdr->env->followup_to, + m_strcasecmp(idx[menu->current]->content->hdr->env->followup_to, "poster") || query_quadoption (OPT_FOLLOWUPTOPOSTER, _("Reply by mail as poster prefers?")) != @@ -1224,17 +1219,17 @@ void mutt_view_attachments (HEADER * hdr) hdr->attach_del = 1; if (idx[idxmax]->content) idx[idxmax]->content->aptr = NULL; - FREE (&idx[idxmax]->tree); - FREE (&idx[idxmax]); + p_delete(&idx[idxmax]->tree); + p_delete(&idx[idxmax]); } if (hdr->attach_del) hdr->changed = 1; - FREE (&idx); + p_delete(&idx); idxmax = 0; - if (WithCrypto && need_secured && secured) { - fclose (fp); - mutt_free_body (&cur); + if (need_secured && secured) { + m_fclose(&fp); + body_list_wipe(&cur); } mutt_menuDestroy (&menu);