SRI-NOSC/s2/write.s

Compare this file to the similar file:
Show the results in this format:

/
/ write4 -- write to another user
/
/ as write4.s;ld -n -s a.out -la;mv a.out /bin/write

/ This write command corrects many deficiencies of previous versions
/ Fixed by Greg CHesson, Jody Kravitz, Rick Balocca,
/ 	at the University of Illinois
/
/ fixes :
/ write is in raw mode
/ errors from write system calls are noted
/ signals are turned off in parent if child is forked (!escapes)
/ rubout or eot ends write
/
.globl	ttyn

	cmp	(sp)+,$2
	beq	1f
	bgt	2f
	mov	$1,r0
	sys	write; argm; eargm-argm
	sys	exit
2:
	movb	*4(sp),ltty
1:
	tst	(sp)+
	mov	(sp)+,r5
	sys	open; utmp; 0
	bec	1f
	mov	$1,r0
	sys	write; film; efilm-film
	sys	exit
1:
	mov	r0,ufil
1:
	mov	ufil,r0
	sys	read; ubuf; 16.
	tst	r0
	bne	2f
	jmp	8f
2:
	tstb	ltty
	beq	2f
	cmpb	ltty,8.+ubuf
	bne	1b
2:
	mov	$ubuf,r3
	mov	r5,r4
	mov	$9.,r2
2:
	dec	r2
	beq	2f
	cmpb	(r4)+,(r3)+
	beq	2b
	tstb	-1(r4)
	bne	1b
	cmpb	$' ,-1(r3)
	bne	1b
2:
	movb	8.+ubuf,ttyno
	sys	open; ttyx; 1
	bes	3f
	sys	stat; ttyx; statbuf
	bes	3f
	bit	$2,statbuf+4
	bne	2f
3:
	mov	$1,r0
	sys	write; dnymes; ednymes-dnymes
	sys	exit
2:
	mov	r0,ttyf
	clr	r0
	jsr	pc,ttyn
	mov	r0,r3
	mov	statbuf,r4
	mov	ufil,r0
	sys	seek; 0; 0
1:
	mov	ufil,r0
	sys	read; ubuf; 16.
	tst	r0
	jeq	unknown
	cmp	r3,ubuf+8.
	bne	1b
	mov	$ubuf,r0
	mov	$8.,r1
1:
	cmpb	$' ,(r0)+
	beq	1f
	dec	r1
	bne	1b
1:
	neg	r1
	add	$8,r1
	mov	r1,0f
6:
	mov	ttyf,r0
	sys	write; mesg; emesg-mesg
	jes	wfailed
	cmp	r0,$emesg-mesg
	jlt	wfailed
	mov	ttyf,r0
	sys	0; 5f
.data
5:
	sys	write; ubuf; 0:2
.text
	/ Note: the lack of check for error return
	mov	ttyf,r0
	sys	write; qnl; 4
	jes	wfailed
	cmp	r0,$4		/* number of chars we attempted to write
	jlt	wfailed
/sys	signal; 2; 9f
	clr	r0
	sys	gtty; vec
	mov	$vec,r3
	mov	$sav,r2
	mov	(r3)+,(r2)+
	mov	(r3)+,(r2)+
	mov	(r3),(r2)
	bis	$040,(r3)
	sys	stty; vec
	/ Note: no error checking
/
/ it sure would be nice if we output a bell here to let
/ the user know...... (jsk 4Jan77)
	mov	$1,r0
	sys	write; belmes;ebelmes-belmes
	jes	wfail2
	cmp	r0,$ebelmes-belmes
	jlt	wfail2
/
	inc	rawflg
7:
	clr	r0
	sys	read; ch; 1
	tst	r0
	beq	9f
	bic	$177600,ch
	cmp	ch,$04
	beq	9f
	cmp	ch,$0177
	beq	9f
	tst	nlflg
	beq	1f
	cmp	ch,$'!
	bne	1f
	sys	stty; sav
	sys	fork
		br mshproc
	sys	signal;2;1
	mov	r0,savsig2
	sys	signal;3;1
	mov	r0,savsig3
	sys	wait
	sys	0;ressig2
	sys	0;ressig3
.data
ressig2:	sys	signal;2;savsig2:	0
ressig3:	sys	signal;3;savsig3:	0
.text
	sys	signal;2;savsig3
	clr	r0
	sys	stty; vec
	mov	$1,r0
	sys	write; excl; 2
	br	7b
1:
	clr	nlflg
	cmp	ch,$'\n
	bne	1f
	inc	nlflg
1:
	mov	ttyf,r0
	sys	write; ch; 1
	jes	wfailed
	tst	r0
	jle	wfailed
	/* testing...
/	mov	$1,r0
/	sys	write; ok;eok-ok;
	br	7b
8:
	movb	(r5)+,ch
	beq	8f
	mov	$1,r0
	sys	write; ch; 1
	br	8b
8:
	tstb	ltty
	beq	8f
	mov	$1,r0
	sys	write; ltty-1; 2
8:
	mov	$1,r0
	sys	write; errmsg; eerrmsg-errmsg
	sys	exit
9:
	mov	ttyf,r0
	sys	write; endmsg; eendmsg-endmsg
	jes	wfailed
	cmp	r0,$eendmsg-endmsg
	jlt	wfailed
	tst	rawflg
	beq	1f
	clr	r0
wfail2:
	sys	stty; sav
1:
	sys	exit

unknown:
	mov	$"??,ubuf
	jbr	6b

mshproc:
	sys	exec; msh; mshp
	sys	exit

wfailed:
	mov	$1,r0
	sys	write; gone;egone-gone
	jbr	wfail2
.data
nlflg:
	1
rawflg:
	0
.text

mshp:
	msh
	minust
	0
msh:
	</bin/sh\0>
minust:
	<-t\0>
argm:
	<Arg count\n>
eargm:
film:
	<Cannot open utmp\n>
efilm:
.data
	< >		/ is ltty -1
ltty:
	.=.+1
.text
excl:
	<!\n>
qnl:
	<...\n>
.data
ttyx:
	</dev/ttyx\0>
ttyno	= .-2
.text
utmp:
	</etc/utmp\0>
endmsg:
	<EOT\n>
eendmsg:
errmsg:
	< not logged in.\n>
eerrmsg:
mesg:
	<\nMessage from >
emesg:
dnymes:
	<Permission denied.\n>
ednymes:
gone:
	<Other side closed\n>
egone:
belmes:
	<>
ebelmes:
/ok:
/	<I'm ok\n>
/eok:
	.even
	.bss

ttyf:	.=.+2
ubuf:	.=.+16.
statbuf:.=.+40.
ch:	.=.+2
ufil:	.=.+2
vec:	.=.+6
sav:	.=.+6
signal = 48.