X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=sendlib.c;h=e6c03594438b93d8255498d8da6d049e10b16efd;hp=a4613541ef11a065db54bcc69c1895b7b85d0c99;hb=06797b065bbd5d88bf473c4b9f8525dcb9990bb7;hpb=d9960a434f5c00a534a0dabe02ae5ab8d4881569 diff --git a/sendlib.c b/sendlib.c index a461354..e6c0359 100644 --- a/sendlib.c +++ b/sendlib.c @@ -13,39 +13,40 @@ # include "config.h" #endif +#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 "mutt_curses.h" -#include "rfc2047.h" -#include "rfc2231.h" #include "mx.h" -#include "mime.h" #include "copy.h" #include "pager.h" #include "charset.h" -#include "mutt_crypt.h" +#include #include "mutt_idna.h" -#include "lib/debug.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #ifdef USE_LIBESMTP # include "mutt_libesmtp.h" #endif /* USE_LIBESMTP */ @@ -69,20 +70,8 @@ #include #endif -extern char RFC822Specials[]; - #define DISPOSITION(X) X==DISPATTACH?"attachment":"inline" -const char MimeSpecials[] = "@.,;:<>[]\\\"()?/= \t"; - -char B64Chars[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', - 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', '+', '/' -}; - static char MsgIdPfx = 'A'; static void transform_to_7bit (BODY * a, FILE * fpin); @@ -121,16 +110,16 @@ static void encode_quoted (FGETCONV * fc, FILE * fout, int istext) } /* Escape lines that begin with/only contain "the message separator". */ - if (linelen == 4 && !str_ncmp ("From", line, 4)) { - strfcpy (line, "=46rom", sizeof (line)); + if (linelen == 4 && !m_strncmp("From", line, 4)) { + m_strcpy(line, sizeof(line), "=46rom"); linelen = 6; } - else if (linelen == 4 && !str_ncmp ("from", line, 4)) { - strfcpy (line, "=66rom", sizeof (line)); + else if (linelen == 4 && !m_strncmp("from", line, 4)) { + m_strcpy(line, sizeof(line), "=66rom"); linelen = 6; } else if (linelen == 1 && line[0] == '.') { - strfcpy (line, "=2E", sizeof (line)); + m_strcpy(line, sizeof(line), "=2E"); linelen = 3; } @@ -223,19 +212,19 @@ static void b64_flush (FILE * fout) for (i = b64_num; i < 3; i++) b64_buffer[i] = '\0'; - fputc (B64Chars[(b64_buffer[0] >> 2) & 0x3f], fout); + fputc(__m_b64chars[(b64_buffer[0] >> 2) & 0x3f], fout); b64_linelen++; - fputc (B64Chars + fputc(__m_b64chars [((b64_buffer[0] & 0x3) << 4) | ((b64_buffer[1] >> 4) & 0xf)], fout); b64_linelen++; if (b64_num > 1) { - fputc (B64Chars + fputc (__m_b64chars [((b64_buffer[1] & 0xf) << 2) | ((b64_buffer[2] >> 6) & 0x3)], fout); b64_linelen++; if (b64_num > 2) { - fputc (B64Chars[b64_buffer[2] & 0x3f], fout); + fputc (__m_b64chars[b64_buffer[2] & 0x3f], fout); b64_linelen++; } } @@ -309,7 +298,7 @@ int mutt_write_mime_header (BODY * a, FILE * f) buffer[0] = 0; tmp = m_strdup(p->value); encode = rfc2231_encode_string (&tmp); - rfc822_cat (buffer, sizeof (buffer), tmp, MimeSpecials); + rfc822_strcpy(buffer, sizeof(buffer), tmp, MimeSpecials); /* Dirty hack to make messages readable by Outlook Express * for the Mac: force quotes around the boundary parameter @@ -361,7 +350,7 @@ int mutt_write_mime_header (BODY * a, FILE * f) buffer[0] = 0; tmp = m_strdup(t); encode = rfc2231_encode_string (&tmp); - rfc822_cat (buffer, sizeof (buffer), tmp, MimeSpecials); + rfc822_strcpy(buffer, sizeof(buffer), tmp, MimeSpecials); p_delete(&tmp); fprintf (f, "; filename%s=%s", encode ? "*" : "", buffer); } @@ -376,9 +365,7 @@ 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) \ - || ((WithCrypto & APPLICATION_PGP)\ - && mutt_is_application_pgp(a))) +# 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) { @@ -396,7 +383,7 @@ int mutt_write_mime_body (BODY * a, FILE * f) return (-1); } - strfcpy (boundary, p, sizeof (boundary)); + m_strcpy(boundary, sizeof(boundary), p); for (t = a->parts; t; t = t->next) { fprintf (f, "\n--%s\n", boundary); @@ -411,9 +398,7 @@ int mutt_write_mime_body (BODY * a, FILE * f) } /* This is pretty gross, but it's the best solution for now... */ - if ((WithCrypto & APPLICATION_PGP) - && a->type == TYPEAPPLICATION - && m_strcmp(a->subtype, "pgp-encrypted") == 0) { + if (a->type == TYPEAPPLICATION && !m_strcmp(a->subtype, "pgp-encrypted")) { fputs ("Version: 1\n", f); return 0; } @@ -457,7 +442,7 @@ void mutt_generate_boundary (PARAMETER ** parm) rs[BOUNDARYLEN] = 0; for (i = 0; i < BOUNDARYLEN; i++) - *p++ = B64Chars[LRAND () % sizeof (B64Chars)]; + *p++ = __m_b64chars[LRAND() % sizeof(__m_b64chars)]; *p = 0; mutt_set_parameter ("boundary", rs, parm); @@ -757,7 +742,7 @@ static size_t convert_file_from_to (FILE * file, for (c = tocodes, i = 0; c; c = c1 ? c1 + 1 : 0, i++) { if ((c1 = strchr (c, ':')) == c) continue; - tcode[i] = str_substrdup (c, c1); + tcode[i] = m_substrdup(c, c1); } ret = (size_t) (-1); @@ -766,7 +751,7 @@ static size_t convert_file_from_to (FILE * file, for (c = fromcodes; c; c = c1 ? c1 + 1 : 0) { if ((c1 = strchr (c, ':')) == c) continue; - fcode = str_substrdup (c, c1); + fcode = m_substrdup(c, c1); ret = convert_file_to (file, fcode, ncodes, (const char **) tcode, &cn, info); @@ -904,13 +889,13 @@ int mutt_lookup_mime_type (BODY * att, const char *path) snprintf (buf, sizeof (buf), "%s/.mime.types", NONULL (Homedir)); break; case 1: - strfcpy (buf, SYSCONFDIR "/muttng-mime.types", sizeof (buf)); + m_strcpy(buf, sizeof(buf), SYSCONFDIR "/madmutt-mime.types"); break; case 2: - strfcpy (buf, PKGDATADIR "/mime.types", sizeof (buf)); + m_strcpy(buf, sizeof(buf), PKGDATADIR "/mime.types"); break; case 3: - strfcpy (buf, SYSCONFDIR "/mime.types", sizeof (buf)); + m_strcpy(buf, sizeof(buf), SYSCONFDIR "/mime.types"); break; default: debug_print (1, ("Internal error, count = %d.\n", count)); @@ -924,27 +909,22 @@ int mutt_lookup_mime_type (BODY * att, const char *path) *p = 0; /* remove any leading space. */ - ct = buf; - SKIPWS (ct); + ct = vskipspaces(buf); /* position on the next field in this line */ if ((p = strpbrk (ct, " \t")) == NULL) continue; *p++ = 0; - SKIPWS (p); + p = vskipspaces(p); /* cycle through the file extensions */ while ((p = strtok (p, " \t\n"))) { sze = m_strlen(p); if ((sze > cur_sze) && (szf >= sze) && - (str_casecmp (path + szf - sze, p) == 0 - || ascii_strcasecmp (path + szf - sze, p) == 0) && (szf == sze - || path[szf - - - sze - - - 1] - == '.')) { + (m_strcasecmp(path + szf - sze, p) == 0 + || ascii_strcasecmp (path + szf - sze, p) == 0) + && (szf == sze || path[szf - sze - 1] == '.')) + { /* get the content-type */ if ((p = strchr (ct, '/')) == NULL) { @@ -955,10 +935,10 @@ int mutt_lookup_mime_type (BODY * att, const char *path) for (q = p; *q && !ISSPACE (*q); q++); - str_substrcpy (subtype, p, q, sizeof (subtype)); + m_strncpy(subtype, sizeof(subtype), p, q - p); if ((type = mutt_check_mime_type (ct)) == TYPEOTHER) - strfcpy (xtype, ct, sizeof (xtype)); + m_strcpy(xtype, sizeof(xtype), ct); cur_sze = sze; } @@ -973,8 +953,8 @@ bye: if (type != TYPEOTHER || *xtype != '\0') { att->type = type; - str_replace (&att->subtype, subtype); - str_replace (&att->xtype, xtype); + m_strreplace(&att->subtype, subtype); + m_strreplace(&att->xtype, xtype); } return (type); @@ -1162,7 +1142,7 @@ char *mutt_get_body_charset (char *d, size_t dlen, BODY * b) if (p) mutt_canonical_charset (d, dlen, NONULL (p)); else - strfcpy (d, "us-ascii", dlen); + m_strcpy(d, dlen, "us-ascii"); return d; } @@ -1198,14 +1178,12 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg) BODY *body; FILE *fp; int cmflags, chflags; - int pgp = WithCrypto ? hdr->security : 0; + int pgp = hdr->security; - if (WithCrypto) { - if ((option (OPTMIMEFORWDECODE) || option (OPTFORWDECRYPT)) && - (hdr->security & ENCRYPT)) { - if (!crypt_valid_passphrase (hdr->security)) - return (NULL); - } + if ((option (OPTMIMEFORWDECODE) || option (OPTFORWDECRYPT)) && + (hdr->security & ENCRYPT)) { + if (!crypt_valid_passphrase (hdr->security)) + return (NULL); } mutt_mktemp (buffer); @@ -1230,26 +1208,20 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg) if (!attach_msg && option (OPTMIMEFORWDECODE)) { chflags |= CH_MIME | CH_TXTPLAIN; cmflags = M_CM_DECODE | M_CM_CHARCONV; - if ((WithCrypto & APPLICATION_PGP)) - pgp &= ~PGPENCRYPT; - if ((WithCrypto & APPLICATION_SMIME)) - pgp &= ~SMIMEENCRYPT; + pgp &= ~(PGPENCRYPT|SMIMEENCRYPT); } - else if (WithCrypto && option (OPTFORWDECRYPT) && (hdr->security & ENCRYPT)) { - if ((WithCrypto & APPLICATION_PGP) - && mutt_is_multipart_encrypted (hdr->content)) { + else if (option (OPTFORWDECRYPT) && (hdr->security & ENCRYPT)) { + if (mutt_is_multipart_encrypted (hdr->content)) { chflags |= CH_MIME | CH_NONEWLINE; cmflags = M_CM_DECODE_PGP; pgp &= ~PGPENCRYPT; } - else if ((WithCrypto & APPLICATION_PGP) - && (mutt_is_application_pgp (hdr->content) & PGPENCRYPT)) { + else if (mutt_is_application_pgp (hdr->content) & PGPENCRYPT) { chflags |= CH_MIME | CH_TXTPLAIN; cmflags = M_CM_DECODE | M_CM_CHARCONV; pgp &= ~PGPENCRYPT; } - else if ((WithCrypto & APPLICATION_SMIME) - && mutt_is_application_smime (hdr->content) & SMIMEENCRYPT) { + else if (mutt_is_application_smime (hdr->content) & SMIMEENCRYPT) { chflags |= CH_MIME | CH_TXTPLAIN; cmflags = M_CM_DECODE | M_CM_CHARCONV; pgp &= ~SMIMEENCRYPT; @@ -1261,12 +1233,11 @@ BODY *mutt_make_message_attach (CONTEXT * ctx, HEADER * hdr, int attach_msg) fflush (fp); rewind (fp); - body->hdr = mutt_new_header (); + body->hdr = header_new(); body->hdr->offset = 0; /* we don't need the user headers here */ body->hdr->env = mutt_read_rfc822_header (fp, body->hdr, 0, 0); - if (WithCrypto) - body->hdr->security = pgp; + body->hdr->security = pgp; mutt_update_encoding (body); body->parts = body->hdr->content; @@ -1389,10 +1360,10 @@ char *mutt_make_date (char *s, size_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 * adr, FILE * fp, int linelen, +void mutt_write_address_list (address_t * adr, FILE * fp, int linelen, int display) { - ADDRESS *tmp; + address_t *tmp; char buf[LONG_STRING]; int count = 0; int len; @@ -1596,8 +1567,7 @@ int mutt_write_rfc822_header (FILE * fp, ENVELOPE * env, BODY * attach, /* Add any user defined headers */ for (; tmp; tmp = tmp->next) { if ((p = strchr (tmp->data, ':'))) { - p++; - SKIPWS (p); + p = vskipspaces(p + 1); if (!*p) continue; /* don't emit empty fields. */ @@ -1642,8 +1612,7 @@ static void encode_headers (LIST * h) continue; i = p - h->data; - ++p; - SKIPWS (p); + p = vskipspaces(p + 1); tmp = m_strdup(p); if (!tmp) @@ -1945,7 +1914,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 * addr) +add_args(const char **args, size_t *argslen, size_t *argsmax, address_t * addr) { for (; addr; addr = addr->next) { /* weed out group mailboxes, since those are for display only */ @@ -1968,8 +1937,8 @@ add_option(const char **args, size_t *argslen, size_t *argsmax, const char *s) return (args); } -static int mutt_invoke_sendmail (ADDRESS * from, /* the sender */ - ADDRESS * to, ADDRESS * cc, ADDRESS * bcc, /* recips */ +static int mutt_invoke_sendmail (address_t * from, /* the sender */ + address_t * to, address_t * cc, address_t * bcc, /* recips */ const char *msg, /* file containing message */ int eightbit) { /* message contains 8bit chars */ @@ -2024,7 +1993,7 @@ static int mutt_invoke_sendmail (ADDRESS * from, /* the sender */ args = add_option(args, &argslen, &argsmax, "-B8BITMIME"); if (option (OPTENVFROM)) { - ADDRESS *f = NULL; + address_t *f = NULL; if (EnvFrom) f = EnvFrom; else if (from && !from->next) @@ -2057,11 +2026,8 @@ static int mutt_invoke_sendmail (ADDRESS * from, /* the sender */ if ((i = send_msg (path, args, msg, &childout)) != (EX_OK & 0xff)) { if (i != S_BKG) { - const char *e = mutt_strsysexit (i); - - e = mutt_strsysexit (i); mutt_error (_("Error sending message, child exited %d (%s)."), i, - NONULL (e)); + m_strsysexit(i)); if (childout) { struct stat st; @@ -2088,8 +2054,8 @@ static int mutt_invoke_sendmail (ADDRESS * from, /* the sender */ return (i); } -int mutt_invoke_mta (ADDRESS * from, /* the sender */ - ADDRESS * to, ADDRESS * cc, ADDRESS * bcc, /* recips */ +int mutt_invoke_mta (address_t * from, /* the sender */ + address_t * to, address_t * cc, address_t * bcc, /* recips */ const char *msg, /* file containing message */ int eightbit) { /* message contains 8bit chars */ @@ -2167,13 +2133,13 @@ void mutt_prepare_envelope (ENVELOPE * env, int final) * recipients if there is no To: or Cc: field, so attempt to suppress * it by using an empty To: field. */ - env->to = rfc822_new_address (); + env->to = address_new (); env->to->group = 1; - env->to->next = rfc822_new_address (); + env->to->next = address_new (); buffer[0] = 0; - rfc822_cat (buffer, sizeof (buffer), "undisclosed-recipients", - RFC822Specials); + rfc822_strcpy(buffer, sizeof(buffer), "undisclosed-recipients", + RFC822Specials); env->to->mailbox = m_strdup(buffer); } @@ -2209,7 +2175,7 @@ void mutt_unprepare_envelope (ENVELOPE * env) for (item = env->userhdrs; item; item = item->next) rfc2047_decode (&item->data); - rfc822_free_address (&env->mail_followup_to); + address_delete (&env->mail_followup_to); /* back conversions */ rfc2047_decode_adrlist (env->to); @@ -2220,8 +2186,8 @@ void mutt_unprepare_envelope (ENVELOPE * env) rfc2047_decode (&env->subject); } -static int _mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to, - const char *resent_from, ADDRESS * env_from) +static int _mutt_bounce_message (FILE * fp, HEADER * h, address_t * to, + const char *resent_from, address_t * env_from) { int i, ret = 0; FILE *f; @@ -2274,9 +2240,9 @@ static int _mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to, return ret; } -int mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to) +int mutt_bounce_message (FILE * fp, HEADER * h, address_t * to) { - ADDRESS *from; + address_t *from; const char *fqdn = mutt_fqdn (1); char resent_from[STRING]; int ret; @@ -2301,18 +2267,18 @@ int mutt_bounce_message (FILE * fp, HEADER * h, ADDRESS * to) ret = _mutt_bounce_message (fp, h, to, resent_from, from); - rfc822_free_address (&from); + address_delete (&from); return ret; } /* given a list of addresses, return a list of unique addresses */ -ADDRESS *mutt_remove_duplicates (ADDRESS * addr) +address_t *mutt_remove_duplicates (address_t * addr) { - ADDRESS *top = addr; - ADDRESS **last = ⊤ - ADDRESS *tmp; + address_t *top = addr; + address_t **last = ⊤ + address_t *tmp; int dup; while (addr) { @@ -2330,7 +2296,7 @@ ADDRESS *mutt_remove_duplicates (ADDRESS * addr) *last = addr->next; addr->next = NULL; - rfc822_free_address (&addr); + address_delete (&addr); addr = *last; } @@ -2417,8 +2383,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, /* (postponment) if the mail is to be signed or encrypted, save this info */ - if ((WithCrypto & APPLICATION_PGP) - && post && (hdr->security & APPLICATION_PGP)) { + if (post && (hdr->security & APPLICATION_PGP)) { fputs ("X-Mutt-PGP: ", msg->fp); if (hdr->security & ENCRYPT) fputc ('E', msg->fp); @@ -2433,8 +2398,7 @@ int mutt_write_fcc (const char *path, HEADER * hdr, const char *msgid, } /* (postponment) if the mail is to be signed or encrypted, save this info */ - if ((WithCrypto & APPLICATION_SMIME) - && post && (hdr->security & APPLICATION_SMIME)) { + if (post && (hdr->security & APPLICATION_SMIME)) { fputs ("X-Mutt-SMIME: ", msg->fp); if (hdr->security & ENCRYPT) { fputc ('E', msg->fp);