X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/f2753d64be0a74a22018e03ec9c04cc9ca45d3ab..d3d8f636ed951b4c02bdeeb146b528fe00dfbb48:/uip/post.c diff --git a/uip/post.c b/uip/post.c index 44faf725..5f70e62f 100644 --- a/uip/post.c +++ b/uip/post.c @@ -16,6 +16,7 @@ #include #include #include "../sbr/m_mktemp.h" +#include "../sbr/message_id.h" #ifdef HAVE_SYS_TIME_H # include @@ -290,7 +291,8 @@ static void putfmt (char *, char *, int *, FILE *); static void start_headers (void); static void finish_headers (FILE *); static int get_header (char *, struct headers *); -static int putadr (char *, char *, struct mailname *, FILE *, unsigned int); +static int putadr (char *, char *, struct mailname *, FILE *, unsigned int, + char *, unsigned int); static void putgrp (char *, char *, FILE *, unsigned int); static int insert (struct mailname *); static void pl (void); @@ -321,7 +323,7 @@ main (int argc, char **argv) char *cp, *msg = NULL, **argp, **arguments, *envelope; char buf[NMH_BUFSIZ], name[NAMESZ], *auth_svc = NULL; FILE *in, *out; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; } @@ -617,16 +619,17 @@ main (int argc, char **argv) hdrtab = msgstate == NORMAL ? NHeaders : RHeaders; + gstate = m_getfld_state_init(in); for (compnum = 1;;) { int bufsz = sizeof buf; - switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) { + switch (state = m_getfld2(&gstate, name, buf, &bufsz)) { case FLD: case FLDPLUS: compnum++; cp = mh_xstrdup(buf); while (state == FLDPLUS) { bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); cp = add (buf, cp); } putfmt (name, cp, &eai, out); @@ -640,7 +643,7 @@ main (int argc, char **argv) fprintf (out, "\n%s", buf); while (state == BODY) { bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); fputs (buf, out); } break; @@ -789,6 +792,8 @@ putfmt (char *name, char *str, int *eai, FILE *out) int count, grp, i, keep; char *cp, *pp, *qp; char namep[BUFSIZ], error[BUFSIZ]; + char *savehdr = NULL; + unsigned int savehdrlen = 0; struct mailname *mp = NULL, *np = NULL; struct headers *hdr; @@ -872,6 +877,19 @@ putfmt (char *name, char *str, int *eai, FILE *out) return; } + /* + * If this is a From:/Resent-From: header, save the full thing for + * later in case we need it for use when constructing a Bcc draft message. + * Because we want to capture the results of alias expansion, save + * the output from putadr(). + */ + + if ((msgstate == RESENT) ? (hdr->set & MRFM) : (hdr->set & MFRM)) { + savehdr = fullfrom; + savehdr[0] = '\0'; + savehdrlen = sizeof(fullfrom); + } + tmpaddrs.m_next = NULL; for (count = 0; (cp = getname (str)); count++) { @@ -991,7 +1009,8 @@ putfmt (char *name, char *str, int *eai, FILE *out) grp++; } - if (putadr (namep, qp, mp, out, hdr->flags)) + if (putadr (namep, qp, mp, out, hdr->flags, savehdr, + savehdrlen)) msgflags |= (hdr->set & (MVIS | MINV)); else mnfree (mp); @@ -1040,7 +1059,7 @@ putfmt (char *name, char *str, int *eai, FILE *out) putgrp (namep, mp->m_gname, out, hdr->flags); if (mp->m_ingrp) grp++; - keep = putadr (namep, "", mp, out, hdr->flags); + keep = putadr (namep, "", mp, out, hdr->flags, savehdr, savehdrlen); np = mp->m_next; if (keep) { mp->m_next = NULL; @@ -1051,17 +1070,11 @@ putfmt (char *name, char *str, int *eai, FILE *out) } /* - * If this is a From:/Resent-From: header, save the full thing for - * later in case we need it for use when constructing a Bcc draft message + * If it was a From header, strip off any trailing newlines from + * the alias-expanded From line. */ if ((msgstate == RESENT) ? (hdr->set & MRFM) : (hdr->set & MFRM)) { - strncpy(fullfrom, str, sizeof(fullfrom)); - fullfrom[sizeof(fullfrom) - 1] = 0; - /* - * Strip off any trailing newlines - */ - while (*fullfrom && fullfrom[strlen(fullfrom) - 1] == '\n') { fullfrom[strlen(fullfrom) - 1] = '\0'; } @@ -1220,9 +1233,11 @@ get_header (char *header, struct headers *table) static int -putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flags) +putadr (char *name, char *aka, struct mailname *mp, FILE *out, + unsigned int flags, char *savehdr, unsigned int savehdrsize) { - int len; + int len, saveappend = 0; + unsigned int shlen; char *cp; char buffer[BUFSIZ]; @@ -1237,6 +1252,11 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag linepos += (nameoutput = strlen (name) + 2); } + if (savehdr) { + shlen = strlen(savehdr); + saveappend = 1; + } + if (*aka && mp->m_type != UUCPHOST && !mp->m_pers) mp->m_pers = mh_xstrdup(aka); if (format) { @@ -1252,15 +1272,34 @@ putadr (char *name, char *aka, struct mailname *mp, FILE *out, unsigned int flag len = strlen (cp); if (linepos != nameoutput) { - if (len + linepos + 2 > outputlinelen) + if (len + linepos + 2 > outputlinelen) { fprintf (out, ",\n%*s", linepos = nameoutput, ""); - else { + if (saveappend) { + if (shlen + 2 + nameoutput + len >= savehdrsize) { + saveappend = 0; + } else { + snprintf(savehdr + shlen, savehdrsize - shlen, ",\n%*s", + linepos, ""); + } + } + } else { fputs (", ", out); linepos += 2; + if (saveappend) { + if (shlen + 2 + len >= savehdrsize) { + saveappend = 0; + } else { + strncat(savehdr, ", ", savehdrsize - shlen); + } + } } } fputs (cp, out); + + if (saveappend && shlen + len < savehdrsize) + strncat(savehdr, cp, savehdrsize - shlen + len); + linepos += len; return (flags & HTRY); @@ -1848,7 +1887,7 @@ do_text (char *file, int fd) int retval, state; char buf[BUFSIZ]; - lseek (fd, (off_t) 0, SEEK_SET); + lseek(fd, 0, SEEK_SET); while ((state = read (fd, buf, sizeof(buf))) > 0) { if (rp_isbad (retval = sm_wtxt (buf, state))) @@ -1865,7 +1904,7 @@ do_text (char *file, int fd) case RP_NO: case RP_NDEL: die (NULL, "posting failed; %s", rp_string (retval)); - /* FALLTHRU */ + break; default: die (NULL, "unexpected response; %s", rp_string (retval));