IDTITL 0403,DVD, .TITLE DVD - DISSOCIATE VIRTUAL DISK .IDENT /X04.03/ .SBTTL DVD - TITLE PAGE .NLIST BEX .LIST MEB .ENABL LC ;**- ; Module name: DVD - DISSOCIATE VIRTUAL DISKS ; ; Version X04.03 Last edit:JMB 3-JAN-1984 13:02:01 ; Status: Released for test ; ; AUTHOR: R.W. STAMERJOHN MAPC 19-MAR-79 ; ; Revision history: ; ; Version X03.00 14-NOV-80 09:40 - 17-NOV-80 10:57 ; Modified by: K.J. CROSS ; COMPLETE REVISION. USES PIPUTL ROUTINES. NEW FORMAT, ; ADDED /ALL AND /NM. DEASSIGNS VS'S. ; ; Version Y03.00 17-NOV-80 10:57 - 19-NOV-80 08:40 ; Modified by: KJC ; RELEASED FOR INTERNAL USE ; ; Version Y03.01 19-NOV-80 08:41 - 19-NOV-80 11:47 ; Modified by: KJC ; PUT "ASN /LOGIN" AT THE END OF PROCESSING. ; MAKE /ALL A PRIVILEGED COMMAND. ; ; Version Y03.02 19-NOV-80 11:48 - 25-NOV-80 11:06 ; Modified by: KJC ; FIX BUG WITH MULTIPLE VS: ASSIGNMENTS ; ; Version Y03.03 25-NOV-80 11:06 - 01-DEC-80 13:05 ; Modified by: KJC ; REMOVED IOT - REPLACED WITH ERROR MESSAGE ; ; Version Y03.04 01-DEC-80 13:05 - 01-JAN-81 09:11 ; Modified by: KJC ; SET PUBLIC VD'S NON-PUBLIC ; ; Version Y03.05 01-JAN-81 09:11 - 15-JAN-81 08:50 ; Modified by: KJC ; FIX BUG WITH MULTIPLE VD'S ASSIGNED TO SAME FILE ; ; Version X04.00 15-JAN-81 08:50 - 29-JAN-81 08:13 ; Modified by: K.J. CROSS ; CHECK FOR INSTALLED TASKS ; ; Version X04.01 29-JAN-81 08:13 - 29-JAN-81 08:13 ; Modified by: KJC ; DON'T CHECK FOR INSTALLED TASKS ON PUBLIC DISKS ; ; Version X04.02 13-Aug-84 17:50 ; Modified by: JMB ; MAKE DVD /ALL NON-PRIVELEGED ; ; Version X.04.03 3-JAN-1984 13:02:57 ; Modified by: J. M. Bostwick ; JMB212 -- any and all DVD of 'own' disks non-priveleged ; don't have to be allocated to user for this. ;**- ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; .SBTTL DVD - DECLARATIONS ; ; MACRO LIBRARY CALLS: ; ; SYMBOLIC DEFINITIONS. ; .MCALL HDRDF$ ;DEFINE TASK HEADER OFFSETS HDRDF$ .MCALL TCBDF$ ;DEFINE TCB OFFSETS TCBDF$ ,<=> .MCALL DCBDF$ ;DEFINE DCB OFFSETS DCBDF$ .MCALL UCBDF$ ;DEFINE UCB OFFSETS UCBDF$ ; ; DIRECTIVE MACROS. ; .MCALL DIR$ ;ISSUE DIRECTIVE .MCALL ALUN$S ;ASSIGN LUN .MCALL GLUN$S ;GET LUN INFORMATION .MCALL EXST$S ;EXIT WITH STATUS .MCALL EXIT$S ;EXIT SYSTEM .MCALL GMCR$ ;GET MCR COMMAND LINE .MCALL QIOW$,QIOW$S ;ISSUE QIO AND WAIT .MCALL SVTK$S ;SETUP SST VECTOR TABLE .MCALL SPWN$ ;SPAWN FOR MCR .MCALL WTSE$S ;WAITFOR ; ; CSI MACROS. ; .MCALL CSI$ ;DEFINE CSI OFFSETS CSI$ .MCALL CSI$1,CSI$2 ;PARSE COMMAND LINE .MCALL CSI$SW,CSI$ND ;CSI SWITCHES ; ; FCS MACROS. ; .MCALL NBOF$L ;DEFINE FNB OFFSETS NBOF$L .MCALL FDOF$L ;DEFINE FCS OFFSETS FDOF$L .MCALL FDBDF$,FINIT$ ;FDB DEFS, FCS INITIALIZTATION .MCALL FSRSZ$ ;DEFINE FSR REGION .MCALL FDOP$A ; ; OTHER MACROS. ; .MCALL CALLR .SBTTL DVD - MACROS ; ; DEFINE SYSTEM STATE MACRO. ; .MACRO SYSTEM ADR EMT 376 .WORD ADR .ENDM SYSTEM ; ; DEFINE FILES-11 QIO MACRO. ; .MACRO F11QIO DPB,ADR DIR$ #DPB .IF NB ADR BCS ADR CMPB #IS.SUC,IOSTAT BNE ADR .ENDC .ENDM F11QIO .SBTTL DVD - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; LOGICAL UNITS/EVENT FLAGS. ; TSTLUN = 1 ;DVD WORKING LUN TTYLUN = 2 ;TERMINAL I/O LUN FILLUN = 3 ;FILE I/O LUN MSGLUN = 4 ;QIOSYM.MSG MSGEFN = 4 ;EVENT FLAG FOR MSGLUN EV.QIO = 1 ;QIO WAIT EVENT FLAG MCREFN = 3 ;SPAWN WAIT EVENT FLAG ; ; SWITCH BIT DEFINITIONS. ; FL.ALL = 1 ;/ALL - DISSOCIATE ALL UNMOUNTED VD'S FL.NM = 2 ;/NM - NO INFORMATIONAL MESSAGES FL.ID = 4 ;/ID - DISPLAY CURRENT VERSION ; ; LOCAL DATA: ; ; DIRECTIVES. ; .NLIST MEB GETCMD: GMCR$ ;GET COMMAND LINE WATDPB: QIOW$ IO.WAT,FILLUN,EV.QIO,,IOSTAT,, MCR1: SPWN$ MCR...,,,,,MCREFN,,,OUTBUF,0 ;SPAWN AN MCR COMMMAND LINE ; ; STT VECTOR TABLE. ; SSTTBL: .WORD 0 ;ODD ADDRESS .WORD 0 ;MEMORY PROTECTION .WORD 0 ;T-BIT TRAP OR BPT .WORD 0 ;IOT TRAP .WORD 0 ;RESERVED INSTRUCTION .WORD 0 ;NON-RSX EMT INSTRUCTION .WORD .ERTRP ;TRAP INSTRUCTION SSTSIZ = <.-SSTTBL>/2 ; ; .ABORT IS VECTORED THROUGH WHEN AN ERROUX MACRO IS EXECUTED. ; $DFNAM AND $IDR50 CONTAINS THE DEFAULT TASK NAME IN RAD50. ; .EXSTS IS USED IN EXST$. ; GCMLCB == 0 .ABORT:: ERRSRV $DFNAM:: $IDR50:: .RAD50 /DVD/ .EXSTS:: EX$SUC ;ASSUME SUCCESS ; ; CSI CONTROL BLOCK. ; CSIBLK: .BLKB C.SIZE ;DEFINE CSI EXTENSION BLOCK .EVEN ; ; SWITCH TABLE. ; SWITCH: .BLKW 1 ;LOCATION FOR SWITCHES ALLFLG: .BLKW 1 ;NON-ZERO IF /ALL SPECIFIED SWTTAB: CSI$SW ALL,FL.ALL,SWITCH,SET,,,EXACT ;DVD ALL DISMOUNTED VD'S CSI$SW NM,FL.NM,SWITCH,SET ;NO MESSAGES CSI$SW ID,FL.ID,SWITCH,SET ;DISPLAY VERSION CSI$ND ; ; INPUT FILE FDB. ; FILFDB: FDBDF$ ;ALLOCATE THE FDB FDOP$A FILLUN ;DEFINE OPEN ACCESS FILFNB = FILFDB + F.FNB ;DEFINE START OF FILENAME BLOCK ; ; WRITE ATTRIBUTE LIST. ; WATLST: .BYTE 03,01 ;WRITE USER CHARACTERISTICS .WORD WATATT ; .BYTE 0,0 ;END-OF-LIST WATATT: .BYTE 200 ;CLEAR LOCK BIT, LEAVE CONTIGIOUS ON .EVEN ; ; OTHER VARIOUS BUFFERS. ; TIUCB: .BLKW 1 ;TI: UCB ADDRESS VDUNIT: .BLKW 1 ;STORAGE FOR VD: UNIT NUMBER IOSTAT: .WORD 0,0 ;I/O STATUS BLOCK UCBADR: .WORD 0 ;VD: UCB ADDRESS EXTADR: .WORD 0 ;VIRTUAL EXTENSION BLOCK ADDRESS PRIVST: .WORD 0 ;PRIV/NON-PRIV STATUS, 0=PRIV LUNINF: .BLKW 6 ;LUN INFORMATION BLOCK UCBREA: .WORD 0 ;UCB ADDRESS OF THE REAL DEVICE ; ; ERROR MESSAGES. ; MSG NOCM, MSG SERR, MSG PRSE, MSG INCM, MSG NOEQ, MSG INVD, MSG INUN, MSG VDUK, MSG VDNL, MSG VDRD, MSG VDNA, MSG MOUN, MSG HUH, MSG PRIV, MSG HRED, MSG HDNL, MSG DRED, MSG AVDX, MSG SPER,<*WARNING* - Error spawning MCR for deassigning VS:> MSG UNLE, MSG NALL, MSG PALL, .LIST MEB ; ; DEFINE FSR REGION. ; FSRSZ$ 0 ;NO RECORD I/O ; ; MCR COMMAND LINES. ; ; NOTE: DON'T SEPERATE THE FOLLOWING LINES. ; INFO1: .ASCII #%NLogical device deassigned: # ASNSTR: .ASCIZ #ASN =VS%O:/LOGIN# REMMSG: .ASCIZ #%NDVD -- *WARNING* - Installed task should be removed: %2R# .EVEN OUTBUF: .BLKB 80. ;BUFFER STORAGE FOR $EDMSG ARGBLK: .BLKW 4 ;ARGUMENT BLOCK FOR $EDMSG .SBTTL DVD * MAIN-LINE TASK CODE ; ;+ ; THIS SECTION CONTAINS THE ENTRY LEVEL CODE FOR THE DVD TASK. ; IN GENERAL, THE STEPS PERFORMED ARE AS FOLLOWS: ; ; 1. GET THE COMMAND LINE. ; 2. PARSE COMMAND INTO ELEMENTS. ; 3. DISSOCIATES THE VIRTUAL DISK FROM THE FILE. ; ; INPUT: ; ; MCR COMMAND LINE IN FORM SHOWN BELOW. ; ; DVD VDN:[/SW] ; ; VDN: VIRTUAL DISK TO DISSOCIATE ; ; /SW IS ONE OR MORE OF THE FOLLOWING SWITCHES: ; ; /ALL - DISSOCIATE ALL VS'S (VS0:, VS1:, ETC.) ; /NM - SUPPRESS NON-FATAL MESSAGES ; /ID - DISPLAY CURRENT VERSION ; ; OUTPUT: ; ; VIRTUAL DISK DISSOCIATED FROM FILE OR ERROR MESSAGE ; OUTPUT TO USER'S TERMINAL. ; ;- ; DVD:: ;REF. LABEL. ; ; SET UP THINGS IN PIPUTL. ; MOV #MSGLUN,.EOLUN ;LUN FOR QIOSYM.MSG MOV #MSGEFN,.EOEFN ;EVENT FLAG FOR MSGLUN ALUN$S #MSGLUN,#"LB,#0 ;MAKE SURE LUN IS ASSIGNED TO LB: MOV $DFNAM,R1 ;GET DEFAULT TASK NAME CALL $GTKNM ;GET OUR TASK NAME MOV R1,$IDR50 ;STORE IT ; ; SETUP SST VECTOR TABLE FOR PROCESSING. ; SVTK$S #SSTTBL,#SSTSIZ ;SETUP SST VECTOR TABLE FINIT$ ;INIT FCS ; ; ZERO VARIOUS VARIABLES. ; CLR UCBADR ;CLEAR VDN: UCB ADDRESS CLR EXTADR ;CLEAR EXTENSION BLOCK ADDRESS CLR PRIVST ;CLEAR PRIV/NON-PRIV STATUS, 0=PRIV ; ; FIND THE UCB FOR OUR TI:. ; MOV $TKTCB,R0 ;SET UP ADDRESS OF TASK CONTROL BLOCK MOV T.UCB(R0),R0 ;GET UCB ADDRESS FOR "TI0:" FOR THIS TASK 10$: MOV U.RED(R0),R1 ;FOLLOW ALL REDIRECTS TO THE BOTTOM CMP R0,R1 ;ARE WE REDIRECTED? BEQ 20$ ; IF EQ - NO, CONTINUE MOV R1,R0 ; IF NE - YES, TRY TO ELIMINATE ANOTHER LEVEL BR 10$ ; OF REDIRECT 20$: MOV R0,TIUCB ;SAVE IT ; ; GET COMMAND LINE, ERROR IF NONE AVAIABLE. ; DIR$ #GETCMD ;GET MCR COMMAND LINE BCC 30$ ; IF CC - OK, CONTINUE ERROUX NOCM ;DECLARE ERROR ; ; SETUP FOR COMMAND PARSING. ; 30$: MOV #GETCMD+G.MCRB,R1 ;GET START OF COMMAND LINE MOV $DSW,R2 ;GET LENGTH OF COMMAND LINE 40$: CMPB #' ,(R1)+ ;SCAN FOR FIRST BLANK CHARACTER BEQ 50$ ; IF EQ - FOUND CHARACTER SOB R2,40$ ;LOOP THROUGH ENTIRE LINE ERROUX INCM ;DECLARE ERROR ; ; CHECK COMMAND FOR SYNTACICAL CORRECTNESS. ; 50$: DEC R2 ;CORRECT LINE LENGTH CSI$1 #CSIBLK,R1,R2 ;CHECK COMMAND LINE SYNTAX BCC 70$ ; IF CC - OK, CONTINUE 60$: CALLR .SYNER ;OUTPUT SYNTAX ERROR MESSAGE AND COMMAND LINE 70$: BITB #CS.EQU,C.STAT(R0) ;IS THERE AN EQUAL SIGN? BEQ 80$ ; IF EQ - YES, CONTINUE ERROUX NOEQ ;DECLARE ERROR ; ; GET INPUT FILENAME. MUST ONLY BE VDX:. ; 80$: CSI$2 #CSIBLK,OUTPUT,#SWTTAB ;GET INPUT SPECIFICATION BCS 60$ ; IF CS - BAD, ERROR BIT #FL.ID,SWITCH ;/ID? BEQ 90$ ;IF EQ, NO ERROUT IDNT ;PRINT VERSION JMP DVDEX ;AND EXIT 90$: BITB #CS.NMF!CS.DIF!CS.MOR,C.STAT(R0) ;IS OUTPUT ONLY DEVICE? BNE 140$ ; IF NE - NO, ERROR ; ; SET UP "ALLFLG" TO NON-ZERO IF /ALL WAS IN THE COMMAND LINE. ; MOV SWITCH,ALLFLG ;COPY SWITCHES BIC #^C,ALLFLG ;ALLFLG <> 0 IF /ALL WAS SPEICIFIED BEQ 110$ ;IF EQ, NOT /ALL - MUST HAVE A DEVICE BITB #CS.DVF,C.STAT(R0) ;WAS THERE A DEVICE SPECIFIED? BEQ 100$ ;IF EQ, NO - CONTINUE ERROUX NALL ;NO DEVICE WITH /ALL 100$: CALL DVDALL ;DVD ALL VS: LOGICAL DEVICES JMP DVDEX ;AND EXIT 110$: BITB #CS.DVF,C.STAT(R0) ;WAS A DEVICE SPECIFIED? BEQ 140$ ; IF EQ - NO, ERROR ; ; PARSE THE DEVICE NAME IN THE COMMAND LINE. ; MOV #FILFDB,R0 ;GET FILE FDB ADDRESS MOV #FILFDB+F.FNB,R1 ;AND NAMEBLOCK ADDRESS MOV #CSIBLK+C.DSDS,R2 ;GET DATASET DESCRIPTOR ADDRESS CLR R3 ;NO DEFAULT NAMEBLOCK CALL .PRSDV ;PARSE DEVICE NAME ONLY BCC 120$ ;IF CC, ALL OK MOV $DSW,R4 ;GET DSW ERROR CODE SUB #128.,R4 ;MINUS 128 FOR .ERTRP ERROUX PRSE,,R4 ;PRINT ERROR AND CODE 120$: CMP #"VD,N.DVNM(R1) ;IS IT A VD: ? BEQ 150$ ;IF EQ, YES 130$: ERROUX INVD ;INVALID DEVICE 140$: ERROUX SERR ;BAD SPECIFICATION ; ; VERIFY UNIT NUMBER RANGE ; 150$: MOV N.UNIT(R1),R1 ;GET THE UNIT NUMBER BIT #177400,R1 ;UNIT NUMBER MUST BE ONE BYTE BEQ 170$ ; IF EQ - OK, CONTINUE 160$: ERROUX INUN ; ; FINALLY, PERFORM THE DISSOCIATION. ; 170$: CALL DISSOC ;DISSOCIATE VD (UNIT NO. IN R1) DVDEX: EXST$S .EXSTS ;SUCCESSFUL COMPLETION EXIT$S ;EXIT TASK .SBTTL DISSOC - DISSOCIATE A VIRTUAL DISK UNIT ; ; **- DISSOC - DISSOCIATE A VIRTUAL DISK UNIT ; ; THIS ROUTINE WILL PERFORM ALL THE NECESSARY OPERATIONS TO DISSOCIATE ; ONE VIRTUAL DISK UNIT FROM IT'S FILE. ; ; INPUTS: R1 = VIRTUAL DISK UNIT NUMBER ; ; OUTPUTS: VIRTUAL DISK UNIT IS DISSOCIATED FROM ITS DISK FILE ; DISSOC: CALL $LOCKL ;;LOCK SYSTEM LISTS WHILE HANDLING REDIRECTS MOV R1,VDUNIT ;;SAVE THE UNIT NUMBER ; ; LOCATE PHYSICAL DEVICE VDN:'S UCB ADDRESS ; MOV $DEVHD,R4 ;;GET ADDRESS OF DCB INTO R4 10$: CMP D.NAM(R4),#"VD ;;IS THIS DEVICE "VD"? BEQ 30$ ;; IF EQ - YES, FOUND "VD" MOV D.LNK(R4),R4 ;; IF NE - NO, LINK TO NEXT DEVICE BNE 10$ ;; IF NE - THERE ARE MORE DEVICES 20$: ERROUX VDUK 30$: CMPB D.UNIT(R4),R1 ;;IS UNIT NUMBER REQUESTED VALID? BHI 40$ ;; IF HI - NO, UNIT NUMBER NOT IN RANGE CMPB D.UNIT+1(R4),R1 ;;IS UNIT NUMBER REQUESTED VALID? BHIS 50$ ;;IF HIS, IT'S OK 40$: ERROUX INUN ;;ERROR EXIT - INVALID UNIT ; ; VERIFY THAT DRIVER IS LOADED ; 50$: TST D.DSP(R4) ;;CHECK TO BE SURE DRIVER IS LOADED BNE 60$ ;; IF NE - DRIVER IS LOADED OR RESIDENT ERROUX VDNL ; ; COMPUTE UCB ADDRESS FOR VDN: ; 60$: MOV D.UCBL(R4),R3 ;;GET LENGTH OF UCB FOR "VD" MOV D.UCB(R4),R5 ;;GET ADDRESS OF FIRST UCB FOR "VD" MOV D.UNIT(R4),R2 ;;GET UNIT RANGE WORD BIC #177400,R2 ;; AND THROW OUT HIGHEST UNIT SUB R2,R1 ;;COMPUTE OFFSET INDEX INTO UCSS BEQ 80$ ;; IF EQ - R5 HAS ADDRESS OF UCB FOR VDN: 70$: ADD R3,R5 ;;ADD LENGTH OF UCB TO GET NEXT UCB SOB R1,70$ ;; IF EQ - R5 HAS ADDRESS OF UCB FOR VDN: ; ; CHECK TO BE SURE VDN: IS NOT REDIRECTED ; 80$: CLR UCBADR ;;INIT UCB ADDRESS TO "NOT IN USE" CLR EXTADR ;;SAME WITH EXTENSION BLOCK ADDRESS CMP U.RED(R5),R5 ;;CHECK REDIRECT UCB ADDRESS BEQ 90$ ;; IF EQ - VDN: IS NOT REDIRECTED ERROUX VDRD ; ; GET VIRTUAL DISK UCB AND DISSOCIATE IF POSSIBLE. ; 90$: SYSTEM 120$ ;;ENTER SYSTEM STATE MOV U.NXT(R5),R0 ;;IS UCB ALLOCATED? BEQ 110$ ;; IF EQ - NO, ERROR MOV X.UCB(R0),UCBREA ;;SAVE REAL DEVICE UCB ADDRESS MOV R5,UCBADR ;;SAVE UCB ADDRESS BITB #US.MNT,U.STS(R5) ;;IS DISK MOUNTED? BEQ 110$ ;; IF EQ - YES, CANNOT DISSOCIATE BITB #US.MDM,U.STS(R5) ;;IS DISK BEING DISMOUNTED? BNE 110$ ;; IF NE - YES, CANNOT DISSOCIATE MOV R0,EXTADR ;;SET DISK DEASSIGNED MOV TIUCB,R0 ;;GET OUR TI: UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ;;IS TERMINAL PRIVILEGED? BNE 100$ ;; IF NE - YES, ACCESS ALLOWED COM PRIVST ;; IF EQ - NO, ACCESS ALLOWED IF VDN: ALLOCATED TST U.OWN(R5) ;; IS VDN: ALLOCATED TO ANYBODY? BEQ 100$ ;; NO -- ACCESS ALLOWED CMP U.OWN(R5),R0 ;;IS VDN: ALLOCATED TO THIS "TI0:"? BEQ 100$ ;; IF EQ - YES, ACCESS ALLOWED NEG PRIVST ;; IF NE - NO, ACCESS DISALLOWED - ABORT WITH ERROR BR 110$ ;;EXIT 100$: CLR U.NXT(R5) ;;MARK VIRTUAL DISK UNASSIGNED BISB #US.OFL,U.ST2(R5) ;; AND SET OFFLINE 110$: RETURN ;;RETURN TO USER STATE 120$: TST UCBADR ;;WAS DISK ALLOCATED? BNE 130$ ;; IF NE - YES, CONTINUE TST ALLFLG ;;IS THIS A /ALL OPERATION? BNE 140$ ;;IF NE, YES - IGNORE ERROR ERROUX VDNA ;;DECLARE ERROR 130$: MOV EXTADR,R0 ;;WAS EXTENSION BLOCK DEALLOCATED? BNE 170$ ;; IF NE - YES, CONTINUE TST ALLFLG ;;IS THIS A /ALL OPERATION? BEQ 160$ ;;IF EQ, NO - ERROR 140$: BIT #FL.NM,SWITCH ;;SUPPRESS MESSAGES? BNE 150$ ;;IF NE, YES - DON'T PRINT ANYTHING ERROUT MOUN ;;PRINT THE ERROR MESSAGE 150$: CALL $UNLKL ;UNLOCK LISTS JMP 360$ ;RETURN QUIETLY 160$: ERROUX MOUN ;;DECLARE ERROR - VD: STILL MOUNTED 170$: TST PRIVST ;;IS USER OWNER OR PRIVILEGED? BLE 180$ ;; IF LE - YES, ALL DVD OPERATION TST ALLFLG ;;IS THIS A /ALL OPERATION? BNE 140$ ;;IF NE, YES - IGNORE ERROR ERROUX PRIV ; ; UNLOCK VIRTUAL DISK FILE, USING FNB STORED IN EXTENSION BLOCK. ; 180$: ADD #X.FNB,R0 ;;POINT TO FILENAME BLOCK MOV #FILFNB,R4 ;;GET OUR FILENAME BLOCK MOV #S.FNB/2,R1 ;;GET FILENAME BLOCK WORD SIZE 190$: MOV (R0)+,(R4)+ ;;COPY FILENAME BLOCK SOB R1,190$ ;; AND LOOP TILL DONE SYSTEM 200$ ;;ENTER SYSTEM STATE MOV EXTADR,R0 ;;GET BACK BLOCK ADDRESS MOV #X.LGTH,R1 ;;GET BLOCK LENGTH CALLR $DEACB ;;DEALLOCATE EXTENSION BLOCK 200$: MOV FILFNB+N.DVNM,R0 ;;GET DEVICE NAME MOV FILFNB+N.UNIT,R1 ;;GET UNIT NUMBER ALUN$S #FILLUN,R0,R1 ;;ASSIGN DEVICE BCS 230$ ;; IF CS - ERROR GLUN$S #FILLUN,#LUNINF ;;GET LUN INFORMATION BCS 230$ ;; IF CS - ERROR-THIS ERROR SHOULD NOT OCCUR CMP FILFNB+N.DVNM,LUNINF+G.LUNA ;;DO NAMES MATCH? BNE 230$ ;; IF NE - NO, FATAL CMPB FILFNB+N.UNIT,LUNINF+G.LUNU ;;DO UNITS MATCH? BNE 230$ ;; IF NE - NO, FATAL MOV $DEVHD,R4 ;;GET ADDRESS OF DCB INTO R4 210$: CMP D.NAM(R4),FILFNB+N.DVNM ;;DOES THIS DEVICE MATCH? BEQ 220$ ;; IF EQ - YES, FOUND DEVICE MOV D.LNK(R4),R4 ;; IF NE - NO, LINK TO NEXT DEVICE BNE 210$ ;; IF NE - THERE ARE MORE DEVICES BR 230$ ;; IF EQ - THERE ARE NO MORE DEVICES 220$: CMPB D.UNIT(R4),FILFNB+N.UNIT ;;DOES UNIT NUMBER MATCH? BHI 230$ ;; IF HI - NO, UNIT NUMBER NOT IN RANGE CMPB D.UNIT+1(R4),FILFNB+N.UNIT ;;DOES UNIT NUMBER MATCH? BHIS 240$ ;; IF HIS - YES, UNIT NUMBER IS VALID 230$: ERROUX HRED ; ; VERIFY THAT DRIVER IS LOADED ; 240$: TST D.DSP(R4) ;;CHECK TO BE SURE DRIVER IS LOADED BNE 250$ ;; IF NE - DRIVER IS LOADED OR RESIDENT ERROUX HDNL ; ; COMPUTE UCB ADDRESS FOR DEVICE ; 250$: MOV D.UCBL(R4),R3 ;;GET LENGTH OF UCB FOR DEVICE MOV D.UCB(R4),R5 ;;GET ADDRESS OF FIRST UCB FOR DEVICE MOV D.UNIT(R4),R2 ;;GET UNIT RANGE WORD BIC #177400,R2 ;; AND THROW OUT HIGHEST UNIT SUB R2,R1 ;;COMPUTE OFFSET INDEX INTO UCSS BEQ 270$ ;; IF EQ - R5 HAS ADDRESS OF UCB FOR DEVICE 260$: ADD R3,R5 ;;ADD LENGTH OF UCB TO GET NEXT UCB SOB R1,260$ ;; IF EQ - R5 HAS ADDRESS OF UCB FOR DEVICE ; ; CHECK TO BE SURE DEVICE IS NOT REDIRECTED ; 270$: CMP U.RED(R5),R5 ;;CHECK REDIRECT UCB ADDRESS BEQ 280$ ;; IF EQ - DEVICE IS NOT REDIRECTED ERROUX DRED ; ; CHECK THAT UCB ADDRESSES MATCH ; 280$: CMP UCBREA,R5 ;;DO UCB ADDRESSES MATCH? BEQ 290$ ;; IF EQ - YES, UNLOCK FILE ERROUX AVDX 290$: F11QIO WATDPB,300$ ;;CLEAR UNLOCK BIT BR 305$ ;; CONTINUE ON SUCCESS 300$: MOV #FILFNB-F.FNB,R0 ;;GET ADDRESS OF FDB ERROUT UNLE,0,IOSTAT ;;DECLARE ERROR TST ALLFLG ;;IS THIS A /ALL OPERATION? BNE 310$ ;;IF NE, YES - IGNORE ERROR JMP @.ABORT ;;ERROR EXIT ; ; IF THE VIRTUAL DISK WAS SET PUBLIC, SET IT NOT PUBLIC. ; 305$: MOV UCBADR,R5 ;;GET THE VD: UCB ADDRESS BITB #US.PUB,U.ST2(R5) ;;IS IT PUBLIC? BEQ 310$ ;;IF EQ, NO BICB #US.PUB,U.ST2(R5) ;;SET /NOPUB ; ; FINALLY, IF ANY LOGICAL DEVICES (VS:) ARE ASSIGNED TO THIS VD:, ; PERFORM THE DEASSIGN OPERATION. ; 310$: CALL $UNLKL ;;UNLOCK SYSTEM LISTS MOV #$MAXVS,R3 ;GET MAX NUMBER OF VS: UNITS CLR R5 ;START WITH VS0: 320$: MOV VDUNIT,R1 ;GET THE UNIT NUMBER ALUN$S #TSTLUN,#"VS,R5 ;ASSIGN LUN TO VS UNIT BCS 360$ ;IF CS, VS DOESN'T EXIST -- CONTINUE GLUN$S #TSTLUN,#LUNINF ;NOW DO A GETLUN ON IT BCC 330$ ;IF CC, CONTINUE ERROUX HUH ;??? 330$: CMP LUNINF+G.LUNA,#"VD ;IS IT A VD? BNE 360$ ;IF NE, NO - FORGET IT CMPB LUNINF+G.LUNU,R1 ;RIGHT VD UNIT NUMBER? BNE 360$ ;IF NE, NO MOV #OUTBUF,R0 ;GET OUTPUT BUFFER ADDRESS MOV #ASNSTR,R1 ;GET INPUT STRING ADDRESS MOV #ARGBLK,R2 ;GET ARGUMENT BLOCK ADDRESS MOV R5,(R2) ;STORE VS: UNIT NUMBER CALL $EDMSG ;EDIT STRING MOVB #33,(R0)+ ;TERMINATE WITH SUB #OUTBUF,R0 ;COMPUTE LENGTH OF THE STRING MOV R0,MCR1+S.PWCL ;STORE LENGTH IN DPB MOV #IS.SUC,IOSTAT ;ASSUME SUCCESS ; ; TO EXECUTE THE "ASN =VS:/LOGIN" COMMAND, THE TERMINAL ; MUST BE PRIVILEGED. SET IT SLAVE WHILE THIS IS HAPPENING. ; MOV TIUCB,R0 ;GET OUR TI: UCB MOV U.CW2(R0),-(SP) ;SAVE OLD U.CW2 BIS #,U.CW2(R0) ;SET US PRIVILEGED, SLAVED F11QIO MCR1,340$ ;EXECUTE THE SPAWN WTSE$S #MCREFN ;WAIT FOR IT MOV (SP)+,U.CW2(R0) ;RESTORE U.CW2 STATE BIT #FL.NM,SWITCH ;PRINT INFORMATIONAL MESSAGES? BNE 350$ ;IF NE, NO MOV #OUTBUF,R0 ;RE-INIT REGISTERS FOR $EDMSG MOV #INFO1,R1 ; ... MOV #ARGBLK,R2 ; ... CALL $EDMSG ;EDIT MESSAGE MOV R0,R1 ;COPY END-OF-STRING ADDRESS SUB #OUTBUF,R1 ;COMPUTE LENGTH OF STRING CALL OUTMSG ;OUTPUT THE MESSAGE TO TI: BR 350$ ;CONTINUE ; ; ERROR SPAWNING MCR. ; 340$: MOV (SP)+,U.CW2(R0) ;RESTORE U.CW2 STATE MOVB $DSW,R4 ;GET DSW ERROR CODE SUB #128.,R4 ;COMPUTE OFFSET FOR QIOSYM.MSG ERROUT SPER,,R4 ;OUTPUT ERROR MESSAGE 350$: 360$: INC R5 ;TRY NEXT VS: DEC R3 ;LOOP COUNTER BLE 370$ ;IF LE, ALL DONE JMP 320$ ;CONTINUE 370$: CALL CHKTSK ;CHECK FOR INSTALLED TASKS RETURN ;RETURN TO CALLER .SBTTL DVDALL - DVD ALL VS: UNITS ; ; DVDALL - DISSOCIATE ALL VS: UNITS ASSIGNED TO THIS TERMINAL. ; ; THIS ROUTINE WILL CHECK ALL VS: UNITS THAT EXIST FOR THIS TERMINAL. ; IT WILL THEN CALL "DISSOC" TO DISSOCIATE THEM. ; DVDALL: MOV TIUCB,R5 ;GET OUR TI:'S UCB ADDRESS ; ; UN-COMMENT NEXT THREE (3) LINES TO REQUIRE PRIVELEGED USER ; FOR DVD /ALL ;; BIT #U2.PRV,U.CW2(R5) ;ARE WE PRIVILEGED? ;; BNE 5$ ;IF NE, YES - PROCEED ;; ERROUX PALL ;"/ALL PRIVILEGED" 5$: CLR R5 ;INIT THE VS: UNIT NUMBER 10$: ALUN$S #TSTLUN,#"VS,R5 ;TRY AN ASSIGN LUN ON VS: BCS 30$ ;IF CS, IT DOESN'T EXIST GLUN$S #TSTLUN,#LUNINF ;NOW, GLUN$ BCC 20$ ;IF CC, OK ERROUX HUH ;??? 20$: CMP LUNINF+G.LUNA,#"VD ;IS IT A VD? BNE 30$ ;IF NE, NO MOV LUNINF+G.LUNU,R1 ;GET THE VD UNIT NUMBER MOV R5,-(SP) ;SAVE COUNTER CALL DISSOC ;DISSOCIATE THE VD: MOV (SP)+,R5 ;RESTORE THE COUNTER 30$: INC R5 ;TRY NEXT UNIT CMP R5,#$MAXVS ;TRIED THEM ALL? BLE 10$ ;IF LE, NO RETURN ;ALL DONE .SBTTL CHKTSK - CHECK FOR INSTALLED TASKS ; ; CHKTSK - CHECK FOR INSTALLED TASKS ; ; A WARNING MESSAGE IS OUTPUT FOR ANY TASKS THAT ARE INSTALLED ON THE ; VIRTUAL DISK BEING DISSOCIATED. THIS IS NECESSARY BECAUSE THEY ; WILL FAIL WHEN THEY ARE EXECUTED. ; ; INPUTS: ; UCBADR = UCB ADDRESS OF VIRTUAL DISK BEING DISSOCIATED ; CHKTSK: MOV $TSKHD,R5 ;GET TASK DIRECTORY POINTER MOV UCBADR,R4 ;GET VD: UCB ADDRESS BITB #US.PUB,U.ST2(R4) ;IS THE VD: PUBLIC BNE 99$ ;IF NE, YES - FORGET IT 10$: CMP T.LDV(R5),R4 ;TASK RESIDE ON THIS VD:? BNE 90$ ;IF NE, NO MOV #ARGBLK,R2 ;GET ARGUMENT BLOCK ADDRESS MOV T.NAM(R5),(R2) ;STORE 1ST HALF OF TASK NAME MOV T.NAM+2(R5),2(R2) ; AND 2ND HALF OF TASK NAME MOV #OUTBUF,R0 ;MESSAGE BUFFER ADDRESS MOV #REMMSG,R1 ;EDIT MESSAGE CALL $EDMSG ;EDIT THE EDIT MESSAGE MOV R0,R1 ;COPY END ADDRESS SUB #OUTBUF,R1 ;COMPUTE LENGTH OF MESSAGE CALL OUTMSG ;OUTPUT THE MESSAGE TO TI: 90$: MOV T.TCBL(R5),R5 ;GET NEXT TCB BNE 10$ ;IF NE, CHECK IT 99$: RETURN ;ALL DONE .SBTTL OUTMSG - OUTPUT MESSAGE TO TI: ; ; OUTMSG - OUTPUT A MESSAGE TO TI: ; ; THE MESSAGE IS ASSUMED TO START IN LOCATION "OUTBUF". ; R1 = NO. OF BYTES IN THE MESSAGE. ; OUTMSG: QIOW$S #IO.WLB,#TTYLUN,#EV.QIO,,,,<#OUTBUF,R1> RETURN ;ALL DONE .SBTTL ERRSRV - EXIT AFTER ERROR ; ; THIS ROUTINE IS CALLED ON A FATAL ERROR. IT SIMPLY EXITS WITH THE ; APPROPRIATE EXIT STATUS. ; ERRSRV: MOV #EX$SEV,.EXSTS ;FATAL ERROR EXST$S .EXSTS ;FATAL EXIT STATUS EXIT$S ;EXIT TASK .END DVD