.TITLE FRC FORCE A COMMAND LINE .IDENT /X01/ ; COPYRIGHT (C) 1977 ; DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; BY WM P. STOREY ; ; MINOR ALTERATIONS BY: B. SCHREIBER ; ; MODIFICATIONS TO USE NEW SPAWN DIRECTIVE BY: J. PROVINO ; ; 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, SPWN$S, GLUN$S, UCBDF$ UCBDF$ ; ; LOCAL DATA ; LUN1 = 1 EFN1 = 1 LUN2 = 2 EFN2 = 2 E$CHOF = 100000 ;SET IN $FRCFL IF /EC PRESENT IN CMD GMCR: GMCR$ ;GET MCR COMMAND LINE DPB GBUF = GMCR+2 ;GET MCR COMMAND LINE BUFFER ADDRESS ALUN: ALUN$ 1,TT,0 ;ASSIGN LUN DPB QIOW: QIOW$ IO.WVB,LUN2,LUN2,,IOST,,<0,0,40> ;ERROR MSG DPB QIOW2: QIOW$ IO.WBT,LUN1,EFN1,,IOST,,<0,0,0> ;QIO TO TARGET TT IOST: .BLKW 2 ;I/O STATUS BLOCK $FRCFL: .WORD 0 ;FLAGS $CMDPT: .WORD 0 ;REMEMBER WHERE CMD STARTS IN GBUF $MCR: .RAD50 /MCR.../ ;NAME OF COMMAND LINE INTERPRETER $BUF: .BLKW 6 ;6 WORD BUFFER FOR GLUN .SBTTL MAIN PROGRAM ;+ ; $FRCEP - FORCE MCR COMMAND LINE ENTRY POINT ; ; SYNTAX: ; ; FRC TTNN:[/EC]=COMMAND ; ; WHERE: ; ; TTNN: TERMINAL ON WHICH COMMAND LINE WILL BE FORCED ; COMMAND MCR COMMAND LINE TO QUEUE TO SPECIFIED TERMINAL ; /EC IS AN OPTIONAL SWITCH TO CAUSE THE COMMAND LINE ; TO BE ECHOED ON THE TARGET TERMINAL ; ;- $FRCEP::DIR$ #GMCR ;GET MCR COMMAND LINE BCS ERR1 ;IF CS COULD NOT ; ; ENSURE USER IS PRIVELEGED ; MOV #$BUF,R0 ;GET ADDRESS OF BUFFER GLUN$S #2,R0 ;GET U.CW2 FOR TI: BIT #U2.PRV,6(R0) ;MUST BE PRIVELEGED BEQ ERR2 ;IF EQ NOT PRIVELEGED ; ; PARSE INPUT LINE ; MOV #GBUF+3,R0 ;POINT IMMEDIATELY AFTER FRC IN BUFFER CMPB #' ,(R0)+ ;SYNTAX IS VERY STRICT BNE ERR3 ;IF NE SYNTAX ERROR CMP #"TT,(R0)+ ;AS I SAID, IT IS VERY STRICT BNE ERR3 ;IF NE ERROR CALL $GTNUM ;GET UNIT NUMBER IF ANY MOV R1,ALUN+A.LUNU ;SET UNIT NUMBER FOR ASSIGN LUN CMPB #':,R2 ;COLON THE TERMINATOR? BNE ERR3 ;IF NE SYNTAX ERROR CMPB #'/,(R0) ;IS THERE A SWITCH? BNE CKEQL ;NO--BETTER BE AN EQUAL SIGN! INC R0 ;YES--SKIP THE SLASH CMPB #'E,(R0)+ ;MUST BE "/EC" BNE ERR3 CMPB #'C,(R0)+ ;... BNE ERR3 BIS #E$CHOF,$FRCFL ;YES--FLAG FOR LATER CKEQL: CMPB #'=,(R0)+ ;EQUAL SIGN NEXT? BNE ERR3 ;IF NE NO--ERROR MOV R0,$CMDPT ;REMEMBER WHERE COMMAND STARTS ; ; ASSIGN LUN TO TERMINAL ; DIR$ #ALUN ;ASSIGN LUN 1 BCS ERR4 ;IF CS BAD TERMINAL MOV $CMDPT,R0 ;YES--GET POINTER TO COMMAND MOV R0,QIOW2+Q.IOPL ;INSERT INTO DPB 80$: TSTB (R0)+ ;FIGURE ITS LENGTH BNE 80$ ;... DEC R0 ;UNCOUNT NULL SUB $CMDPT,R0 ;GET LENGTH MOV R0,QIOW2+Q.IOPL+2 ;SET INTO DPB DEC R0 ;UNCOUNT CARRIAGE RETURN TST $FRCFL ;DO WE NEED TO ECHO CMD ON TARGET? BPL 90$ ;IF PL NO DIR$ #QIOW2 ;WRITE TO TERMINAL 90$: SPWN$S #$MCR,,,,,#1,,,$CMDPT,R0,ALUN+A.LUNU,#"TT JMP EXIT ; ; ; ERROR MESSAGES ; .PSECT FRCMSG .NLIST BEX EM1: .ASCIZ <15>/FRC -- FAILED TO GET MCR COMMAND LINE/ EM2: .ASCIZ <15>/FRC -- PRIVELEGED COMMAND/ EM3: .ASCIZ <15>/FRC -- SYNTAX ERROR/ EM4: .ASCIZ <15>/FRC -- TERMINAL NOT IN SYSTEM/ EM5: .ASCIZ <15>/FRC -- FAILED TO ALLOCATE MCR BUFFER/ .LIST BEX .PSECT ; ; ERROR PROCESSING ; ERR1: MOV #EM1,R0 ;GMCR ERROR BR ERROR ERR2: MOV #EM2,R0 ;NOT PRIVELEGED BR ERROR ERR3: MOV #EM3,R0 ;SYNTAX ERROR BR ERROR ERR4: MOV #EM4,R0 ;TERMINAL NOT IN SYSTEM BR ERROR ERR5: MOV #EM5,R0 ;NO MCR BUFFER AVAILABLE ; ; COMMON ERROR HANDLER ; ERROR: MOV R0,QIOW+Q.IOPL ;SET STRING ADDRESS MOV R0,R1 ;COPY ADDRESS 10$: TSTB (R1)+ ;LOOK FOR NULL BNE 10$ DEC R1 ;DONT COUNT NULL SUB R0,R1 ;CALC LENGTH OF ERROR MESSAGE MOV R1,QIOW+Q.IOPL+2 DIR$ #QIOW ;WRITE MESSAGE EXIT: EXIT$S .END $FRCEP