X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=sendlib.c;h=042ca3ac595807fbcca1fa45e29d6af6a6f8cb40;hp=e6c03594438b93d8255498d8da6d049e10b16efd;hb=7b392ef7b50798f9eb3e7c869e634c5fef0092d1;hpb=06797b065bbd5d88bf473c4b9f8525dcb9990bb7 diff --git a/sendlib.c b/sendlib.c index e6c0359..042ca3a 100644 --- a/sendlib.c +++ b/sendlib.c @@ -7,44 +7,25 @@ * please see the file GPL in the top level source directory. */ -#define _SENDLIB_C 1 +#include -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include -#include -#include #include -#include -#include #include -#include -#include -#include -#include -#include -#include - #include - +#include #include - #include +#include + +#include #include "mutt.h" #include "handler.h" #include "recvattach.h" -#include "mx.h" #include "copy.h" #include "pager.h" #include "charset.h" -#include #include "mutt_idna.h" #ifdef USE_LIBESMTP @@ -52,7 +33,7 @@ #endif /* USE_LIBESMTP */ #ifdef USE_NNTP -#include +#include #endif #ifdef HAVE_SYSEXITS_H @@ -61,22 +42,9 @@ #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 char MsgIdPfx = 'A'; - static void transform_to_7bit (BODY * a, FILE * fpin); -static void encode_quoted (FGETCONV * fc, FILE * fout, int istext) +static void encode_quoted (fgetconv_t * fc, FILE * fout, int istext) { int c, linelen = 0; char line[77], savechar; @@ -134,7 +102,7 @@ static void encode_quoted (FGETCONV * fc, FILE * fout, int istext) fputs (line, fout); } else { - int savechar = line[linelen - 1]; + savechar = line[linelen - 1]; line[linelen - 1] = '='; line[linelen] = 0; @@ -247,7 +215,7 @@ static void b64_putc (char c, FILE * fout) } -static void encode_base64 (FGETCONV * fc, FILE * fout, int istext) +static void encode_base64 (fgetconv_t * fc, FILE * fout, int istext) { int ch, ch1 = EOF; @@ -263,7 +231,7 @@ static void encode_base64 (FGETCONV * fc, FILE * fout, int istext) fputc ('\n', fout); } -static void encode_8bit (FGETCONV * fc, FILE * fout, int istext) +static void encode_8bit (fgetconv_t * fc, FILE * fout, int istext) { int ch; @@ -274,7 +242,6 @@ static void encode_8bit (FGETCONV * fc, FILE * fout, int istext) int mutt_write_mime_header (BODY * a, FILE * f) { - PARAMETER *p; char buffer[STRING]; char *t; char *fn; @@ -285,6 +252,8 @@ int mutt_write_mime_header (BODY * a, FILE * f) fprintf (f, "Content-Type: %s/%s", TYPE (a), a->subtype); if (a->parameter) { + parameter_t *p; + len = 25 + m_strlen(a->subtype); /* approximate len. of content-type */ for (p = a->parameter; p; p = p->next) { @@ -332,6 +301,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) { @@ -365,20 +335,18 @@ int mutt_write_mime_header (BODY * a, FILE * f) return (ferror (f) ? -1 : 0); } -# define write_as_text_part(a) (mutt_is_text_part(a) || mutt_is_application_pgp(a)) - int mutt_write_mime_body (BODY * a, FILE * f) { - char *p, boundary[SHORT_STRING]; + const char *p; + char boundary[SHORT_STRING]; char send_charset[SHORT_STRING]; FILE *fpin; BODY *t; - FGETCONV *fc; + fgetconv_t *fc; if (a->type == TYPEMULTIPART) { /* First, find the boundary to use */ - if (!(p = mutt_get_parameter ("boundary", a->parameter))) { - debug_print (1, ("no boundary parameter found!\n")); + if (!(p = parameter_getval(a->parameter, "boundary"))) { mutt_error _("No boundary parameter found! [report this error]"); return (-1); @@ -404,7 +372,6 @@ int mutt_write_mime_body (BODY * a, FILE * f) } if ((fpin = fopen (a->filename, "r")) == NULL) { - debug_print (1, ("%s no longer exists!\n", a->filename)); mutt_error (_("%s no longer exists!"), a->filename); return -1; } @@ -416,6 +383,7 @@ int mutt_write_mime_body (BODY * a, FILE * f) else fc = fgetconv_open (fpin, 0, 0, 0); +#define write_as_text_part(a) (mutt_is_text_part(a) || mutt_is_application_pgp(a)) if (a->encoding == ENCQUOTEDPRINTABLE) encode_quoted (fc, f, write_as_text_part (a)); else if (a->encoding == ENCBASE64) @@ -424,6 +392,7 @@ int mutt_write_mime_body (BODY * a, FILE * f) encode_8bit (fc, f, write_as_text_part (a)); else mutt_copy_stream (fpin, f); +#undef write_as_text_part fgetconv_close (&fc); fclose (fpin); @@ -431,23 +400,6 @@ int mutt_write_mime_body (BODY * a, FILE * f) return (ferror (f) ? -1 : 0); } -#undef write_as_text_part - -#define BOUNDARYLEN 16 -void mutt_generate_boundary (PARAMETER ** parm) -{ - char rs[BOUNDARYLEN + 1]; - char *p = rs; - int i; - - rs[BOUNDARYLEN] = 0; - for (i = 0; i < BOUNDARYLEN; i++) - *p++ = __m_b64chars[LRAND() % sizeof(__m_b64chars)]; - *p = 0; - - mutt_set_parameter ("boundary", rs, parm); -} - typedef struct { int from; int whitespace; @@ -458,7 +410,7 @@ typedef struct { static void update_content_info (CONTENT * info, CONTENT_STATE * s, char *d, - size_t dlen) + ssize_t dlen) { int from = s->from; int whitespace = s->whitespace; @@ -565,9 +517,6 @@ static void update_content_info (CONTENT * info, CONTENT_STATE * s, char *d, } -/* Define as 1 if iconv sometimes returns -1(EILSEQ) instead of transcribing. */ -#define BUGGY_ICONV 1 - /* * Find the best charset conversion of the file from fromcode into one * of the tocodes. If successful, set *tocode and CONTENT *info and @@ -584,7 +533,7 @@ static void update_content_info (CONTENT * info, CONTENT_STATE * s, char *d, * long as the input for any pair of charsets we might be interested * in. */ -static size_t convert_file_to (FILE * file, const char *fromcode, +static ssize_t convert_file_to (FILE * file, const char *fromcode, int ncodes, const char **tocodes, int *tocode, CONTENT * info) { @@ -593,18 +542,18 @@ static size_t convert_file_to (FILE * file, const char *fromcode, char bufi[256], bufu[512], bufo[4 * sizeof (bufi)]; const char *ib, *ub; char *ob; - size_t ibl, obl, ubl, ubl1, n, ret; + ssize_t ibl, obl, ubl, ubl1, n, ret; int i; CONTENT *infos; CONTENT_STATE *states; - size_t *score; + ssize_t *score; cd1 = mutt_iconv_open ("UTF-8", fromcode, 0); - if (cd1 == (iconv_t) (-1)) + if (cd1 == MUTT_ICONV_ERROR) return -1; cd = p_new(iconv_t, ncodes); - score = p_new(size_t, ncodes); + score = p_new(ssize_t, ncodes); states = p_new(CONTENT_STATE, ncodes); infos = p_new(CONTENT, ncodes); @@ -613,7 +562,7 @@ static size_t convert_file_to (FILE * file, const char *fromcode, cd[i] = mutt_iconv_open (tocodes[i], "UTF-8", 0); else /* Special case for conversion to UTF-8 */ - cd[i] = (iconv_t) (-1), score[i] = (size_t) (-1); + cd[i] = MUTT_ICONV_ERROR, score[i] = -1; rewind (file); ibl = 0; @@ -627,33 +576,27 @@ static size_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 == (size_t) (-1) || !n || ICONV_NONTRANS); - if (n == (size_t) (-1) && - ((errno != EINVAL && errno != E2BIG) || ib == bufi)) { - assert (errno == EILSEQ || - (errno == EINVAL && ib == bufi && ibl < sizeof (bufi))); - ret = (size_t) (-1); + if (n == -1 && ((errno != EINVAL && errno != E2BIG) || ib == bufi)) { + ret = -1; break; } ubl1 = ob - bufu; /* Convert from UTF-8 */ for (i = 0; i < ncodes; i++) - if (cd[i] != (iconv_t) (-1) && score[i] != (size_t) (-1)) { + if (cd[i] != MUTT_ICONV_ERROR && score[i] != -1) { ub = bufu, ubl = ubl1; ob = bufo, obl = sizeof (bufo); n = my_iconv(cd[i], (ibl || ubl) ? &ub : 0, &ubl, &ob, &obl); - if (n == (size_t) (-1)) { - assert (errno == E2BIG || - (BUGGY_ICONV && (errno == EILSEQ || errno == ENOENT))); - score[i] = (size_t) (-1); + if (n == -1) { + score[i] = -1; } else { score[i] += n; update_content_info (&infos[i], &states[i], bufo, ob - bufo); } } - else if (cd[i] == (iconv_t) (-1) && score[i] == (size_t) (-1)) + else if (cd[i] == MUTT_ICONV_ERROR && score[i] == -1) /* Special case for conversion to UTF-8 */ update_content_info (&infos[i], &states[i], bufu, ubl1); @@ -668,31 +611,31 @@ static size_t convert_file_to (FILE * file, const char *fromcode, if (!ret) { /* Find best score */ - ret = (size_t) (-1); + ret = -1; for (i = 0; i < ncodes; i++) { - if (cd[i] == (iconv_t) (-1) && score[i] == (size_t) (-1)) { + if (cd[i] == MUTT_ICONV_ERROR && score[i] == -1) { /* Special case for conversion to UTF-8 */ *tocode = i; ret = 0; break; } - else if (cd[i] == (iconv_t) (-1) || score[i] == (size_t) (-1)) + else if (cd[i] == MUTT_ICONV_ERROR || score[i] == -1) continue; - else if (ret == (size_t) (-1) || score[i] < ret) { + else if (ret == -1 || score[i] < ret) { *tocode = i; ret = score[i]; if (!ret) break; } } - if (ret != (size_t) (-1)) { + if (ret != -1) { memcpy (info, &infos[*tocode], sizeof (CONTENT)); update_content_info (info, &states[*tocode], 0, 0); /* EOF */ } } for (i = 0; i < ncodes; i++) - if (cd[i] != (iconv_t) (-1)) + if (cd[i] != MUTT_ICONV_ERROR) iconv_close (cd[i]); iconv_close (cd1); @@ -718,7 +661,7 @@ static size_t convert_file_to (FILE * file, const char *fromcode, * However, if fromcode is zero then fromcodes is assumed to be the * name of a single charset even if it contains a colon. */ -static size_t convert_file_from_to (FILE * file, +static ssize_t convert_file_from_to (FILE * file, const char *fromcodes, const char *tocodes, char **fromcode, char **tocode, CONTENT * info) @@ -726,7 +669,7 @@ static size_t convert_file_from_to (FILE * file, char *fcode; char **tcode; const char *c, *c1; - size_t ret; + ssize_t ret; int ncodes, i, cn; /* Count the tocodes */ @@ -745,7 +688,7 @@ static size_t convert_file_from_to (FILE * file, tcode[i] = m_substrdup(c, c1); } - ret = (size_t) (-1); + ret = -1; if (fromcode) { /* Try each fromcode in turn */ for (c = fromcodes; c; c = c1 ? c1 + 1 : 0) { @@ -755,7 +698,7 @@ static size_t convert_file_from_to (FILE * file, ret = convert_file_to (file, fcode, ncodes, (const char **) tcode, &cn, info); - if (ret != (size_t) (-1)) { + if (ret != -1) { *fromcode = fcode; *tocode = tcode[cn]; tcode[cn] = 0; @@ -768,7 +711,7 @@ static size_t convert_file_from_to (FILE * file, /* There is only one fromcode */ ret = convert_file_to (file, fromcodes, ncodes, (const char **) tcode, &cn, info); - if (ret != (size_t) (-1)) { + if (ret != -1) { *tocode = tcode[cn]; tcode[cn] = 0; } @@ -796,7 +739,7 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) char *tocode = NULL; char buffer[100]; char chsbuf[STRING]; - size_t r; + ssize_t r; struct stat sb; @@ -814,7 +757,6 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) } if ((fp = fopen (fname, "r")) == NULL) { - debug_print (1, ("%s: %s (errno %d).\n", fname, strerror (errno), errno)); return (NULL); } @@ -822,15 +764,15 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) p_clear(&state, 1); if (b != NULL && b->type == TYPETEXT && (!b->noconv && !b->force_charset)) { - char *chs = mutt_get_parameter ("charset", b->parameter); + 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, - &fromcode, &tocode, info) != (size_t) (-1)) { + &fromcode, &tocode, info) != -1) { if (!chs) { - mutt_canonical_charset (chsbuf, sizeof (chsbuf), tocode); - mutt_set_parameter ("charset", chsbuf, &b->parameter); + charset_canonicalize (chsbuf, sizeof (chsbuf), tocode); + parameter_setval(&b->parameter, "charset", chsbuf); } b->file_charset = fromcode; p_delete(&tocode); @@ -847,10 +789,9 @@ CONTENT *mutt_get_content_info (const char *fname, BODY * b) safe_fclose (&fp); if (b != NULL && b->type == TYPETEXT && (!b->noconv && !b->force_charset)) - mutt_set_parameter ("charset", (!info->hibin ? "us-ascii" : - Charset - && !mutt_is_us_ascii (Charset) ? Charset : - "unknown-8bit"), &b->parameter); + parameter_setval(&b->parameter, "charset", + (!info->hibin ? "us-ascii" + : Charset && !charset_is_us_ascii(Charset) ? Charset : "unknown-8bit")); return info; } @@ -898,7 +839,6 @@ int mutt_lookup_mime_type (BODY * att, const char *path) m_strcpy(buf, sizeof(buf), SYSCONFDIR "/mime.types"); break; default: - debug_print (1, ("Internal error, count = %d.\n", count)); goto bye; /* shouldn't happen */ } @@ -983,9 +923,9 @@ void mutt_message_to_7bit (BODY * a, FILE * fp) 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; } @@ -1023,7 +963,7 @@ cleanup: return; } a->length = sb.st_size; - mutt_free_body (&a->parts); + body_list_wipe(&a->parts); a->hdr->content = NULL; } @@ -1048,9 +988,9 @@ static void transform_to_7bit (BODY * a, FILE * fpin) 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; @@ -1104,10 +1044,6 @@ static void mutt_set_encoding (BODY * b, CONTENT * info) && ascii_strcasecmp (b->subtype, "pgp-keys") == 0) b->encoding = ENC7BIT; else -#if 0 - if (info->lobin || info->hibin || info->binary || info->linemax > 990 - || info->cr || ( /* option (OPTENCODEFROM) && */ info->from)) -#endif { /* Determine which encoding is smaller */ if (1.33 * (float) (info->lobin + info->hibin + info->ascii) < @@ -1116,10 +1052,6 @@ static void mutt_set_encoding (BODY * b, CONTENT * info) else b->encoding = ENCQUOTEDPRINTABLE; } -#if 0 - else - b->encoding = ENC7BIT; -#endif } void mutt_stamp_attachment (BODY * a) @@ -1129,22 +1061,16 @@ void mutt_stamp_attachment (BODY * a) /* Get a body's character set */ -char *mutt_get_body_charset (char *d, size_t dlen, BODY * b) +char *mutt_get_body_charset(char *d, ssize_t dlen, BODY * b) { - char *p = NULL; + const char *p; - if (b && b->type != TYPETEXT) - return NULL; - - if (b) - p = mutt_get_parameter ("charset", b->parameter); - - if (p) - mutt_canonical_charset (d, dlen, NONULL (p)); - else - m_strcpy(d, dlen, "us-ascii"); + if (b && b->type != TYPETEXT) + return NULL; - return d; + p = b ? parameter_getval(b->parameter, "charset") : NULL; + charset_canonicalize(d, dlen, p); + return d; } @@ -1155,11 +1081,11 @@ void mutt_update_encoding (BODY * a) char chsbuff[STRING]; /* override noconv when it's us-ascii */ - if (mutt_is_us_ascii (mutt_get_body_charset (chsbuff, sizeof (chsbuff), a))) + if (charset_is_us_ascii (mutt_get_body_charset (chsbuff, sizeof (chsbuff), a))) a->noconv = 0; if (!a->force_charset && !a->noconv) - mutt_delete_parameter ("charset", &a->parameter); + parameter_delval(&a->parameter, "charset"); if ((info = mutt_get_content_info (a->filename, a)) == NULL) return; @@ -1190,7 +1116,7 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg) if ((fp = safe_fopen (buffer, "w+")) == NULL) return NULL; - body = mutt_new_body (); + body = body_new(); body->type = TYPEMESSAGE; body->subtype = m_strdup("rfc822"); body->filename = m_strdup(buffer); @@ -1251,31 +1177,16 @@ BODY *mutt_make_file_attach (const char *path) BODY *att; CONTENT *info; - att = mutt_new_body (); + att = body_new(); att->filename = m_strdup(path); /* Attempt to determine the appropriate content-type based on the filename * suffix. */ - -#if 0 - - if ((n = - mutt_lookup_mime_type (buf, sizeof (buf), xbuf, sizeof (xbuf), - path)) != TYPEOTHER || *xbuf != '\0') { - att->type = n; - att->subtype = m_strdup(buf); - att->xtype = m_strdup(xbuf); - } - -#else - mutt_lookup_mime_type (att, path); -#endif - if ((info = mutt_get_content_info (path, att)) == NULL) { - mutt_free_body (&att); + body_list_wipe(&att); return NULL; } @@ -1288,15 +1199,14 @@ BODY *mutt_make_file_attach (const char *path) */ att->type = TYPETEXT; att->subtype = m_strdup("plain"); - } - else { + } else { att->type = TYPEAPPLICATION; att->subtype = m_strdup("octet-stream"); } } mutt_update_encoding (att); - return (att); + return att; } static int get_toplevel_encoding (BODY * a) @@ -1317,11 +1227,11 @@ BODY *mutt_make_multipart (BODY * b) { BODY *new; - new = mutt_new_body (); + new = body_new(); new->type = TYPEMULTIPART; new->subtype = m_strdup("mixed"); new->encoding = get_toplevel_encoding (b); - mutt_generate_boundary (&new->parameter); + parameter_set_boundary(&new->parameter); new->use_disp = 0; new->disposition = DISPINLINE; new->parts = b; @@ -1338,12 +1248,12 @@ BODY *mutt_remove_multipart (BODY * b) t = b; b = b->parts; t->parts = NULL; - mutt_free_body (&t); + body_list_wipe(&t); } return b; } -char *mutt_make_date (char *s, size_t len) +char *mutt_make_date (char *s, ssize_t len) { time_t t = time (NULL); struct tm *l = localtime (&t); @@ -1405,9 +1315,9 @@ void mutt_write_address_list (address_t * adr, FILE * fp, int linelen, /* need to write the list in reverse because they are stored in reverse order * when parsed to speed up threading */ -void mutt_write_references (LIST * r, FILE * f) +void mutt_write_references (string_list_t * r, FILE * f) { - LIST **ref = NULL; + string_list_t **ref = NULL; int refcnt = 0, refmax = 0; for (; (TrimRef == 0 || refcnt < TrimRef) && r; r = r->next) { @@ -1424,6 +1334,24 @@ void mutt_write_references (LIST * r, FILE * f) 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. @@ -1445,9 +1373,8 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, { char buffer[LONG_STRING]; char *p; - LIST *tmp = env->userhdrs; + 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)) @@ -1455,8 +1382,6 @@ 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 */ @@ -1474,7 +1399,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) { @@ -1485,7 +1410,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) { @@ -1498,30 +1423,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 */ @@ -1532,7 +1457,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) @@ -1562,8 +1487,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, ':'))) { @@ -1596,12 +1519,10 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, 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); } -static void encode_headers (LIST * h) +static void encode_headers (string_list_t * h) { char *tmp; char *p; @@ -1679,6 +1600,7 @@ static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt) tm = gmtime (&now); while (*fmt) { + static char MsgIdPfx = 'A'; int c = *fmt++; if (c != '%') { @@ -1744,22 +1666,18 @@ static void mutt_gen_localpart(char *buf, unsigned int len, const char *fmt) #undef APPEND_FMT } -char *mutt_gen_msgid (void) +static char *mutt_gen_msgid (void) { 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' */ - - mutt_gen_localpart (localpart, localpart_length, MsgIdFormat); + if (!(fqdn = mutt_fqdn(0))) + fqdn = NONULL(Hostname); - 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) @@ -1807,17 +1725,8 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) setsid (); /* next we close all open files */ -#if defined(OPEN_MAX) - for (fd = 0; fd < OPEN_MAX; fd++) + for (fd = 0; fd < getdtablesize(); fd++) close (fd); -#elif defined(_POSIX_OPEN_MAX) - for (fd = 0; fd < _POSIX_OPEN_MAX; fd++) - close (fd); -#else - close (0); - close (1); - close (2); -#endif /* now the second fork() */ if ((pid = fork ()) == 0) { @@ -1844,7 +1753,7 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) _exit (S_ERR); } - execv (path, args); + execv (path, (char**)args); _exit (S_ERR); } else if (pid == -1) { @@ -1914,7 +1823,7 @@ send_msg(const char *path, const char **args, const char *msg, char **tempfile) } static const char ** -add_args(const char **args, size_t *argslen, size_t *argsmax, address_t * addr) +add_args(const char **args, ssize_t *argslen, ssize_t *argsmax, address_t * addr) { for (; addr; addr = addr->next) { /* weed out group mailboxes, since those are for display only */ @@ -1928,7 +1837,7 @@ add_args(const char **args, size_t *argslen, size_t *argsmax, address_t * addr) } static const char ** -add_option(const char **args, size_t *argslen, size_t *argsmax, const char *s) +add_option(const char **args, ssize_t *argslen, ssize_t *argsmax, const char *s) { if (*argslen == *argsmax) { p_realloc(&args, *argsmax += 5); @@ -1944,7 +1853,7 @@ static int mutt_invoke_sendmail (address_t * from, /* the sender */ { /* message contains 8bit chars */ char *ps = NULL, *path = NULL, *s = NULL, *childout = NULL; const char **args = NULL; - size_t argslen = 0, argsmax = 0; + ssize_t argslen = 0, argsmax = 0; int i; #ifdef USE_NNTP @@ -2070,58 +1979,6 @@ int mutt_invoke_mta (address_t * from, /* the sender */ return mutt_invoke_sendmail (from, to, cc, bcc, msg, eightbit); } -/* appends string 'b' to string 'a', and returns the pointer to the new - string. */ -char *mutt_append_string (char *a, const char *b) -{ - size_t la = m_strlen(a); - - p_realloc(&a, la + m_strlen(b) + 1); - strcpy (a + la, b); /* __STRCPY_CHECKED__ */ - return (a); -} - -/* returns 1 if char `c' needs to be quoted to protect from shell - interpretation when executing commands in a subshell */ -#define INVALID_CHAR(c) (!isalnum ((unsigned char)c) && !strchr ("@.+-_,:", c)) - -/* returns 1 if string `s' contains characters which could cause problems - when used on a command line to execute a command */ -int mutt_needs_quote (const char *s) -{ - while (*s) { - if (INVALID_CHAR (*s)) - return 1; - s++; - } - return 0; -} - -/* Quote a string to prevent shell escapes when this string is used on the - command line to send mail. */ -char *mutt_quote_string (const char *s) -{ - char *r, *pr; - size_t rlen; - - rlen = m_strlen(s) + 3; - pr = r = p_new(char, rlen); - *pr++ = '"'; - while (*s) { - if (INVALID_CHAR (*s)) { - size_t o = pr - r; - - p_realloc(&r, ++rlen); - pr = r + o; - *pr++ = '\\'; - } - *pr++ = *s++; - } - *pr++ = '"'; - *pr = 0; - return (r); -} - /* For postponing (!final) do the necessary encodings only */ void mutt_prepare_envelope (ENVELOPE * env, int final) { @@ -2170,12 +2027,12 @@ void mutt_prepare_envelope (ENVELOPE * env, int final) void mutt_unprepare_envelope (ENVELOPE * env) { - LIST *item; + string_list_t *item; for (item = env->userhdrs; item; item = item->next) rfc2047_decode (&item->data); - address_delete (&env->mail_followup_to); + address_list_wipe(&env->mail_followup_to); /* back conversions */ rfc2047_decode_adrlist (env->to); @@ -2211,8 +2068,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(Tempdir), NULL); + if (f) { int ch_flags = CH_XMIT | CH_NONEWLINE | CH_NOQFROM; if (!option (OPTBOUNCEDELIVERED)) @@ -2230,8 +2087,8 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, mutt_copy_bytes (fp, f, h->content->length); 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) @@ -2267,58 +2124,18 @@ int mutt_bounce_message (FILE * fp, HEADER * h, address_t * to) ret = _mutt_bounce_message (fp, h, to, resent_from, from); - address_delete (&from); + address_list_wipe(&from); return ret; } - -/* given a list of addresses, return a list of unique addresses */ -address_t *mutt_remove_duplicates (address_t * addr) -{ - address_t *top = addr; - address_t **last = ⊤ - address_t *tmp; - int dup; - - while (addr) { - for (tmp = top, dup = 0; tmp && tmp != addr; tmp = tmp->next) { - if (tmp->mailbox && addr->mailbox && - !ascii_strcasecmp (addr->mailbox, tmp->mailbox)) { - dup = 1; - break; - } - } - - if (dup) { - debug_print (2, ("Removing %s\n", addr->mailbox)); - - *last = addr->next; - - addr->next = NULL; - address_delete (&addr); - - addr = *last; - } - else { - last = &addr->next; - addr = addr->next; - } - } - - return (top); -} - static void set_noconv_flags (BODY * b, short flag) { for (; b; b = b->next) { if (b->type == TYPEMESSAGE || b->type == TYPEMULTIPART) set_noconv_flags (b->parts, flag); else if (b->type == TYPETEXT && b->noconv) { - if (flag) - mutt_set_parameter ("x-mutt-noconv", "yes", &b->parameter); - else - mutt_delete_parameter ("x-mutt-noconv", &b->parameter); + parameter_setval(&b->parameter, "x-mutt-noconv", flag ? "yes" : NULL); } } } @@ -2336,7 +2153,6 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, set_noconv_flags (hdr->content, 1); if (mx_open_mailbox (path, M_APPEND | M_QUIET, &f) == NULL) { - debug_print (1, ("unable to open mailbox %s in append-mode, aborting.\n", path)); return (-1); } @@ -2344,11 +2160,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(Tempdir), NULL); + if (!tempfp) { + mutt_error(_("Could not create temporary file")); mx_close_mailbox (&f, NULL); - return (-1); + return -1; } } @@ -2421,7 +2237,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, */ if (post && hdr->chain && hdr->chain) { - LIST *p; + string_list_t *p; fputs ("X-Mutt-Mix:", msg->fp); for (p = hdr->chain; p; p = p->next) @@ -2449,7 +2265,6 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, fflush (tempfp); if (ferror (tempfp)) { - debug_print (1, ("%s: write failed.\n", tempfile)); fclose (tempfp); unlink (tempfile); mx_commit_message (msg, &f); /* XXX - really? */