* please see the file GPL in the top level source directory.
*/
-#define _SENDLIB_C 1
-
#include <lib-lib/lib-lib.h>
#include <signal.h>
#include <lib-sys/mutt_signal.h>
#include <lib-mime/mime.h>
#include <lib-ui/curses.h>
+#include <lib-mx/mx.h>
#include <lib-crypt/crypt.h>
-#include "lib/list.h"
-
#include "mutt.h"
#include "handler.h"
#include "recvattach.h"
-#include "mx.h"
#include "copy.h"
#include "pager.h"
#include "charset.h"
#endif /* USE_LIBESMTP */
#ifdef USE_NNTP
-#include <nntp.h>
+#include <nntp/nntp.h>
#endif
#ifdef HAVE_SYSEXITS_H
#define EX_OK 0
#endif
-/* If you are debugging this file, comment out the following line. */
-/*#define NDEBUG*/
-
-#ifdef NDEBUG
-#define assert(x)
-#else
-#include <assert.h>
-#endif
-
-#define DISPOSITION(X) X==DISPATTACH?"attachment":"inline"
-
static void transform_to_7bit (BODY * a, FILE * fpin);
static void encode_quoted (fgetconv_t * fc, FILE * fout, int istext)
if (a->description)
fprintf (f, "Content-Description: %s\n", a->description);
+#define DISPOSITION(X) X==DISPATTACH?"attachment":"inline"
fprintf (f, "Content-Disposition: %s", DISPOSITION (a->disposition));
if (a->use_disp) {
#undef write_as_text_part
fgetconv_close (&fc);
- fclose (fpin);
+ m_fclose(&fpin);
return (ferror (f) ? -1 : 0);
}
ib = bufi;
ob = bufu, obl = sizeof (bufu);
n = my_iconv(cd1, ibl ? &ib : 0, &ibl, &ob, &obl);
- assert (n == -1 || !n);
if (n == -1 && ((errno != EINVAL && errno != E2BIG) || ib == bufi)) {
- assert (errno == EILSEQ ||
- (errno == EINVAL && ib == bufi && ibl < ssizeof (bufi)));
ret = -1;
break;
}
}
b->file_charset = fromcode;
p_delete(&tocode);
- safe_fclose (&fp);
+ m_fclose(&fp);
return info;
}
}
update_content_info (info, &state, buffer, r);
update_content_info (info, &state, 0, 0);
- safe_fclose (&fp);
+ m_fclose(&fp);
if (b != NULL && b->type == TYPETEXT && (!b->noconv && !b->force_charset))
parameter_setval(&b->parameter, "charset",
p = NULL;
}
}
- fclose (f);
+ m_fclose(&f);
}
}
a->offset = 0;
if (stat (a->filename, &sb) == -1) {
mutt_perror ("stat");
- fclose (fpin);
+ m_fclose(&fpin);
}
a->length = sb.st_size;
}
- mutt_mktemp (temp);
- if (!(fpout = safe_fopen (temp, "w+"))) {
- mutt_perror ("fopen");
+ fpout = m_tempfile(temp, sizeof(temp), NONULL(Tempdir), NULL);
+ if (!fpout) {
+ mutt_error(_("Could not create temporary file"));
goto cleanup;
}
p_delete(&line);
if (fpin && !fp)
- fclose (fpin);
+ m_fclose(&fpin);
if (fpout)
- fclose (fpout);
+ m_fclose(&fpout);
else
return;
a->noconv = 1;
a->force_charset = 1;
- mutt_mktemp (buff);
- if ((s.fpout = safe_fopen (buff, "w")) == NULL) {
- mutt_perror ("fopen");
+ s.fpout = m_tempfile(buff, sizeof(buff), NONULL(Tempdir), NULL);
+ if (!s.fpout) {
+ mutt_error(_("Could not create temporary file"));
return;
}
s.fpin = fpin;
mutt_decode_attachment (a, &s);
- fclose (s.fpout);
+ m_fclose(&s.fpout);
a->d_filename = a->filename;
a->filename = m_strdup(buff);
a->unlink = 1;
mutt_update_encoding (body);
body->parts = body->hdr->content;
- fclose (fp);
+ m_fclose(&fp);
return (body);
}
p_delete(&ref);
}
+static int edit_header(int mode, const char *s)
+{
+ const char *p;
+ int slen = m_strlen(s);
+
+ if (mode != 1 || option(OPTXMAILTO))
+ return 1;
+
+ p = skipspaces(EditorHeaders);
+ while (*p) {
+ if (!ascii_strncasecmp(p, s, slen) && p[slen - 1] == ':')
+ return 1;
+ p = skipspaces(p + slen);
+ }
+
+ return 0;
+}
+
/* Note: all RFC2047 encoding should be done outside of this routine, except
* for the "real name." This will allow this routine to be used more than
* once, if necessary.
char *p;
string_list_t *tmp = env->userhdrs;
int has_agent = 0; /* user defined user-agent header field exists */
- list2_t* hdrs = list_from_str (EditorHeaders, " ");
#ifdef USE_NNTP
if (!option (OPTNEWSSEND))
if (mode == 0 && !privacy)
fputs (mutt_make_date (buffer, sizeof (buffer)), fp);
-#define EDIT_HEADER(x) (mode != 1 || option(OPTXMAILTO) || (mode == 1 && list_lookup(hdrs,(list_lookup_t*) ascii_strcasecmp,x) >= 0))
-
/* OPTUSEFROM is not consulted here so that we can still write a From:
* field if the user sets it with the `my_hdr' command
*/
#ifdef USE_NNTP
if (!option (OPTNEWSSEND))
#endif
- if (EDIT_HEADER("To:"))
+ if (edit_header(mode, "To:"))
fputs ("To:\n", fp);
if (env->cc) {
#ifdef USE_NNTP
if (!option (OPTNEWSSEND))
#endif
- if (EDIT_HEADER("Cc:"))
+ if (edit_header(mode, "Cc:"))
fputs ("Cc:\n", fp);
if (env->bcc) {
#ifdef USE_NNTP
if (!option (OPTNEWSSEND))
#endif
- if (EDIT_HEADER("Bcc:"))
+ if (edit_header(mode, "Bcc:"))
fputs ("Bcc:\n", fp);
#ifdef USE_NNTP
if (env->newsgroups)
fprintf (fp, "Newsgroups: %s\n", env->newsgroups);
- else if (mode == 1 && option (OPTNEWSSEND) && EDIT_HEADER("Newsgroups:"))
+ else if (mode == 1 && option (OPTNEWSSEND) && edit_header(mode, "Newsgroups:"))
fputs ("Newsgroups:\n", fp);
if (env->followup_to)
fprintf (fp, "Followup-To: %s\n", env->followup_to);
- else if (mode == 1 && option (OPTNEWSSEND) && EDIT_HEADER("Followup-To:"))
+ else if (mode == 1 && option (OPTNEWSSEND) && edit_header(mode, "Followup-To:"))
fputs ("Followup-To:\n", fp);
if (env->x_comment_to)
fprintf (fp, "X-Comment-To: %s\n", env->x_comment_to);
else if (mode == 1 && option (OPTNEWSSEND) && option (OPTXCOMMENTTO) &&
- EDIT_HEADER("X-Comment-To:"))
+ edit_header(mode, "X-Comment-To:"))
fputs ("X-Comment-To:\n", fp);
#endif
if (env->subject)
fprintf (fp, "Subject: %s\n", env->subject);
- else if (mode == 1 && EDIT_HEADER("Subject:"))
+ else if (mode == 1 && edit_header(mode, "Subject:"))
fputs ("Subject:\n", fp);
/* save message id if the user has set it */
fputs ("Reply-To: ", fp);
mutt_write_address_list (env->reply_to, fp, 10, 0);
}
- else if (mode > 0 && EDIT_HEADER("Reply-To:"))
+ else if (mode > 0 && edit_header(mode, "Reply-To:"))
fputs ("Reply-To:\n", fp);
if (env->mail_followup_to)
fputc ('\n', fp);
}
-#undef EDIT_HEADER
-
/* Add any user defined headers */
for (; tmp; tmp = tmp->next) {
if ((p = strchr (tmp->data, ':'))) {
fprintf (fp, "User-Agent: %s (%s)\n", mutt_make_version (0), os);
}
- list_del (&hdrs, (list_del_t*)xmemfree);
-
return (ferror (fp) == 0 ? 0 : -1);
}
{
char buf[SHORT_STRING];
char localpart[SHORT_STRING];
- unsigned int localpart_length;
const char *fqdn;
- if (!(fqdn = mutt_fqdn (0)))
- fqdn = NONULL (Hostname);
-
- localpart_length = sizeof (buf) - m_strlen(fqdn) - 4; /* the 4 characters are '<', '@', '>' and '\0' */
+ if (!(fqdn = mutt_fqdn(0)))
+ fqdn = NONULL(Hostname);
- mutt_gen_localpart (localpart, localpart_length, MsgIdFormat);
-
- snprintf (buf, sizeof (buf), "<%s@%s>", localpart, fqdn);
- return (m_strdup(buf));
+ mutt_gen_localpart(localpart, sizeof(localpart), MsgIdFormat);
+ snprintf(buf, sizeof(buf), "<%s@%s>", localpart, fqdn);
+ return m_strdup(buf);
}
static RETSIGTYPE alarm_handler (int sig)
if (!fp)
fp = msg->fp;
- mutt_mktemp (tempfile);
- if ((f = safe_fopen (tempfile, "w")) != NULL) {
+ f = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ if (f) {
int ch_flags = CH_XMIT | CH_NONEWLINE | CH_NOQFROM;
if (!option (OPTBOUNCEDELIVERED))
mutt_copy_header (fp, h, f, ch_flags, NULL);
fputc ('\n', f);
mutt_copy_bytes (fp, f, h->content->length);
- fclose (f);
+ m_fclose(&f);
- ret = mutt_invoke_mta (env_from, to, NULL, NULL, tempfile,
- h->content->encoding == ENC8BIT);
+ ret = mutt_invoke_mta(env_from, to, NULL, NULL, tempfile,
+ h->content->encoding == ENC8BIT);
}
if (msg)
* the message body begins with "From "
*/
if (f.magic == M_MMDF || f.magic == M_MBOX) {
- mutt_mktemp (tempfile);
- if ((tempfp = safe_fopen (tempfile, "w+")) == NULL) {
- mutt_perror (tempfile);
+ tempfp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ if (!tempfp) {
+ mutt_error(_("Could not create temporary file"));
mx_close_mailbox (&f, NULL);
- return (-1);
+ return -1;
}
}
fflush (tempfp);
if (ferror (tempfp)) {
- fclose (tempfp);
+ m_fclose(&tempfp);
unlink (tempfile);
mx_commit_message (msg, &f); /* XXX - really? */
mx_close_message (&msg);
/* copy the body and clean up */
rewind (tempfp);
r = mutt_copy_stream (tempfp, msg->fp);
- if (fclose (tempfp) != 0)
+ if (m_fclose(&tempfp) != 0)
r = -1;
/* if there was an error, leave the temp version */
if (!r)