X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=sendlib.c;h=0f676b901b55b1ce75f53470afa277ba0bb118b0;hp=042ca3ac595807fbcca1fa45e29d6af6a6f8cb40;hb=fc854762626c5e2dce8c5618860a882934ec81d2;hpb=7b392ef7b50798f9eb3e7c869e634c5fef0092d1 diff --git a/sendlib.c b/sendlib.c index 042ca3a..0f676b9 100644 --- a/sendlib.c +++ b/sendlib.c @@ -231,7 +231,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; @@ -395,7 +396,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); } @@ -776,7 +777,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; } } @@ -786,7 +787,7 @@ 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", @@ -885,7 +886,7 @@ int mutt_lookup_mime_type (BODY * att, const char *path) p = NULL; } } - fclose (f); + m_fclose(&f); } } @@ -918,7 +919,7 @@ 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; } @@ -946,9 +947,9 @@ cleanup: p_delete(&line); if (fpin && !fp) - fclose (fpin); + m_fclose(&fpin); if (fpout) - fclose (fpout); + m_fclose(&fpout); else return; @@ -995,7 +996,7 @@ static void transform_to_7bit (BODY * a, FILE * fpin) } 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; @@ -1112,8 +1113,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(Tempdir), NULL); + if (!fp) return NULL; body = body_new(); @@ -1167,7 +1168,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); } @@ -1211,16 +1212,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; + + if (a->encoding == ENC8BIT) + e = ENC8BIT; + } - return (e); + return e; } BODY *mutt_make_multipart (BODY * b) @@ -1270,68 +1272,58 @@ 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; + + len = rfc822_write_address_single(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; - } - - while (refcnt-- > 0) { - fputc (' ', f); - fputs (ref[refcnt]->data, f); - } + p_clear(refs, countof(refs)); + for (i = 0; i < countof(refs) && r; r = r->next) { + refs[i++] = r; + } - p_delete(&ref); + while (i-- > 0) { + fprintf(f, " %s", refs[i]->data); + } } static int edit_header(int mode, const char *s) @@ -1367,7 +1359,6 @@ static int edit_header(int mode, const char *s) * anonymous remailer chains. * */ - int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, int mode, int privacy) { @@ -1542,7 +1533,7 @@ 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); } @@ -1571,12 +1562,6 @@ const char *mutt_fqdn (short may_hide_host) 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) \ @@ -1604,7 +1589,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; } @@ -1656,7 +1642,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); } } @@ -1668,19 +1653,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]; - const char *fqdn; + char buf[SHORT_STRING]; + char localpart[SHORT_STRING]; + const char *fqdn; - if (!(fqdn = mutt_fqdn(0))) - fqdn = NONULL(Hostname); + if (!(fqdn = mutt_fqdn(0))) + fqdn = NONULL(Hostname); - mutt_gen_localpart(localpart, sizeof(localpart), 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; } @@ -1862,7 +1847,7 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ mutt_FormatString (cmd, sizeof (cmd), NONULL (Inews), nntp_format_str, 0, 0); - if (!*cmd) { + if (m_strisempty(cmd)) { i = nntp_post (msg); unlink (msg); return i; @@ -1902,7 +1887,7 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ args = add_option(args, &argslen, &argsmax, "-B8BITMIME"); if (option (OPTENVFROM)) { - address_t *f = NULL; + address_t *f = EnvFrom; if (EnvFrom) f = EnvFrom; else if (from && !from->next) @@ -1928,7 +1913,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; @@ -1940,14 +1925,14 @@ 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); @@ -1982,38 +1967,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 @@ -2078,14 +2056,14 @@ 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); @@ -2231,11 +2209,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; @@ -2245,7 +2221,6 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, fputc ('\n', msg->fp); } -#endif if (tempfp) { char sasha[LONG_STRING]; @@ -2265,7 +2240,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); @@ -2283,7 +2258,7 @@ 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)