.TITLE CFID .IDENT /X01.01/ ; ; Author: Richard JD Kirkman ; Date : 10th August-80 ; Name: UNDelete ; Function: To attempt to recover a recently deleted file. ; ; Algorithm: Accepts uic of owner, input and output disks (must be different) ; Scans indexfile of input disk for deleted files, and uses ; IO.RLB from priv task to read all blocks of a file which matches ; according to the map area of the file. ; ; Note: This program will only succeed in recovering a file,if the file header ; has not been reused. It will not check if the data blocks have been reused ; but will simply create a new file containing all the listed blocks with the ; listed attributes. ; .MCALL GCML$,GCMLB$,CSI$,CSI$1,CSI$2,CSI$ND .MCALL FHDOF$ .MCALL NMBLK$,FDOP$A,FDRC$A,FDBK$A,OPEN$R,READ$ .MCALL EXIT$S,QIOW$S,ALUN$S,QIOW$,DIR$,GLUN$S .MCALL OPEN$W,FINIT$,FDBDF$,FSRSZ$,CLOSE$,WRITE$,WAIT$ FHDOF$ DEF$L ; CSI$ CSIBLK: .BLKB C.SIZE GCLBLK: GCMLB$ 4,UND,,1 OWNER: .WORD 0 ;UIC OF OWNER STBK: .BLKW 8. BUF: .BLKB 80. ; HDR: .BLKW 256. DATA: .BLKW 256. ; ; .ENABL LC ERR1: .ASCII /UNDelete - Devices must be distinct/ ERR1L=.-ERR1 ERR2: .ASCII /UNDelete - syntax "UND>OU0:=IN0:[101,201]"/ ERR2L=.-ERR2 TXTLIN: .ASCII /UNDELETE [x01.01] Recovery of / T1: .ASCII / to / T2: .ASCII / / TXTL=.-TXTLIN .EVEN .DSABL LC QIO1: QIOW$ IO.WLB,5,5,,,, QIO2: QIOW$ IO.WLB,5,5,,,, QIO3: QIOW$ IO.WLB,5,5,,,, ; FDB: FDBDF$ FDRC$A FD.RWM FDBK$A DATA,1000 FDOP$A 2,,DFNB,FO.WRT DFNB: NMBLK$ FILE,DAT,0 INDX: .WORD 0,0,5,INXU,10.,INXF INXU: .ASCII /[0,0]/ INXF: .ASCII /INDEXF.SYS/ .EVEN INXFDB: FDBDF$ FDRC$A FD.RWM FDBK$A HDR,1000 FDOP$A 3,INDX,,FO.RD FSRSZ$ 1 ;1 FOR GCML ; ; PROGRAM ENTRY POINT ; ; ; START: FINIT$ ALUN$S #1,#"TI,#0 GCML$ #GCLBLK ;GET A COMMAND LINE BCC 10$ EXIT$S ;ASSUME EOF 10$: CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD BCS SYNERR CSI$2 #CSIBLK,OUTPUT ;GET OUT DEV BCS SYNERR BITB #,C.STAT(R0) BNE SYNERR BITB #CS.DVF,C.STAT(R0) BEQ SYNERR CALL DEVICE ALUN$S #2,R3,R4 ; CSI$2 #CSIBLK,INPUT BCS SYNERR BITB #,C.STAT(R0) BNE SYNERR BITB #,C.STAT(R0) BEQ SYNERR MOV #CSIBLK+C.DIRD,R2 MOV #OWNER,R3 CALL .ASCPP ; CALL DEVICE ALUN$S #3,R3,R4 ALUN$S #4,R3,R4 CALL DEVCHK BCS DEVERR CALL INDEX ;HANDLE THSI INDEXFILE BR START SYNERR: DIR$ #QIO2 BR START DEVERR: DIR$ #QIO1 BR START ; ; DEVICE CHECK, RETURNS C IF BOTH DEVICES ON LUN2 3 ARE SAME ; DEVCHK: MOV #HDR,R0 GLUN$S #3,R0 ;GET INFP ON INPUT MOV (R0),R1 ;SAVE INFO MOVB 2(R0),R5 MOV #T1,R2 MOV R0,R4 MOVB (R4)+,(R2)+ MOVB (R4)+,(R2)+ MOVB (R4)+,R4 ADD #'0,R4 MOVB R4,(R2)+ MOVB #':,(R2)+ MOV OWNER,R3 CLR R4 CALL .PPASC GLUN$S #2,R0 CMP R1,(R0) BNE 10$ ;DEVICES DIFFER = OK CMPB R5,2(R0) ;UNITS BNE 10$ SEC RTS PC 10$: MOV #T2,R4 MOVB (R0)+,(R4)+ MOVB (R0)+,(R4)+ MOVB (R0)+,R0 ADD #'0,R0 MOVB R0,(R4)+ MOVB #':,(R4)+ DIR$ #QIO3 CLC RTS PC ; ; ; ; DEVICE - ROUTINE TAKES CSIBLK & RETURN DEVICE NAME IN R3, UNIT IN R4 ; FOR ALUN SERVICE ; DEVICE: MOV #CSIBLK+C.DEVD,R0 ;POINT TO DESC MOV (R0)+,R1 ;GET LENGTH MOV (R0),R0 ;AND POIJTNER MOVB (R0)+,R3 ;SET 1ST CHAR SWAB R3 CLRB R3 BISB (R0)+,R3 ;SET OTHER CHAR SWAB R3 ;GET ORDER CORRECT CLR R4 ;UNIT DEF = 0 SUB #2,R1 ;USED 2 OF LENGTH BEQ 10$ ; IF DONE STOP 1$: CMPB (R0),#': ; OR IF ":" BEQ 10$ ; THEN ALSO DONE MOVB (R0)+,R2 ; ELSE GET CHAR SUB #'0,R2 ; AS INTEGER ASL R4 ASL R4 ASL R4 ; MULT OLD R4 BY 8. ADD R2,R4 ;AND ADD IN VALUE DEC R1 ;ADJUST COUNT BGT 1$ ;MORE TO DO 10$: RTS PC ;R3,R4 SETUP.. R0,R1,R2 DESTROYED ; ; ROUTINE TO HANDLE INDEXFILES ; LUN 2,LUN3,LUN4 ASSIGNED AS REQUIRED! ; INDEX: MOV #STBK,INXFDB+F.STBK OPEN$R #INXFDB BCC 10$ HALT 10$: MOV STBK+4,INXFDB+F.HIBK MOV STBK+4,INXFDB+F.EFBK MOV STBK+6,INXFDB+F.HIBK+2 MOV STBK+6,INXFDB+F.EFBK+2 READ$ #INXFDB ;BOOT WAIT$ R0 READ$ #INXFDB WAIT$ R0 MOV HDR,R5 20$: READ$ #INXFDB WAIT$ R0 SOB R5,20$ ;SKIP BITMAP 30$: READ$ #INXFDB BCS 50$ WAIT$ R0 BCS 50$ CMP HDR,#27027 ;NEVER USED BNE 40$ TST HDR+2 BNE 40$ ;IN USE STILL CALL CHECK BCS 40$ CALL COPY 40$: BR 30$ 50$: CLOSE$ #INXFDB RETURN ;FOR NEW COMMAND ; ; ; THIS IS THE MAIN ROUTINE TO COPY A FILE, ENTERED AFTER CHECKING HEADER ; IS DELETED AND ACCEPTABLE ; ; COPY: ;ENTERED HERE WITH HDR (256 WORDS) FILE HEADER FOR FILE TO BE COPIED ;LUN 2 IS ASSIGNED TO OUTPUT DEVICE ;LUN 3 IS OPEN IN INDEXFILE ;LUN 4 IS FOR BLOCK READS OF INPUT DISK ; FUNCTIONS TO PERFORM ;A) OPEN OUTPUT FILE OF RELEVANT NAME ON LUN2 ;B) FOR ALL BLOCKS IN HEADER OF FILE, COPY BLOCK TO DATA BUFFER ; AND THEN USE WRITE$ TO PUT IN OUTPUT FILE ;C) COPY ATTRIBUTES BACK TO FDB &CLOSE ;D) RETURN - DONE ; MOV #HDR,R1 ;GET INFO ADDRESS MOVB H.IDOF(R1),R2 ;GET OFFSET TO ID AREA MOVB H.MPOF(R1),R3 ;AND TO MAP AREA ASL R2 ASL R3 ADD R1,R2 ADD R1,R3 MOV #DFNB+N.FNAM,R4 ;GET ADDRESS TO STUFF NAME INFO MOV #5,R5 ;5 WORDS ( FILENAME,TYP;EXT) 10$: MOV (R2)+,(R4)+ ; SOB R5,10$ ; OPEN$W #FDB ;OPEN FILE FOR WRITING BCC 20$ ; HALT 20$: CALL COPYBK MOV #HDR,R1 MOV #FDB,R0 ; ADD #H.UFAT,R1 ;POINT TO USER ATTRIB FOR FILE MOV #7,R5 ;7 WORDS 30$: MOV (R1)+,(R0)+ SOB R5,30$ CLOSE$ #FDB ;CLOSE WITH INFO RESTORED RTS PC ; ; ROUTINE TO COPY THE FILE BLOCKS POINTED TO BY THE MAP AREA ; ; COPYBK: ; FILE NOW OPEN ON LUN 2 ;R3 HAS ADDRESS OF MAP AREA CLR R5 BISB M.USE(R3),R5 ADD #M.RTRV,R3 ;IS NOW POINTER TO FIRST GROUP 10$: TST R5 ;IF NILL OR <0 THEN DONE BLE 50$ ;NOW DONE CLR R1 CLR R4 BISB (R3)+,R4 BISB (R3)+,R1 MOV (R3)+,R2 20$: QIOW$S #IO.RLB,#4,#4,,,,<#DATA,#1000,,R4,R2> WRITE$ #FDB BCC 30$ HALT 30$: WAIT$ R0 BCC 40$ HALT 40$: ADD #1,R2 ;STEP ON BLOCK # ADCB R4 ;IN DOUBLE PREC DEC R1 ;DONE WHEN NEG BPL 20$ ;AT LEAST 1 MORE TO GO SUB #2,R5 ; BR 10$ 50$: RTS PC ; ; ROUTINE TO CHECK IF FILE IS TO BE COPIED TO OUTPUT MEDIA ; ; ENTERED WITH BLOCK "HDR" CONTINING FILE'S HEADER ; ; RESULT C SET - DO NOT COPY ; C CLEAR - COPY TO OTHER MEDIA ; ; CHECK: CMP HDR+H.FOWN,OWNER ;CORRECT USER?? BNE 10$ ; INSERT OTHER CHECKS OR MAKE BELOW INTO RPR, SETTING C IF ANSWER N ; ; ; NOW DISPLAY NAME OF FILE BEING COPIED ; MOV #BUF,R0 MOV #HDR+S.HDHD,R5 MOV (R5)+,R1 CALL $C5TA MOV (R5)+,R1 CALL $C5TA MOV (R5)+,R1 CALL $C5TA MOVB #'.,(R0)+ MOV (R5)+,R1 CALL $C5TA MOVB #';,(R0)+ MOV (R5)+,R1 MOV R5,R2 CALL $CBOMG MOVB #40,(0)+ MOV #BUF,R1 SUB R1,R0 QIOW$S #IO.WVB,#1,#1,,,, CLC RTS PC 10$: SEC RTS PC ; ; .END START