.TITLE USP -- UNSPOOL DEVICES .IDENT -010001- .ENABL LC ;+ ; ABSTRACT: USP ; ; This task will set a spooled device to be ; unspooled in an unsafe way. Its use is not ; generally reccommended, but it may be useful ; in some specialized applications. ; It was written to bypass the normal protection ; of IAS V3.0 and later which will not allow a ; device to be set unspooled unless the SP0: ; device has been dismounted. ; ; The device MUST first have all spooled I/O to it ; terminated. This task cannot find out whether any ; spooled I/O is pending for the device (the information ; is locked up in the FCS region for each individual ; user task), which is why it is unsafe. This is why ; its use is not generally reccommended except for very ; controlled environments. ; ; Operating procedures: ; ; MCR>USP ddn: ; ; PDS> USP ddn: ; ; 'ddn' is the device name and unit number of the device ; to be set unspooled. The ':' is optional. ; ; NONSTANDARD FEATURES: ; ; THIS TASK MUST FIND THE DEVICE TO BE UNSPOOLED ; IN A NON-STANDARD WAY SINCE THE STANDARD METHOD ; (WITH ..FDEV) WILL FOLLOW THE REDIRECT CHAIN, AND ; UNDER IAS V3.0 A SPOOLED DEVICE IS REDIRECTED TO ; THE SP0: DEVICE. ; ; LIMITATIONS: ; ; *** THIS TASK IS UNSAFE *** ; IF THE SPOOLED DEVICE IS BEING SPOOLED TO BY ; SOME USER, USING THIS TASK TO UNSPOOL IT WILL ; CAUSE UNUSUAL THINGS TO HAPPEN !!! ; ; TASK BUILD: ; ; USP/PR/-TA/-FP/-AB=USP,[1,1]EXEC.STB/SS ; / ; UIC =[1,1] ; TASK =$$$USP ; // ; ; WRITTEN: 23-FEB-80, -1.0.0-, BRUCE C. WRIGHT ; MODIFIED: 06-Mar-1981, -1.0.1-, Bruce C. Wright ; Miscellaneous cleanups to make into production task. ; VERIFIED: 06-Mar-1981, -1.0.1-, Bruce C. Wright ;- .MCALL QIOW$,GMCR$,DIR$,WSIG$S,EXST$S .MACRO ERROR ARG .NCHR $$$, JSR R0,ERROR .WORD $$$ .ASCII "ARG" .EVEN .ENDM .MACRO TYPE STR,LEN,VFC .IF NB VFC MOV VFC,-(SP) .IFF MOV #40,-(SP) .ENDC MOV LEN,-(SP) MOV STR,-(SP) JSR PC,TYPE .ENDM .MACRO EXIT STATUS JSR R0,EXIT .IF B STATUS .WORD EX$SUC .IFF .WORD STATUS .ENDC .ENDM UNSAFE:: DIR$ #GMCR ; GET OUR MCR COMMAND LINE. BCC 10$ ; SKIP IF GOTTEN OK ERROR 10$: MOV .CRTSK,R5 ; GET OUR ATL NODE. MOV A.TI(R5),R5 ; GET OUR TI ADDRESS. BITB #UT.PR,U.PR(R5) ; THIS JOKER PRIVILEGED? BNE 20$ ; YES, LET HIM DO IT. ERROR 20$: MOV #STATBL,R5 ; GET STATE TABLE ADDR MOV #GMCR+G.MCRB,R4 ; POINT TO MCR BUFFER. MOV @#$DSW,R3 ; GET LENGTH OF BUFFER. MOV #KEYTBL,R2 ; GET KEYWORD TABLE MOV #1,R1 ; BLANKS ARE SYNTAX ELEMENTS. CALL .TPARS ; PARSE THE LINE. BCC 30$ ; SKIP IF OK ERROR 30$: CMP DEVNUM,#77 ; DEVICE NUMBER TOO HIGH? BLOS GETDEV ; NO, KEEP GOING. ERROR GETDEV: MOV .PUDBA,R5 ; GET PUD BASE ADDRESS. 10$: CMP R5,.PUDEA ; PAST PUD ENDING ADDRESS? BLO 20$ ; NO, KEEP GOING. ERROR 20$: CMP DEVNAM,U.DN(R5) ; DEVICE NAME MATCH? BNE 30$ ; NO CMPB DEVNUM,U.UN(R5) ; DEVICE UNIT MATCH? BEQ 40$ ; YES 30$: ADD #U.SZ,R5 ; GET TO NEXT PUD ENTRY. BR 10$ ; AND LOOP OVER PUD. 40$: BIT #UC.OSP!UC.ISP,U.C1(R5) ; IS IT SPOOLED? BNE 50$ ; YES ERROR 50$: BIC #UC.OSP!UC.ISP,U.C1(R5) ; SET DEVICE UNSPOOLED. MOV R5,U.RP(R5) ; SET REDIRECT POINTER. EXIT ; AND LEAVE. ; ; ERROR : PRINT ERROR MESSAGES. ; ERROR: MOV (R0)+,R1 ; GET THE LENGTH WORD. TYPE R0,R1 ; TYPE THE RESULT. EXIT EX$ERR ; AND LEAVE. ; ; EXIT : EXIT FROM PROGRAM WITH RETURN CODE. ; EXIT: EXST$S (R0) ; AND EXIT. ; ; TYPE : TYPE OUT MESSAGES. ; TYPE: MOV 2(SP),QIOW+Q.IOPL ; OUTPUT THE BUFFER ADDR MOV 4(SP),QIOW+Q.IOPL+2 ; OUTPUT THE LENGTH MOV 6(SP),QIOW+Q.IOPL+4 ; OUTPUT THE VFC MOV (SP),6(SP) ; POP ARGS OFF STACK ADD #6,SP ; ... 10$: DIR$ #QIOW ; DO THE I/O BCC 30$ ; SKIP IF OK CMP @#$DSW,#IE.UPN ; NO POOL NODE? BNE 20$ ; NO -- JUST RETURN ERROR. WSIG$S ; YES -- WAIT A BIT BR 10$ ; AND TRY AGAIN. 20$: SEC ; SHOW ERROR. 30$: RETURN ; AND RETURN TO THE CALLER. ; ; .TPARS TABLES ; .MCALL ISTAT$,STATE$,TRAN$ ; ISTAT$ STATBL,KEYTBL ; STATE$ GETSPA TRAN$ $BLANK,SKPSPA TRAN$ $ANY,GETSPA ; STATE$ SKPSPA TRAN$ $BLANK,SKPSPA TRAN$ $ALPHA,,SETDV1 ; STATE$ TRAN$ $ALPHA,,SETDV2 ; STATE$ TRAN$ $NUMBR,GETCOL,SETNUM TRAN$ $LAMDA ; STATE$ GETCOL TRAN$ ':,GETEOS TRAN$ $LAMDA ; STATE$ GETEOS TRAN$ $EOS,$EXIT STATE$ ; ; ACTION ROUTINES ; SETDV1: MOVB .PCHAR,DEVNAM ; SET FIRST PART OF DEVICE NAME RETURN ; AND RETURN. SETDV2: MOVB .PCHAR,DEVNAM+1 ; SET SECOND PART OF DEVICE NAME. RETURN ; AND RETURN. SETNUM: MOV .PNUMB,DEVNUM ; SET DEVICE NUMBER. TST .PNUMH ; TOO LARGE? BEQ 10$ ; NO ADD #2,(SP) ; YES, REJECT TRANSITION. 10$: RETURN ; AND RETURN. DEVNAM: .WORD 0 DEVNUM: .WORD 0 GMCR: GMCR$ QIOW: QIOW$ IO.WVB,5,5,,,,<0,0,0> .END UNSAFE