1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-16 08:24:38 +00:00
PDP-10.its/src/sysnet/idents.97
2017-02-05 08:14:41 -08:00

225 lines
4.9 KiB
Plaintext

;-*- Mode: MIDAS -*-
TITLE IDENTS ; Ident/Auth Server -- install as DEVICE;TCP SYN161
PORT==113. ; Official TCP port for Indent/Auth Server
A=1 ; scratch
B=2 ; scratch
C=3 ; scratch
D=4 ; scratch
T=10 ; scratch for macros
TT=11 ; scratch for macros
P=17 ; stack pointer
NETI==1 ; network input channel
NETO==2 ; network output channel
PDLSIZ==10 ; stack size
CMDSIZ==100 ; input buffer size
LOC 42
JSR TSINT
LOC 100 ; Here we go
DEBUG: 0 ; Non-zero when debugging
.INSRT KSC;MACROS
DEFINE POINT (SIZ,ADR) ; As in MACRO-10
<440000\<<SIZ>_6>,,<ADR>>!TERMIN
DEFINE SYS FUN,[ARGS] ; Success or death
SYSCALL FUN,ARGS
JSR AUTPSY
TERMIN
DEFINE ASCIOT [ADR,LEN] ; Send ASCII to network
MOVE T,[POINT 7,ADR]
MOVE TT,LEN
SYS SIOT,[
MOVEI NETO
MOVE T
MOVE TT]
TERMIN
DEFINE STRIOT &TEXT& ; Send text to network
ASCIOT [ASCII TEXT],[.LENGTH TEXT]
TERMIN
DEFINE CRLF ; Send network EOL
.IOT NETO,[^M]
.IOT NETO,[^J]
TERMIN
TSINT: 0 ; Interrupt handler - for fatal conditions
0 ; Any interrupt is cause for death.
JSR AUTPSY
AUTPSY: 0 ; Remember where we came from
SKIPE DEBUG
.VALUE
.LOGOUT
PDL: PDLSIZ,,PDL+1 ; Push down stack
BLOCK PDLSIZ
COMAND: BLOCK <CMDSIZ/5>+1 ; Input buffer
CMDLEN: 0 ; Actual size, excluding EOL
LOCALP: 0 ; Local port number
CLIENP: 0 ; Foreign port number
CLIENT: 0 ; Foreign host number
XUNAME: 0 ; Logged in user name, in SIXBIT
USERID: BLOCK 2 ; Logged in user name, in ASCII
UIDLEN: 0 ; Length of USERID in bytes
GO: MOVE P,PDL ; Set up stack
NETOPN: SYS TCPOPN,[ ; Listen for a connection
MOVEI NETI
MOVEI NETO
MOVEI PORT
MOVE [-1]
MOVE [-1]]
MOVEI B,3*30. ; Try for 30 sec
NETOP2: MOVEI A,10.
.SLEEP A,
SYSCAL WHYINT,[ ; Get socket state
MOVEI NETO
MOVEM D
MOVEM A]
.LOSE %LSSYS
CAIE A,%NSOPN ; If connection open
CAIN A,%NSRFN ; or RFNM wait on write link
CAIA ; then don't
SOJG B,NETOP2 ; try again
CAIG B,
JSR AUTPSY ; Timed out...
GETCMD: MOVE A,[POINT 7,COMAND] ; Point to COMAND buffer
HRLZI B,-CMDSIZ ; -Size,,Length
GETCM1: SYS IOT,[ ; Get one character
MOVEI NETI
MOVEM C]
CAIGE C,0 ; If the other end closed
JSR NKNOWN ; then barf
CAIE C,^M ; If it's CR
CAIN C,^J ; or LF
JRST GETCM2 ; then we're done
IDPB C,A ; Save it
AOBJN B,GETCM1 ; Next
JSR NKNOWN ; Buffer overflow
GETCM2: HLLI B, ; Drop remaining size
MOVEM B,CMDLEN ; Remember the length
CAIGE B,3 ; If it's too short to make sense
JSR NKNOWN ; then barf
PARSE: MOVE A,[POINT 7,COMAND] ; Point to COMAND buffer
CALL NUMBER ; Scan first number
MOVEM B,LOCALP ; into local port
CALL NUMBER ; Scan second number
MOVEM B,CLIENP ; into client port
LOOKUP: SYS RFNAME,[ ; Get client host number
MOVEI NETI
MOVEM D
MOVEM D
MOVEM D
MOVEM CLIENT]
JFCL
;; DEBUG OUTPUT
MOVE A,CLIENT
LSH A,-30
CALL PROCT
.IOT NETO,[":]
MOVE A,CLIENT
LSH A,-20
ANDI A,377
CALL PROCT
.IOT NETO,[":]
MOVE A,CLIENT
LSH A,-10
ANDI A,377
CALL PROCT
.IOT NETO,[":]
MOVE A,CLIENT
ANDI A,377
CALL PROCT
CRLF
RESULT: CALL PORTS ; Send back result
STRIOT " : USERID : ITS : "
ASCIOT USERID,UIDLEN
DONE: CRLF
.NETS NETO, ; Force the output.
.CLOSE NETO, ; Disconnect.
.CLOSE NETI, ; Disconnect.
.LOGOUT
NKNOWN: 0 ; Remember where we came from
PUSHAE P,[A,B,C,D] ; Don't clobber the evidence
STRIOT "0, "
MOVE A,NKNOWN ; Where it blew
CALL PROCT ; Tell the loser
STRIOT " : ERROR : UNKNOWN-ERROR"
POPAE P,[D,B,C,A] ; Restore evidence
SKIPE DEBUG
JSR AUTPSY ; Present it to the court
JRST DONE
NVALID: CALL PORTS
STRIOT " : ERROR : INVALID-PORT"
JRST DONE
;; Send COMAND back to client
PORTS: ASCIOT COMAND,CMDLEN
RETURN
;; Send positive number in right half of A to the net, in octal
;; Clobbers A, B and C
PROCT: HLLI A, ; Clear top half
JUMPE A,PROCT0 ; Careful with zero
HRROI B,0 ; The glass is half full
PROCT1: LSHC A,3 ; Get the top digit from A, and take a sip
HLRZ C,A ; Move digit into C
JUMPE C,PROCT1 ; Skip leading zeroes
ANDI C,7 ; Strip old bits
ADDI C,"0 ; Convert to octal
.IOT NETO,C ; Send it out
JUMPN B,PROCT1 ; Until the glass is empty
RETURN
PROCT0: .IOT NETO,["0] ; Zero is special
RETURN
;; Skip leading non-digits, then
;; read decimal number from bp in A into B
;; Advances A, clobbers C
NUMBER: ILDB C,A ; Look at the next character
JUMPE C,NVALID ; Barf at end of string
CAIL C,"0 ; If it's less than 0
CAILE C,"9 ; or greater than 9
JRST NUMBER ; then skip it
SETZ B, ; Start from 0
NUMLOP: IMULI B,10. ; Move previous digits up
SUBI C,"0 ; Convert to binary
IOR B,C ; Add to result
ILDB C,A ; Look at the next character
JUMPE C,NUMEND ; Bail at end of string
CAIL C,"0 ; If it's less than 0
CAILE C,"9 ; or greater than 9
JRST NUMEND ; then we're done
JRST NUMLOP ; Next
NUMEND: JUMPLE B,NVALID ; Barf on gubbage
RETURN
LITS: ; Literals go here
END GO