Trailing-Edge
-
PDP-10 Archives
-
bb-x130a-sb
-
whochk.mac
There are 4 other files named whochk.mac in the archive. Click here to see a list.
TITLE WHOCHK -- CHECK ROUTINE FOR WHO
SEARCH WHOMAC
$SETUP (WHOCHK)
Comment |
This module contains the driver subroutine WHOCHK, which dispatches
to the mode specific checking routines, but it handles 'AND', 'NOT',
and 'OR'. It also contains other general checking routines, currently
only CHKLOG to see if a job is logged in (used by WHOCMD).
|
; TABLE OF CONTENTS FOR WHOCHK
;
;
; SECTION PAGE
; 1. General checking
; 1.1 WHOCHK - See if matches users switches............ 3
; 1.2 CHKTST - Check this spec for a match.............. 4
; 2. Simple check tables
; 2.1 Define macros..................................... 5
; 2.2 JOB MODE.......................................... 6
; 2.3 LINE MODE......................................... 7
; 2.4 NODE MODE......................................... 8
; 2.5 USER MODE......................................... 9
; 3. Checking routines
; 3.1 JOB MODE.......................................... 10
; 3.2 LINE NODE......................................... 17
; 3.3 NODE MODE......................................... 18
; 3.4 Common tests...................................... 19
; 4. General checking
; 4.1 CHKSTR - See if legal file structure.............. 20
; 4.2 CHKNOD - See if node online....................... 21
; 4.3 CHKDEV - See if device given (single job)......... 22
; 4.4 CHKLOG - See if logged out and legal.............. 23
; 5. Storage................................................... 24
SUBTTL General checking -- WHOCHK - See if matches users switches
;CALL:
; PUSHJ P,WHOCHK
; <LOSE>
; <WIN>
WHOCHK::MOVE I,S.FRST## ;START WITH FIRST SPEC
PUSHJ P,S$POSITION## ;POSITION TO ENTRY
;HERE WHEN WINNING SO FAR
CHKTML: PUSHJ P,CHKTST ;TEST NEXT SPEC FOR MATCH
JRST CHKTMB ;NO--BAD MATCH
CHKTMD: LOAD T1,.FXMOD(I),FX.TRM ;GET TERMINATOR
JRST @[.POPJ1## ;END--WIN BIG
CHKTMC ;'AND'--NEXT MUST ALSO WIN
.POPJ1## ;'OR'--WIN BIG
CHKTMN ;'NOT'--NEXT MUST NOT WIN
.POPJ1## ;+ (INDEPENDENT OF FT$COR)--WIN BIG
.POPJ1## ; (5)--ASSUME WIN BIG
.POPJ1## ; (6)--ASSUME WIN BIG
.POPJ1##](T1) ; (7)--ASSUME WIN BIG
;HERE WHEN OK SO FAR, THEN 'NOT'
CHKTMN: PUSHJ P,CHKTAD ;ADVANCE TO NEXT SPEC
JRST .POPJ1## ;NOT THERE!--ASSUME BIG WIN
PUSHJ P,CHKTST ;TEST FOR MATCH
JRST CHKTMD ;NO--PROCEED TO NEXT BASED ON SEPARATOR
;HERE WHEN LOST--MUST WAIT FOR NEXT 'OR' TO WIN
CHKTMB: LOAD T1,.FXMOD(I),FX.TRM ;GET TERMINATOR
JRST @[CHKTMF ;END--LOOSE BIG
CHKTMS ;'AND'--SKIP ON
CHKTMC ;'OR'--START MATCHING OVER
CHKTMS ;'NOT'--SKIP ON
CHKTMP ; + --DEPENDS ON FT$COR
CHKTMF ; (5)--ASSUME LOOSE BIG
CHKTMF ; (6)--ASSUME LOOSE BIG
CHKTMF](T1) ; (7)--ASSUME LOOSE BIG
;HERE WHEN SKIPPING TO NEXT 'OR' BECAUSE LOOSING
CHKTMS: PUSHJ P,CHKTAD ;ADVANCE TO NEXT SPEC
JRST CHKTMF ;IF DONE, LOOSE BIG
JRST CHKTMB ;IF SOMETHING, REDISPATCH
;HERE WHEN WINNING AND 'AND' ENCOUNTERED
CHKTMC: PUSHJ P,CHKTAD ;ADVANCE TO NEXT
JRST .POPJ1## ;IF DONE, ASSUME WIN BIG
JRST CHKTML ;THEN GO TEST THIS ALSO
;HERE IF TOO OLD OR TOO YOUNG--BACK DOWN SUCCESS COUNTER
CHKTMF: POPJ P, ;GIVE BAD NEWS TO CALLER
;DEFINE + BEHAVIOUR
ND FT$COR,-1 ;LET + = 'OR'
IFN FT$COR,<CHKTMP==CHKTMC>
IFE FT$COR,<CHKTMP==CHKTMF>
;ROUTINE TO ADVANCE WITHIN CONCATINATED SET
;CALL:
; PUSHJ P,CHKTAD
; <DONE>
; <NEXT SPEC> ;I POINTS TO NEXT SPEC
CHKTAD: CAMN I,S.LAST## ;AT THE END?
POPJ P, ;YES--ALL DONE
PJRST S$NEXT## ;GET NEXT SPEC AND RETURN
SUBTTL General checking -- CHKTST - Check this spec for a match
;CALL:
; MOVEI I,SPEC ADDR
; PUSHJ P,CHKTST
; <LOSE>
; <WIN>
CHKTST: PUSHJ P,.SAVE2##
MOVE P2,XCHK(M) ;LOAD CHECK AOBJN
CHKLOP: MOVE P1,@.CKSWT(P2) ;GET SWITCH VALUE
CAMN P1,.CKINI(P2) ;SEE IF DIFERENT THAN INITIAL
JRST CHKNXT ;NO--THE SAME
PUSHJ P,@.CKLOD(P2) ;LOAD FIELD TO TEST
SKIPN .CKCHK(P2) ;SEE IF ROUTINE TO PROCESS
JRST CHKL.1 ;NO--TEST MASK
PUSHJ P,@.CKCHK(P2) ;DISPATCH TO CHECK
POPJ P, ;REJECTED
JRST CHKNXT ;PASSED--GO ON
CHKL.1: XOR P1,T1 ;MASK WITH VALUE
TDNE P1,@.CKMSK(P2) ;SEE IF MATCHES WHERE SIGNIFICANT
POPJ P, ;REJECTED
CHKNXT: CAMN P2,XCHK(M) ;FIRST TIME?
AOS NFOUND## ;YES--COUNT FOUND A THING
ADD P2,[.CKLEN-1,,.CKLEN-1] ;ADVANCE AOBJN
AOBJN P2,CHKLOP ;AND LOOP FOR ALL
JRST .POPJ1## ;PASSED!
SUBTTL Simple check tables -- Define macros
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<XWD -L'ABR'CHK,T'ABR'CHK>
XCHK: MODES
DEFINE CCHECK(MOD),<
IRPC MOD,<
DEFINE V(XXX,INI<-1>,LOD),<
IFB <LOD>,<X(.FZ'XXX##(I),[-1],INI,MOD'B$'XXX##,0)>
IFNB <LOD>,<X(.FZ'XXX##(I),[-1],INI,MOD'B$'LOD##,0)>
>
DEFINE VM(XXX,INI<-1>),<X(.FZ'XXX##(I),.FZ'XXX+1(I),INI,MOD'B$'XXX##,0)>
DEFINE VR(XXX,INI<-1>,LOD),<
IFB <LOD>,<X(.FZ'XXX##(I),0,INI,MOD'B$'XXX##,MOD'C$'XXX)>
IFNB <LOD>,<X(.FZ'XXX##(I),0,INI,MOD'B$'LOD##,MOD'C$'XXX)>
>
STOPI
>
T'MOD'CHK: CHECKS
L'MOD'CHK==.-T'MOD'CHK
>;END DEFINE CCHECK
DEFINE X(SWT,MSK,INI,LOD,CHK),<
SWT
MSK
INI
LOD
CHK
>;END DEFINE X
SUBTTL Simple check tables -- JOB MODE
DEFINE CHECKS,<
XLIST
V JOB ;;JOB NUMBER
V BJB ;;BATCH JOB BATCH
V CLS ;;CLASS
V CJN ;;CONTROLLING JOB NUMBER
IFN FTIPC,<
V CAT ;;CATEGORY
V SLT ;;SLOT
VM LPN ;;LOGGED IN PPN
VM CID ;;CHARGE ID
V BDG ;;DEC BADGE NUMBER
VR PVT,-1,LPN ;;PIVOTED
>
IFN FTMDC,<
V STP ;;SETP
>
VR APC ;;ASYNC PORT CHARACTERISTICS
V RMT ;;REMOTE TERMINAL BIT
V NLN ;;NETWORK LINE NUMBER
V BBB ;;BACKGROUND BATCH BIT
V BSN ;;BATCH STREAM NUMBER
VM PPN ;;PPN
VM PRG ;;PROGRAM
VM NNM ;;NETWORK NODE NAME
VM HSN ;;HIGH SEGMENT NAME
VM CPN ;;CONTROLLING PROGRAM NAME
VM CNO ;;CHARGE NUMBER
VR TTY ;;TERMINAL
VR HPQ ;;HPQ
VR DPR ;;DISK PRIORITY
VR STA, 0 ;;JOB STATES (GENERIC)
VR WSC ;;JOB WAIT STATE CODES (2 CHAR THINGIES)
VR SLF,-1,PPN ;;SELF PPN
VR OPR,-1,PPN ;;OPERATORS
VR PRV, 0 ;;PRIVILEGE BITS
VR CAP, 0, ;;CAPABILITY BITS
VR JST, 0,STS ;;JOB STATUS BITS
VR NAM ;;USER NAME
VR SNC,-1,JLT ;;LOGGED IN SINCE
VR BFR,-1,JLT ;;LOGGED IN BEFORE
IFN FTRESET,<
VR RSN,-1,STM ;;RESET SINCE
VR RBF,-1,STM ;;RESET BEFORE
>;END IFN FTRESET
IFN FTPRGRUN,<
VM PTR ;;PROGRAM TO RUN
>;END IFN FTPRGRUN
VR VM ,-1,PPL ;;JOB IS VIRTUAL
VR MOU,-1,PPN ;;MOUNTED STRUCTURE
VR CRL,-1,PPL ;;CORE SIZE (PHYSICAL)
VR VCL,-1,PVL ;;CORE SIZE (VIRTUAL)
VR LOC ;;JOBS LOCATION
VR ACC ;;ACCOUNT STRING
VR DDB, 0 ;;DDB IN USE
VR WTO ;;WTO PRIVS
VR GOP ;;GALAXY OPR PRIVS
VR DDT ;;DDT IS LOADED
VR PFH ;;PFH IS LOADED
LIST
>
EXTERN JC$DDB
CCHECK(JOB)
SUBTTL Simple check tables -- LINE MODE
DEFINE CHECKS,<
XLIST
VR TTY ;;TERMINAL
V JOB ;;JOB NUMBER
V TSP ;;TRANSMIT SPEED
V RSP ;;RECEIVE SPEED
V NLN ;;NETWORK LINE NUMBER
VR APC ;;ASYNC PORT CHARACTERISTICS
V RMT ;;REMOTE TERMINAL BIT
V TAC ;;TERMINAL ASSIGNED BY COMMAND
V TAP ;;TERMINAL ASSIGNED BY PROGRAM
V TCJ ;;TERMINAL CONTROLLING A JOB
V DSC ;;DATA SET CARRIER
V SLV ;;SLAVE TERMINAL
VM NNM ;;NETWORK NODE NAME
VM TYP ;;TERMINAL TYPE
VR LOC ;;TERMINAL LOCATION STRING
V MCL ;;MIC CONTROLLED LINE
IFN FTLGNQ,<
VR LQP ;;LOGIN QUEUE POSITION
> ;END IFN FTLGNQ
LIST
>
CCHECK(LIN)
SUBTTL Simple check tables -- NODE MODE
DEFINE CHECKS,<
XLIST
VM NNM ;;NETWORK NODE NAME
VM TYP ;;NODE TYPE
OBJECTS
LIST
>
DEFINE XX(OBJ),<
IF2,NC$'OBJ==CK$VAL
VR OBJ
>
CCHECK(NOD)
SUBTTL Simple check tables -- USER MODE
DEFINE CHECKS,<
XLIST
VR NAM ;;USER NAME
VM PPN ;;PPN
VM PSW ;;PASSWORD
VR PRV, 0 ;;PRIVILEGE BITS
LIST
>
CCHECK(USR)
SUBTTL Checking routines -- JOB MODE
JC$DPR: CAIN P1,PD.DPR## ;PRESENT DEFAULT?
JRST DPR.1 ;YES
SUBI P1,<1_WID(JS.PRI)> ;REMOVE OFFSET (SEE $DISK IN WHOSCN)
CAME T1,P1 ;MATCH EXACTLY?
POPJ P, ;NO--RETURN
JRST .POPJ1## ;YES--SKIP RETURN
DPR.1: JUMPG T1,.POPJ1## ;WIN IF GREATER THAN ZERO
POPJ P, ;ELSE REJECT
JC$HPQ: CAIN P1,PD.HPQ## ;PRESENT DEFAULT?
JRST HPQ.1 ;YES
CAIE T1,(P1) ;MATCH EXACTLY?
POPJ P, ;NO--RETURN
JRST .POPJ1## ;YES--SKIP RETURN
HPQ.1: JUMPG T1,.POPJ1## ;WIN IF GREATER THAN ZERO
POPJ P, ;ELSE REJECT
JC$SLF: CAMN T1,.MYPPN## ;SEE IF MATCHES MY PPN
JUMPE P1,.POPJ## ;YES--REJECT IF /NOSELF
CAME T1,.MYPPN## ;SEE IF MATCHES MY PPN
JUMPG P1,.POPJ## ;NO--REJECT IF /SELF
JRST .POPJ1## ;YES--SKIP RETURN
JC$OPR: SETO T2, ;LOAD A MINUS 1
MOVEI T3,(T1) ;GET JOBS PROGRAMMER NUMBER
MOVE T4,OPRPPN## ;GET OPR PPN
CAIE T3,(T4) ;OPR PROGRAMMER?
JRST OPR.1 ;NO
CAMN T4,T1 ;LOCAL OPR?
TDZA T2,T2 ;YES--FLAG WITH 0
MOVEI T2,1 ;NO--LOAD A 1
OPR.1: XCT [JUMPGE T2,.POPJ##
JUMPL T2,.POPJ##
JUMPN T2,.POPJ##
JUMPLE T2,.POPJ##]-1(P1)
JRST .POPJ1## ;SUCESS RETURN
JC$RSN:! ;RESET TIME GREATER THAN SWITCH?
JC$SNC: CAMG T1,P1 ;LOGIN GREATER THAN SWITCH?
POPJ P, ;NO--REJECT
JRST .POPJ1## ;YES--ACCEPT
JC$RBF:! ;RESET TIME LESS THAN SWITCH?
JC$BFR: CAML T1,P1 ;LOGIN LESS THAN SWITCH?
POPJ P, ;NO--REJECT
JRST .POPJ1## ;YES--ACCEPT
JC$VM: PUSH P,T1 ;SAVE PHYSICAL LOW SIZE
PUSHJ P,JB$PPH## ;PHYISCAL HIGH SIZE
POP P,T2 ;RESTORE
ADD T1,T2 ;SUM PHYSICAL SIZE
PUSH P,T1 ;SAVE PHYSICAL SIZE
PUSHJ P,JB$PVL## ;VIRTUAL LOW SIZE
PUSH P,T1 ;SAVE
PUSHJ P,JB$PVH## ;VIRTUAL HIGH SIZE
POP P,T2 ;RESTORE
ADD T1,T2 ;SUM VIRTUAL SIZE
POP P,T2 ;RESTORE PHYSICAL SIZE
CAIE T2,1(T1) ;SAME (INCLUDE UPMP)
JUMPE P1,.POPJ## ;NO--REJECT IF /NOVM
CAIN T2,1(T1) ;DIFFERENT (INCLUDE UPMP)
JUMPN P1,.POPJ## ;NO--REJECT IF /VM
JRST .POPJ1## ;JUST RIGHT
JC$WSC: TDNE P1,[000077,,777777] ;ONLY 2 CHARS?
JRST WSC.1 ;NO--USE ALL
LSH P1,-^D24 ;RIGHT JUSTIFY TWO CHARS
LDB T2,[POINT 12,T1,11] ;GET FIRST TWO STATE CHARS
CAMN T2,P1 ;MATCH?
JRST .POPJ1## ;YES--ACCEPT
LDB T2,[POINT 12,T1,29] ;GET NEXT TWO STAT CHARS
CAMN T2,P1 ;MATCH?
JRST .POPJ1## ;YES--ACCEPT
POPJ P, ;NO--REJECT
WSC.1: CAME T1,P1 ;EXACT MATCH?
POPJ P, ;NO--REJECT
JRST .POPJ1## ;YES--ACCEPT
JC$CRL: PUSH P,T1 ;SAVE LOW SIZE
PUSHJ P,JB$PPH## ;GET HIGH SEG SIZE
POP P,T2 ;RESTORE LOW
ADDI T1,(T2) ;GET TOTAL
CAMG T1,.FZCRH##(I) ;SEE IF TOO BIG
CAMGE T1,.FZCRL##(I) ;OR TOO SMALL
POPJ P, ;YES--REJECT
JRST .POPJ1## ;NO--ACCEPT
JC$VCL: PUSH P,T1 ;SAVE LOW SIZE
PUSHJ P,JB$PVH## ;GET HIGH SEG SIZE
POP P,T2 ;RESTORE LOW
ADDI T1,(T2) ;GET TOTAL
CAMG T1,.FZVCH##(I) ;SEE IF TOO BIG
CAMGE T1,.FZVCL##(I) ;OR TOO SMALL
POPJ P, ;YES--REJECT
JRST .POPJ1## ;NO--ACCEPT
JC$LOC: CAMN T1,P1 ;MATCH USERS?
JRST .POPJ1## ;YES--ACCEPT
CAIE P1,PD.LOC## ;PRESENT DEFAULT?
POPJ P, ;NO--LOSE
MOVE P1,T1 ;SAVE CURRENT LOCATION
PUSHJ P,JB$NNU## ;GET LOCATION OF TERMINAL
CAME P1,T1 ;MATCH?
POPJ P, ;NO--LOSE
JRST .POPJ1## ;YES--WIN
JC$WTO: CAIN P1,PD.WTO## ;PRESENT DEFAULT?
JRST WTO.1 ;YES
CAIN T1,-1(P1) ;MATCH? (KEYS START WITH 1)
AOS (P) ;YES
POPJ P, ;AND RETURN
WTO.1: CAIE T1,.OBNOM ;NONE?
AOS (P) ;NO--WIN
POPJ P, ;AND RETURN
JC$GOP: CAIN P1,PD.GOP## ;PRESENT DEFAULT?
JRST GOP.1 ;YES
CAIN T1,-1(P1) ;MATCH? (KEYS START WITH 1)
AOS (P) ;YES
POPJ P, ;AND RETURN
GOP.1: JUMPG T1,.POPJ1## ;WIN IF ANY
POPJ P, ;ELSE LOSE
IFN FTIPC,<
JC$PVT: PUSH P,T1 ;SAVE LOGGED IN PPN
PUSHJ P,JB$PPN## ;GET CURRENT PPN
POP P,T2 ;RESTORE LOGGED IN
CAME T1,T2 ;MATCH?
JUMPG P1,.POPJ1## ;NO--WIN IF /PIVOTED
CAMN T1,T2 ;MATCH?
JUMPE P1,.POPJ1## ;YES--WIN IF /NOPIVOTED
POPJ P, ;LOSE
>
JC$ACC: MOVEI T2,(I)
HRLI T2,-10
ACC.1: MOVE T3,.FZACC##(T2)
XOR T3,(T1)
TDNE T3,.FZATM##(T2)
POPJ P,
ADDI T1,1
AOBJN T2,ACC.1
JRST .POPJ1##
JC$STA: MOVE T2,[-LN$STA,,STABIT] ;POINT TO TABLES
PJRST CHKBIT ;CHECK THE BITS
DEFINE X(A),<EXP STAT'A##,STAT'A##>
STABIT: STATES
LN$STA==.-STABIT
JC$CAP: PUSHJ P,.SAVE2## ;SAVE P1,P2
DMOVE P1,.FZCAP##(I) ;LOAD MASK, VALUES
JRST CAPPRV
UC$PRV:!
JC$PRV: PUSHJ P,.SAVE2## ;SAVE P1,P2
DMOVE P1,.FZPRV##(I) ;LOAD MASK, VALUES
CAPPRV: MOVE T2,[-LN$PRV,,PRVBIT] ;POINT TO BITS
PJRST CHKWRD ;AND CHECK BITS
DEFINE PRIVS,<
XLIST
XX IPCF ,JP.IPC
XX DISK ,JP.DPR
XX METER ,JP.MET
XX POKE ,JP.POK
XX CPU ,JP.CCC
XX HPQ ,JP.HPQ
XX UNSPOOL ,JP.NSP
XX ENQ ,JP.ENQ
XX RTTRP ,JP.RTT
XX LOCK ,JP.LCK
XX TRPSET ,JP.TRP
XX SPYALL ,JP.SPA
XX SPYMON ,JP.SPM
IFN FTIPC,<
XX NETEXAM ,JP.NEX
XX CHGPPN ,JP.CPN
>
IFN FTMDC,<
XX SETP ,JP.MPV
XX PRGRUN ,JP.SPG
>
IFN FTTUFTS,<
XX NAME ,JP.NAM
XX PPASSW ,JP.CPP
XX MAIL ,JP.MAI
XX SFD ,JP.SFD
XX SPASSW ,JP.CSP
XX COMBO ,JP.COM
XX MAGTAPE ,JP.MAG
>
LIST
>
DEFINE XX(A,B),<EXP PR'A##,B>
PRVBIT: PRIVS
LN$PRV==.-PRVBIT
JC$JST: MOVE T2,[-LN$JST,,JSTBIT] ;POINT TO TABLE
PJRST CHKBIT ;GO CHECK THEM
DEFINE JSTATUS,<
XLIST
XX RUN,JS.RUN
XX CMDWAIT,JS.CMW
XX MONERR,JS.ERR
XX LOCK,JS.NSW
XX SWAP,JS.SWP
XX JACCT,JS.JAC
XX DCORE,JS.JDC
XX OPRWAIT,JS.OPR
XX XONLY,JS.XOY
XX DSKFUL,JS.DFP
LIST
>
DEFINE XX(A,B),<EXP <1_<ST'A##-1>>,B>
JSTBIT: JSTATUS
LN$JST==.-JSTBIT
CHKBIT: HRLZ T3,(T2) ;GET THE SCAN BIT
TDNN T3,P1 ;SEE IF KNOWN
JRST CHKB.2 ;NO
MOVE T4,1(T2) ;GET THE SPECIFIED BIT
TSNE T3,P1 ;SEE IF /NOBIT
TDNE T4,T1 ;SEE IF BIT ON
SKIPA
POPJ P, ;LOSE
TSNN T3,P1 ;SEE IF /BIT
TDNN T4,T1 ;SEE IF BIT OFF
SKIPA
POPJ P,
CHKB.2: AOBJN T2,.+1 ;LOOP FOR ALL
AOBJN T2,CHKBIT ;..
JRST .POPJ1## ;WIN!
CHKWRD: MOVE T3,(T2) ;GET THE SCAN BIT
TDNN T3,P1 ;SEE IF KNOWN
JRST CHKW.2 ;NO
MOVE T4,1(T2) ;GET THE SPECIFIED BIT
TDNE T3,P2 ;SEE IF /NOBIT
TDNE T4,T1 ;SEE IF BIT ON
SKIPA
POPJ P, ;LOSE
TDNN T3,P2 ;SEE IF /BIT
TDNN T4,T1 ;SEE IF BIT OFF
SKIPA
POPJ P, ;LOSE
CHKW.2: AOBJN T2,.+1 ;LOOP FOR ALL
AOBJN T2,CHKWRD ;..
JRST .POPJ1## ;WIN!
JC$MOU: MOVEM T1,GOBBLK+.DFGPP ;STORE PPN
PUSHJ P,JB$JOB## ;GET JOB NUMBER
MOVEM T1,GOBBLK+.DFGJN ;STORE JOB NUMBER
SETOM GOBBLK+.DFGNM ;START WITH FIRST STR
CHKM.1: MOVE T1,[3,,GOBBLK] ;POINT TO BLOCK
PUSHJ P,UGOBSTR## ;READ S/L
POPJ P, ;TOO BAD
SKIPN T1,GOBBLK+.DFGNM ;GET STR NAME
JRST CHKM.1 ;SKIP OVER FENCE
AOJE T1,.POPJ## ;END OF S/L
CAMN P1,GOBBLK+.DFGNM ;MATCH USERS?
JRST .POPJ1## ;YES--MATCHES
JRST CHKM.1 ;NO--LOOP
UC$NAM:!
JC$NAM: MOVE T2,1(T1) ;GET PART 2
MOVE T1,(T1) ;GET PART 1
NAM.3: DMOVE T3,T1 ;COPY NAME
XOR T3,.FZNAM##(I) ;MASK OFF WITH USERS SWITCH
XOR T4,.FZNAM##+1(I) ;..
TDNN T3,.FZNMM##(I) ;CHECK
TDNE T4,.FZNMM##+1(I) ;..
CAIA ;FAILED--CHECK AGAIN
JRST .POPJ1## ;GOOD RETURN
NAM.1: LDB T3,[POINT 6,T1,5] ;GET FIRST CHAR
CAIL T3,'A' ;ALPHA?
CAILE T3,'Z' ;..
JRST NAM.2 ;NO--SKIP OUT
LSHC T1,6 ;YES--SHIFT TO NEXT CHAR
JUMPN T1,NAM.1 ;CHECK AGAIN IF NONZERO
POPJ P, ;FAILED
NAM.2: LSHC T1,6 ;SHIFT OFF THE SPACE
JUMPN T1,NAM.3 ;MASK AGAIN IF NONZERO
POPJ P, ;ELSE FAIL
SUBTTL Checking routines -- LINE NODE
LC$LOC: MOVEI T2,(I)
HRLI T2,-4
LOC.1: MOVE T3,.FZLOC##(T2)
XOR T3,(T1)
TDNE T3,.FZLMC##(T2)
POPJ P,
ADDI T1,1
AOBJN T2,LOC.1
JRST .POPJ1##
SUBTTL Checking routines -- NODE MODE
SUBTTL Checking routines -- Common tests
LC$LQP:! ;LOGIN QUEUE
JC$DDT:! ;DDT
JC$PFH:! ;PFH
CK$VAL: CAIN P1,0 ;SEE IF /NOVALUE
JUMPE T1,.POPJ1## ;YES--RETURN IF NOT VALUE
CAIE P1,0 ;SEE IF /VALUE
JUMPN T1,.POPJ1## ;YES--RETURN IF VALUE
POPJ P, ;ELSE FAIL
JC$APC:!
LC$APC:!
CK$APC: HRRES P1 ;FIX SIGN
JUMPL P1,APC.1 ;JUMP IF /NOVALUE
CAMN P1,T1 ;MATCH?
AOS (P) ;YES--WIN
POPJ P, ;NO--RETURN
APC.1: MOVNS P1 ;MAKE POSITIVE
CAME P1,T1 ;MATCH?
AOS (P) ;NO--WIN
POPJ P, ;YES--RETURN
JC$TTY:!
LC$TTY: HLRZ T2,P1 ;GET LH
CAIN T2,1 ;SPECIAL NOxxx FORM?
JRST TTY.1 ;YES
XOR T1,.FZTTY##(I) ;MASK OFF
TDNE T1,.FZTTM##(I) ;CHECK
POPJ P, ;FAILED
JRST .POPJ1## ;GOOD!
TTY.1: MOVSS P1 ;SWITCH HALVES
XOR T1,P1 ;CHECK LH
TLNN T1,-1 ;LH MATCH?
POPJ P, ;MATCH--LOSE SINCE /NOxxx
JRST .POPJ1## ;NO MATCH--WIN
SUBTTL General checking -- CHKSTR - See if legal file structure
CHKSTR::MOVE T1,.FZMOU##(I) ;GET STR NAME
CAMN T1,[-1] ;SEE IF GIVEN
POPJ P, ;NO--RETURN
PUSHJ P,STRNFS## ;TRY TO CONVERT TO A FS NUMBER
$WARN (DNF,<Device not a file structure >,E.DNF,.POPJ##)
SKIPN S.PRINT## ;/NOPRINT
POPJ P, ;YES--NO MOUNT COUNT MESSAGES
MOVE T1,.FZMOU##(I) ;RELOAD STR NAME
PUSHJ P,STRMNC## ;GET THE MOUNT COUNTS
PJRST PRTSTR ;PRINT STRUCTURE INFO AND RETURN
E.DNF: MOVE T1,.FZMOU##(I) ;GET NAME
PJRST .TSIXN## ;TYPE AND RETURN
; Here to print structure info
PRTSTR: PUSHJ P,.SAVE2## ;SAVE P1 AND P2
DMOVE P1,T1 ;SAVE STRMNC FLAGS AND COUNTS
MOVE T1,.FZMOU##(I) ;GET STR NAME
PUSHJ P,.TDEVN## ;TYPE IT
LOAD T2,P1,MC.TMC ;GET TOTAL MOUNT COUNT
MOVEI T1,[ASCIZ/ Mount count /]
SKIPN T2 ;NON-ZERO?
MOVEI T1,[ASCIZ | Mount count 0|]
PUSHJ P,.TSTRG## ;TYPE
SKIPN T1,T2 ;GET COUNT
JRST PSTR.7 ;DONE IF ZERO
PUSHJ P,.TDECW## ;TYPE
MOVEI T1,[ASCIZ | = |] ;SEPARATE
PUSHJ P,.TSTRG## ; FROM WHAT'S TO FOLLOW
TRZ F,FR.COMMA ;MIGHT NEED A PLUS LATER
; Type active S/L count
LOAD T1,P2,MC.ACT ;GET ACTIVE S/L COUNT
JUMPE T1,PSTR.1 ;ZERO?
PUSHJ P,.TDECW## ;TYPE IT
MOVEI T1,[ASCIZ | active|]
PUSHJ P,.TSTRG##
TRO F,FR.COMMA ;MIGHT NEED A PLUS LATER
PSTR.1: LOAD T2,P2,MC.PAS ;GET PASSIVE S/L COUNT
JUMPE T2,PSTR.2 ;ZERO?
MOVEI T1,[ASCIZ | + |] ;GET SEPARATOR
TROE F,FR.COMMA ;NEED A PLUS?
PUSHJ P,.TSTRG## ;YES
MOVE T1,T2 ;GET COUNT
PUSHJ P,.TDECW## ;TYPE IT
MOVEI T1,[ASCIZ | passive|]
PUSHJ P,.TSTRG##
PSTR.2: TXNN P1,MC.SYS ;IN SYSTEM S/L?
JRST PSTR.3 ;NO
MOVEI T1,[ASCIZ | + |] ;GET SEPARATOR
TROE F,FR.COMMA ;NEED A PLUS?
PUSHJ P,.TSTRG## ;YES
MOVEI T1,[ASCIZ |SSL|]
PUSHJ P,.TSTRG##
PSTR.3: TXNN P1,MC.ASL!MC.SDL ;ANY OTHER BITS ON?
JRST PSTR.7 ;NOPE
MOVEI T1,[ASCIZ |; also|] ;MORE TO FOLLOW
PUSHJ P,.TSTRG## ;TYPE TEXT
TRZ F,FR.COMMA ;NO COMMA NOW
TXNN P1,MC.ASL ;IN ACTIVE SWAPPING LIST?
JRST PSTR.6 ;NO
MOVEI T1,[ASCIZ | unit(s) in ASL|]
PUSHJ P,.TSTRG##
PSTR.6: TXNN P1,MC.SDL ;IN SYSTEM DUMP LIST
JRST PSTR.7 ;NO
TROE F,FR.COMMA ;NEED A COMMA?
PUSHJ P,.TCOMA## ;YES
MOVEI T1,[ASCIZ | in SDL|]
PUSHJ P,.TSTRG##
PSTR.7: PJRST .TCRLF## ;NEW LINE AND RETURN
SUBTTL General checking -- CHKNOD - See if node online
CHKNOD::MOVE T1,.FZNNM##(I) ;GET NODE NAME
CAIE M,M%NODE## ;IF NOT NODE MODE
CAMN T1,[-1] ;SEE IF GIVEN
POPJ P, ;NO--RETURN
SETCM T2,.FZNOM##(I) ;GET MASK
JUMPN T2,.POPJ## ;RETURN IF WILDCARDS
TLNN F,(FL.NETWORKS) ;HAVE NETWORKS?
$WARN (NNS,<No network support in this monitor>)
PUSHJ P,NODINF## ;DO WE KNOW ABOUT THIS ONE?
SKIPA ;NO
JRST CHKN.1 ;ONWARD
$WARN (NSN,<No such node ">,E.NSN)
POPJ P, ;RETURN
CHKN.1: TXNN T3,NT.ONL ;IS IT REALLY ONLINE (DECNET)?
$WARN (NNO,<Node not online ">,E.NSN)
POPJ P, ;RETURN
E.NSN: MOVE T1,.FZNNM##(I) ;GET NODE NAME
PUSHJ P,.TSIXN## ;TYPE IT
MOVEI T1,"""" ;CLOSING QUOTE
PJRST .TCHAR## ;TYPE IT AND RETURN
SUBTTL General checking -- CHKDEV - See if device given (single job)
CHKDEV::MOVE T1,.FZDEV##(I) ;GET /DEVICE:XXX
CAMN T1,[-1] ;SEE IF GIVEN
POPJ P, ;NO--RETURN
DEVTYP T1, ;GETS ITS INFO
MOVEI T1,0 ;FAILED
CAIN T1,0 ;SEE IF ZERO
$WARN (NSD,<No such device >,E.NSD,DEVBAD)
TXNE T1,TY.SPL ;SEE IF SPOOLED
$WARN (DSD,<Device is a spooled device >,E.NSD,DEVBAD)
LOAD O,T1,TY.JOB ;GET JOB NUMBER
MOVEM O,.FZJOB##(I) ;STORE AS THIS JOB
JUMPE O,DEVFRE ;LOOKS FREE
MOVEI T1,[ASCIZ/Device /]
PUSHJ P,.TSTRG##
PUSHJ P,E.NSD
PUSHJ P,.TSPAC##
MOVE T4,.FZDEV##(I)
DVCHR. T4,
MOVEI T1,[ASCIZ/assigned/]
TXNE T4,DV.ASC
PUSHJ P,.TSTRG##
MOVEI T1,[ASCIZ/ and /]
TXC T4,DV.ASC!DV.ASP
TXCN T4,DV.ASC!DV.ASP
PUSHJ P,.TSTRG##
MOVEI T1,[ASCIZ/inited/]
TXNE T4,DV.ASP
PUSHJ P,.TSTRG##
MOVEI T1,[ASCIZ/ by/]
PUSHJ P,.TSTRG##
PJRST .TCRLF##
E.NSD: MOVE T1,.FZDEV##(I)
PJRST .TSIXN##
DEVFRE: MOVE T2,.FZDEV##(I)
DVCHR. T2,
TXNE T2,DV.ASC!DV.ASP
$WARN (DID,<Device is detached >,E.NSD,DEVBAD)
TXNE T1,TY.RAS
$WARN (DRD,<Device is a restricted device >,E.NSD,DEVBAD)
MOVEI T1,[ASCIZ/Device is free /]
PUSHJ P,.TSTRG##
PUSHJ P,E.NSD
PJRST .TCRLF##
DEVBAD: SETZM .FZJOB##(I) ;INSURE NO MATCH
POPJ P, ;AND RETURN
SUBTTL General checking -- CHKLOG - See if logged out and legal
CHKLOG::TLNE F,(FL.LOGIN) ;AM I LOGGED IN?
POPJ P, ;YES
SKIPN USRLGO## ;/MODE:USER OK IF LOGGED OUT?
CAIE M,M%USER## ;NO--IN USER MODE?
SKIPA ;ONWARD
$FATAL (LPU,<Login please to use /MODE:USER>)
IFN FTSERV,<
TLNE F,(FL.WHOSRV) ;ARE WE A SERVER?
JRST CHKLG1 ;YES--THE LOG FILE BELONGS TO WHOSRV
>
SKIPE O.SPEC##+.FXDEV ;OUTPUT SPEC?
$FATAL (LPT,<Login please to use output file specification>)
CHKLG1: SKIPLE S.DPY## ;SEE IF /DPY
$FATAL (LPD,<Login please to use switch DPY>)
SKIPLE S.REPEAT## ;SEE IF /REPEAT
$FATAL (LPR,<Login please to use switch REPEAT>)
SKIPLE S.CACHE## ;SEE IF /CACHE
$FATAL (LPC,<Login please to use switch CACHE>)
IFN FTSERV,<
SKIPN SRVLGO## ;OK TO USE /SERVE LOGGED OUT?
TLNE F,(FL.WHOSRV) ;ARE WE A SERVER?
SKIPA T1,[EXP -1] ;YES--WE ALWAYS IGNORE /SERVER
MOVE T1,S.SERVER##+.SVFLG ;SEE IF /SERVER
CAME T1,[EXP -1] ;REQUESTING REMOTE SERVER SERVICE?
$FATAL (LPS,<Login please to use switch SERVER>)
> ;END IFN FTSERV
POPJ P, ;AND RETURN
SUBTTL Storage
$LOW
GOBBLK: BLOCK 3
DSKBLK: BLOCK .DCSMT+1
END