.TITLE RECFIL - RECOVERY OF FILES BY UIC NBLK=30. NSTART=2. ;DISK BLOCK TO START WITH ;***TI P$SECT=0 ;RO PSECTS FOR IAS .MCALL QIOW$S,QIOW$,GTSK$S,DIR$,ALUN$C,FHDOF$ .MCALL EXIT$S,QIOW$C FHDOF$ DEF$L ; ; FILREC.MAC ; ; THIS PROGRAM IS A COMBINATION OF ; UICREC AND LAZRUS ; FROM SPRING 80 RSX SIG TAPE, UIC=[307,22]. THERE ARE ; A FEW ADDITIONAL MODIFICATIONS AS STATED BELOW. ; ;ORIGINAL COMMENTS(UICREC): ; ; PROGRAM TO RECOVER ALL FILE IN THE TASKS UIC FROM DPO AND ; WRITE THEM ONTO SY0: IN THE CURRENT UIC ; ; TO USE THIS PROGRAM, YOU SET /UIC AND ASN TO AN EXISTING UIC ; ON A MOUNTED SCRATCH DISK. THE CORRESPONDING UIC ON THE ; CORRUPTED DISK WILL BE COPIED INTO THE UIC THAT YOU ARE ; SET TO ON YOUR SY DISK. ; ; NOTE THAT THIS PROGRAM ASSUMES THAT BLOCKS 0-222 ON THE ; DISK ARE CORRUPTED. ; ;ORIGINAL COMMENT(LAZRUS): ; ; THIS PROGRAM IS A MODIFIED VERSION OF MIKE HIGGINS "UICREC" ; PROGRAM. LIKE "UICREC" IT IS BEING WRITTEN IN GREAT HASTE ; SO PLEASE FORGIVE THE LACK OF DOCUMENTATION. ; ; THIS PROGRAM IS INTENDED TO RESURRECT FILES THAT WERE ACCIDENTALLY ; DELETED (VIA PIP *.*;*/DE) FROM THE DEAD. ; ; WE WILL REFER TO THE VOLUME ON WHICH THE PIP *.*;*/DE WAS ; DONE AS THE "DEAD" VOLUME. THE "GOOD" VOLUME IS ; ANY NORMAL FILES-11 DISK WHICH HAS ENOUGH SCRATCH SPACE ; TO HOLD AT LEAST THE RESURRECTED FILES FOR ONE UIC. ; ; THIS PROGRAM WILL SCAN A "DEAD" VOLUME FOR ALL FILES ; IN A GIVEN UIC THAT HAVE BEEN DELETED. IT WILL COPY EACH ; FILE TO THE SAME UIC ON THE "GOOD" VOLUME. IT ONLY DOES ; ONE UIC AT A TIME, AND THE UIC IT WORKS ON IS ; THE SET /UIC THAT IS IN EFFECT WHEN THE PROGRAM IS RUN. ; ; ; NOTE: THIS PROGRAM DOES NOT ATTEMPT TO CORRECT THE BIT MAP ; AND ALL THAT JAZZ ON THE "DEAD" VOLUME. IN FACT ; IT DOES NOT WRITE ON THE "DEAD" VOLUME AT ALL. THUS ; THERE IS NO NEED TO MAKE AN EMERGENCY COPY OF THE ; "DEAD" VOLUME. WHEN RUNNING THE "LAZRUS" PROGRAM ; YOU MAY WRITE PROTECT THE "DEAD" VOLUME. ; ; ; SOME LIMITATIONS: ; ; SINCE LAZRUS SCANS ALL OF THE BLOCKS ON A DISK VOLUME, IT ; MAY RESURRECT A PROGRAM THAT HAS BEEN DELETED A LONG TIME ; AGO. THIS PROGRAM COULD HAVE THE SAME NAME AND VERSION NUMBER AS ONE ; THAT WAS DELETED A SHORT TIME AGO. IT IS POSSIBLE THAT LAZRUS ; WILL RESURRECT BOTH VERSIONS. THE USER MUST DECIDE WHICH ; VERSION IS THE CURRENT ONE. AS OF RIGHT NOW LAZRUS WILL NOT RESTORE ; THE CREATATION DATE OF THE RESURRECTED FILE. ; ; ; ; A DELETED FILE HEADER IS IDENTIFIED AS FOLLOWS ; ; WD 0 - 27027 (IN OCTAL) THIS IS A STATIC OFFSET IN THE FILE HEADER ; WD 1 - ZERO, THE FILE FILE ID NUMBER OF A DELETED FILE IS ZERO ; WD 10 - THE UIC ; WD 377 - ZERO, THE CHECKSUM OF A DELETED FILE IS ZERO ; ; ; ; MODIFICATIONS : ; 3-FEB-81 ; OTTO TITZE, KERNPHYSIK THD, D-61 DARMSTADT ; ; 1. COMMAND INPUT ADDED ; 2. DATE SELECTION ADDED: ; ONLY FILES AFTER A SPECIFIC CREATION DATE ARE RECOVERED. ; (ASSUMING THAT A REASONABLY MANAGED SYSTEM HAS BACKUPS "FROM ; TIME TO TIME". THEREFORE ONE ONLY NEEDS TO RECOVER FILES ; AFTER THE LAST BACKUP. OTHERWISE ONE GETS LOST E.G IN ; RECOVERING A WHOLE RM03) ; 3. OVERRIDE UIC SELECTION: ; FOR HUGE DISKS(WITH HUNDREDS OF UICS IT WAS TO CUMBERSOME ; TO RUN THE PROGRAM ONCE A TIME FOR EACH. ; 4. LIMITATION TO BLOCKS >222 IS DROPPED. READ NOW STARTS ; AT NSTART(=2) ; ; COMMAND LINE FORMAT: ; ; DEV:=DEV:/SW ; ; SWITCHES: ; /AL OVERRIDE UIC SELECTION ; /AF:DATE ALL FILES WITH A CREEATION DATE LATER THAN ; DATE WILL BE RECOVERED ; /DE ONLY DELETED FILES WILL BE RECOVERED(LAZRUS-MODE) ; /UI COPY IN CORRESPONDING UFD(/AL IS IMPLIED) ; /GR SELECT GROUP CODE(UIC) MATCHING ONLY, WITH ; COPY TO CORRESPONDING UFD ; ; SUBROUTINES USED: ; ; BLOCKN MODIFIED VERSION OF BLOCKS.MAC ; CMDINP COMMAND INPUT ; CNVDAT STOLEN FROM SRD [365,1] AND MODIFIED ; ; .IF NE P$SECT .PSECT CODE,RO .ENDC RECFIL:: GTSK$S #TBUF ;GET THE TASK PARAMETRS (TO GET THE UIC) ;***TI CALL CMDINP BIT #AFMSK,CSIFLG ;DATE INPUT? BEQ 20$ ;NO MOV #DATBUF,R1 ;DATE STRING FROM INPUT CALL CNVDAT ;CONVERT TO INTEGER NUMBER BCC 10$ ;NO ERROR EXIT$S 10$: MOV R2,DATBUF ;THIS WE ONLY NEED 20$: ; ALUN$C 1,XL,0 ; ALUN$C 2,XP,0 ;***TI HDLUP: DIR$ #RDBLK ;READ A BUNCH OF BLOCKS TSTB IOSTAT ;TEST FOR ERROR IN ANY OF THEM BMI SMALL ;GO DO THEM ONE AT A TIME IF ERROR MOV #HEADER,R5 ;R5 POINTS TO THE NEXT HEADER IN CORE MOV BBHI,HDRHI MOV BBLO,NXTHDR ALLH: CALL REST ;CALL THE REST OF THE PROGRAM FOR EACH HEADER ADD #512.,R5 ;SKIP TO THE NEXT HEADER ADD #1,NXTHDR ADC HDRHI CMP R5,#ENDH ;TEST FOR DONE BLT ALLH ;GO DO THE NEXT ONE NEXTB: ADD #NBLK,BBLO ;INCRIMENT TO THE NEXT BLOCK OF HEADERS ADC BBHI BR HDLUP ;GO RECOVER ALL OF THEM ;CONTROL BRANCHES HERE IF THERE IS AN ERROR IN THE ;BIG READ ABOVE. SMALL: MOV #NBLK,R4 ;LOOP FOR ALL BLOCKS REQUESTED MOV BBHI,HDRHI ;INITALIZE TO THE START OF THE BIG READ MOV BBLO,NXTHDR MOV #HEADER,R5 SLUP: MOV R4,-(SP) ;SAVE LOOP COUNTER DIR$ #RDHDR ;READ ONE BLOCK TSTB IOSTAT ;IS THIS THE BAD BLOCK? BGT NOPE CMPB IOSTAT,#IE.BLK ;ARE THERE NO MORE BLOCKS? BNE ESLUP QIOW$S #IO.WVB,#5,#5,,,,<#DONE,#DL,#40> EXIT$S NOPE: CALL REST ;NO, RECOVER THIS FILE ESLUP: ADD #1,NXTHDR ADC HDRHI MOV (SP)+,R4 ;RECOVER THE LUP COUNT SOB R4,SLUP ;LUP FOR ALL BLOCKS BR NEXTB REST: CMP #27027,(R5) ;IS THIS A HEADER BLOCK BNE NEXTJP ;NO, SKIP TO NEXT BLOCK ;***TI ; SPECIFIC TEST FOR DELETED FILES ON A GOOD VOLUME ; BIT #DEMSK,CSIFLG ;MODE IS DELETE BEQ LOSFL ;NO TST 2(R5) ;DELETED FILE HAS ID = ZERO BNE NEXTJP ;NO MOV R5,R0 ;NOW TRY CHECKSUM ADD #776,R0 ;WHICH MUST TST (R0) ;BE ZERO BNE NEXTJP ;NO BR UICCHK ;GO TO COMMON PART NEXTJP: JMP NEXT ;LONG BRANCH ; ;***TI ; TEST FOR GOOD FILES ON BAD VOLUME ; LOSFL: ;***TI TST 2(R5) ;IS THIS HEADER BLOCK ALLOCATED? BEQ NEXTJP ;NO, SKIP TO NEXT ;CALCULATE THE CHECKSUM OF THE HEADER BLOCK AS A ;FINAL CHECK TO MAKE SURE IT REALLY IS A HEADER MOV R5,R0 ;START AT TOP OF HEADER MOV #377,R1 ;LOOP FOR ALL BUT THE LAST WORD CLR R2 ;R2 CONTAINS THE SUM CHECK: ADD (R0)+,R2 ;THE HEADER CHECKSUM IS JUST A "DUMB SHIT SOB R1,CHECK ;RUNNING SUM" TO QUOTE JIM LIVINGSTON CMP R2,(R0) ;IS THE CHECKSUM CORRECT? BNE NEXTJP ;NO, THEN FORGET THIS BLOCK ;***TI UICCHK: BIT #ALMSK,CSIFLG ;USE ALL UICS? BNE 50$ ;YES BIT #GRMSK,CSIFLG ;GROUP CODE MATCHING BEQ 10$ ;NO,DO ALL CMPB H.PROJ(R5),UIC+1 ;SAME GROUP BEQ 50$ ;YES, OKAY ;***TI 10$: CMP H.PROG(R5),UIC ;IS THIS FILE IN THE UIC I WANT?? BNE NEXTJP ;NO, THROW IT OUT THIS TIME ;***TI 50$: BIT #AFMSK,CSIFLG ;DATE(/AF) SPECIFIED? BEQ 100$ ;NO,SKIP REMAINDER MOVB (R5),R1 ;OFFSET TO IDENT AREA IN HEADER ASL R1 ;MAKE WORD OFFSET ADD R5,R1 ;AND ADRESS ADD #I.CRDT,R1 CALL CNVDAT ;CONVERT TO INTEGER BCS NEXTJP ;ERROR! SKIP THIS HEADER CMP DATBUF,R2 ;/AF SHOULD BE LESS BHI NEXTJP ;NO, DON'T WANT IT 100$: ;***TI CLR DIR ;DATASET DESCRIPTOR UIC LENGTH CLR DIR+2 ;AND ADRESS ; ; CONVERT UIC FROM FILE HEADER TO DATASET DESCRIPTOR ; MOV #DIRSTR+1,R0 ;OUTPUT STRING ADR CLR R1 BISB H.PROJ(R5),R1 ;GET GROUP CODE CLR R2 ;SUPPRESS ZEROS CALL $CBOMG ;CONVERT CLR R1 BISB H.PROG(R5),R1 ;OWNER CODE CLR R2 MOVB #',,(R0)+ ;TO MAKE UIC CALL $CBOMG ;CONVERT MOVB #'],(R0)+ ;END OF UIC SUB #DIRSTR,R0 ;STRINGLENGTH BIT #UIMSK,CSIFLG ;COPY TO DIFFERENT UICS? BEQ 140$ ;NO MOV R0,DIR ;INSERT IN DATASET DESCR MOV #DIRSTR,R1 ;SAME FOR ADRESS MOV R1,DIR+2 140$: QIOW$S #IO.WVB,#6,#6,,,,<#DIRSTR,R0,#'$> ;***TI ; MOV #STRING,R0 ;START SETTING UP FOR EDITMSG MOV #EDIT,R1 MOV R5,R2 ;CALCULATE THE ADDRESS OF THE FILE ADD #56,R2 ;INFORMATION SECTION OF THE HEADER CALL $EDMSG ;CONVERT TO ASCII MOV R1,NAM ;SAVE LENGTH MOV #STRING,NAM+2 ;AND ADDRESS IN DSDB FOR OUTPUT FILE QIOW$S #IO.WVB,#6,#6,,,,<#STRING,R1,#0> ; MOV #BSTRING,R0 MOVB #11,(R0)+ MOV HDRHI,R1 MOV #30010,R2 CALL $CBTA MOVB #54,(R0)+ MOV NXTHDR,R1 MOV #30010,R2 CALL $CBTA MOVB #11,(R0)+ MOV R0,R1 SUB #BSTRING,R1 QIOW$S #IO.WVB,#6,#6,,,,<#BSTRING,R1,#0> ;THIS IS A HEADER THAT WE WANT, RECOVER IT. JSR PC,BLOCKS NEXT: RTS PC ; .IF NE P$SECT .PSECT .ENDC RDBLK: QIOW$ IO.RLB,1,1,,IOSTAT,, ;***TI BBHI=RDBLK+Q.IOPL+6 BBLO=RDBLK+Q.IOPL+10 HEADER: .BLKB 512.*NBLK ENDH: RDHDR: QIOW$ IO.RLB,1,1,,IOSTAT,, ;***TI HDRHI=RDHDR+Q.IOPL+6 NXTHDR=RDHDR+Q.IOPL+10 TBUF: .BLKW 16. UIC=TBUF+16 EDIT: .ASCII /%X/ .WORD 0 STRING: .BLKB 32. BSTRING: .BLKB 32. YN: .BLKB 10. DIRSTR: .ASCII /[/ ;DON'T TOUCH THAT .BLKB 9. ;BUFFER FOR REST OF UIC DONE: .ASCII /I'M DONE/<7><7><7><7> DL=.-DONE ; .END RECFIL