X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/acfc7e9b6460b6d69adcf035c1675730b55d4f98..f5576df6fd6c54ac0836b6cc9634f63a156f325a:/usr/src/usr.bin/mail/cmd3.c diff --git a/usr/src/usr.bin/mail/cmd3.c b/usr/src/usr.bin/mail/cmd3.c index 0e64ea15f2..a5b2df537d 100644 --- a/usr/src/usr.bin/mail/cmd3.c +++ b/usr/src/usr.bin/mail/cmd3.c @@ -2,26 +2,40 @@ * Copyright (c) 1980 Regents of the University of California. * All rights reserved. * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #ifndef lint -static char sccsid[] = "@(#)cmd3.c 5.13 (Berkeley) %G%"; +static char sccsid[] = "@(#)cmd3.c 5.24 (Berkeley) 6/25/90"; #endif /* not lint */ #include "rcv.h" -#include -#include /* * Mail -- a mail program @@ -33,78 +47,40 @@ static char sccsid[] = "@(#)cmd3.c 5.13 (Berkeley) %G%"; * Process a shell escape by saving signals, ignoring signals, * and forking a sh -c */ - shell(str) char *str; { - int (*sigint)(), (*sigquit)(); - union wait stat; - register int t; - char *Shell; + sig_t sigint = signal(SIGINT, SIG_IGN); + char *shell; char cmd[BUFSIZ]; - strcpy(cmd, str); + (void) strcpy(cmd, str); if (bangexp(cmd) < 0) - return(-1); - if ((Shell = value("SHELL")) == NOSTR) - Shell = SHELL; - sigint = signal(SIGINT, SIG_IGN); - sigquit = signal(SIGQUIT, SIG_IGN); - t = vfork(); - if (t == 0) { - if (sigint != SIG_IGN) - signal(SIGINT, SIG_DFL); - if (sigquit != SIG_IGN) - signal(SIGQUIT, SIG_DFL); - execl(Shell, Shell, "-c", cmd, (char *)0); - perror(Shell); - _exit(1); - } - while (wait(&stat) != t) - ; - if (t == -1) - perror("fork"); - signal(SIGINT, sigint); - signal(SIGQUIT, sigquit); + return 1; + if ((shell = value("SHELL")) == NOSTR) + shell = _PATH_CSHELL; + (void) run_command(shell, 0, -1, -1, "-c", cmd, NOSTR); + (void) signal(SIGINT, sigint); printf("!\n"); - return(0); + return 0; } /* * Fork an interactive shell. */ - /*ARGSUSED*/ dosh(str) char *str; { - int (*sigint)(), (*sigquit)(); - union wait stat; - register int t; - char *Shell; - - if ((Shell = value("SHELL")) == NOSTR) - Shell = SHELL; - sigint = signal(SIGINT, SIG_IGN); - sigquit = signal(SIGQUIT, SIG_IGN); - t = vfork(); - if (t == 0) { - if (sigint != SIG_IGN) - signal(SIGINT, SIG_DFL); - if (sigquit != SIG_IGN) - signal(SIGQUIT, SIG_DFL); - execl(Shell, Shell, (char *)0); - perror(Shell); - _exit(1); - } - while (wait(&stat) != t) - ; - if (t == -1) - perror("fork"); - signal(SIGINT, sigint); - signal(SIGQUIT, sigquit); + sig_t sigint = signal(SIGINT, SIG_IGN); + char *shell; + + if ((shell = value("SHELL")) == NOSTR) + shell = _PATH_CSHELL; + (void) run_command(shell, 0, -1, -1, NOSTR); + (void) signal(SIGINT, sigint); putchar('\n'); - return(0); + return 0; } /* @@ -170,37 +146,34 @@ help() register c; register FILE *f; - if ((f = fopen(HELPFILE, "r")) == NULL) { - perror(HELPFILE); + if ((f = Fopen(_PATH_HELP, "r")) == NULL) { + perror(_PATH_HELP); return(1); } while ((c = getc(f)) != EOF) putchar(c); - fclose(f); + Fclose(f); return(0); } /* * Change user's working directory. */ - -schdir(str) - char *str; +schdir(arglist) + char **arglist; { - register char *cp; + char *cp; - for (cp = str; *cp == ' '; cp++) - ; - if (*cp == '\0') + if (*arglist == NOSTR) cp = homedir; else - if ((cp = expand(cp)) == NOSTR) + if ((cp = expand(*arglist)) == NOSTR) return(1); if (chdir(cp) < 0) { perror(cp); return(1); } - return(0); + return 0; } respond(msgvec) @@ -230,6 +203,7 @@ _respond(msgvec) return(1); } mp = &message[msgvec[0] - 1]; + touch(mp); dot = mp; if ((rcv = skin(hfield("from", mp))) == NOSTR) rcv = skin(nameof(mp, 1)); @@ -244,10 +218,10 @@ _respond(msgvec) * Delete my name from the reply list, * and with it, all my alternate names. */ - np = delname(np, myname, icequal); + np = delname(np, myname); if (altnames) for (ap = altnames; *ap; ap++) - np = delname(np, *ap, icequal); + np = delname(np, *ap); if (np != NIL && replyto == NOSTR) np = cat(np, extract(rcv, GTO)); else if (np == NIL) { @@ -261,10 +235,10 @@ _respond(msgvec) head.h_subject = reedit(head.h_subject); if (replyto == NOSTR && (cp = skin(hfield("cc", mp))) != NOSTR) { np = elide(extract(cp, GCC)); - np = delname(np, myname, icequal); + np = delname(np, myname); if (altnames != 0) for (ap = altnames; *ap; ap++) - np = delname(np, *ap, icequal); + np = delname(np, *ap); head.h_cc = np; } else head.h_cc = NIL; @@ -381,7 +355,7 @@ set(arglist) char varbuf[BUFSIZ], **ap, **p; int errs, h, s; - if (argcount(arglist) == 0) { + if (*arglist == NOSTR) { for (h = 0, s = 1; h < HSHSIZE; h++) for (vp = variables[h]; vp != NOVAR; vp = vp->v_link) s++; @@ -467,7 +441,7 @@ group(argv) int s; char **ap, *gname, **p; - if (argcount(argv) == 0) { + if (*argv == NOSTR) { for (h = 0, s = 1; h < HSHSIZE; h++) for (gh = groups[h]; gh != NOGRP; gh = gh->g_link) s++; @@ -481,7 +455,7 @@ group(argv) printgroup(*p); return(0); } - if (argcount(argv) == 1) { + if (argv[1] == NOSTR) { printgroup(*argv); return(0); } @@ -550,27 +524,19 @@ null(e) } /* - * Print out the current edit file, if we are editing. - * Otherwise, print the name of the person who's mail - * we are reading. + * Change to another file. With no argument, print information about + * the current file. */ - file(argv) register char **argv; { - register char *cp; if (argv[0] == NOSTR) { newfileinfo(); return 0; } - if ((cp = expand(*argv)) == NOSTR) - return -1; - strcpy(prevfile, mailname); - if (setfile(cp, **argv != '%')) { - perror(cp); - return -1; - } + if (setfile(*argv) < 0) + return 1; announce(); return 0; } @@ -621,6 +587,7 @@ _Respond(msgvec) head.h_to = NIL; for (ap = msgvec; *ap != 0; ap++) { mp = &message[*ap - 1]; + touch(mp); dot = mp; if ((cp = skin(hfield("from", mp))) == NOSTR) cp = skin(nameof(mp, 2));