X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/c5ef7e3f83bdcb3cc581d9650597c8f432b60d9a..ee49b2c5af04d584025cbeb56a32609d63648007:/uip/post.c diff --git a/uip/post.c b/uip/post.c index ff12d0c9..2917945b 100644 --- a/uip/post.c +++ b/uip/post.c @@ -12,9 +12,12 @@ #include #include #include +#include "h/done.h" #include #include #include +#include "sbr/m_mktemp.h" +#include "sbr/message_id.h" #ifdef HAVE_SYS_TIME_H # include @@ -227,7 +230,7 @@ static int unkadr = 0; /* how many of those were unknown */ static int badadr = 0; /* number of bad addrs */ static int badmsg = 0; /* message has bad semantics */ static int verbose = 0; /* spell it out */ -static int format = 1; /* format addresses */ +static bool format = true; /* format addresses */ static int mime = 0; /* use MIME-style encapsulations for Bcc */ static int msgid = 0; /* add msgid */ static int debug = 0; /* debugging post */ @@ -288,8 +291,9 @@ static char *partno = NULL; 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 get_header (char *, struct headers *) PURE; +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); @@ -298,12 +302,12 @@ static int annoaux (struct mailname *); static void insert_fcc (struct headers *, char *); static void make_bcc_file (int); static void verify_all_addresses (int, int, char *, int, char *); -static void chkadr (void); +static void chkadr (void) PURE; static void sigon (void); static void sigoff (void); static void p_refile (char *); static void fcc (char *, char *); -static void die (char *, char *, ...); +static void fatal (char *, char *, ...) CHECK_PRINTF(2, 3); static void post (char *, int, int, int, char *, int, char *); static void do_text (char *file, int fd); static void do_an_address (struct mailname *, int); @@ -320,9 +324,9 @@ 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; } + if (nmh_init(argv[0], false, false)) { return 1; } mts_init (); arguments = getarguments (invo_name, argc, argv, 0); @@ -335,7 +339,7 @@ main (int argc, char **argv) ambigsw (cp, switches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [switches] file", invo_name); @@ -347,7 +351,7 @@ main (int argc, char **argv) case LIBSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); /* create a minimal context */ if (context_foil (cp) == -1) done (1); @@ -355,9 +359,9 @@ main (int argc, char **argv) case ALIASW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if ((state = alias (cp)) != AK_OK) - adios (NULL, "aliasing error in %s - %s", + die("aliasing error in %s - %s", cp, akerror (state)); continue; @@ -378,7 +382,7 @@ main (int argc, char **argv) case FILTSW: if (!(filter = *argp++) || *filter == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); mime = 0; continue; case NFILTSW: @@ -386,10 +390,10 @@ main (int argc, char **argv) continue; case FRMTSW: - format++; + format = true; continue; case NFRMTSW: - format = 0; + format = false; continue; case BITSTUFFSW: @@ -434,25 +438,25 @@ main (int argc, char **argv) case WIDTHSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if ((outputlinelen = atoi (cp)) < 10) - adios (NULL, "impossible width %d", outputlinelen); + die("impossible width %d", outputlinelen); continue; case ANNOSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if ((pfd = atoi (cp)) <= 2) - adios (NULL, "bad argument %s %s", argp[-2], cp); + die("bad argument %s %s", argp[-2], cp); continue; case CLIESW: if (!(clientsw = *argp++) || *clientsw == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case SERVSW: if (!(serversw = *argp++) || *serversw == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case SNOOPSW: snoop++; @@ -460,7 +464,7 @@ main (int argc, char **argv) case PARTSW: if (!(partno = *argp++) || *partno == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case SASLSW: @@ -473,12 +477,12 @@ main (int argc, char **argv) case SASLMECHSW: if (!(saslmech = *argp++) || *saslmech == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case AUTHSERVICESW: if (!(auth_svc = *argp++) || *auth_svc == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); oauth_flag++; continue; @@ -493,7 +497,7 @@ main (int argc, char **argv) int i; if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); for (i = 0; oauthswitches[i].profname != NULL; i++) { if (oauthswitches[i].switchnum == swnum) { @@ -503,7 +507,7 @@ main (int argc, char **argv) } if (oauthswitches[i].profname == NULL) - adios (NULL, "internal error: cannot map switch %s " + die("internal error: cannot map switch %s " "to profile entry", argp[-2]); oauth_flag++; @@ -512,12 +516,12 @@ main (int argc, char **argv) case USERSW: if (!(user = *argp++) || *user == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case PORTSW: if (!(port = *argp++) || *port == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case TLSSW: @@ -542,56 +546,55 @@ main (int argc, char **argv) case FILEPROCSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); fileproc = cp; continue; case MHLPROCSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); mhlproc = cp; continue; case MTSSM: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); sendmail = cp; continue; case MTSSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); save_mts_method (cp); continue; case CREDENTIALSSW: { if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); add_profile_entry ("credentials", cp); continue; } case MESSAGEIDSW: if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); if (save_message_id_style (cp) != 0) - adios (NULL, "unsupported messageid \"%s\"", cp); + die("unsupported messageid \"%s\"", cp); continue; } } if (msg) - adios (NULL, "only one message at a time!"); - else - msg = cp; + die("only one message at a time!"); + msg = cp; } alias (AliasFile); if (!msg) - adios (NULL, "usage: %s [switches] file", invo_name); + die("usage: %s [switches] file", invo_name); if (outputlinelen < 10) - adios (NULL, "impossible width %d", outputlinelen); + die("impossible width %d", outputlinelen); if ((in = fopen (msg, "r")) == NULL) adios (msg, "unable to open"); @@ -607,7 +610,7 @@ main (int argc, char **argv) } else { char *cp = m_mktemp2(NULL, invo_name, NULL, &out); if (cp == NULL) { - adios(NULL, "unable to create temporary file in %s", + die("unable to create temporary file in %s", get_temp_dir()); } strncpy(tmpfil, cp, sizeof(tmpfil)); @@ -616,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); @@ -639,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; @@ -650,10 +654,10 @@ main (int argc, char **argv) case LENERR: case FMTERR: - adios (NULL, "message format error in component #%d", compnum); + die("message format error in component #%d", compnum); default: - adios (NULL, "getfld() returned %d", state); + die("getfld() returned %d", state); } break; } @@ -666,9 +670,8 @@ main (int argc, char **argv) if (debug) { pl (); done (0); - } else { - fclose (out); } + fclose (out); /* * Here's how we decide which address to use as the envelope-from @@ -724,7 +727,7 @@ main (int argc, char **argv) char sbuf[128]; if (auth_svc == NULL) { - adios(NULL, "No authentication service given with -authservice"); + die("No authentication service given with -authservice"); } for (i = 0; oauthswitches[i].profname != NULL; i++) { @@ -788,6 +791,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; @@ -871,6 +876,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++) { @@ -971,9 +989,8 @@ putfmt (char *name, char *str, int *eai, FILE *out) mp->m_bcc++; if (np->m_ingrp) mp->m_ingrp = np->m_ingrp; - else - if (mp->m_gname) - putgrp (namep, mp->m_gname, out, hdr->flags); + else if (mp->m_gname) + putgrp (namep, mp->m_gname, out, hdr->flags); if (mp->m_ingrp) { if (sm_mts == MTS_SENDMAIL_PIPE) { /* Catch this before sendmail chokes with: @@ -983,14 +1000,14 @@ putfmt (char *name, char *str, int *eai, FILE *out) aliases and put them in Bcc:, but then they'd have the Blind-Carbon-Copy indication. */ - adios (NULL, - "blind lists not compatible with" + die( "blind lists not compatible with" " sendmail/pipe"); } 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); @@ -1039,7 +1056,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; @@ -1050,17 +1067,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'; } @@ -1199,9 +1210,9 @@ finish_headers (FILE *out) } if (badmsg) - adios (NULL, "re-format message and try again"); + die("re-format message and try again"); if (!recipients) - adios (NULL, "no addressees"); + die("no addressees"); } @@ -1210,18 +1221,22 @@ get_header (char *header, struct headers *table) { struct headers *h; + header = FENDNULL(header); for (h = table; h->value; h++) - if (!strcasecmp (FENDNULL(header), FENDNULL(h->value))) - return (h - table); + if (!strcasecmp(FENDNULL(h->value), header)) + return h - table; return NOTOK; } 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; + bool saveappend = false; + unsigned int shlen; char *cp; char buffer[BUFSIZ]; @@ -1236,6 +1251,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 = true; + } + if (*aka && mp->m_type != UUCPHOST && !mp->m_pers) mp->m_pers = mh_xstrdup(aka); if (format) { @@ -1251,18 +1271,37 @@ 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 = false; + } else { + snprintf(savehdr + shlen, savehdrsize - shlen, ",\n%*s", + linepos, ""); + } + } + } else { fputs (", ", out); linepos += 2; + if (saveappend) { + if (shlen + 2 + len >= savehdrsize) { + saveappend = false; + } else { + strncat(savehdr, ", ", savehdrsize - shlen); + } + } } } fputs (cp, out); + + if (saveappend && shlen + len < savehdrsize) + strncat(savehdr, cp, savehdrsize - shlen + len); + linepos += len; - return (flags & HTRY); + return flags & HTRY; } @@ -1331,26 +1370,26 @@ pl (void) int i; struct mailname *mp; - printf ("-------\n\t-- Addresses --\nlocal:\t"); + fputs("-------\n\t-- Addresses --\nlocal:\t", stdout); for (mp = localaddrs.m_next; mp; mp = mp->m_next) printf ("%s%s%s", mp->m_mbox, mp->m_bcc ? "[BCC]" : "", mp->m_next ? ",\n\t" : ""); - printf ("\nnet:\t"); + fputs("\nnet:\t", stdout); for (mp = netaddrs.m_next; mp; mp = mp->m_next) printf ("%s%s@%s%s%s", FENDNULL(mp->m_path), mp->m_mbox, mp->m_host, mp->m_bcc ? "[BCC]" : "", mp->m_next ? ",\n\t" : ""); - printf ("\nuucp:\t"); + fputs("\nuucp:\t", stdout); for (mp = uuaddrs.m_next; mp; mp = mp->m_next) printf ("%s!%s%s%s", mp->m_host, mp->m_mbox, mp->m_bcc ? "[BCC]" : "", mp->m_next ? ",\n\t" : ""); - printf ("\n\t-- Folder Copies --\nfcc:\t"); + fputs("\n\t-- Folder Copies --\nfcc:\t", stdout); for (i = 0; i < fccind; i++) printf ("%s%s", fccfold[i], i + 1 < fccind ? ",\n\t" : ""); putchar('\n'); @@ -1389,7 +1428,7 @@ annoaux (struct mailname *mp) snprintf (buffer, sizeof(buffer), "%s\n", adrformat (mp)); i = strlen (buffer); - return (write (pfd, buffer, i) == i ? OK : NOTOK); + return write(pfd, buffer, i) == i ? OK : NOTOK; } @@ -1408,7 +1447,7 @@ insert_fcc (struct headers *hdr, char *pp) return; if (fccind >= FCCS) - adios (NULL, "too many %ss", hdr->value); + die("too many %ss", hdr->value); fccfold[fccind++] = mh_xstrdup(cp); } @@ -1426,7 +1465,7 @@ make_bcc_file (int dashstuff) char *tfile = NULL, *program; if ((tfile = m_mktemp2(NULL, "bccs", NULL, &out)) == NULL) { - adios(NULL, "unable to create temporary file in %s", get_temp_dir()); + die("unable to create temporary file in %s", get_temp_dir()); } strncpy (bccfil, tfile, sizeof(bccfil)); @@ -1451,15 +1490,14 @@ make_bcc_file (int dashstuff) * prefix and check again. */ if ((cp = strchr(prefix, 'a')) == NULL) - adios (NULL, "lost prefix start"); + die("lost prefix start"); while (find_prefix () == NOTOK) { if (*cp < 'z') (*cp)++; - else - if (*++cp == 0) - adios (NULL, "can't find a unique delimiter string"); - else - (*cp)++; + else if (*++cp == 0) + die("can't find a unique delimiter string"); + else + (*cp)++; } fprintf (out, "%s: %s\n%s: multipart/digest; boundary=\"", @@ -1476,8 +1514,7 @@ make_bcc_file (int dashstuff) * of MIME encapsulation. */ if (filter != NULL) { - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep (5); + child_id = fork(); switch (child_id) { case NOTOK: adios ("fork", "unable to"); @@ -1501,7 +1538,7 @@ make_bcc_file (int dashstuff) execvp (program, vec); fprintf (stderr, "unable to exec "); perror (mhlproc); - _exit (-1); + _exit(1); default: pidXwait (child_id, mhlproc); @@ -1570,12 +1607,12 @@ static void chkadr (void) { if (badadr && unkadr) - die (NULL, "%d address%s unparsable, %d addressee%s undeliverable", + fatal (NULL, "%d address%s unparsable, %d addressee%s undeliverable", badadr, PLURALS(badadr), unkadr, PLURALS(badadr)); if (badadr) - die (NULL, "%d address%s unparsable", badadr, PLURALS(badadr)); + fatal (NULL, "%d address%s unparsable", badadr, PLURALS(badadr)); if (unkadr) - die (NULL, "%d addressee%s undeliverable", unkadr, PLURALS(unkadr)); + fatal (NULL, "%d addressee%s undeliverable", unkadr, PLURALS(unkadr)); } @@ -1616,7 +1653,7 @@ do_addresses (int bccque, int talk) chkadr (); if (rp_isbad (retval = sm_waend ())) - die (NULL, "problem ending addresses; %s", rp_string (retval)); + fatal (NULL, "problem ending addresses; %s", rp_string (retval)); } @@ -1633,7 +1670,7 @@ static void post (char *file, int bccque, int talk, int eai, char *envelope, int oauth_flag, char *auth_svc) { - int retval, i; + int retval; pid_t child_id; if (verbose) { @@ -1650,8 +1687,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope, char **argp, *program; int argc; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep (5); + child_id = fork(); switch (child_id) { case NOTOK: adios ("fork", "unable to"); @@ -1682,7 +1718,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope, int eightbit = 0; if (fd == NOTOK) { - die (file, "unable to re-open"); + fatal (file, "unable to re-open"); } if (msgflags & MMIM && cte != UNKNOWN) { @@ -1692,7 +1728,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope, } else { if (scan_input (fd, &eightbit) == NOTOK) { close (fd); - die (file, "problem reading from"); + fatal (file, "problem reading from"); } } @@ -1701,7 +1737,7 @@ post (char *file, int bccque, int talk, int eai, char *envelope, oauth_flag ? auth_svc : NULL, tlsflag)) || rp_isbad (retval = sm_winit (envelope, eai, eightbit))) { close (fd); - die (NULL, "problem initializing server; %s", rp_string (retval)); + fatal (NULL, "problem initializing server; %s", rp_string (retval)); } do_addresses (bccque, talk && verbose); @@ -1744,7 +1780,7 @@ verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag, verbose, snoop, sasl, saslmech, user, oauth_flag ? auth_svc : NULL, tlsflag)) || rp_isbad (retval = sm_winit (envelope, eai, eightbit))) { - die (NULL, "problem initializing server; %s", rp_string (retval)); + fatal (NULL, "problem initializing server; %s", rp_string (retval)); } } @@ -1770,7 +1806,7 @@ verify_all_addresses (int talk, int eai, char *envelope, int oauth_flag, puts(" -- Address Verification Successful --"); if (!whomsw || checksw) - sm_end (DONE); + sm_end (whomsw ? OK : DONE); fflush (stdout); sigoff (); @@ -1812,7 +1848,7 @@ do_an_address (struct mailname *lp, int talk) return; } if (talk) - printf (": "); + fputs(": ", stdout); fflush (stdout); switch (retval = sm_wadr (mbox, host, @@ -1834,7 +1870,7 @@ do_an_address (struct mailname *lp, int talk) default: if (!talk) fprintf (stderr, " %s: ", addr); - die (NULL, "unexpected response; %s", rp_string (retval)); + fatal (NULL, "unexpected response; %s", rp_string (retval)); } fflush (stdout); @@ -1847,15 +1883,15 @@ 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))) - die (NULL, "problem writing text; %s\n", rp_string (retval)); + fatal (NULL, "problem writing text; %s\n", rp_string (retval)); } if (state == NOTOK) - die (file, "problem reading from"); + fatal (file, "problem reading from"); switch (retval = sm_wtend ()) { case RP_OK: @@ -1863,11 +1899,11 @@ do_text (char *file, int fd) case RP_NO: case RP_NDEL: - die (NULL, "posting failed; %s", rp_string (retval)); - /* FALLTHRU */ + fatal (NULL, "posting failed; %s", rp_string (retval)); + break; default: - die (NULL, "unexpected response; %s", rp_string (retval)); + fatal (NULL, "unexpected response; %s", rp_string (retval)); } } @@ -1946,7 +1982,7 @@ static void fcc (char *file, char *folder) { pid_t child_id; - int i, status, argp; + int status, argp; char fold[BUFSIZ]; char **arglist, *program; @@ -1954,9 +1990,7 @@ fcc (char *file, char *folder) printf (" %sFcc %s: ", msgstate == RESENT ? "Resent-" : "", folder); fflush (stdout); - for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++) - sleep (5); - + child_id = fork(); switch (child_id) { case NOTOK: if (!verbose) @@ -1979,7 +2013,7 @@ fcc (char *file, char *folder) arglist[argp++] = fold; arglist[argp] = NULL; execvp (program, arglist); - _exit (-1); + _exit(1); default: if ((status = pidwait (child_id, OK))) { @@ -2001,7 +2035,7 @@ fcc (char *file, char *folder) */ static void -die (char *what, char *fmt, ...) +fatal (char *what, char *fmt, ...) { int err; va_list ap;