* 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 <sys/stat.h>
-#include <sys/wait.h>
/*
* Mail -- a mail program
* 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;
}
/*
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)
return(1);
}
mp = &message[msgvec[0] - 1];
+ touch(mp);
dot = mp;
if ((rcv = skin(hfield("from", mp))) == NOSTR)
rcv = skin(nameof(mp, 1));
* 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) {
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;
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++;
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++;
printgroup(*p);
return(0);
}
- if (argcount(argv) == 1) {
+ if (argv[1] == NOSTR) {
printgroup(*argv);
return(0);
}
}
/*
- * 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;
}
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));