X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=sendlib.c;h=1802e1da8b3b4f0c6f82c903312ca0c92df7410e;hp=b024afc2f62a823cbc7f7a0184a29e66d1c8aa0e;hb=b6980caf7b13994c57957872876cdecc21e54a82;hpb=5a4df9d0e93209aeade80f632158036799f3e9bc diff --git a/sendlib.c b/sendlib.c index b024afc..1802e1d 100644 --- a/sendlib.c +++ b/sendlib.c @@ -7,26 +7,23 @@ * please see the file GPL in the top level source directory. */ -#define _SENDLIB_C 1 - #include #include #include +#include #include #include #include #include +#include #include -#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" @@ -37,7 +34,7 @@ #endif /* USE_LIBESMTP */ #ifdef USE_NNTP -#include +#include #endif #ifdef HAVE_SYSEXITS_H @@ -46,17 +43,6 @@ #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 -#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) @@ -246,7 +232,8 @@ static void encode_base64 (fgetconv_t * fc, FILE * fout, int istext) fputc ('\n', fout); } -static void encode_8bit (fgetconv_t * fc, FILE * fout, int istext) +static void encode_8bit (fgetconv_t * fc, FILE * fout, + int istext __attribute__ ((unused))) { int ch; @@ -316,6 +303,7 @@ int mutt_write_mime_header (BODY * a, FILE * f) 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) { @@ -352,8 +340,8 @@ int mutt_write_mime_header (BODY * a, FILE * f) int mutt_write_mime_body (BODY * a, FILE * f) { const char *p; - char boundary[SHORT_STRING]; - char send_charset[SHORT_STRING]; + char boundary[STRING]; + char send_charset[STRING]; FILE *fpin; BODY *t; fgetconv_t *fc; @@ -409,7 +397,7 @@ int mutt_write_mime_body (BODY * a, FILE * f) #undef write_as_text_part fgetconv_close (&fc); - fclose (fpin); + m_fclose(&fpin); return (ferror (f) ? -1 : 0); } @@ -590,10 +578,7 @@ static ssize_t convert_file_to (FILE * file, const char *fromcode, 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; } @@ -782,10 +767,10 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) if (b != NULL && b->type == TYPETEXT && (!b->noconv && !b->force_charset)) { const char *chs = parameter_getval(b->parameter, "charset"); - char *fchs = b->use_disp ? ((FileCharset && *FileCharset) ? - FileCharset : Charset) : Charset; - if (Charset && (chs || SendCharset) && - convert_file_from_to (fp, fchs, chs ? chs : SendCharset, + char *fchs = b->use_disp && !m_strisempty(MCharset.file_charset) + ? FileCharset : MCharset.charset; + if (MCharset.charset && (chs || MCharset.send_charset) && + convert_file_from_to (fp, fchs, chs ? chs : MCharset.send_charset, &fromcode, &tocode, info) != -1) { if (!chs) { charset_canonicalize (chsbuf, sizeof (chsbuf), tocode); @@ -793,7 +778,7 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) } b->file_charset = fromcode; p_delete(&tocode); - safe_fclose (&fp); + m_fclose(&fp); return info; } } @@ -803,12 +788,13 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) 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", (!info->hibin ? "us-ascii" - : Charset && !charset_is_us_ascii(Charset) ? Charset : "unknown-8bit")); + : MCharset.charset && !charset_is_us_ascii(MCharset.charset) + ? MCharset.charset : "unknown-8bit")); return info; } @@ -844,7 +830,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path) */ switch (count) { case 0: - snprintf (buf, sizeof (buf), "%s/.mime.types", NONULL (Homedir)); + snprintf(buf, sizeof (buf), "%s/.mime.types", NONULL(MCore.homedir)); break; case 1: m_strcpy(buf, sizeof(buf), SYSCONFDIR "/madmutt-mime.types"); @@ -902,7 +888,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path) p = NULL; } } - fclose (f); + m_fclose(&f); } } @@ -935,14 +921,14 @@ void mutt_message_to_7bit (BODY * a, FILE * fp) 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(MCore.tmpdir), NULL); + if (!fpout) { + mutt_error(_("Could not create temporary file")); goto cleanup; } @@ -963,9 +949,9 @@ cleanup: p_delete(&line); if (fpin && !fp) - fclose (fpin); + m_fclose(&fpin); if (fpout) - fclose (fpout); + m_fclose(&fpout); else return; @@ -998,21 +984,21 @@ static void transform_to_7bit (BODY * a, FILE * fpin) transform_to_7bit (a->parts, fpin); } - else if (mutt_is_message_type (a->type, a->subtype)) { + else if (mutt_is_message_type(a)) { mutt_message_to_7bit (a, fpin); } else { 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(MCore.tmpdir), 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; @@ -1034,7 +1020,7 @@ static void transform_to_7bit (BODY * a, FILE * fpin) /* determine which Content-Transfer-Encoding to use */ static void mutt_set_encoding (BODY * b, CONTENT * info) { - char send_charset[SHORT_STRING]; + char send_charset[STRING]; if (b->type == TYPETEXT) { char *chsname = @@ -1129,8 +1115,8 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg) return (NULL); } - mutt_mktemp (buffer); - if ((fp = safe_fopen (buffer, "w+")) == NULL) + fp = m_tempfile(buffer, sizeof(buffer), NONULL(MCore.tmpdir), NULL); + if (!fp) return NULL; body = body_new(); @@ -1184,7 +1170,7 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg) mutt_update_encoding (body); body->parts = body->hdr->content; - fclose (fp); + m_fclose(&fp); return (body); } @@ -1228,16 +1214,17 @@ BODY *mutt_make_file_attach (const char *path) static int get_toplevel_encoding (BODY * a) { - int e = ENC7BIT; + int e = ENC7BIT; - for (; a; a = a->next) { - if (a->encoding == ENCBINARY) - return (ENCBINARY); - else if (a->encoding == ENC8BIT) - e = ENC8BIT; - } + for (; a; a = a->next) { + if (a->encoding == ENCBINARY) + return ENCBINARY; - return (e); + if (a->encoding == ENC8BIT) + e = ENC8BIT; + } + + return e; } BODY *mutt_make_multipart (BODY * b) @@ -1287,68 +1274,74 @@ char *mutt_make_date (char *s, ssize_t len) /* wrapper around mutt_write_address() so we can handle very large recipient lists without needing a huge temporary buffer in memory */ -void mutt_write_address_list (address_t * adr, FILE * fp, int linelen, - int display) +void +mutt_write_address_list(address_t *addr, FILE *fp, int linelen, int display) { - address_t *tmp; - char buf[LONG_STRING]; - int count = 0; - int len; + int first = 1; + + while (addr) { + char buf[LONG_STRING]; + int len = rfc822_addrcpy(buf, ssizeof(buf), addr, display); + + if (!first) { + if (linelen + len > 74) { + fputs("\n\t", fp); + linelen = 8; /* tab is usually about 8 spaces... */ + } else + if (addr->mailbox) { + fputc(' ', fp); + linelen++; + } + } + first = 0; - while (adr) { - tmp = adr->next; - adr->next = NULL; - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), adr, display); - len = m_strlen(buf); - if (count && linelen + len > 74) { - fputs ("\n\t", fp); - linelen = len + 8; /* tab is usually about 8 spaces... */ - } - else { - if (count && adr->mailbox) { - fputc (' ', fp); - linelen++; - } - linelen += len; - } - fputs (buf, fp); - adr->next = tmp; - if (!adr->group && adr->next && adr->next->mailbox) { - linelen++; - fputc (',', fp); - } - adr = adr->next; - count++; - } - fputc ('\n', fp); -} + linelen += len + 1; + fputs(buf, fp); -/* arbitrary number of elements to grow the array by */ -#define REF_INC 16 + if (!addr->group && addr->next && addr->next->mailbox) { + fputc(',', fp); + linelen++; + } -#define TrimRef 10 + addr = addr->next; + } + fputc ('\n', fp); +} /* need to write the list in reverse because they are stored in reverse order * when parsed to speed up threading */ -void mutt_write_references (string_list_t * r, FILE * f) +void mutt_write_references(string_list_t *r, FILE *f) { - string_list_t **ref = NULL; - int refcnt = 0, refmax = 0; + string_list_t *refs[10]; + int i; - for (; (TrimRef == 0 || refcnt < TrimRef) && r; r = r->next) { - if (refcnt == refmax) - p_realloc(&ref, refmax += REF_INC); - ref[refcnt++] = r; - } + p_clear(refs, countof(refs)); + for (i = 0; i < countof(refs) && r; r = r->next) { + refs[i++] = r; + } - while (refcnt-- > 0) { - fputc (' ', f); - fputs (ref[refcnt]->data, f); - } + while (i-- > 0) { + fprintf(f, " %s", refs[i]->data); + } +} + +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); + } - p_delete(&ref); + return 0; } /* Note: all RFC2047 encoding should be done outside of this routine, except @@ -1366,7 +1359,6 @@ void mutt_write_references (string_list_t * r, FILE * f) * anonymous remailer chains. * */ - int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, int mode, int privacy) { @@ -1374,7 +1366,6 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, 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)) @@ -1382,14 +1373,12 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, 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 */ if (env->from && !privacy) { buffer[0] = 0; - rfc822_write_address (buffer, sizeof (buffer), env->from, 0); + rfc822_addrcat(buffer, sizeof(buffer), env->from, 0); fprintf (fp, "From: %s\n", buffer); } @@ -1401,7 +1390,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, #ifdef USE_NNTP if (!option (OPTNEWSSEND)) #endif - if (EDIT_HEADER("To:")) + if (edit_header(mode, "To:")) fputs ("To:\n", fp); if (env->cc) { @@ -1412,7 +1401,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, #ifdef USE_NNTP if (!option (OPTNEWSSEND)) #endif - if (EDIT_HEADER("Cc:")) + if (edit_header(mode, "Cc:")) fputs ("Cc:\n", fp); if (env->bcc) { @@ -1425,30 +1414,30 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, #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 */ @@ -1459,7 +1448,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, 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) @@ -1489,8 +1478,6 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, fputc ('\n', fp); } -#undef EDIT_HEADER - /* Add any user defined headers */ for (; tmp; tmp = tmp->next) { if ((p = strchr (tmp->data, ':'))) { @@ -1520,11 +1507,9 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, os = (uname(&un) == -1) ? "UNIX" : un.sysname; } /* Add a vanity header */ - fprintf (fp, "User-Agent: %s (%s)\n", mutt_make_version (0), os); + fprintf (fp, "User-Agent: %s (%s)\n", mutt_make_version(), os); } - list_del (&hdrs, (list_del_t*)xmemfree); - return (ferror (fp) == 0 ? 0 : -1); } @@ -1548,41 +1533,34 @@ static void encode_headers (string_list_t * h) rfc2047_encode_string (&tmp); p_realloc(&h->data, m_strlen(h->data) + 2 + m_strlen(tmp) + 1); - sprintf (h->data + i, ": %s", NONULL (tmp)); /* __SPRINTF_CHECKED__ */ + sprintf (h->data + i, ": %s", NONULL (tmp)); p_delete(&tmp); } } -const char *mutt_fqdn (short may_hide_host) +const char *mutt_fqdn(short may_hide_host) { char *p = NULL, *q; - if (Fqdn && Fqdn[0] != '@') { - p = Fqdn; + if (MCore.hostname && MCore.hostname[0] != '@') { + p = MCore.hostname; if (may_hide_host && option (OPTHIDDENHOST)) { - if ((p = strchr (Fqdn, '.'))) + if ((p = strchr(MCore.hostname, '.'))) p++; /* sanity check: don't hide the host if - * the fqdn is something like detebe.org. - */ + the fqdn is something like detebe.org. */ - if (!p || !(q = strchr (p, '.'))) - p = Fqdn; + if (!p || !(q = strchr(p, '.'))) + p = MCore.hostname; } } return p; } -/* normalized character (we're stricter than RFC2822, 3.6.4) */ -static char mutt_normalized_char(char c) -{ - return (isalnum(c) || strchr(".!#$%&'*+-/=?^_`{|}~", c)) ? c : '.'; -} - static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt) { #define APPEND_FMT(fmt, arg) \ @@ -1610,7 +1588,8 @@ static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt) int c = *fmt++; if (c != '%') { - APPEND_BYTE(mutt_normalized_char(c)); + /* normalized character (we're stricter than RFC2822, 3.6.4) */ + APPEND_BYTE((isalnum(c) || strchr(".!#$%&'*+-/=?^_`{|}~", c)) ? c : '.'); continue; } @@ -1662,7 +1641,6 @@ static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt) break; default: /* invalid formats are replaced by '.' */ APPEND_BYTE('.'); - m_strncat(buf, len, ".", 1); } } @@ -1674,23 +1652,19 @@ static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt) static char *mutt_gen_msgid (void) { - char buf[SHORT_STRING]; - char localpart[SHORT_STRING]; - unsigned int localpart_length; - const char *fqdn; + char buf[STRING]; + char localpart[STRING]; + const char *fqdn; - if (!(fqdn = mutt_fqdn (0))) - fqdn = NONULL (Hostname); + if (!(fqdn = mutt_fqdn(0))) + fqdn = NONULL(MCore.shorthost); - localpart_length = sizeof (buf) - m_strlen(fqdn) - 4; /* the 4 characters are '<', '@', '>' and '\0' */ - - 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) +static RETSIGTYPE alarm_handler (int sig __attribute__ ((unused))) { SigAlrm = 1; } @@ -1716,7 +1690,7 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) sigaddset (&set, SIGTSTP); sigprocmask (SIG_BLOCK, &set, NULL); - if (SendmailWait >= 0) { + if (MTransport.sendmail_wait >= 0) { char tmp[_POSIX_PATH_MAX]; mutt_mktemp (tmp); @@ -1747,7 +1721,7 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) } unlink (msg); - if (SendmailWait >= 0) { + if (MTransport.sendmail_wait >= 0) { /* *tempfile will be opened as stdout */ if (open (*tempfile, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0600) < 0) @@ -1755,8 +1729,7 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) /* redirect stderr to *tempfile too */ if (dup (1) < 0) _exit (S_ERR); - } - else { + } else { if (open ("/dev/null", O_WRONLY | O_APPEND) < 0) /* stdout */ _exit (S_ERR); if (open ("/dev/null", O_RDWR | O_APPEND) < 0) /* stderr */ @@ -1772,11 +1745,11 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) _exit (S_ERR); } - /* SendmailWait > 0: interrupt waitpid() after SendmailWait seconds - * SendmailWait = 0: wait forever - * SendmailWait < 0: don't wait + /* sendmail_wait > 0: interrupt waitpid() after sendmail_wait seconds + * sendmail_wait = 0: wait forever + * sendmail_wait < 0: don't wait */ - if (SendmailWait > 0) { + if (MTransport.sendmail_wait > 0) { SigAlrm = 0; act.sa_handler = alarm_handler; #ifdef SA_INTERRUPT @@ -1787,21 +1760,20 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) #endif sigemptyset (&act.sa_mask); sigaction (SIGALRM, &act, &oldalrm); - alarm (SendmailWait); + alarm (MTransport.sendmail_wait); } - else if (SendmailWait < 0) + else if (MTransport.sendmail_wait < 0) _exit (0xff & EX_OK); if (waitpid (pid, &st, 0) > 0) { st = WIFEXITED (st) ? WEXITSTATUS (st) : S_ERR; - if (SendmailWait && st == (0xff & EX_OK)) { + if (MTransport.sendmail_wait && st == (0xff & EX_OK)) { unlink (*tempfile); /* no longer needed */ p_delete(tempfile); } - } - else { - st = (SendmailWait > 0 && errno == EINTR && SigAlrm) ? S_BKG : S_ERR; - if (SendmailWait > 0) { + } else { + st = (MTransport.sendmail_wait > 0 && errno == EINTR && SigAlrm) ? S_BKG : S_ERR; + if (MTransport.sendmail_wait > 0) { unlink (*tempfile); p_delete(tempfile); } @@ -1861,32 +1833,29 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ const char *msg, /* file containing message */ int eightbit) { /* message contains 8bit chars */ - char *ps = NULL, *path = NULL, *s = NULL, *childout = NULL; + char cmd[LONG_STRING]; + char *ps = NULL, *path = NULL, *childout = NULL; const char **args = NULL; ssize_t argslen = 0, argsmax = 0; int i; #ifdef USE_NNTP if (option (OPTNEWSSEND)) { - char cmd[LONG_STRING]; - - mutt_FormatString (cmd, sizeof (cmd), NONULL (Inews), nntp_format_str, 0, - 0); - if (!*cmd) { + m_strformat(cmd, sizeof(cmd), 0, Inews, nntp_format_str, 0, 0); + if (m_strisempty(cmd)) { i = nntp_post (msg); unlink (msg); return i; } - - s = m_strdup(cmd); - } - else + } else #endif - s = m_strdup(Sendmail); + { + m_strcpy(cmd, sizeof(cmd), MTransport.sendmail); + } - ps = s; + ps = cmd; i = 0; - while ((ps = strtok (ps, " "))) { + while ((ps = strtok(ps, " "))) { if (argslen == argsmax) p_realloc(&args, argsmax += 5); @@ -1908,27 +1877,25 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ #ifdef USE_NNTP if (!option (OPTNEWSSEND)) { #endif - if (eightbit && option (OPTUSE8BITMIME)) + if (eightbit && MTransport.use_8bitmime) args = add_option(args, &argslen, &argsmax, "-B8BITMIME"); - if (option (OPTENVFROM)) { - address_t *f = NULL; - if (EnvFrom) - f = EnvFrom; - else if (from && !from->next) + if (MTransport.use_envelope_from) { + address_t *f = MTransport.envelope_from_address; + if (!f && from && !from->next) f = from; if (f) { args = add_option (args, &argslen, &argsmax, "-f"); args = add_args (args, &argslen, &argsmax, f); } } - if (DsnNotify) { + if (MTransport.dsn_notify) { args = add_option (args, &argslen, &argsmax, "-N"); - args = add_option (args, &argslen, &argsmax, DsnNotify); + args = add_option (args, &argslen, &argsmax, MTransport.dsn_notify); } - if (DsnReturn) { + if (MTransport.dsn_return) { args = add_option (args, &argslen, &argsmax, "-R"); - args = add_option (args, &argslen, &argsmax, DsnReturn); + args = add_option (args, &argslen, &argsmax, MTransport.dsn_return); } args = add_option (args, &argslen, &argsmax, "--"); args = add_args (args, &argslen, &argsmax, to); @@ -1938,7 +1905,7 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ } #endif - if (argslen == argsmax) + if (argslen >= argsmax) p_realloc(&args, ++argsmax); args[argslen++] = NULL; @@ -1950,18 +1917,17 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ if (childout) { struct stat st; - if (stat (childout, &st) == 0 && st.st_size > 0) - mutt_do_pager (_("Output of the delivery process"), childout, 0, - NULL); + if (!stat(childout, &st) && st.st_size > 0) + mutt_do_pager(_("Output of the delivery process"), childout, 0, + NULL); } } - } - else + } else { unlink (childout); + } p_delete(&childout); p_delete(&path); - p_delete(&s); p_delete(&args); if (i == (EX_OK & 0xff)) @@ -1992,38 +1958,31 @@ int mutt_invoke_mta (address_t * from, /* the sender */ /* For postponing (!final) do the necessary encodings only */ void mutt_prepare_envelope (ENVELOPE * env, int final) { - char buffer[LONG_STRING]; - if (final) { if (env->bcc && !(env->to || env->cc)) { /* some MTA's will put an Apparently-To: header field showing the Bcc: * recipients if there is no To: or Cc: field, so attempt to suppress * it by using an empty To: field. */ - env->to = address_new (); + env->to = address_new(); env->to->group = 1; - env->to->next = address_new (); - - buffer[0] = 0; - rfc822_strcpy(buffer, sizeof(buffer), "undisclosed-recipients", - RFC822Specials); - - env->to->mailbox = m_strdup(buffer); + env->to->next = address_new(); + env->to->mailbox = m_strdup("undisclosed-recipients"); } - mutt_set_followup_to (env); + mutt_set_followup_to(env); - if (!env->message_id && MsgIdFormat && *MsgIdFormat) - env->message_id = mutt_gen_msgid (); + if (!env->message_id && !m_strisempty(MsgIdFormat)) + env->message_id = mutt_gen_msgid(); } /* Take care of 8-bit => 7-bit conversion. */ - rfc2047_encode_adrlist (env->to, "To"); - rfc2047_encode_adrlist (env->cc, "Cc"); - rfc2047_encode_adrlist (env->bcc, "Bcc"); - rfc2047_encode_adrlist (env->from, "From"); - rfc2047_encode_adrlist (env->mail_followup_to, "Mail-Followup-To"); - rfc2047_encode_adrlist (env->reply_to, "Reply-To"); + rfc2047_encode_adrlist(env->to, "To"); + rfc2047_encode_adrlist(env->cc, "Cc"); + rfc2047_encode_adrlist(env->bcc, "Bcc"); + rfc2047_encode_adrlist(env->from, "From"); + rfc2047_encode_adrlist(env->mail_followup_to, "Mail-Followup-To"); + rfc2047_encode_adrlist(env->reply_to, "Reply-To"); if (env->subject) #ifdef USE_NNTP @@ -2037,20 +1996,20 @@ void mutt_prepare_envelope (ENVELOPE * env, int final) void mutt_unprepare_envelope (ENVELOPE * env) { - string_list_t *item; + string_list_t *item; - for (item = env->userhdrs; item; item = item->next) - rfc2047_decode (&item->data); + for (item = env->userhdrs; item; item = item->next) + rfc2047_decode(&item->data); - address_list_wipe(&env->mail_followup_to); + address_list_wipe(&env->mail_followup_to); - /* back conversions */ - rfc2047_decode_adrlist (env->to); - rfc2047_decode_adrlist (env->cc); - rfc2047_decode_adrlist (env->bcc); - rfc2047_decode_adrlist (env->from); - rfc2047_decode_adrlist (env->reply_to); - rfc2047_decode (&env->subject); + /* back conversions */ + rfc2047_decode_adrlist(env->to); + rfc2047_decode_adrlist(env->cc); + rfc2047_decode_adrlist(env->bcc); + rfc2047_decode_adrlist(env->from); + rfc2047_decode_adrlist(env->reply_to); + rfc2047_decode(&env->subject); } static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, @@ -2058,7 +2017,7 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, { int i, ret = 0; FILE *f; - char date[SHORT_STRING], tempfile[_POSIX_PATH_MAX]; + char date[STRING], tempfile[_POSIX_PATH_MAX]; MESSAGE *msg = NULL; if (!h) { @@ -2078,8 +2037,8 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, if (!fp) fp = msg->fp; - mutt_mktemp (tempfile); - if ((f = safe_fopen (tempfile, "w")) != NULL) { + f = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + if (f) { int ch_flags = CH_XMIT | CH_NONEWLINE | CH_NOQFROM; if (!option (OPTBOUNCEDELIVERED)) @@ -2088,17 +2047,17 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, fseeko (fp, h->offset, 0); fprintf (f, "Resent-From: %s", resent_from); fprintf (f, "\nResent-%s", mutt_make_date (date, sizeof (date))); - if (MsgIdFormat && *MsgIdFormat) - fprintf (f, "Resent-Message-ID: %s\n", mutt_gen_msgid ()); + if (!m_strisempty(MsgIdFormat)) + fprintf (f, "Resent-Message-ID: %s\n", mutt_gen_msgid()); fputs ("Resent-To: ", f); mutt_write_address_list (to, f, 11, 0); 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) @@ -2110,7 +2069,6 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, int mutt_bounce_message (FILE * fp, HEADER * h, address_t * to) { address_t *from; - const char *fqdn = mutt_fqdn (1); char resent_from[STRING]; int ret; char *err; @@ -2118,15 +2076,14 @@ int mutt_bounce_message (FILE * fp, HEADER * h, address_t * to) resent_from[0] = '\0'; from = mutt_default_from (); - if (fqdn) - rfc822_qualify (from, fqdn); + rfc822_qualify(from, mutt_fqdn(1)); - rfc2047_encode_adrlist (from, "Resent-From"); + rfc2047_encode_adrlist(from, "Resent-From"); if (mutt_addrlist_to_idna (from, &err)) { mutt_error (_("Bad IDN %s while preparing resent-from."), err); return -1; } - rfc822_write_address (resent_from, sizeof (resent_from), from, 0); + rfc822_addrcat(resent_from, sizeof(resent_from), from, 0); #ifdef USE_NNTP unset_option (OPTNEWSSEND); @@ -2170,11 +2127,11 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, * 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(MCore.tmpdir), NULL); + if (!tempfp) { + mutt_error(_("Could not create temporary file")); mx_close_mailbox (&f, NULL); - return (-1); + return -1; } } @@ -2187,8 +2144,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, /* post == 1 => postpone message. Set mode = -1 in mutt_write_rfc822_header() * post == 0 => Normal mode. Set mode = 0 in mutt_write_rfc822_header() * */ - mutt_write_rfc822_header (msg->fp, hdr->env, hdr->content, post ? -post : 0, - 0); + mutt_write_rfc822_header(msg->fp, hdr->env, hdr->content, -post, 0); /* (postponment) if this was a reply of some sort, contians the * Message-ID: of message replied to. Save it using a special X-Mutt- @@ -2206,8 +2162,6 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, fprintf (msg->fp, "X-Mutt-Fcc: %s\n", fcc); fprintf (msg->fp, "Status: RO\n"); - - /* (postponment) if the mail is to be signed or encrypted, save this info */ if (post && (hdr->security & APPLICATION_PGP)) { fputs ("X-Mutt-PGP: ", msg->fp); @@ -2241,11 +2195,9 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, fputc ('\n', msg->fp); } -#ifdef MIXMASTER /* (postponement) if the mail is to be sent through a mixmaster * chain, save that information */ - if (post && hdr->chain && hdr->chain) { string_list_t *p; @@ -2255,7 +2207,6 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, fputc ('\n', msg->fp); } -#endif if (tempfp) { char sasha[LONG_STRING]; @@ -2275,7 +2226,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, fflush (tempfp); if (ferror (tempfp)) { - fclose (tempfp); + m_fclose(&tempfp); unlink (tempfile); mx_commit_message (msg, &f); /* XXX - really? */ mx_close_message (&msg); @@ -2293,13 +2244,12 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, /* 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) unlink (tempfile); - } - else { + } else { fputc ('\n', msg->fp); /* finish off the header */ r = mutt_write_mime_body (hdr->content, msg->fp); }