X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/afee8ed17a56617618fb7f963b111d7cf0fb56e7..a6a073be4aea5e0a1ca2e55920d0f97c8a5f273a:/uip/whatnowsbr.c diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index c9cbf503..eb6106a7 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -552,10 +552,10 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) int trailln = strlen(trailcmd) + 4; if (ln < 0 || ln + trailln > bufsz) adios((char *)0, "arguments too long"); - + cp = buf + ln; - - while (*++argp != (char *)0) { + + while (*argp && *++argp) { ln = strlen(*argp); /* +1 for leading space */ if (ln + trailln + 1 > bufsz - (cp-buf)) @@ -618,7 +618,7 @@ popen_in_dir(const char *dir, const char *cmd, const char *type) /* ensure that $SHELL exists, as the cmd was written relying on a non-blank $SHELL... */ setenv("SHELL","/bin/sh",0); /* don't overwrite */ - + if (getcwd(olddir, sizeof(olddir)) == 0) adios("getcwd", "could not get working directory"); if (chdir(dir) != 0) @@ -697,7 +697,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, context_save (); /* save the context file */ fflush (stdout); - switch (pid = vfork()) { + switch (pid = fork()) { case NOTOK: advise ("fork", "unable to"); status = NOTOK; @@ -816,7 +816,7 @@ sendfile (char **arg, char *file, int pushsw) { pid_t child_id; int i, vecp; - char *cp, *sp, *vec[MAXARGS]; + char *cp, *sp, **vec, *program; /* Translate MIME composition file, if necessary */ if ((cp = context_find ("automimeproc")) @@ -845,14 +845,13 @@ sendfile (char **arg, char *file, int pushsw) context_save (); /* save the context file */ fflush (stdout); - for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++) + for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) sleep (5); switch (child_id) { case NOTOK: advise (NULL, "unable to fork, so sending directly..."); case OK: - vecp = 0; - vec[vecp++] = invo_name; + vec = argsplit(sendproc, &program, &vecp); if (pushsw) vec[vecp++] = "-push"; if (arg) @@ -861,7 +860,7 @@ sendfile (char **arg, char *file, int pushsw) vec[vecp++] = file; vec[vecp] = NULL; - execvp (sendproc, vec); + execvp (program, vec); fprintf (stderr, "unable to exec "); perror (sendproc); _exit (-1); @@ -940,6 +939,7 @@ check_draft (char *msgnam) */ if (uprf (name, XXX_FIELD_PRF)) { fclose (fp); + m_getfld_state_destroy (&gstate); return 0; } while (state == FLDPLUS) { @@ -955,6 +955,7 @@ check_draft (char *msgnam) for (bp = buf; *bp; bp++) if (*bp != ' ' && *bp != '\t' && *bp != '\n') { fclose (fp); + m_getfld_state_destroy (&gstate); return 1; } @@ -965,10 +966,10 @@ check_draft (char *msgnam) default: fclose (fp); + m_getfld_state_destroy (&gstate); return 0; } } - m_getfld_state_destroy (&gstate); } @@ -1011,10 +1012,6 @@ check_draft (char *msgnam) X("help", 0, SHELPSW) \ X("dashstuffing", -12, BITSTUFFSW) \ X("nodashstuffing", -14, NBITSTUFFSW) \ - X("mail", -4, MAILSW) \ - X("saml", -4, SAMLSW) \ - X("send", -4, SSNDSW) \ - X("soml", -4, SOMLSW) \ X("client host", -6, CLIESW) \ X("server host", 6, SERVSW) \ X("snoop", -5, SNOOPSW) \ @@ -1031,6 +1028,7 @@ check_draft (char *msgnam) X("attachformat", 7, SNDATTACHFORMAT) \ X("port server-port-name/number", 4, PORTSW) \ X("tls", TLSminc(-3), TLSSW) \ + X("initialtls", TLSminc(-10), INITTLSSW) \ X("notls", TLSminc(-5), NTLSSW) \ X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \ X("messageid localname|random", 2, MESSAGEIDSW) \ @@ -1061,8 +1059,8 @@ static void sendit (char *sp, char **arg, char *file, int pushed) { int vecp, n = 1; - char *cp, buf[BUFSIZ], **argp; - char **arguments, *vec[MAXARGS]; + char *cp, buf[BUFSIZ], **argp, *program; + char **arguments, *savearg[MAXARGS], **vec; struct stat st; char *attach = NMH_ATTACH_HEADER;/* attachment header field name */ int attachformat = 1; /* mhbuild format specifier for @@ -1074,17 +1072,17 @@ sendit (char *sp, char **arg, char *file, int pushed) /* * Make sure these are defined. In particular, we need - * vec[1] to be NULL, in case "arg" is NULL below. It - * doesn't matter what is the value of vec[0], but we + * savearg[1] to be NULL, in case "arg" is NULL below. It + * doesn't matter what is the value of savearg[0], but we * set it to NULL, to help catch "off-by-one" errors. */ - vec[0] = NULL; - vec[1] = NULL; + savearg[0] = NULL; + savearg[1] = NULL; /* - * Temporarily copy arg to vec, since the brkstring() call in + * Temporarily copy arg to savearg, since the brkstring() call in * getarguments() will wipe it out before it is merged in. - * Also, we skip the first element of vec, since getarguments() + * Also, we skip the first element of savearg, since getarguments() * skips it. Then we count the number of arguments * copied. The value of "n" will be one greater than * this in order to simulate the standard argc/argv. @@ -1092,17 +1090,17 @@ sendit (char *sp, char **arg, char *file, int pushed) if (arg) { char **bp; - copyip (arg, vec+1, MAXARGS-1); - bp = vec+1; + copyip (arg, savearg+1, MAXARGS-1); + bp = savearg+1; while (*bp++) n++; } /* - * Merge any arguments from command line (now in vec) + * Merge any arguments from command line (now in savearg) * and arguments from profile. */ - arguments = getarguments (sp, n, vec, 1); + arguments = getarguments (sp, n, savearg, 1); argp = arguments; debugsw = 0; @@ -1114,7 +1112,12 @@ sendit (char *sp, char **arg, char *file, int pushed) annotext = NULL; distfile = NULL; - vecp = 1; /* we'll get the zero'th element later */ + /* + * Get our initial arguments for postproc now + */ + + vec = argsplit(postproc, &program, &vecp); + vec[vecp++] = "-library"; vec[vecp++] = getcpy (m_maildir ("")); @@ -1195,14 +1198,11 @@ sendit (char *sp, char **arg, char *file, int pushed) case NMSGDSW: case WATCSW: case NWATCSW: - case MAILSW: - case SAMLSW: - case SSNDSW: - case SOMLSW: case SNOOPSW: case SASLSW: case NOSASLSW: case TLSSW: + case INITTLSSW: case NTLSSW: vec[vecp++] = --cp; continue; @@ -1310,10 +1310,9 @@ sendit (char *sp, char **arg, char *file, int pushed) if ((pushsw = pushed)) push (); - vec[0] = r1bindex (postproc, '/'); closefds (3); - if (sendsbr (vec, vecp, file, &st, 1, attach, attachformat) == OK) + if (sendsbr (vec, vecp, program, file, &st, 1, attach, attachformat) == OK) done (0); } @@ -1326,26 +1325,25 @@ whomfile (char **arg, char *file) { pid_t pid; int vecp; - char *vec[MAXARGS]; + char **vec, *program; context_save (); /* save the context file */ fflush (stdout); - switch (pid = vfork()) { + switch (pid = fork()) { case NOTOK: advise ("fork", "unable to"); return 1; case OK: - vecp = 0; - vec[vecp++] = r1bindex (whomproc, '/'); + vec = argsplit(whomproc, &program, &vecp); vec[vecp++] = file; if (arg) while (*arg) vec[vecp++] = *arg++; vec[vecp] = NULL; - execvp (whomproc, vec); + execvp (program, vec); fprintf (stderr, "unable to exec "); perror (whomproc); _exit (-1); /* NOTREACHED */