/*
* Copyright notice from original mutt:
* Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
*
* 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 "mutt.h"
#include "ascii.h"
#include "mutt_crypt.h"
#include "mutt_idna.h"
#include "lib/intl.h"
#include "lib/debug.h"
#include <sys/stat.h>
#include <string.h>
#include <ctype.h>
void mutt_edit_headers (const char *editor,
const char *body,
HEADER * msg, char *fcc, size_t fcclen)
{
char path[_POSIX_PATH_MAX]; /* tempfile used to edit headers + body */
char buffer[LONG_STRING];
char *p;
FILE *ifp, *ofp;
int i, keep;
ENVELOPE *n;
time_t mtime;
struct stat st;
LIST *cur, **last = NULL, *tmp;
mutt_mktemp (path);
if ((ofp = safe_fopen (path, "w")) == NULL) {
mutt_perror (path);
return;
}
mutt_env_to_local (msg->env);
mutt_write_rfc822_header (ofp, msg->env, NULL, 1, 0);
fputc ('\n', ofp); /* tie off the header. */
/* now copy the body of the message. */
if ((ifp = fopen (body, "r")) == NULL) {
mutt_perror (body);
return;
}
mutt_copy_stream (ifp, ofp);
fclose (ifp);
fclose (ofp);
if (stat (path, &st) == -1) {
mutt_perror (path);
return;
}
mtime = mutt_decrease_mtime (path, &st);
mutt_edit_file (editor, path);
stat (path, &st);
if (mtime == st.st_mtime) {
debug_print (1, ("temp file was not modified.\n"));
/* the file has not changed! */
mutt_unlink (path);
return;
}
mutt_unlink (body);
mutt_free_list (&msg->env->userhdrs);
/* Read the temp file back in */
if ((ifp = fopen (path, "r")) == NULL) {
mutt_perror (path);
return;
}
if ((ofp = safe_fopen (body, "w")) == NULL) {
/* intentionally leak a possible temporary file here */
fclose (ifp);
mutt_perror (body);
return;
}
n = mutt_read_rfc822_header (ifp, NULL, 1, 0);
while ((i = fread (buffer, 1, sizeof (buffer), ifp)) > 0)
fwrite (buffer, 1, i, ofp);
fclose (ofp);
fclose (ifp);
mutt_unlink (path);
/* restore old info. */
n->references = msg->env->references;
msg->env->references = NULL;
mutt_free_envelope (&msg->env);
msg->env = n;
n = NULL;
if (!msg->env->in_reply_to)
#ifdef USE_NNTP
if (!option (OPTNEWSSEND))
#endif
mutt_free_list (&msg->env->references);
mutt_expand_aliases_env (msg->env);
/* search through the user defined headers added to see if either a
* fcc: or attach-file: field was specified.
*/
cur = msg->env->userhdrs;
last = &msg->env->userhdrs;
while (cur) {
keep = 1;
/* keep track of whether or not we see the in-reply-to field. if we did
* not, remove the references: field later so that we can generate a new
* message based upon this one.
*/
if (fcc && ascii_strncasecmp ("fcc:", cur->data, 4) == 0) {
p = cur->data + 4;
SKIPWS (p);
if (*p) {
strfcpy (fcc, p, fcclen);
mutt_pretty_mailbox (fcc);
}
keep = 0;
}
else if (ascii_strncasecmp ("attach:", cur->data, 7) == 0) {
BODY *body;
BODY *parts;
char *q;
p = cur->data + 7;
SKIPWS (p);
if (*p) {
if ((q = strpbrk (p, " \t"))) {
str_substrcpy (path, p, q, sizeof (path));
SKIPWS (q);
}
else
strfcpy (path, p, sizeof (path));
mutt_expand_path (path, sizeof (path));
if ((body = mutt_make_file_attach (path))) {
body->description = str_dup (q);
for (parts = msg->content; parts->next; parts = parts->next);
parts->next = body;
}
else {
mutt_pretty_mailbox (path);
mutt_error (_("%s: unable to attach file"), path);
}
}
keep = 0;
}
else if ((WithCrypto & APPLICATION_PGP)
&& ascii_strncasecmp ("pgp:", cur->data, 4) == 0) {
msg->security = mutt_parse_crypt_hdr (cur->data + 4, 0);
if (msg->security)
msg->security |= APPLICATION_PGP;
keep = 0;
}
if (keep) {
last = &cur->next;
cur = cur->next;
}
else {
tmp = cur;
*last = cur->next;
cur = cur->next;
tmp->next = NULL;
mutt_free_list (&tmp);
}
}
}
syntax highlighted by Code2HTML, v. 0.9.1