Trailing-Edge
-
PDP-10 Archives
-
tops20_v7_0_tcpip_distribution_tape
-
tcpip-sources/ftsctt.mac
There are 2 other files named ftsctt.mac in the archive. Click here to see a list.
; UPD ID= 5, SNARK:<6.ARPA-UTILITIES>FTSCTT.MAC.2, 10-Jun-84 16:04:39 by PAETZOLD
;get rid of loop waiting for primary net to come up.
;GIDNEY::<TCPIP.FTP>FTSCTT.MAC.8, 2-Jun-84 11:03:26, Edit by PAETZOLD
;GIDNEY::<TCPIP.FTP>FTSCTT.MAC.7, 2-Jun-84 11:01:30, Edit by PAETZOLD
;Use "%"s in some symbols.
;GIDNEY::<TCPIP.FTP>FTSCTT.MAC.6, 2-Jun-84 10:54:33, Edit by PAETZOLD
;Get rid of TCPSYM. No TENEX support.
;CWL:<INET-SW>FTSCTT.MAC.3 12-May-82 21:01:13, Edit by CLYNN
TITLE FTSCTT Control job for TCP based FTP service using CRJOB
SUBTTL Definitions
SEARCH MONSYM,MACSYM
SALL
VWHO==0 ; Last edited by SWE
VMAJOR==1 ; Major version #
VMINOR==0 ; Revision #
VEDIT==5 ; Remove unused RCUSR, disown job in TENEX version
LOC <.JBVER==137>
<VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT ;VERSION NUMBER
RELOC
T1=1 ; Temp ACs
T2=2
T3=3
T4=4
T5=5
MSG=6
P=17
PDLL==40 ; Size of PDL
FTPORT: ^D21 ; FTP Listening Port number
OPNARG: TCP%WT+CDB ; TCP Flags & connection block adr
TIMOUT: ^D30 ; Give up after 30 seconds
RXPARS: 0 ; OPEN retransmission parameters
SUBTTL Variables
; Job related
PDL: BLOCK PDLL ; Push down list
; Sub-job related ...
ACBLK: BLOCK 20 ; ACs stuffed in subjob
LSNJCN: BLOCK 1 ; TCP JCN of listening connection
PNDJOB: BLOCK 1 ; Created sub-job job number
TTYDSC: BLOCK 1 ; TTY descriptor for TVT
; Block for TENEX CRJOB
1B1+1B3+1B5+1B6+1B7+1B8+1B10+1B12
CRJB10: [ASCIZ /OPERATOR/],,[0] ; Name,,Passwd
0 ; Account
[ASCIZ/<SYSTEM>FTPSRT.SAV/] ; File to get
.NULIO ; Initial terminal (i.e. detached)
0 ; CPU time limit
0 ; Connect time limit
ACBLK ; ACs to stuff into fork
BLOCK 12 ; No Flags for EXEC, nor Primary JFNs,
; Plus space for new and futre args
; Block for TOPS-20 CRJOB ; CREATE job
; Put FTPSRT in top fork but don't start it until Attached
CJ%NAM!CJ%FIL!CJ%ACS!CJ%OWN!CJ%WTA!CJ%NPW!CJ%NUD!CJ%CAP
CRJB20: POINT 7,[ASCIZ /OPERATOR/] ; User name
POINT 7,[0] ; Password
0 ; Account
POINT 7,[ASCIZ /SYSTEM:FTPSRT.EXE/] ; File to run
0 ; Entry vector offset
.NULIO ; Initial TTY (i.e. detached)
0 ; Pre-login time limit
ACBLK ; AC block
BLOCK 13 ; No EXEC, nor Primary JFNs,
; Nor runtime limit, nor Capability mask, nor PID for ICPF on logout,
; Plus space for new and future args
CDB: BLOCK .TCPCS ; Connection block
; Blocks to SEND error message
SBFH: BLOCK .TCPBS ; SEND buffer header
SBF: BLOCK <^D<200+3>/4> ; 8-bit error message (or GTJFN string)
BF2: BLOCK <^D<200+4>/5> ; 7-bit error message
SUBTTL STATUS Blocks
STAD: -STADL,,STADSY ; STAT T2 for following info
STADSY: ASCII /TFH/ ; Foreign Host
ASCII /TLH/ ; Local Host
ASCII /TFP/ ; Foreign Port
ASCII /TLP/ ; Local Port
ASCII /TERR/ ; Error Code
STADL==.-STADSY
STST: -STSTL,,STSTSY ; STAT T2 for following info
STSTSY: ASCII /TERR/ ; Error Code
ASCII /TSSYN/ ; Send state
STSTL==.-STSTSY
SYNCED==7 ; Connection synchronized (useable)
SUBTTL Once-only Initialization
FTSCTT: RESET
SETZM PNDJOB ; No pending job yet
SETZM LSNJCN ; No listen JCN yet
SETZM TTYDSC ; No TVT assigned yet
MOVEI T1,.FHSLF
SETOB T2,T3
EPCAP ; Enable all our capabilities
; Initialize TCP control blocks
MOVE T1,FTPORT ; Listen port
MOVEM T1,CDB+.TCPLP
MOVX T1,TCP%PU ; Push error message
MOVEM T1,SBFH+.TCPBF
MOVEI T1,SBF ; Error message buffer
MOVEM T1,SBFH+.TCPBA
SUBTTL Respond to connection by creating an FTP server job
REGO: MOVE P,[IOWD PDLL,PDL] ; Set up push down list
MOVE T1,OPNARG ; Arguments for OPEN
MOVE T2,TIMOUT ; Wait for a minute to synchronize
MOVE T3,RXPARS ; Retransmission parameters
OPEN%
JRST EROPN ; Error
MOVEM T1,LSNJCN ; Have listening JCN
TXO T1,TCP%SY ; Giving symbols
MOVE T2,STAD ; Address & error
MOVX T3,<-STADL,,ACBLK+1> ; To AC block 1-5
STAT%
JRST ERSTS
MOVE T4,ACBLK+STADL ; Error code
JUMPN T4,ERSTX ; Exit on error
MOVEI T2,CRJB20 ; Get TOPS20 CRJOB block
MOVE T1,-1(T2) ; Flag word
CRJOB ; Create detached job
JRST ERCJ
MOVEM T1,PNDJOB ; Save pending job #
MOVE T1,LSNJCN ; Attach TVT to connection
TXO T1,<TCP%JS+AN%NTP> ; JCN, not JFN
ATNVT
JRST ERTV
SETZM LSNJCN ; JCN is exchanged for
MOVEM T1,TTYDSC ; TTY descriptor
MOVE T1,PNDJOB ; Pending Job #
SETZ T2, ; Job wasn't logged in
SETZ T3, ; No password required
MOVE T4,TTYDSC ; TTY Descriptor
ANDI T4,377777 ; TTY unit number
TXO T1,<AT%TRM> ; Attach to terminal in T4
ATACH
JRST ERAT
SETZM PNDJOB ; Job gone
SETZM TTYDSC ; Terminal gone
JRST REGO ; Go for another
SUBTTL Error routines
ERSTX: MOVE T1,T4 ; Move error code to T1
JSP MSG,FATAL ; STAT reported OPEN error
ASCIZ /
% FTSCTT: Connection STATUS error /
EROPN: HLRZ T2,T1 ; Possible JCN
SKIPE T2 ; Didn't get that far
TXO T2,TCP%JS
MOVEM T2,LSNJCN ; For ABORT
HRRZS T1
CAIE T1,<TCP%ER+TCP%LE+FLD(^D31,TCP%EC)>B<35+36-8>
JRST EROPN1
MOVX T4,<^D<5*60*1000>> ; Wait 5 minutes if TCP not available
JSP MSG,FATALT ; OPEN of listening connection failed
ASCIZ /
% FTSCTT: TCP not initialized error /
EROPN1: JSP MSG,FATAL ; OPEN of listening connection failed
ASCIZ /
% FTSCTT: Connection OPEN error / ; Maybe too many TCP connections
FATAL: MOVX T4,<^D15000> ; Usual wait time
FATALT: PUSH P,T1 ; Save error code
HRROI T1,(MSG) ; Get error text pointer
PSOUT
ERJMP .+1
MOVX T1,<.PRIOU>
POP P,T2 ; Get error code
MOVX T3,^D8
NOUT
JFCL
HRROI T1,[ASCIZ /
/]
PSOUT ; End line
ERJMP .+1
SKIPE T1,LSNJCN ; Have a JCN?
ABORT% ; Yes
JFCL ; No, or error
SETZM LSNJCN
MOVE T1,T4 ; Wait time
DISMS
JRST FTSCTT
ERSTS: JSP MSG,TCPEMS ; STAT of OPEN connection failed
ASCIZ /Status error was / ; Maybe connection was reset
ERCJ: JSP MSG,TTYEMS ; CRJOB failed to create a new job
ASCIZ /Unable to create job because / ; Maybe FULL
ERTV: JSP MSG,TCPEMS ; ATNVT failed to attach TVT to connection
ASCIZ /Unable to attach NVT to connection - / ; Maybe no free TVTs
ERAT: JSP MSG,TTYEMS ; ATACH failed to attach TVT to created job
ASCIZ /Unable to attach NVT to job because / ; ??
SUBTTL Format Error Messages
; From TCP Error Code
TCPEMS: PUSH P,T1 ; Save TCP error code
HRROI T1,BF2
HRROI T2,[ASCIZ /
421 /]
SETZ T3,
SOUT
ERJMP .+1
HRROI T2,(MSG)
SOUT
ERJMP .+1
POP P,T2
MOVX T3,^D8
NOUT
JFCL
JRST SNDMSG
; From System Error String
TTYEMS: HRROI T1,BF2
HRROI T2,[ASCIZ /
421 /]
SETZ T3,
SOUT
ERJMP .+1
HRROI T2,(MSG)
SOUT
ERJMP .+1
HRLOI T2,.FHSLF
ERSTR
JFCL
JFCL
SKIPG PNDJOB
JRST NOJOB
HRROI T2,[ASCIZ/, Job /]
SOUT
ERJMP .+1
MOVE T2,PNDJOB
MOVX T3,^D10
NOUT
JFCL
NOJOB: JRST SNDMSG
SUBTTL Send error message to user (via TCP)
SNDMSG: HRROI T2,[ASCIZ/
/]
SETZ T3,
SOUT
ERJMP .+1
SKIPE T2,TTYDSC ; Have a TTY descriptor (& no JCN)?
JRST TRYTTY ; Yes, try it
MOVX T1,<POINT 8,SBF> ; Convert 7-bit message to 8-bit
MOVX T2,<POINT 7,BF2>
MOVX T3,<^D200>
SETZ T4, ; Count message length
SOUT
ERJMP .+1
MOVNS T3
ADDI T3,<^D200>
MOVEM T3,SBFH+.TCPBC
SKIPN T1,LSNJCN ; See if connection looks usable
JRST LOSE ; No
TXO T1,TCP%SY ; Giving symbols
MOVE T2,STST ; TERR into T4
MOVX T3,<-STSTL,,T4> ; & TSSYN into T5
STAT%
JRST LOSE ; STAT Error
JUMPN T4,LOSE ; Connection Error
CAIE T5,<SYNCED> ; Send side SYNCED?
JRST LOSE ; No
MOVE T1,LSNJCN
MOVEI T2,SBFH
MOVE T3,TIMOUT
MOVE T4,RXPARS
SEND%
JRST LOSE
JRST DELAY
SUBTTL Send error message to user (via TVT TTY)
TRYTTY: HRROI T1,SBF ; BF2 has error message
DEVST ; T2 has tty descriptor
JRST LOSE
MOVX T2,":" ; End device name with colon
BOUT
SETZ T2, ; End string with NUL
BOUT
MOVX T1,<GJ%FOU+GJ%SHT>
HRROI T2,SBF
GTJFN ; Get JFN for TVT TTY
JRST LOSE
MOVE T4,T1 ; Save JFN for cleanup
MOVX T2,<FLD(7,OF%BSZ)+OF%APP>
OPENF ; Open TTY for message
JRST DELJFN
HRROI T2,BF2
SETZ T3, ; Send error message by TTY
SOUT
ERJMP DELJFN
MOVE T1,T4
CLOSF ; Close TTY
CAIA
SETZ T4, ; JFN was released by CLOSF
SKIPE T1,T4 ; If still have JFN
RLJFN ; Release it
JFCL
DELAY: MOVX T1,<^D5000> ; Wait for error message
DISMS ; to be delivered
JRST CLEAN
SUBTTL Cleanup Garbage
DELJFN: SKIPE T1,T4 ; If still have JFN
RLJFN ; Release it
JFCL
LOSE: HRROI T1,[ASCIZ /
% FTSCTT: Cannot report error to user:/]
PSOUT
HRROI T1,BF2
PSOUT
CLEAN: SKIPE T1,PNDJOB ; Get job #, if any
LGOUT ; Log it out
JFCL ; One error is enough
SETZM PNDJOB
SKIPE T1,TTYDSC ; Get TTY descriptor, if any
RELD ; Release it
JFCL ; One error is enough
SETZM TTYDSC
SKIPE T1,LSNJCN ; Get JCN, if any
CLOSE% ; Finished sending
JFCL
MOVX T1,<^D5000> ; Wait a few seconds
DISMS
SKIPE T1,LSNJCN ; Get JCN, if any
ABORT% ; Get rid of it
JFCL
SETZM LSNJCN
JRST REGO ; Try again
END FTSCTT