.TITLE ASSIGN -- PROGRAM ASSIGNS LUNS .IDENT -000100- .NLIST BIN .LIST TTM ;+ ; PROGRAM TO REASSIGN LUNS OF A NON-INSTALLED TASK BY A ; NON-PRIVILEGED USER ; ; USE: ; ---- ; ; MCR>ASG FILESPEC=DVN:LUN (IF AN MCR FUNCTION) ; ; -OR- ; ; MCR>RUN $ASSIGN ; ---- ; ASG>FILESPEC=DVN:LUN ; ---- ; ; FILESPEC MAY BE ANY LEGAL RSX FILE SPECIFICATION. ; IT DEFAULTS TO .TSK (NO UIC CODE). ; THE PROGRAM WILL ALSO ACCEPT AN "@" FILE SPECIFICATION, ; UP TO ONE (1) NESTING LEVEL DEEP: ; ; ASG>@[22,4]ASSIGN ; ---- ; ; IF A NULL LINE OR A LINE STARTING WITH ";" IS ENCOUNTERED, ; THAT LINE IS IGNORED. ; ; SYNTAX: ; ; ASG>FILENAME=DVNN:LUN ; ---- ; ; FILENAME THE NAME OF THE FILE (DEFAULTS TO .TSK) ; DV THE DEVICE TO BE ASSIGNED TO THE LUN. ; NN THE UNIT NUMBER OF THE DEVICE TO BE ASSIGNED. ; LUN THE LUN TO BE ASSIGNED TO DVNN:. ; ; THE SYNTAX WAS CHOSEN TO BE CONSISTANT WITH THE ASG COMMAND ; IN TKB. ; ; ERROR MESSAGES ; ----- -------- ; ; MESSAGE CAUSE ; ; I/O ERROR CODE THE TASK IMAGE COULD NOT ; BE OPENED OR SOME SIMILAR ; ERROR. ; I/O ERROR ON @ FILE -- THE COMMAND FILE ; HAD AN I/O ERROR. ; OPEN ERROR ON @ FILE -- THE COMMAND FILE ; COULD NOT BE OPENED. ; SYNTAX ERROR -- AN INDIRECT ; COMMAND FILE HAS INVALID ; SYNTAX. ; MAX @ FILE DEPTH EXCEEDED -- MORE THAN 1 NESTED @ ; FILE WAS USED. ; UNKNOWN ERROR AN UNKNOWN ERROR OCCURRED ; IN PROCESSING THE COMMAND ; LINE. ; ERROR IN PARSE 1 SYNTAX ERROR FOR TASK IMAGE ; SPECIFICATION ; ERROR IN PARSE 2 SYNTAX ERROR FOR TASK IMAGE ; SPECIFICATION ; ILLEGAL LUN SPECIFIED -- AN ILLEGAL LUN WAS GIVEN IN THE ; COMMAND STRING ; ; ; LOGICAL UNITS USED ; ------- ----- ---- ; ; LUN EVENT FLAG DEVICE ; ; 2 5 TI: (MESSAGE OUTPUT) ; 3 TI: (COMMAND INPUT) ; 4 1 DB0: (TASK IMAGE) ; ; AUTHOR: WRIGHT DATE: 28-MAY-77 ;- ; R$$11D = 0 ;DEFINE THIS SYMBOL FOR RSX-11D ;I$$AS = 0 ;DEFINE THIS SYMBOL FOR IAS. .MCALL QIOW$,EXIT$S,DIR$ .MCALL CLOSE$,READ$,OPEN$M,WAIT$,WRITE$ .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2 .IF DF I$$AS .MCALL LBLSY$ LBLSY$ DEF$L .ENDC ;I$$AS ; ; THE FOLLOWING MACRO IS USED TO TEST FOR AN ERROR ; AFTER AN I/O OPERATION. IT IS PASSED THE I/O STATUS ; BLOCK ADDRESS AND THE ADDRESS OF THE ERROR ROUTINE, ; CHECKING THE I/O STATUS BLOCK AND THE DIRECTIVE ; STATUS WORD FOR AN ERROR RETURN CODE, PASSING ; CONTROL TO THE ERROR ROUTINE IF AN ERROR OCCURRED. ; .MACRO ERRTST,STATUS,ERRAST BCC .+6 JMP ERRAST TST @#DSW BGE .+6 JMP ERRAST TST STATUS BGE .+6 JMP ERRAST .ENDM ; ; GENERALISED ERROR MESSAGE MACRO ; .MACRO ERROR MSG,LEN MOV MSG,$QIOW+Q.IOPL MOV LEN,$QIOW+Q.IOPL+2 MOV #$QIOW,-(SP) CALL .DIRDL ;DO A QIO .ENDM ; ; EQUATE GLOBAL SYMBOLS. ; DSW = 0 CR = 15 LF = 12 ; ; LOGICAL UNITS ; LUNCM = 1 ;COMMAND INPUT LUNTI = 2 ;MESSAGE OUTPUT LUNSY = 3 ;THE TASK IMAGE ASSIGN:: GCML$ #CMLBLK ;GET THE FILE NAME OF TASK. BCC GETOK ;SKIP ERROR PROCESS IF LINE OK. CMPB CMLBLK+G.ERR,#GE.IOR BEQ CMDERR ;I/O ERROR ON COMMAND INPUT CMPB CMLBLK+G.ERR,#GE.OPR BEQ CMDOPE ;OPEN ERROR ON COMMAND FILE CMPB CMLBLK+G.ERR,#GE.BIF BEQ CMDSYN ;SYNTAX ERROR. CMPB CMLBLK+G.ERR,#GE.MDE BEQ CMDMAX ;MAX @ FILE DEPTH EXCEEDED CMPB CMLBLK+G.ERR,#GE.EOF BEQ CMDEOF ;EOF ON COMMAND FILE. ERROR #UNKERR,#UNKLEN BR ASSIGN ;UNKNOWN ERROR IOER1: MOV #IOMSG,R1 ;GET ADDR OF I/O MESSAGE MOV #IOLEN,R2 ;AND LENGTH. CALL .PRFCS ;PRINT FCS ERROR CODE. CLOSE$ R0 BR ASSIGN CMDERR: ERROR #ERRMSG,#ERRLEN EXIT$S ;FATAL ERROR CMDOPE: ERROR #OPEMSG,#OPELEN BR ASSIGN ;OPEN FAILURE CMDSYN: ERROR #SYNMSG,#SYNLEN BR ASSIGN ;SYNTAX ERROR PARSN1: ERROR #PARMS1,#PARML1 BR ASSIGN ;SYNTAX FOR PARSE PARSN2: ERROR #PARMS2,#PARML2 BR ASSIGN ;SYNTAX ERROR PARSE 2 CMDMAX: ERROR #MAXMSG,#MAXLEN BR ASSIGN ;MAX @ FILE DEPTH CMDEOF: EXIT$S ;END-OF-FILE GETOK: TST CMLBLK+G.CMLD ;WAS ANY DATA TRANSMITTED? BEQ ASSIGN ;LOOP IF NOT. CSI$1 #CSIBLK,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCS PARSN1 ;SYNTAX ERROR CSI$2 #CSIBLK,INPUT ;GET THE INPUT FILE. BCS PARSN2 ;ERROR? MOV #CSIBLK+C.DSDS,R1 MOV (R1)+,R4 ;ANY DEVICE ? BEQ CMDSYN ;NO MOV (R1)+,R5 ;GET ADDRESS OF DEVICE NAME MOVB (R5)+,R2 ;GET DEVICE NAME SWAB R2 BISB (R5)+,R2 ;COMPLETE MOVEMENT SWAB R2 CLR R3 ;CLEAR COUNT. SUB #2,R4 ;GET THE NUMBER OF CHARS LEFT 10$: BLE 30$ ;LEAVE IF NO MORE MOVB (R5)+,R0 ;GET NEXT CHAR. CMPB R0,#'7 ;> 7? BHI CMDSYN ;ERROR IF SO CMPB R0,#'0 ; < 0? BLO CMDSYN ;ERROR IF SO BIC #177770,R0 ;CLEAR LOW GARBAGE. ASH #3,R3 ;MULTIPLY PREVIOUS ... ADD R0,R3 ; ... AND ADD IN NEW DEC R4 ;DECREMENT COUNT BR 10$ ;AND LOOP ; ; WE NOW HAVE: ; ; R1 -> DIRECTORY STRING ; R2 = DEVICE NAME ; R3 = DEVICE NUMBER ; 30$: CMP R3,#255. ;OVER TOP? BHI CMDSYN ;SYNTAX ERROR IF SO TST (R1)+ ;IS DIRECTORY STRING NULL? BNE CMDSYN ;NO -- ERROR TST (R1)+ ;SKIP NEXT WORD MOV (R1)+,R0 ;GET THE COUNT FOR THE FILENAME LENGTH BEQ CMDSYN ;SYNTAX IF 0 MOV (R1),R1 ;POINT TO THE LUN. CLR R5 ;CLEAR THE COUNT. LOOP: MOVB (R1)+,R4 ;PICK UP CHAR. CMPB R4,#'9 ;OVER 9? BHI CMDSYN ;YES CMPB R4,#'0 ;UNDER 0? BLO CMDSYN ;YES SUB #'0,R4 ;R5 = THE NUMBER. MUL #10.,R5 ;MULTIPLY BY 10 ADD R4,R5 ;ADD IN THE NEW STUFF SOB R0,LOOP ;AND LOOP UNTIL DONE. MOV R5,R4 ;SAVE IN THE LUN TO CHANGE. BLE LUNERR ;ERROR -- ILLEGAL LUN CMP R4,#256. ;TOO MANY LUNS? BHI LUNERR ;ERROR IF SO ; ; DECODE THE TASK IMAGE SPECIFICATION. ; CSI$2 #CSIBLK,OUTPUT BCS PARSN2 ;SYNTAX ERROR OPEN$M #FDB,,#CSIBLK+C.DSDS ;OPEN TASK IMAGE FILE. ERRTST IOST,IOER1 ; ; WE NOW HAVE THE TASK IMAGE OPENED AND THE SYNTAX OF THE COMMAND ; VERIFIED. CHANGE THE LUN. ; MOV #1,BLKNO+2 ;POINT TO FIRST BLOCK. READ$ R0,,,#BLKNO ERRTST IOST,IOER1 WAIT$ R0 ERRTST IOST,IOER1 ; ; WE NOW HAVE THE LABEL BLOCK FROM THE TASK IMAGE IN CORE. ; GET POINTER TO THE HEADER BLOCK. ; .IF DF I$$AS MOV BUFFER+L$BHRB,R5 ;GET THE POINTER TO THE HEADER. .ENDC ;I$$AS .IF DF R$$11D MOV BUFFER+212,R5 ;GET THE POINTER TO THE HEADER. .ENDC ;R$$11D CMP R5,#3 ;IS IT 3 (USUAL CASE)? BNE REDHDR ;NO, MUST BE IN RANGE. CMP R4,#128. ;IS THE LUN IN RANGE? BLOS REDHDR ;YES -- OK LUNERR: ERROR #LUNMSG,#LUNLEN CLOSE$ R0 ;CLOSE FILE JMP ASSIGN ;AND LOOP REDHDR: MOV R5,BLKNO+2 ;POINT TO HEADER READ$ R0,,,#BLKNO ERRTST IOST,IOER1 WAIT$ R0 ERRTST IOST,IOER1 ; ; WE NOW HAVE THE HEADER IN CORE. GET THE NUMBER OF LUN'S ; CMP R4,BUFFER+H.LUT ;LUN NUMBER TOO HIGH? BHI LUNERR ;YES MOV #2,R5 ;ASSUME IN BLOCK 2 CMP R4,#128. ;TOO HIGH? BLOS 10$ ;NO INC R5 ;ADJUST R5 10$: MOV R5,BLKNO+2 ;SET UP BLOCK NUMBER READ$ R0,,,#BLKNO ERRTST IOST,IOER1 WAIT$ R0 ERRTST IOST,IOER1 DEC R4 ;FIXUP FOR 1 ORIGIN BIC #128.,R4 ;CLEAR APPROPRIATE BIT ASH #2,R4 ;COMPUTE ADDRESS IN BUFFER MOV R2,BUFFER(R4) ;SAVE DEVICE NAME MOV R3,BUFFER+2(R4) ;SAVE UNIT NUMBER MOV R5,BLKNO+2 ;RE-INIT BLKNO WRITE$ R0,,,#BLKNO ERRTST IOST,IOER1 WAIT$ R0 ERRTST IOST,IOER1 CLOSE$ R0 ;CLOSE TASK IMAGE JMP ASSIGN ;AND BEGIN AGAIN. ; ; ERROR MESSAGES ; IOMSG: .ASCII /ASG/ IOLEN = .-IOMSG .EVEN ERRMSG: .ASCII \ASG -- I/O ERROR ON @ FILE\ ERRLEN = .-ERRMSG .EVEN OPEMSG: .ASCII /ASG -- OPEN ERROR FOR @ FILE/ OPELEN = .-OPEMSG .EVEN SYNMSG: .ASCII /ASG -- SYNTAX ERROR/ SYNLEN = .-SYNMSG .EVEN MAXMSG: .ASCII /ASG -- MAX @ FILE DEPTH EXCEEDED/ MAXLEN = .-MAXMSG .EVEN UNKERR: .ASCII /ASG -- UNKNOWN ERROR/ UNKLEN = .-UNKERR .EVEN PARMS1: .ASCII /ASG -- ERROR IN PARSE 1/ PARML1 = .-PARMS1 .EVEN PARMS2: .ASCII /ASG -- ERROR IN PARSE 2/ PARML2 = .-PARMS2 .EVEN LUNMSG: .ASCII /ASG -- ILLEGAL LUN SPECIFIED/ LUNLEN = .-LUNMSG .EVEN ; ; FILE STORAGE AREAS. ; .MCALL FSRSZ$,FDBDF$,FDRC$A,FDBK$A,NMBLK$,FDOP$A FSRSZ$ 1 FDB: FDBDF$ FDRC$A FD.RWM!FD.RAN FDBK$A BUFFER,512.,,LUNSY,IOST ;EVENT FLAG = LUN FDOP$A LUNSY,,DFNAME DFNAME: NMBLK$ ,TSK,,SY,0 ;ESTABLISH DEFAULT FILE NAME. ; ; OTHER TEMPORARY LOCATIONS. ; .EVEN IOST: .BLKW 2 BLKNO: .BLKW 2 BUFFER: .BLKW 256. $QIOW: QIOW$ IO.WVB,LUNTI,LUNTI,,,,<,,40> ; ; COMMAND LINE AND PARSE ROUTINE DATA AREAS ; CSI$ .EVEN CSIBLK: .BLKB C.SIZE CMLBLK: GCMLB$ 1,ASG,,LUNCM .EVEN .END ASSIGN