.TITLE FRC - FORCE COMMAND LINE .IDENT /X1/ .ENABLE LC ; ; COPYRIGHT 1977 ; DIGITAL EQUIPMENT CORPORATION, PRINCETON, NEW JERSEY ; ; ; DATE: 3-JAN-77 ; BY: WM P. STOREY ; VERSION: X1 ; ; ; Modified by:- ; ; Phil Stephensen-Payne, ; c/o Systime Ltd., ; Concourse Computer Centre, ; 432 Dewsbury Road, ; LEEDS LS11 7DF, ; England. ; ; Removed access to system data bases by using spawning ; ; THIS TASK FORCES A COMMAND LINE TO MCR, ; AS THOUGH THE COMMAND LINE HAD BEEN ; TYPED ON THE SPECIFIED TERMINAL. ; .MCALL DIR$,GMCR$,ALUN$S,GLUN$S,SPWN$,QIOW$,EXIT$S .MCALL UCBDF$ UCBDF$ ; DEFINE UCB OFFSETS ; ; LOCAL DATA ; GMCR: GMCR$ ; GET MCR DPB BUF =GMCR+2 ; AND COMMAND LINE QIOW: QIOW$ IO.WVB,1,1,,,,<0,0,40> ;ERROR MESSAGE DPB SPWN: SPWN$ MCR...,,,,,,,,,,,TT .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/ ERR5: .ASCIZ <15>/FRC -- SPAWN FAILED/ .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:: ; ; Ensure User is Privileged ; ALUN$S #1,#"TI,#0 ; Assign LUN 1 to TI: GLUN$S #1,#BUF ; Get info about it BIT #U2.PRV,BUF+6 ; Privileged? BEQ ERROR2 ; No - tell him off! DIR$ #GMCR ; GET MCR COMMAND LINE BCS ERROR1 ; CS=COULD NOT GET IT ; ; PARSE INPUT LINE ; MOV $DSW,SPWN+S.PWCL ; Save length for later 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 $COTB ; CALL GET UNIT NUMBER IF ANY MOV R1,SPWN+S.PWVT ; SET UNIT NUMBER FOR SPAWN 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 ; MOV R0,SPWN+S.PWCA ; Get address of command-line SUB #BUF,R0 ; Hence get length we through away SUB R0,SPWN+S.PWCL ; Calculate length remaining BLE ERROR3 ; If not enough, hit him DIR$ #SPWN ; Do the spawn CMP $DSW,#IS.SUC ; Success? BEQ EXIT ; Yes - exit CMP $DSW,#IE.IDU ; Invalid terminal ID? BEQ ERROR4 ; Yes - say so MOV #ERR5,R0 ; No - just spawn failure BR ERROR ; .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