msm@killer.DALLAS.TX.US (Michael Mattone) (03/04/89)
I've noticed a few problems with the shell. Included below are cdiffs
for patching the shell source.
(1) The "trap" built-in only recognizes the first signal number.
So, the following only sets a trap for signal 1:
trap 'exit 1' 1 2 3
The solution is to modify the function dotrap() in sh3.c.
(2) A command like
set - `date`
to set the positional parameters $1, $2, $3 etc., seems to put
garbage there instead. The problem seems to be with the statement
t->words++ in the doset() function in file sh3.c. Removing that
and inserting a for() loop to copy the elements of t->words[] seems
to work better.
(3) The value of "$#" should be 0 not -1 if no arguments are found when
the shell starts up. This can be fixed in file sh1.c near the
end of the main() function where "$#" gets set.
(4) The shell variable "$!" is supposed to be set to the process id
of the last process run in the background. Currently it gets set
to the process id of each new command.
echo x - sh1.c.cdif
sed '/^X/s///' > sh1.c.cdif << '/'
X*** oldsh/sh1.c Fri Feb 24 00:22:28 1989
X--- newsh/sh1.c Fri Feb 24 00:23:34 1989
X***************
X*** 131,137 ****
X setval(cprompt, "");
X prompt->status &= ~EXPORT;
X cprompt->status &= ~EXPORT;
X! if (newfile(*++argv))
X exit(1);
X }
X }
X--- 131,137 ----
X setval(cprompt, "");
X prompt->status &= ~EXPORT;
X cprompt->status &= ~EXPORT;
X! if (newfile(name = *++argv))
X exit(1);
X }
X }
X***************
X*** 162,168 ****
X dolc--; /* keyword */
X else
X ap++;
X! setval(lookup("#"), putn(--dolc));
X
X for (;;) {
X if (talking && e.iop <= iostack)
X--- 162,168 ----
X dolc--; /* keyword */
X else
X ap++;
X! setval(lookup("#"), putn((--dolc < 0) ? (dolc = 0) : dolc));
X
X for (;;) {
X if (talking && e.iop <= iostack)
/
echo x - sh3.c.cdif
sed '/^X/s///' > sh3.c.cdif << '/'
X*** oldsh/sh3.c Fri Feb 24 00:22:32 1989
X--- newsh/sh3.c Fri Feb 24 01:07:45 1989
X***************
X*** 85,90 ****
X--- 85,91 ----
X i = parent();
X if (i != 0) {
X if (i != -1) {
X+ setval(lookup("!"), putn(i));
X if (pin != NULL)
X closepipe(pin);
X if (talking) {
X***************
X*** 314,320 ****
X if (i != 0) {
X if (i == -1)
X warn("try again");
X- setval(lookup("!"), putn(i));
X }
X return(i);
X }
X--- 315,320 ----
X***************
X*** 801,807 ****
X register struct op *t;
X {
X register char *s;
X! register n, i;
X
X if (t->words[1] == NULL) {
X for (i=0; i<NSIG; i++)
X--- 801,808 ----
X register struct op *t;
X {
X register char *s;
X! register int n, i;
X! register int resetsig;
X
X if (t->words[1] == NULL) {
X for (i=0; i<NSIG; i++)
X***************
X*** 813,835 ****
X }
X return(0);
X }
X! n = getsig((s = t->words[2])!=NULL? s: t->words[1]);
X! xfree(trap[n]);
X! trap[n] = 0;
X! if (s != NULL) {
X! if ((i = strlen(s = t->words[1])) != 0) {
X! trap[n] = strsave(s, 0);
X! setsig(n, sig);
X! } else
X! setsig(n, SIG_IGN);
X! } else {
X! if (talking)
X! if (n == SIGINT)
X! setsig(n, onintr);
X! else
X! setsig(n, n == SIGQUIT ? SIG_IGN : SIG_DFL);
X! else
X! setsig(n, SIG_DFL);
X }
X return(0);
X }
X--- 814,840 ----
X }
X return(0);
X }
X! resetsig = digit(*t->words[1]);
X! for (i = resetsig ? 1 : 2; t->words[i] != NULL; ++i) {
X! n = getsig(t->words[i]);
X! xfree(trap[n]);
X! trap[n] = 0;
X! if (!resetsig) {
X! if (*t->words[1] != '\0') {
X! trap[n] = strsave(t->words[1], 0);
X! setsig(n, sig);
X! } else
X! setsig(n, SIG_IGN);
X! } else {
X! if (talking)
X! if (n == SIGINT)
X! setsig(n, onintr);
X! else
X! setsig(n, n == SIGQUIT ? SIG_IGN
X! : SIG_DFL);
X! else
X! setsig(n, SIG_DFL);
X! }
X }
X return(0);
X }
X***************
X*** 977,983 ****
X return(0);
X }
X if (*cp == '-') {
X! t->words++;
X if (*++cp == 0)
X flag['x'] = flag['v'] = 0;
X else
X--- 982,990 ----
X return(0);
X }
X if (*cp == '-') {
X! /* bad: t->words++; */
X! for(n = 0; (t->words[n]=t->words[n+1]) != NULL; n++)
X! ;
X if (*++cp == 0)
X flag['x'] = flag['v'] = 0;
X else
X***************
X*** 1016,1021 ****
X--- 1023,1049 ----
X }
X }
X
X+ #include <sys/types.h>
X+ #include <sys/times.h>
X+
X+ #define SECS 60L
X+ #define MINS 3600L
X+
X+ dotimes()
X+ {
X+ struct tms tbuf;
X+
X+ times(&tbuf);
X+
X+ prn((int)(tbuf.tms_cutime / MINS));
X+ prs("m");
X+ prn((int)((tbuf.tms_cutime % MINS) / SECS));
X+ prs("s ");
X+ prn((int)(tbuf.tms_cstime / MINS));
X+ prs("m");
X+ prn((int)((tbuf.tms_cstime % MINS) / SECS));
X+ prs("s\n");
X+ }
X
X struct builtin {
X char *command;
X***************
X*** 1040,1045 ****
X--- 1068,1074 ----
X "umask", doumask,
X "login", dologin,
X "newgrp", dologin,
X+ "times", dotimes,
X 0,
X };
X
/
exit 0