perm filename RSSER.MID[S,NET]3  blob 
sn#811229 filedate 1986-02-24 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==365		; 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