perm filename RSSER.MID[S,NET] blob sn#820023 filedate 1986-06-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	X TERMID CORBEG TERSTR ARGSTR LUSER FNDLSP ARGEND ERSTRP AUXIOP AUXOOP INLNKP LNKTTY PDL COREND
C00005 00003	RSSER CPYHST 1DIGTP NOTTIP
C00007 00004	RSEXEC RSEXC1 CMDCHR CMDREE ARGCHR STOCHR
C00009 00005	XCTCMD CMDTAB NUMCOM CMDSER
C00010 00006	ERSTR CMDONE NOOP BREAK PTCL QUIT USINF USINF0
C00013 00007	SSINF USINFR SSINF0 SSINF7 SSINF1
C00015 00008	SSINF3 SSINF4 SSINF2 SSINF6 SSINF5 SSNXTJ
C00017 00009	AUXS AUXSDE AUXSSE AUXS1
C00019 00010	CONN BADHDL GOTHDL GETSKT GOTSKT SNDCON HOMOSK
C00021 00011	LINK NOTTYN CHKFOK
C00024 00012	LNKTPL LNKZZZ LNKLUP LNKLP0 LNKLP1
C00025 00013	OCTOUT NETMSG NEGACK NEGAK1 POSACK ...LIT SVRRTS DATRTS ERRTNS ERRHAN ERRINS HSTTAB HSTSIX
C00027 ENDMK
C⊗;
;X TERMID CORBEG TERSTR ARGSTR LUSER FNDLSP ARGEND ERSTRP AUXIOP AUXOOP INLNKP LNKTTY PDL COREND

TITLE RSSER
SUBTTL Definitions

; Mark Crispin, SU-AI, July 1979

; Assembly switches

IFNDEF SVRSKT,SVRSKT==245.		; default listen socket
IFNDEF PDLLEN,PDLLEN==50		; stack length

; AC definitions.  0→3 are used by NETWRK

X=4 ? A=5 ? B=6 ? C==7 ? P=17

TERMID:	'TERMID				; for spies to see where we are
CORBEG==.				; start of initialized core storage
TERSTR:	BLOCK 40			; console location string
ARGSTR:	BLOCK 20.			; argument string
LUSER:	BLOCK 1				; user name for USINF
FNDLSP:	BLOCK 1				; -1 → found a loser
ARGEND==.-1
ERSTRP:	BLOCK 1				; -1 → full error messages
AUXIOP:	BLOCK 1				; -1 → aux input opened
AUXOOP:	BLOCK 1				; -1 → aux output opened
INLNKP:	BLOCK 1				; -1 → in a link
LNKTTY:	BLOCK 1				; link TTY number
PDL:	BLOCK PDLLEN			; stack
COREND==.-1				; end of initialized storage
;RSSER CPYHST 1DIGTP NOTTIP

SUBTTL Initialize the world

RSSER:	CAI
	RESET
	MOVE [SIXBIT/RSSER/]
	SETNAM
	SETZM CORBEG
	MOVE [CORBEG,,CORBEG+1]
	BLT COREND
	MOVE P,[PDL(-PDLLEN)]
	MOVSI 377777
	SETPR2				; map the system in
	 JRST 4,.-1
	OUTSTR [ASCIZ/RSSER started
/]

; Listen for a connection on our socket

	MOVEI SVRSKT
	MOVEM LSNSKT
	PUSHJ P,LISTEN

; Set up terminal id for interested spies

	MOVEI TERMID
	MOVEM JOBVER

; Log the connection

	OUTSTR [ASCIZ/Connected to /]
	PUSHJ P,MAPHST			; map in host table
	MOVE HOST
	PUSHJ P,HSTNUM			; get HDB
	 CAI				; sorry about errors
	MOVEI A,(1)			; host name
	HRLI A,440700
	SKIPA X,[440700,,TERSTR]
CPYHST:	 IDPB B,X
	ILDB B,A
	JUMPN B,CPYHST
	HLRZ A,1			; pointer to system name
	MOVE B,(A)			; get system name
	MOVE A,FSOCKT			; and ICP socket
	CAMN B,[ASCII/TIP/]		; on a TIP?
	 TRNE A,177774			; just paranoia; make sure a TIP port
	  JRST NOTTIP
	MOVEI B,"#
	IDPB B,X
	LSH A,-16.
	IDIVI A,8.			; ports are octal
	JUMPE A,1DIGTP
	ADDI A,"0 ? IDPB A,X
1DIGTP:	ADDI B,"0 ? IDPB B,X
NOTTIP:	PUSHJ P,SETANM			; set our job name
	PUSHJ P,UNMHST			; map out the host table
	OUTSTR TERSTR
	OUTSTR [ASCIZ/
/]
	JRST RSEXC1			; skip prompt first time around
;RSEXEC RSEXC1 CMDCHR CMDREE ARGCHR STOCHR

SUBTTL RS EXEC top level

RSEXEC:	MOVEI ↑M
	PUSHJ P,NETOCH
	MOVEI ↑J
	PUSHJ P,NETOCH
	MOVEI "@			; command prompt
	PUSHJ P,NETOCH
	PUSHJ P,NETSND
	SKIPE INLNKP
	 JRST LNKTPL
RSEXC1:	MOVE X,[440700,,A]
	SETZB A,ARGSTR			; clear command
	MOVE [ARGSTR,,ARGSTR+1]
	BLT ARGEND
CMDCHR:	PUSHJ P,NETICW
CMDREE:	CAIN ↑M				; end of command?
	 JRST XCTCMD
	CAIE <" >			; start of arguments?
	 JRST STOCHR
	MOVE X,[440700,,ARGSTR]
ARGCHR:	PUSHJ P,NETICW
	CAIN ↑M
	 JRST XCTCMD
	CAIL "a
	 CAILE "z
	  TRNA
	   SUBI "a-"A
	IDPB X
	JRST ARGCHR

STOCHR:	TRNN A,376			; command too long?
	 JRST [	CAIL "a			; no, convert case
		 CAILE "z
		  TRNA
		   SUBI "a-"A
		IDPB X			; and stuff it in
		JRST CMDCHR]
	MOVEI X,[ASCIZ/110 Command too long/]
	PUSHJ P,NETICW
	CAIE ↑M
	 JRST .-2
	PUSHJ P,NETICW			; eat LF
	JRST NEGACK
;XCTCMD CMDTAB NUMCOM CMDSER

SUBTTL Command decoder

XCTCMD:	PUSHJ P,NETICW			; eat LF
	JUMPE A,CMDONE			; null command is always valid
	MOVSI B,-NUMCOM
	CAMN A,CMDTAB(B)
	 JRST @CMDSER(B)
	AOBJN B,.-2
	MOVEI X,[ASCIZ/100 No comprende dat/]
	JRST NEGACK

; Command tables

DEFINE CMDS
 CMD ERSTR
 CMD SSINF
 CMD USINF
 CMD AUXS
 CMD CONN
 CMD LINK
 CMD BREAK
 CMD NOOP
 CMD PTCL
 CMD QUIT
TERMIN

DEFINE CMD FOO
 IFG .LENGTH/FOO/-5,.ERR FOO bites the bag
 ASCII/FOO/
TERMIN

CMDTAB:	CMDS
NUMCOM==.-CMDTAB

DEFINE CMD FOO
 FOO
TERMIN

CMDSER:	CMDS
;ERSTR CMDONE NOOP BREAK PTCL QUIT USINF USINF0

SUBTTL Command service routines

; ERSTR - Toggle error message verbosity

ERSTR:	SETCMM ERSTRP
CMDONE:	PUSHJ P,POSACK
	JRST RSEXEC

; NOOP - Just returns NOOP as a reply

NOOP:	PUSHJ P,POSACK
	JSP C,NETMSG
	 ASCIZ/NOOP/
	JRST CMDONE

; BREAK - Break links

BREAK:	SKIPN A,LNKTTY
	 JRST CMDONE
	MOVEI B,↑C
	PTWR1W A
	PTRD1S A			; slurp up every last goddam character!!
	 CAIA
	  JRST .-2
	PTYREL LNKTTY
	SETZM LNKTTY
	SETZM INLNKP
	JRST CMDONE

; PTCL - change protocol

PTCL:	SKIPN X,ARGSTR
	 JRST [	MOVEI X,[ASCIZ/120 What protocol?/]
		JRST NEGACK]
	CAMN X,[ASCII/GENRL/]
	 JRST CMDONE
	CAMN X,[ASCIZ/TENEX/]
	 SKIPA X,[[ASCIZ/120 Boy if you expect Tenex protocol out of me are you ever gonna lose/]]
	  MOVEI X,[ASCIZ/120 That protocol isn't implemented/]
	JRST NEGACK

; QUIT - terminate interaction and die

QUIT:	RESET
	EXIT

; USINF - status on a single user

USINF:	SKIPN ARGSTR			; any argument?
	 JRST [	MOVEI X,[ASCIZ/110 Who do ya want?/]
		JRST NEGACK]
	MOVE A,[440700,,ARGSTR]
	SETZ
USINF0:	ILDB B,A
	JUMPE B,[	MOVEM LUSER
			PUSHJ P,POSACK
			JRST USINFR]
	CAIL B,"a
	 CAILE B,"z
	  TRNA
	   SUBI B,"a-"A
	LSH 6
	ADDI -" (B)			; sixbitify and add in
	TLNN 77				; overflow?
	 JRST USINF0
	MOVEI X,[ASCIZ/110 User name too long/]
	JRST NEGACK
;SSINF USINFR SSINF0 SSINF7 SSINF1

SUBTTL SSINF command

SSINF:	PUSHJ P,POSACK
	JSP C,NETMSG
	 ASCIZ/
Job    User  TTY Subsys/
USINFR:	MOVEI ↑M
	PUSHJ P,NETOCH
	MOVEI ↑J
	PUSHJ P,NETOCH
	MOVEI X,1			; start at job 1
SSINF0:	MOVE A,400210			; JBTSTS
	ADDI A,400000(X)
	MOVE A,(A)
	TLNN A,10000			; JLOG set?
	 JRST SSNXTJ			; no job or a phantom, ignore it
	MOVE A,400211			; PRJPRG
	ADDI A,400000(X)
	SKIPE A,(A)
	 CAMN A,[SIXBIT/*SEG*/]
	  JRST SSNXTJ
	SKIPN LUSER
	 JRST SSINF7
	HRRZ A,A
	CAME A,LUSER
	 JRST SSNXTJ
SSINF7: SETOM FNDLSP
	MOVEI <" >
	PUSHJ P,NETOCH
	MOVEI A,(X)
	IDIVI A,10.
	SKIPN A
	 MOVEI A," -"0
	MOVEI "0(A)
	PUSHJ P,NETOCH
	MOVEI "0(B)
	PUSHJ P,NETOCH
	MOVEI <" >
	PUSHJ P,NETOCH
	PUSHJ P,NETOCH
	MOVE A,400211			; PRJPRG
	ADDI A,400000(X)
	MOVE A,(A)
	MOVEI C,6
SSINF1:	SETZ B,
	ROTC A,6
	MOVEI " (B)
	PUSHJ P,NETOCH
	CAIN C,4
	 JRST [	MOVEI ",
		PUSHJ P,NETOCH
		SOJA C,SSINF1]
	SOJG C,SSINF1
	MOVEI <" >
; (continued on next page)
;SSINF3 SSINF4 SSINF2 SSINF6 SSINF5 SSNXTJ

; SSINF TTY line, program name

	PUSHJ P,NETOCH
	MOVE A,400236			; JBTLIN
	ADDI A,400000(X)
	HRRZ A,(A)
	CAIN A,-1			; detached?
	 JRST [	JSP C,NETMSG
		 ASCIZ/Det/
		JRST SSINF2]
	IDIVI A,100
	IDIVI B,10
	JUMPE A,[	MOVEI <" >
			PUSHJ P,NETOCH
			JUMPN B,SSINF3
			PUSHJ P,NETOCH
			JRST SSINF4]
	MOVEI "0(A)
	PUSHJ P,NETOCH
SSINF3:	MOVEI "0(B)
	PUSHJ P,NETOCH
SSINF4:	MOVEI "0(C)
	PUSHJ P,NETOCH
SSINF2:	MOVEI <" >
	PUSHJ P,NETOCH
	MOVE A,400225			; JOBNAM
	ADDI A,400000(X)
	SKIPN A,(A)
	 JRST SSINF5
SSINF6:	SETZ B,
	ROTC A,6
	MOVEI " (B)
	PUSHJ P,NETOCH
	JUMPN A,SSINF6
SSINF5:	MOVEI ↑M
	PUSHJ P,NETOCH
	MOVEI ↑J
	PUSHJ P,NETOCH
SSNXTJ:	CAME X,400222			; hit last job?
	 AOJA X,SSINF0
	SKIPE LUSER			; not for SSINF
	 SKIPE FNDLSP
	  JRST CMDONE
	JSP C,NETMSG
	 ASCIZ/
User not logged in/
	JRST CMDONE
;AUXS AUXSDE AUXSSE AUXS1

SUBTTL AUXS Command

AUXS:	SKIPN ARGSTR
	 JRST [	MOVEI X,[ASCIZ/110 What type and size?/]
		JRST NEGACK]
	LDB [260700,,ARGSTR]
	CAIE <" >			; direction must be a single character
	 JRST AUXSDE
	LDB [350700,,ARGSTR]		; get direction
	CAIN "R				; receive socket
	 JRST [	MOVEI A,4
		MOVEI C,1
		JRST AUXS1]
	CAIN "S				; send socket
	 JRST [	MOVEI A,5
		MOVEI C,2
		JRST AUXS1]
AUXSDE:	SKIPA X,[[ASCIZ/220 Bad direction specification/]]
AUXSSE:	 MOVEI X,[ASCIZ/221 Bad size specification/]
	JRST NEGACK
AUXS1:	LDB [100700,,ARGSTR]		; must be a single character
	JUMPN AUXSSE
	LDB [170700,,ARGSTR]
	CAIE "8
	 JRST AUXSSE
	PUSHJ P,POSACK
	ADD A,LSOCKT
	PUSHJ P,OCTOUT
	MOVEI <" >
	PUSHJ P,NETOCH
	MOVEI "0(C)
	PUSHJ P,NETOCH
	JRST CMDONE
;CONN BADHDL GOTHDL GETSKT GOTSKT SNDCON HOMOSK

SUBTTL CONN Command

CONN:	SKIPN ARGSTR
	 JRST [	MOVEI X,[ASCIZ/110 What handle and socket?/]
		JRST NEGACK]
	MOVE X,[440700,,ARGSTR]
	ILDB C,X			; get handle
	CAIE C,"1
	 CAIN C,"2
	  JRST GOTHDL			; got a handle on the situation
BADHDL:	MOVEI X,[ASCIZ/260 Bad handle/]
	JRST NEGACK
GOTHDL:	ILDB X
	JUMPE [	MOVEI X,[ASCIZ/110 What socket?/]
		JRST NEGACK]
	CAIE <" >
	 JRST BADHDL			; wanted a space here
	SETZ A,
GETSKT:	ILDB B,X
	CAIL B,"0
	 CAILE B,"7
	  JRST GOTSKT
	LSH A,3
	ADDI A,-"0(B)
	JRST GETSKT
GOTSKT:	CAIE C,"1			; receive connection?
	 JRST SNDCON
	TRNN A,1
	 JRST HOMOSK
	SUBI A,3			; fake out DATI's smarts
	MOVEM A,FSOCKT
	PUSHJ P,DATI			; open connection
	SETOM AUXIOP
	JRST CMDONE

SNDCON:	TRNE A,1
	 JRST HOMOSK
	SUBI A,2			; fake out DATO's smarts
	MOVEM A,FSOCKT
	MOVEI 8.
	PUSHJ P,DATO
	SETOM AUXOOP
	JRST CMDONE

HOMOSK:	MOVEI X,[ASCIZ/270 Homosocketual connections are illegal by California law/]
	JRST NEGACK			; the Anita Bryant feature
;LINK NOTTYN CHKFOK

SUBTTL LINK Command

LINK:	SKIPN X,ARGSTR
	 JRST [	MOVEI X,[ASCIZ/110 With what to whom?/]
		JRST NEGACK]
	ANDCMI X,377
	CAME X,[ASCII/1 2 /]
	 CAMN X,[ASCII/2 1 /]
	  TRNA
	   JRST [	MOVEI X,[ASCIZ/110 Bad handle/]
			JRST NEGACK]
	SKIPE AUXIOP
	 SKIPN AUXOOP
	  JRST [MOVEI X,[ASCIZ/801 Connection not open/]
		JRST NEGACK]
	MOVEI X,377
	AND X,ARGSTR
	JUMPE X,[	MOVEI X,[ASCIZ/110 To whom?/]
			JRST NEGACK]
	PTYGET A
	 JRST [	MOVEI X,[ASCIZ/620 Can't get a PTY/]
		JRST NEGACK]
	HRRM A,LNKTTY
	MOVE B,A
	TLO B,10034
	PTSETL A
	MOVSI B,034400			; set IMPBIT
	TLO B,(A)
	HRROI B
	TTYSET
	MOVSI B,025400			; clear NO-CONVERT bit
	TLO B,(A)
	TTYSET
	MOVEI B,[ASCIZ/TALK /]
	PTWRS7 A
	LDB B,[010700,,ARGSTR]
	CAIL B,"0
	 CAILE B,"7
	  JRST NOTTYN
	MOVEI B,[ASCIZ/TTY/]
	PTWRS7 A
NOTTYN:	SKIPA X,[100700,,ARGSTR]
	 PTWR1W A
	ILDB B,X
	JUMPN B,.-2
	MOVEI B,↑M
	PTWR1W A
	MOVEI B,↑J
	PTWR1W A
	PTRD1W A
	CAIN B,"U
	 JRST [	MOVEI X,[ASCIZ/605 User not logged in/]
		SETZM LNKTTY
		PTYREL A
		JRST NEGACK]
	CAIE B,"T
	 JRST CHKFOK
	PTRD1W A			; thank you BH for making the fucking
	CAIE B,<" >			; messages so goddamned similar!
	 JRST .-2
	PTRD1W A			; thank you again BH!
	PTRD1W A			; thank you again BH!
	CAIE B,"T
	 JRST CHKFOK			; see if won now
	MOVEI X,[ASCIZ/601 User logged in more than once/]
	SETZM LNKTTY
	PTYREL A
	JRST NEGACK

CHKFOK:	CAIN B,"b
	 JRST [	MOVEI X,[ASCIZ/603 Refused by user/]
		SETZM LNKTTY
		PTYREL A
		JRST NEGACK]
	CAIE B,"O
	 JRST [	MOVEI X,[ASCIZ/604 Can't complete link for unknown reason/]
		SETZM LNKTTY
		PTYREL A
		JRST NEGACK]
	PTRD1W A
	CAIE B,<" >
	 JRST .-2
	MOVEI [	MOVE JOBCNI
		TLNE 20
		 JRST [	DEBREAK
			RESET
			EXIT]
		DISMIS]
	MOVEM JOBAPR
	MOVSI 1030			; INTPTO+INTIMS+INTINP
	INTENB
	CLKINT 2*60.
	SETOM INLNKP
	JRST CMDONE
;LNKTPL LNKZZZ LNKLUP LNKLP0 LNKLP1

; Link top level

LNKTPL:	PUSHJ P,NETICH			; get a command character
	 JRST LNKZZZ
	SETZB A,ARGSTR			; clear command
	MOVE X,[ARGSTR,,ARGSTR+1]
	BLT X,ARGEND
	MOVE X,[440700,,A]
	JRST CMDREE			; reenter command mode

LNKZZZ:	MOVE A,LNKTTY
	PTGETL A
	TLNN B,1
	 JRST QUIT			; link was broken
	IWAIT
LNKLUP:	PTRD1S A
	 JRST LNKLP1
LNKLP0:	MOVEI (B)
	PUSHJ P,DATOCH
	PTRD1S A
	 TRNA
	  JRST LNKLP0
	PUSHJ P,DATSND
LNKLP1:	PUSHJ P,DATICH
	 JRST LNKTPL
	ANDI 177
	CAIE ↑C
	 CAIN 177
	  JRST LNKLP1			; we don't need rubouts
	MOVE B,
	PTWR1W A
	JRST LNKLP1
;OCTOUT NETMSG NEGACK NEGAK1 POSACK ...LIT SVRRTS DATRTS ERRTNS ERRHAN ERRINS HSTTAB HSTSIX

SUBTTL Random routines

; Network octal output

OCTOUT:	IDIVI A,8.
	PUSH P,B
	SKIPE A
	 PUSHJ P,OCTOUT
	POP P,B
	MOVEI "0(B)
	JRST NETOCH

; Network text message

NETMSG:	HRLI C,440700			; called with JSP C,NETMSG
	ILDB C
	JUMPE 1(C)
	PUSHJ P,NETOCH
	JRST NETMSG+1

; Negative acknowledgement

NEGACK:	MOVEI "-
	PUSHJ P,NETOCH
	HRLI X,440700
NEGAK1:	ILDB X
	SKIPN ERSTRP			; verbosity mode on?
	 CAIE <" >			; no, is it a space?
	  TRNA
	   JRST RSEXEC			; space with ERSTR mode off
	JUMPE RSEXEC
	PUSHJ P,NETOCH
	JRST NEGAK1

; Positive acknowledgement

POSACK:	MOVEI "+
	JRST NETOCH

...LIT:	CONSTANTS

; Wonderful network routines

SVRRTS==-1				; include server routines
DATRTS==-1				; include data channel routines
ERRTNS==-1				; include error routines
ERRHAN==-1				; include automagic error handling
ERRINS==<JRST QUIT>			; error instruction
HSTTAB==-1				; include host table magic
HSTSIX==-1				; and alias name kludge

.INSRT NETWRK

END RSSER