X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/de4636bb664106d9932ae7acb517e471b848f1f3..2e08fdfc0ef872c968c2e42b7ee0ede42aee14aa:/uip/post.c diff --git a/uip/post.c b/uip/post.c index f6f7924c..9b8bcbef 100644 --- a/uip/post.c +++ b/uip/post.c @@ -185,8 +185,6 @@ static short fccind = 0; /* index into fccfold[] */ static short outputlinelen = OUTPUTLINELEN; static int pfd = NOTOK; /* fd to write annotation list to */ -static uid_t myuid= -1; /* my user id */ -static gid_t mygid= -1; /* my group id */ static int recipients = 0; /* how many people will get a copy */ static int unkadr = 0; /* how many of those were unknown */ static int badadr = 0; /* number of bad addrs */ @@ -263,7 +261,7 @@ static int insert (struct mailname *); static void pl (void); static void anno (void); static int annoaux (struct mailname *); -static void insert_fcc (struct headers *, unsigned char *); +static void insert_fcc (struct headers *, char *); static void make_bcc_file (int); static void verify_all_addresses (int, char *); static void chkadr (void); @@ -286,6 +284,7 @@ main (int argc, char **argv) char *cp, *msg = NULL, **argp, **arguments, *envelope; char buf[BUFSIZ], name[NAMESZ]; FILE *in, *out; + m_getfld_state_t gstate = 0; #ifdef LOCALE setlocale(LC_ALL, ""); @@ -522,7 +521,7 @@ main (int argc, char **argv) start_headers (); if (debug) { verbose++; - discard (out = stdout); /* XXX: reference discard() to help loader */ + out = stdout; } else { if (whomsw) { if ((out = fopen ("/dev/null", "w")) == NULL) @@ -542,32 +541,30 @@ main (int argc, char **argv) hdrtab = msgstate == NORMAL ? NHeaders : RHeaders; - for (compnum = 1, state = FLD;;) { - switch (state = m_getfld (state, name, buf, sizeof(buf), in)) { + for (compnum = 1;;) { + int bufsz = sizeof buf; + switch (state = m_getfld (&gstate, name, buf, &bufsz, in)) { case FLD: - case FLDEOF: case FLDPLUS: compnum++; cp = add (buf, NULL); while (state == FLDPLUS) { - state = m_getfld (state, name, buf, sizeof(buf), in); + bufsz = sizeof buf; + state = m_getfld (&gstate, name, buf, &bufsz, in); cp = add (buf, cp); } putfmt (name, cp, out); free (cp); - if (state != FLDEOF) - continue; - finish_headers (out); - break; + continue; case BODY: - case BODYEOF: finish_headers (out); if (whomsw) break; fprintf (out, "\n%s", buf); while (state == BODY) { - state = m_getfld (state, name, buf, sizeof(buf), in); + bufsz = sizeof buf; + state = m_getfld (&gstate, name, buf, &bufsz, in); fputs (buf, out); } break; @@ -585,6 +582,7 @@ main (int argc, char **argv) } break; } + m_getfld_state_destroy (&gstate); if (pfd != NOTOK) anno (); @@ -923,12 +921,9 @@ putfmt (char *name, char *str, FILE *out) static void start_headers (void) { - unsigned char *cp; - char sigbuf[BUFSIZ]; + char *cp, sigbuf[BUFSIZ]; struct mailname *mp; - myuid = getuid (); - mygid = getgid (); time (&tclock); /* @@ -1257,13 +1252,13 @@ annoaux (struct mailname *mp) static void -insert_fcc (struct headers *hdr, unsigned char *pp) +insert_fcc (struct headers *hdr, char *pp) { - unsigned char *cp; + char *cp; - for (cp = pp; isspace (*cp); cp++) + for (cp = pp; isspace ((unsigned char) *cp); cp++) continue; - for (pp += strlen (pp) - 1; pp > cp && isspace (*pp); pp--) + for (pp += strlen (pp) - 1; pp > cp && isspace ((unsigned char) *pp); pp--) continue; if (pp >= cp) *++pp = 0; @@ -1284,9 +1279,9 @@ make_bcc_file (int dashstuff) { int fd, i; pid_t child_id; - char *vec[6]; + char **vec; FILE *out; - char *tfile = NULL; + char *tfile = NULL, *program; tfile = m_mktemp2(NULL, "bccs", NULL, &out); if (tfile == NULL) adios("bcc", "unable to create temporary file"); @@ -1338,8 +1333,6 @@ make_bcc_file (int dashstuff) * of MIME encapsulation. */ if (filter != NULL) { - vec[0] = r1bindex (mhlproc, '/'); - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) sleep (5); switch (child_id) { @@ -1349,7 +1342,7 @@ make_bcc_file (int dashstuff) case OK: dup2 (fileno (out), 1); - i = 1; + vec = argsplit(mhlproc, &program, &i); vec[i++] = "-forward"; vec[i++] = "-form"; vec[i++] = filter; @@ -1362,7 +1355,7 @@ make_bcc_file (int dashstuff) vec[i++] = "-nodashstuffing"; vec[i] = NULL; - execvp (mhlproc, vec); + execvp (program, vec); fprintf (stderr, "unable to exec "); perror (mhlproc); _exit (-1); @@ -1405,7 +1398,7 @@ static int find_prefix (void) { int result = OK; - unsigned char buffer[BUFSIZ]; + char buffer[BUFSIZ]; FILE *in; if ((in = fopen (tmpfil, "r")) == NULL) @@ -1413,10 +1406,10 @@ find_prefix (void) while (fgets (buffer, sizeof(buffer) - 1, in)) if (buffer[0] == '-' && buffer[1] == '-') { - unsigned char *cp; + char *cp; for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--) - if (!isspace (*cp)) + if (!isspace ((unsigned char) *cp)) break; *++cp = '\0'; if (strcmp (buffer + 2, prefix) == 0) { @@ -1513,7 +1506,8 @@ post (char *file, int bccque, int talk, char *envelope) sigon (); if (sm_mts == MTS_SENDMAIL_PIPE) { - char *sargv[16], **argp; + char **argp, *program; + int argc; for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) sleep (5); @@ -1526,17 +1520,16 @@ post (char *file, int bccque, int talk, char *envelope) adios (file, "can't reopen for sendmail"); } - argp = sargv; - *argp++ = "sendmail"; - *argp++ = "-t"; /* read msg for recipients */ - *argp++ = "-i"; /* don't stop on "." */ + argp = argsplit(sendmail, &program, &argc); + argp[argc++] = "-t"; /* read msg for recipients */ + argp[argc++] = "-i"; /* don't stop on "." */ if (whomsw) - *argp++ = "-bv"; + argp[argc++] = "-bv"; if (snoop) - *argp++ = "-v"; - *argp = NULL; + argp[argc++] = "-v"; + argp[argc] = NULL; - execv (sendmail, sargv); + execv (program, argp); adios (sendmail, "can't exec"); default: @@ -1787,8 +1780,9 @@ static void fcc (char *file, char *folder) { pid_t child_id; - int i, status; + int i, status, argp; char fold[BUFSIZ]; + char **arglist, *program; if (verbose) printf (" %sFcc %s: ", msgstate == RESENT ? "Resent-" : "", folder); @@ -1811,8 +1805,14 @@ fcc (char *file, char *folder) *folder == '+' || *folder == '@' ? "" : "+", folder); /* now exec the fileproc */ - execlp (fileproc, r1bindex (fileproc, '/'), - "-link", "-file", file, fold, NULL); + + arglist = argsplit(fileproc, &program, &argp); + arglist[argp++] = "-link"; + arglist[argp++] = "-file"; + arglist[argp++] = file; + arglist[argp++] = fold; + arglist[argp] = NULL; + execvp (program, arglist); _exit (-1); default: