IDTITL 0401,DVD, .TITLE DVD - DISSOCIATE VIRTUAL DISK .IDENT /X04.01/ .SBTTL DVD - TITLE PAGE .NLIST BEX .LIST MEB .ENABL LC ;**- ; Module name: DVD - DISSOCIATE VIRTUAL DISKS ; ; Version X04.01 Last edit: 29-JAN-81 08:13 ; 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 ; ;**- ; ; ************************************************************************ ; * ; 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