.NLIST TTM,MEB .TITLE FRC - FORCE COMMAND LINE .IDENT /X1/ ; ; COPYRIGHT 1977 ; DIGITAL EQUIPMENT CORPORATION, PRINCETON, NEW JERSEY ; ; ; DATE: 3-JAN-77 ; BY: WM P. STOREY ; VERSION: X1 ; ; THIS TASK FORCES A COMMAND LINE TO MCR, ; AS THOUGH THE COMMAND LINE HAD BEEN ; TYPED ON THE SPECIFIED TERMINAL. ; .MCALL DIR$,GMCR$,ALUN$,QIOW$,EXIT$S,CALL,RETURN .MCALL TCBDF$,UCBDF$,HDRDF$ ; TCBDF$ ; DEFINE TCB OFFSETS UCBDF$ ; DEFINE UCB OFFSETS HDRDF$ ; DEFINE HEADER OFFSETS ; LOCAL DATA ; GMCR: GMCR$ ; GET MCR DPB BUF =GMCR+2 ; AND COMMAND LINE ALUN: ALUN$ 1,TT,0 ; ASSIGN LUN DPB QIOW: QIOW$ IO.WVB,2,2,,IOST,,<0,0,40> ;ERROR MESSAGE DPB IOST: .BLKW 2 ; I/O STATUS BLOCK .SBTTL ERROR MESSAGES .NLIST BEX ERR1: .ASCIZ <15>/FRC -- GET COMMAND LINE ERROR/ ERR2: .ASCIZ <15>/FRC -- PRIVILEGED COMMAND/ ERR3: .ASCIZ <15>/FRC -- SYNTAX ERROR/ ERR4: .ASCIZ <15>/FRC -- TERMINAL NOT IN SYSTEM/ .LIST BEX .EVEN .PAGE .SBTTL MAIN LINE CODE ;+ ; *** FRCEP - FORCE MCR COMMAND LINE ; ; SYNTAX: ; FRC TTNN:=STRING ; WHERE: ; TTNN: - TERMINAL ON WHICH COMMAND LINE WILL BE FORCED ; STRING - MCR COMMAND LINE STRING TO QUEUE ;- FRCEP:: DIR$ #GMCR ; GET MCR COMMAND LINE BCS ERROR1 ; CS=COULD NOT GET IT ; ; ENSURE USER IS PRIVILEGED ; MOV $TKTCB,R0 ; GET OUR OWN TCB ADDRESS MOV T.UCB(R0),R0 ; GET TI UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; MUST BE PRIVILEGED TO FORCE BEQ ERROR2 ; EQ = NOT PRIVILEGED, SO ERROR ; ; PARSE INPUT LINE ; MOV #BUF+3,R0 ; POINT IN BUFFER IMMEDIATELY AFTER FRC CMPB #' ,(R0)+ ; STRICT SYNTAX, MUST BE BLANK BNE ERROR3 ; NE=NO BLANK, SO ERROR CMP #"TT,(R0)+ ; STRICT SYNTAX, MUST BE BNE ERROR3 ; IF NE THEN NO TT SO ERROR CALL $GTNUM ; CALL GET UNIT NUMBER IF ANY MOV R1,ALUN+A.LUNU ; SET UNIT NUMBER FOR ASSIGN CMPB #':,R2 ; DEVICE TERMINATOR? BNE ERROR3 ; NE=NO TERMINATOR, SO ERROR CMPB #'=,(R0)+ ; EQUAL SIGN? BNE ERROR3 ; NE=NO '=' SO ERROR ; ; QUEUE MCR LINE TO SPECIFIED TERMINAL ; DIR$ #ALUN ; ASSIGN LUN 1 BCS ERROR4 ; CS=TERMINAL NOT IN SYSTEM MOV R0,R3 ; SAVE STRING POINTER CALL $SWSTK,EXIT ; SWITCH TO SYSTEM STATE MOV #84.,R1 ; SET LENGTH OF A MCR BUFFER CALL $ALOCB ; GET A BUFFER BCS 20$ ; CS=CAN'T GET ONE MOV R0,R1 ; COPY BUFFER ADDRESS MOV $HEADR,R2 ; GET OUR HEADER ADDRESS CLR (R0)+ ; ZERO LINK WORD MOV H.LUN(R2),(R0)+ ; PICK UP UCB ADDRESS BEQ 20$ ; EQ=ALUN BAD, SO ERROR (GO AWAY) ; 10$: MOVB (R3)+,(R0)+ ; MOV COMMAND INTO BUFFER BNE 10$ ; NE=NOT FINISHED ; CALL $QMCRL ; LINK INTO MCR LIST ; 20$: RETURN ; GET BACK TO USER STATE .PAGE .SBTTL ERROR PROCESSING ERROR1: MOV #ERR1,R0 ; GET COMMAND LINE ERROR BR ERROR ; ERROR2: MOV #ERR2,R0 ; PRIVILEGED COMMAND BR ERROR ; ERROR3: MOV #ERR3,R0 ; SYNTAX ERROR BR ERROR ; ERROR4: MOV #ERR4,R0 ; TERMINAL NOT IN SYSTEM ; ERROR: MOV R0,QIOW+Q.IOPL ; SET BUFFER ADDRESS MOV R0,R1 ; COPY IT ; 10$: TSTB (R1)+ ; ZERO? BNE 10$ ; NE=NOPE ; DEC R1 ; YES, ZERO IS END OF LINE SUB R0,R1 ; CALCULATE NUMBER OF BYTES MOV R1,QIOW+Q.IOPL+2 ; SET BYTE COUNT ; DIR$ #QIOW ; WRITE OUT ERROR MESSAGE ; EXIT: EXIT$S .END FRCEP