#include <lib-sys/unix.h>
#include <lib-mime/mime.h>
-#include <lib-ui/curses.h>
+#include <lib-ui/lib-ui.h>
#include <lib-ui/menu.h>
#include <lib-mx/mx.h>
#include "keymap.h"
#include "pager.h"
#include "copy.h"
-#include <lib-crypt/crypt.h>
+#include "crypt.h"
int mutt_get_tmp_attachment (BODY * a)
{
/* Remove headers by copying out data to another file, then
* copying the file back */
fseeko (fp, b->offset, 0);
- tfp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ tfp = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL);
if (!tfp) {
mutt_perror (_("Failure to open file to strip headers."));
goto bailout;
}
else if (a->type == TYPETEXT) {
/* On text, default to editor */
- mutt_edit_file (NONULL (Editor), a->filename);
+ mutt_edit_file(a->filename);
} else {
rfc1524_entry_delete(&entry);
mutt_error (_("No mailcap edit entry for %s"), type);
int mutt_is_autoview (BODY * b, const char *type)
{
string_list_t *t = AutoViewList;
- char _type[SHORT_STRING];
+ char _type[STRING];
int i;
if (!type)
int pagerfd = -1;
is_message = mutt_is_message_type(a);
- if (is_message && a->hdr && (a->hdr->security & ENCRYPT) &&
- !crypt_valid_passphrase (a->hdr->security))
- return (rc);
use_mailcap = (flag == M_MAILCAP ||
(flag == M_REGULAR && rfc1524_mailcap_isneeded(a)));
snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);
if (use_pager) {
/* recv case */
- pagerfd = m_tempfd(pagerfile, sizeof(pagerfile), NONULL(Tempdir),
+ pagerfd = m_tempfd(pagerfile, sizeof(pagerfile), NONULL(mod_core.tmpdir),
fp && !use_mailcap ? a->filename : NULL);
}
/* Don't use mailcap; the attachment is viewed in the pager */
if (flag == M_AS_TEXT) {
+ unlink(pagerfile);
+ close(pagerfd);
/* just let me see the raw data */
if (mutt_save_attachment (fp, a, pagerfile, 0, NULL))
goto return_error;
/* Use built-in handler */
set_option (OPTVIEWATTACH); /* disable the "use 'v' to view this part"
* message in case of error */
- if (mutt_decode_save_attachment (fp, a, pagerfile, M_DISPLAY, 0)) {
+ if (mutt_decode_save_attachment (fp, a, pagerfd, M_DISPLAY)) {
unset_option (OPTVIEWATTACH);
goto return_error;
}
/* We only reach this point if there have been no errors */
if (use_pager) {
- pager_t info;
- p_clear(&info, 1);
-
- info.fp = fp;
- info.bdy = a;
- info.ctx = Context;
- info.idx = idx;
- info.idxlen = idxlen;
- info.hdr = hdr;
-
- rc = mutt_do_pager(descrip, pagerfile,
- M_PAGER_ATTACHMENT | (is_message ? M_PAGER_MESSAGE : 0),
- &info);
+ pager_t info = { Context, hdr, a, fp, idx, idxlen };
+ rc = mutt_pager(descrip, pagerfile,
+ M_PAGER_ATTACHMENT | (is_message ? M_PAGER_MESSAGE : 0),
+ &info);
*pagerfile = '\0';
}
else
}
/* returns 1 on success, 0 on error */
-int mutt_pipe_attachment (FILE * fp, BODY * b, const char *path,
- char *outfile)
+int mutt_pipe_attachment(FILE * fp, BODY * b, const char *path, int out)
{
pid_t thepid;
- int out = -1;
int rv = 0;
- if (outfile && *outfile)
- if ((out = safe_open (outfile, O_CREAT | O_EXCL | O_WRONLY)) < 0) {
- mutt_perror ("open");
- return 0;
- }
-
mutt_endwin (NULL);
if (fp) {
STATE s;
p_clear(&s, 1);
- if (outfile && *outfile)
+ if (out >= 0)
thepid = mutt_create_filter_fd(path, &s.fpout, NULL, NULL, -1, out, -1);
else
thepid = mutt_create_filter(path, &s.fpout, NULL, NULL);
s.fpin = fp;
mutt_decode_attachment (b, &s);
m_fclose(&s.fpout);
- }
- else {
+ } else {
/* send case */
FILE *ifp, *ofp;
if ((ifp = fopen (b->filename, "r")) == NULL) {
mutt_perror ("fopen");
- if (outfile && *outfile) {
- close (out);
- unlink (outfile);
- }
return 0;
}
- if (outfile && *outfile)
- thepid = mutt_create_filter_fd (path, &ofp, NULL, NULL, -1, out, -1);
+ if (out >= 0)
+ thepid = mutt_create_filter_fd(path, &ofp, NULL, NULL, -1, out, -1);
else
- thepid = mutt_create_filter (path, &ofp, NULL, NULL);
+ thepid = mutt_create_filter(path, &ofp, NULL, NULL);
if (thepid < 0) {
mutt_perror (_("Can't create filter"));
bail:
- if (outfile && *outfile)
- close (out);
+ if (out >= 0)
+ close(out);
/*
* check for error exit from child process
*/
- if (mutt_wait_filter (thepid) != 0)
+ if (mutt_wait_filter(thepid) != 0)
rv = 0;
- if (rv == 0 || option (OPTWAITKEY))
+ if (rv == 0 || option(OPTWAITKEY))
mutt_any_key_to_continue (NULL);
return rv;
}
mx_close_mailbox (&ctx, NULL);
return -1;
}
- if (ctx.magic == M_MBOX || ctx.magic == M_MMDF)
+ if (ctx.magic == M_MBOX)
chflags = CH_FROM;
chflags |= (ctx.magic == M_MAILDIR ? CH_NOSTATUS : CH_UPDATE);
if (_mutt_copy_message (msg->fp, fp, hn, hn->content, 0, chflags) == 0
}
/* returns 0 on success, -1 on error */
-int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
- int displaying, int flags)
+int mutt_decode_save_attachment (FILE * fp, BODY * m, int pathfd,
+ int displaying)
{
STATE s;
unsigned int saved_encoding = 0;
p_clear(&s, 1);
s.flags = displaying;
-
- if (flags == M_SAVE_APPEND)
- s.fpout = fopen (path, "a");
- else
- s.fpout = safe_fopen (path, "w");
+ s.fpout = fdopen (pathfd, "w");
if (s.fpout == NULL) {
+ close(pathfd);
mutt_perror ("fopen");
return (-1);
}
pid_t thepid;
FILE *ifp, *fpout;
short unlink_newfile = 0;
+ int tok;
snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);
return (1);
}
- if (!ascii_strcasecmp ("text/plain", type) ||
- !ascii_strcasecmp ("application/postscript", type)) {
- return (mutt_pipe_attachment (fp, a, NONULL (PrintCmd), NULL));
+ tok = mime_which_token(type, -1);
+ if (tok == MIME_TEXT_PLAIN || tok == MIME_APPLICATION_POSTSCRIPT) {
+ return mutt_pipe_attachment(fp, a, NONULL (PrintCmd), -1);
}
- else if (mutt_can_decode (a)) {
+
+ if (mutt_can_decode (a)) {
/* decode and print */
int rc = 0;
+ int newfile_fd = 0;
ifp = NULL;
fpout = NULL;
- mutt_mktemp (newfile);
- if (mutt_decode_save_attachment (fp, a, newfile, M_PRINTING, 0) == 0) {
+ newfile_fd = m_tempfd(newfile, sizeof(newfile), NONULL(mod_core.tmpdir), NULL);
+ if (mutt_decode_save_attachment (fp, a, newfile_fd, M_PRINTING) == 0) {
- if ((ifp = fopen (newfile, "r")) == NULL) {
+ if ((ifp = fopen(newfile, "r")) == NULL) {
mutt_perror ("fopen");
goto bail0;
}
goto bail0;
}
- mutt_copy_stream (ifp, fpout);
-
+ mutt_copy_stream(ifp, fpout);
m_fclose(&fpout);
m_fclose(&ifp);
m_fclose(&fpout);
mutt_unlink (newfile);
return rc;
- }
- else {
+ } else {
mutt_error _("I don't know how to print that!");
return 0;