Changes for gsh version 2.0a1:

Fix PR#50 while maintaining backward compatibility: when new environment
variable $KEEPQUOTE is set, use the command line's original single and
double quotes unchanged (rather than removing all quotes and adding
double quotes as needed).

Fix PR#123: do not ignore command line characters following a ";" that
was not preceeded by a command.

Add signal handler for SIGTTIN (background read attempted from control
terminal) that prints a message and quits the shell. This is needed
because gsh will sometimes receive such a signal, go into the "suspended"
state, and never return to "running" state.

Add environment variable $ECHOX to print expanded commands before they
are executed.
This commit is contained in:
tribby 1999-11-30 17:53:27 +00:00
parent 9aa13dba8f
commit 74f2b97322
7 changed files with 203 additions and 54 deletions

View File

@ -1,15 +1,27 @@
Last updated: Dec. 27, 1998 By: Dave Tribby Last updated: Nov. 26, 1999 By: Dave Tribby
For more bug reports, see http://www.gno.org/~gno/bugs.html For more bug reports, see http://www.gno.org/~gno/bugs.html
Completed items are reported in file UpdateLog. Completed items are reported in file UpdateLog.
Allow redirection of built-in commands' I/O even if they aren't forked. Determine why gsh gets SIGTTIN (background read attempted signal) when
it executes a very quickly executing child program. Currently gsh
quits in order to avoid waiting forever, but that may not always be a
good strategy.
Rather than have each built-in command always be either forked or Rather than have each built-in command always be either forked or
non-forked, check dynamically and only fork when it's really necessary non-forked, check dynamically and only fork when it's really necessary
(background or piped). (background or piped). Something like this:
If process is in background (&) or piped (|), then fork.
Otherwise: if redirecting I/O, then
copy file descriptor(s)
open new stdin, stdout, and/or stderr
Execute process.
If I/O was redirected, then
close redirected file(s)
reconnect stdin, stdout, and/or stderr
Note: routine "command" sets srcfile and dstfile.
Identify limits built into gsh and how they can be changed; for example, Identify limits built into gsh and how they can be changed; for example,
command line cannot expand to > 1024 characters. command line cannot expand to > 1024 characters.

View File

@ -1,6 +1,34 @@
GSH 2.0 UPDATES GSH 2.0 UPDATES
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
Nov 26 99 [dmt] Cleanup tests directory and update its Makefile.
Nov 22 99 [dmt] Add environment variable flags $ECHOX and $KEEPQUOTE
that modify the behavior of gsh. [shellvar.asm, cmd.asm]
If set, $ECHOX causes gsh to echo a single expanded command.
(In previous versions of gsh 2.0, this was temporary code
that was executed whenever $ECHO was set.)
If set, $KEEPQUOTE tells gsh to use the user's original
single and double quotes, rather than removing them and
adding double quotes as needed. This resolves PR#50 and,
if a child program re-parses its parameters, also resolves
PR#34 (gsh messes up nested quotes).
Nov 18 99 [dmt] Fix PR#123: command line parsing ended if a ";"
delimited a null command (echo "Test 1" ; ; echo "Test2"
would only echo the first string). Modified cmd.asm
Sep 6 99 [dmt] Add comments to ioctl calls in edit.asm.
Sep 1 99 [dmt] Added signal handler for SIGTTIN (signal #21, background
read attempted from control terminal) that prints a message
and quits the shell. This was needed because gsh will sometimes
receive such a signal, go into the "suspended" state, and never
return to "running" state.
Feb 11 99 [dmt] Changes to this point checked-in to master archive.
Released as version 2.0d10 (displays as 2.0d?)
Feb 2 99 [dmt] Changed maxline_size from 1024 to 4096. Feb 2 99 [dmt] Changed maxline_size from 1024 to 4096.
Recode copy loop in expandalias to be more efficient. Recode copy loop in expandalias to be more efficient.
@ -26,7 +54,7 @@ Jan 30 99 [dmt] Add check for output buffer overflow when globbing, and
to truly eat leading blanks (per comments), and to check for to truly eat leading blanks (per comments), and to check for
buffer overflow (alias.cmd). (Also tightened up the code.) buffer overflow (alias.cmd). (Also tightened up the code.)
Jan 13 98 [dmt] Changes to this point checked-in to master archive. Jan 13 99 [dmt] Changes to this point checked-in to master archive.
Released as version 2.0d9 Released as version 2.0d9
Jan 12 99 [dmt] Add debug routine DB~CHKBNK, which causes BRK B0 if Jan 12 99 [dmt] Add debug routine DB~CHKBNK, which causes BRK B0 if

View File

@ -6,7 +6,7 @@
* Jawaid Bazyar * Jawaid Bazyar
* Tim Meekins * Tim Meekins
* *
* $Id: cmd.asm,v 1.11 1999/02/08 17:26:50 tribby Exp $ * $Id: cmd.asm,v 1.12 1999/11/30 17:53:27 tribby Exp $
* *
************************************************************************** **************************************************************************
* *
@ -90,6 +90,8 @@ BADFD gequ -2
gettoken START gettoken START
using vardata
buf equ 1 buf equ 1
state equ buf+4 state equ buf+4
ch equ state+2 ch equ state+2
@ -198,7 +200,7 @@ neut5 cmp #' ' ;space
cmp #9 ;tab cmp #9 ;tab
jeq loop jeq loop
if2 @a,ne,#'>',neut6 if2 @a,ne,#'>',neut6
lda #GTGT ldx #GTGT
bra neut10 bra neut10
neut4 if2 @a,ne,#13,neut4a ;return neut4 if2 @a,ne,#13,neut4a ;return
@ -219,21 +221,26 @@ neut4c lda [buf]
neut4d jmp loop neut4d jmp loop
neut6 if2 @a,ne,#'"',neut7 neut6 if2 @a,ne,#'"',neut7
startquote lda #INQUOTE startquote ldx #INQUOTE
bra neut10 bra chkkeep
neut7 if2 @a,ne,#"'",neut8 neut7 if2 @a,ne,#"'",neut8
startsingle lda #SINGQUOTE startsingle ldx #SINGQUOTE
bra neut10 chkkeep ldy varkeepquote ; Is KEEPQUOTE env var set?
beq neut10 ; NO: just set the state
bra neut9a ; YES: save quote character
neut8 if2 @a,ne,#'\',neut9 neut8 if2 @a,ne,#'\',neut9
lda [buf] lda [buf]
and #$FF and #$FF
incad buf incad buf
if2 @a,eq,#13,neut10a if2 @a,eq,#13,neut10a
neut9 sta [word] ;default
incad word neut9 ldx #INWORD ; Default
lda #INWORD
neut10 sta state neut9a sta [word] ; Save character in buffer
neut10a jmp loop incad word ; and increment pointer.
neut10 stx state ; Set current state.
neut10a jmp loop ; Check next character.
; ;
; CASE GTGT ; CASE GTGT
@ -256,23 +263,28 @@ gtgt3 incad buf
; ;
; CASE INQUOTE ; CASE INQUOTE
; ;
case_inquote if2 ch,ne,#'\',quote2 ;is it a quoted character? case_inquote if2 ch,ne,#'\',quote2 ; If it's a quoted character,
lda [buf] lda [buf] ; load up the next character
incad buf incad buf ; and bump the pointer.
putword sta [word] putword sta [word]
incad word incad word
jmp loop jmp loop
quote2 if2 @a,ne,#'"',putword quote2 if2 @a,ne,#'"',putword
ld2 INWORD,state bra chkkeep2
jmp loop
; ;
; CASE SINGLEQUOTE ; CASE SINGLEQUOTE
; ;
case_single anop case_single anop
if2 ch,ne,#"'",putword if2 ch,ne,#"'",putword
ld2 INWORD,state
jmp loop ; For both ' and ": if KEEPQUOTE env var is set, save quote char in result.
chkkeep2 ldy varkeepquote
beq nokeep
sta [word]
incad word
nokeep ld2 INWORD,state ; Always: set state to INWORD
jmp loop ; and get the next character.
; ;
; CASE INWORD ; CASE INWORD
; ;
@ -294,7 +306,7 @@ case_inword if2 ch,eq,#000,endword
incad buf incad buf
and #$FF and #$FF
if2 @a,eq,#13,word2 if2 @a,eq,#13,word2
bra putword jmp putword
word2 jmp loop word2 jmp loop
endword dec buf endword dec buf
finiword lda #0 finiword lda #0
@ -334,6 +346,8 @@ errstr2 dc c"gsh: Missing ending '.",h'0d00'
command START command START
using vardata
pipefds equ 1 pipefds equ 1
errappend equ pipefds+4 errappend equ pipefds+4
errfile equ errappend+2 errfile equ errappend+2
@ -473,7 +487,9 @@ chkchar if2 @a,eq,#' ',qneeded
beq appword Done if null character. beq appword Done if null character.
bra chkchar bra chkchar
qneeded inc needq Quotes needed. qneeded lda varkeepquote If env var KEEPQUOTE is set,
bne appword required quotes are already in place.
inc needq Otherwise, quotes are needed.
; ;
; Append word to command line (optionally, with quotes) ; Append word to command line (optionally, with quotes)
@ -494,7 +510,7 @@ nospace lda needq If special char is in parameter,
beq noquote beq noquote
lda [word] lda [word]
and #$FF and #$FF
cmp #'"' and it doesn't start with '"', cmp #'"' and param doesn't start with '"',
bne doquote bne doquote
stz needq stz needq
bra noquote bra noquote
@ -1199,6 +1215,7 @@ mutex key
************************************************************************** **************************************************************************
execute START execute START
using vardata
exebuf equ 1 exebuf equ 1
pipesem equ exebuf+4 pipesem equ exebuf+4
@ -1322,7 +1339,6 @@ found_end anop
sta end_char Save the ending character. sta end_char Save the ending character.
tya Get number of bytes in command. tya Get number of bytes in command.
jeq goback If none, just skip it.
clc Add command length to clc Add command length to
adc cmdstrt starting address to adc cmdstrt starting address to
@ -1331,6 +1347,9 @@ found_end anop
adc cmdstrt+2 adc cmdstrt+2
sta cmdend+2 sta cmdend+2
cpy #0 If number of bytes in command
jeq chk_cmd = 0, just skip it.
lda end_char Get the termination character. lda end_char Get the termination character.
beq expand If it's not a null byte, beq expand If it's not a null byte,
lda #0 lda #0
@ -1402,15 +1421,14 @@ expalias ldx ptr_glob+2
ora exebuf+2 ora exebuf+2
jeq errexit jeq errexit
* >> Temporary debug code: echo expanded command if echo is set. ; echo expanded command if echox is set.
using vardata ldy varechox
ldy varecho beq noechox
beq noecho
ldx exebuf+2 ldx exebuf+2
lda exebuf lda exebuf
jsr puts jsr puts
jsr newline jsr newline
noecho anop noechox anop
* command subroutine (4:waitpid,2:inpipe,2:jobflag,2:inpipe2, * command subroutine (4:waitpid,2:inpipe,2:jobflag,2:inpipe2,
* 4:pipesem,4:stream,4:awaitstatus) * 4:pipesem,4:stream,4:awaitstatus)

View File

@ -6,7 +6,7 @@
* Jawaid Bazyar * Jawaid Bazyar
* Tim Meekins * Tim Meekins
* *
* $Id: edit.asm,v 1.11 1999/01/14 17:44:24 tribby Exp $ * $Id: edit.asm,v 1.12 1999/11/30 17:53:27 tribby Exp $
* *
************************************************************************** **************************************************************************
* *
@ -96,23 +96,39 @@ GetCmdLine START
stz currenthist stz currenthist
stz currenthist+2 stz currenthist+2
;
; Get current state of tty
;
ioctl (#1,#TIOCGETP,#oldsgtty) ioctl (#1,#TIOCGETP,#oldsgtty)
ioctl (#1,#TIOCGETK,#oldttyk)
ioctl (#1,#TIOCGLTC,#oldltc)
;
; Set tty to return on character-by-character mode (CBREAK) and
; map CR into LF; output LF as CR-LF (CRMOD)
;
ioctl (#1,#TIOCGETP,#newsgtty) ioctl (#1,#TIOCGETP,#newsgtty)
lda #CBREAK+CRMOD lda #CBREAK+CRMOD
sta sg_flags sta sg_flags
ioctl (#1,#TIOCSETP,#newsgtty) ioctl (#1,#TIOCSETP,#newsgtty)
ioctl (#1,#TIOCGETK,#oldttyk) ;
; Set ttyk bit fields to OAMAP+OA2META+VT100ARROW
;
ioctl (#1,#TIOCSETK,#newttyk) ioctl (#1,#TIOCSETK,#newttyk)
ioctl (#1,#TIOCGLTC,#oldltc) ;
; Set tty to disable "delayed stop process signal" special character
; (default value of ^Y)
;
ioctl (#1,#TIOCGLTC,#newltc) ioctl (#1,#TIOCGLTC,#newltc)
short m short m
lda #-1 lda #-1
sta newltc+1 sta t_dsuspc
long m long m
ioctl (#1,#TIOCSLTC,#newltc) ioctl (#1,#TIOCSLTC,#newltc)
cmdloop lda #keybindtab cmdloop lda #keybindtab
sta 0 sta 0
lda #^keybindtab lda #^keybindtab
@ -149,8 +165,8 @@ eof ldx cmdlen
lda varignore lda varignore
bne findcmd bne findcmd
reterr jsr cursoron reterr jsr cursoron
ioctl (#1,#TIOCSETP,#oldsgtty) ioctl (#1,#TIOCSETP,#oldsgtty) ; Restore original
ioctl (#1,#TIOCSETK,#oldttyk) ioctl (#1,#TIOCSETK,#oldttyk) ; tty settings.
ioctl (#1,#TIOCSLTC,#oldltc) ioctl (#1,#TIOCSLTC,#oldltc)
sec sec
rts rts
@ -302,8 +318,8 @@ fix0 inx
beq retdone beq retdone
ph4 #cmdline ph4 #cmdline
jsl InsertHistory jsl InsertHistory
retdone ioctl (#1,#TIOCSETP,#oldsgtty) retdone ioctl (#1,#TIOCSETP,#oldsgtty) ; Restore original
ioctl (#1,#TIOCSETK,#oldttyk) ioctl (#1,#TIOCSETK,#oldttyk) ; tty settings.
ioctl (#1,#TIOCSLTC,#oldltc) ioctl (#1,#TIOCSLTC,#oldltc)
clc clc
rts rts
@ -564,23 +580,44 @@ cmdoa6c ldy cmdloc
jsr moveright jsr moveright
bra cmdoa6c bra cmdoa6c
oldsgtty dc i1'0' ;
dc i1'0' ; sgtty data structures for current values and new values:
dc i1'0' ;
dc i1'0' oldsgtty dc i1'0' sg_ispeed: input baud rate
dc i2'0' dc i1'0' sg_ospeed: output baud rate
dc i1'0' sg_erase: line-edit erase char
dc i1'0' sg_kill: line-edit kill char
dc i2'0' sg_flags: various state settings
newsgtty dc i1'0' newsgtty dc i1'0'
dc i1'0' dc i1'0'
dc i1'0' dc i1'0'
dc i1'0' dc i1'0'
sg_flags dc i2'0' sg_flags dc i2'0' sg_flags set to CBREAK+CRMOD
;
; ttyk bit map for current value and new value:
;
oldttyk dc i2'0' oldttyk dc i2'0'
newttyk dc i2'OAMAP+OA2META+VT100ARROW' newttyk dc i2'OAMAP+OA2META+VT100ARROW'
oldltc ds 6 ;
newltc ds 6 ; ltchars data structures for current values and new values:
;
oldltc dc i1'0' t_suspc: stop process signal (^Z)
dc i1'0' t_dsuspc: delayed stop process sig (^Y)
dc i1'0' t_rprntc: reprint line (^R)
dc i1'0' t_flushc: flush output (^O)
dc i1'0' t_werasc: word erase (^W)
dc i1'0' t_lnextc: literal next char (^V)
newltc dc i1'0'
t_dsuspc dc i1'0'
dc i1'0'
dc i1'0'
dc i1'0'
dc i1'0'
END END

View File

@ -1,7 +1,7 @@
/* /*
* Resources for version and comment * Resources for version and comment
* *
* $Id: gsh.rez,v 1.12 1999/02/08 17:26:50 tribby Exp $ * $Id: gsh.rez,v 1.13 1999/11/30 17:53:27 tribby Exp $
*/ */
#define PROG "gsh" #define PROG "gsh"
@ -15,8 +15,8 @@
*/ */
resource rVersion (1, purgeable3) { resource rVersion (1, purgeable3) {
{ 2, 0, 0, /* Version 2.0.0 */ { 2, 0, 0, /* Version 2.0.0 */
development, /* development|alpha|beta|final|release */ alpha, /* development|alpha|beta|final|release */
10 }, /* non-final release number */ 1 }, /* non-final release number */
verUS, /* Country */ verUS, /* Country */
PROG, /* Program name */ PROG, /* Program name */
DESC DESC

View File

@ -6,7 +6,7 @@
* Jawaid Bazyar * Jawaid Bazyar
* Tim Meekins * Tim Meekins
* *
* $Id: shell.asm,v 1.10 1999/02/08 17:26:51 tribby Exp $ * $Id: shell.asm,v 1.11 1999/11/30 17:53:27 tribby Exp $
* *
************************************************************************** **************************************************************************
* *
@ -35,6 +35,8 @@
* *
* signal18 subroutine (4:fubar) * signal18 subroutine (4:fubar)
* *
* signal21 subroutine (4:fubar)
*
************************************************************************** **************************************************************************
mcopy /obj/gno/bin/gsh/shell.mac mcopy /obj/gno/bin/gsh/shell.mac
@ -47,6 +49,7 @@ dummyshell start ; ends up in .root
SIGINT gequ 2 SIGINT gequ 2
SIGTSTP gequ 18 SIGTSTP gequ 18
SIGCHLD gequ 20 SIGCHLD gequ 20
SIGTTIN gequ 21
cmdbuflen gequ 1024 cmdbuflen gequ 1024
@ -109,6 +112,7 @@ fastskip1 anop
signal (#SIGINT,#signal2) signal (#SIGINT,#signal2)
signal (#SIGTSTP,#signal18) signal (#SIGTSTP,#signal18)
signal (#SIGCHLD,#pchild) signal (#SIGCHLD,#pchild)
signal (#SIGTTIN,#signal21)
; ;
; Set entry point for users calling system ; Set entry point for users calling system
; ;
@ -636,3 +640,31 @@ signal18 START
msg dc c'^Z',h'0d0a00' msg dc c'^Z',h'0d0a00'
END END
;=========================================================================
;
; SIGTTIN handler
;
;=========================================================================
;
; Work-around for kernel problem: if background read error signal
; is received, gsh will hang forever. Instead, quit.
;
signal21 START
using global
subroutine (4:fubar),0
WriteCString #bg_msg Print message.
Quit QuitParm
QuitParm dc i'0'
; return
bg_msg dc c'gsh: SIGTTIN received!!',h'0d0a00'
END

View File

@ -7,7 +7,7 @@
* Tim Meekins * Tim Meekins
* Derek Taubert * Derek Taubert
* *
* $Id: shellvar.asm,v 1.8 1999/02/08 17:26:51 tribby Exp $ * $Id: shellvar.asm,v 1.9 1999/11/30 17:53:27 tribby Exp $
* *
************************************************************************** **************************************************************************
* *
@ -696,9 +696,27 @@ up9 anop
pei (var) pei (var)
ph4 #oldpmodename ph4 #oldpmodename
jsr cmpdcstr jsr cmpdcstr
bne done bne up10
lda flag lda flag
sta varoldpmode sta varoldpmode
jmp done
up10 pei (var+2)
pei (var)
ph4 #varechoxname
jsr cmpdcstr
bne up11
lda flag
sta varechox
jmp done
up11 pei (var+2)
pei (var)
ph4 #keepquotename
jsr cmpdcstr
bne done
lda flag
sta varkeepquote
done return done return
@ -800,6 +818,8 @@ pushdsilname dc c'pushdsilent',h'00'
termname dc c'term',h'00' termname dc c'term',h'00'
ignorename dc c'ignoreeof',h'00' ignorename dc c'ignoreeof',h'00'
oldpmodename dc c'oldpathmode',h'00' oldpmodename dc c'oldpathmode',h'00'
varechoxname dc c'echox',h'00'
keepquotename dc c'keepquote',h'00'
; Table of flag values (must be in same order as string addresses) ; Table of flag values (must be in same order as string addresses)
evvaltbl anop evvaltbl anop
@ -811,6 +831,8 @@ varnobeep dc i2'0'
varpushdsil dc i2'0' varpushdsil dc i2'0'
varignore dc i2'0' varignore dc i2'0'
varoldpmode dc i2'0' varoldpmode dc i2'0'
varechox dc i2'0'
varkeepquote dc i2'0'
evvaltblsz dc i2'evvaltblsz-evvaltbl' # bytes in table evvaltblsz dc i2'evvaltblsz-evvaltbl' # bytes in table