SYSTEM@EB0UAB51.BITNET (Inaki Nunez) (11/25/86)
Hi!
It's easy to write a program to recovery the lost files.
In the program, you must do two thinks:
1) Set on the bit of the bitmap in the INDEX BITMAP.
2) Write again the ID number of the INDEXF.SYS. When the
file is deleted this number is also deleted. So, you must rewrite
this number. To do so, you must to know the ID number of the file
to recovery. It is easy to know the block number of the Indexf.sys
in which is the header of the file (suposing that you know the ID
number of the file). The ID=1 is in the block numer:
n=(cluster_size)*4+size_of_the_index_bit_map+1
If you don't know the ID number of the file to recovery, your
problem is worst. You can try to find the name of the file (I supose
you know this name, at least), and compare whith the name that is
YET in the Indexf.sys (position 4C (hexa) until 5F).
3) The file is recovered now, but it's not accesible, because
it hasn't directory. You can execute the verify of the disk
ANALIZE/DISK/REPAIR
and the files will appear in the directory SYSLOST.
Well, I'll send you a program we made long time ago.
You must write the ID numbers in a file. Be carefull with this program.
I'm not remember well but some positions (for example the position of
a file in the INDEXF.SYS and some others) are variables with the
disk, and I don't rmember if in this program these positions are
constants or variables.
Good luck!
Inaki Nunez
SYSTEM@EB0UAB51
C******************************************************************************
C *
CCC CENTRO DE CALCULO DE LA UNIVERSIDAD AUTONOMA DE BARCELONA - (CATALUNYA) *
CCC - Espana - *
C *
C Producte : RECUPERACION DE FICHEROS A PARTIR DEL -ID- *
C *
C Sistema Operativo : VAX / VMS *
C *
C Lenguaje/s Utilizado/s : VAX - 11 FORTRAN *
C _ _ *
C Elaborado por : Inaki Nunez *
C _ *
C Manuel Pena Camacho *
C *
C******************************************************************************
C*
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C C
CCC PROGRAMA PARA RECUPERAR FICHEROS MODIFICANDO EL INDEX FILE
C C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
IMPLICIT INTEGER (A-Z)
C
LOGICAL PVEZ, PVEZ2
C
CHARACTER SN*1
C
INTEGER*2 WORD(256), ACUMW
C
BYTE BLOCK(512)
C
EQUIVALENCE (WORD,BLOCK)
EQUIVALENCE (ACUMW,ACUM)
C
CCC SE ABRE EL INDEX FILE
C
OPEN (UNIT = 1,
- NAME = 'DRB1:[0,0]INDEXF.SYS',
C - NAME = 'INDEXF.TMP',
- STATUS = 'OLD',
- SHARED,
- IOSTAT = IOS)
C
IF ( IOS .NE. 0) THEN
TYPE *,'ERROR OPEN INDEX',IOS
CALL EXIT
END IF
C
CCC SE ABRE EL FICHERO QUE CONTIENE LOS ID DE LOS FICHEROS A RECUPERAR
C
OPEN (UNIT = 2,
- NAME = 'ID.DAT',
- STATUS = 'OLD',
- IOSTAT = IOS)
C
IF ( IOS .NE. 0) THEN
TYPE *,'ERROR OPEN ID',IOS
CALL EXIT
END IF
C
CCC LECTURAS EN FALSO PARA OBTENER EL 1.ER BLOQUE DEL INDEX BIT MAP
C
DO I = 1,9
READ (1,10,IOSTAT=IOS) BLOCK
10 FORMAT (512A1)
IF (IOSTAT .NE. 0) THEN
TYPE *,'ERROR LECTURA ',IOS
CALL EXIT
END IF
END DO
C
CCC LECTURA DEL PRIMER ID A SALVAR
C
PVEZ2 = .TRUE.
RESTA = 0
1 READ (2,5,ERR=9000)ID
5 FORMAT (O6)
C
CCC OBTENER EL BYTE Y EL BIT A LEVANTAR EN EL INDEX BIT MAP,
CCC SI BYTE>512 NUEVA LECTURA
C
BYTE = (ID / 8) + 1 - RESTA
BIT = MOD (ID,8) - 1
C
IF (BIT .LT. 0) THEN
BIT = 7
BYTE = BYTE - 1
END IF
C
IF (BYTE .GT. 512 .AND. PVEZ2) THEN
PVEZ2 = .FALSE.
BYTE = BYTE - 512
RESTA = 512
C
REWRITE (1,10,IOSTAT=IOS)BLOCK
IF (IOSTAT .NE. 0) THEN
TYPE *,'ERROR REWRITE 1 ',IOS
CALL EXIT
END IF
C
READ (1,10,IOSTAT=IOS) BLOCK
IF (IOSTAT .NE. 0) THEN
TYPE *,'ERROR LECTURA ',IOS
CALL EXIT
END IF
END IF
C
CALL LIB$INSV (1,BIT,1,BLOCK (BYTE))
C
GO TO 1
C
9000 REWRITE (1,10,IOSTAT=IOS)BLOCK
IF (IOSTAT .NE. 0) THEN
TYPE *,'ERROR REWRITE 2 ',IOS
CALL EXIT
END IF
C
CCC SE CIERRAN LOS FICHEROS PARA REPOSICIONARNOS AL PRINCIPIO
C
CLOSE (UNIT = 1)
CLOSE (UNIT = 2)
C
CCC SE VUELVEN A ABRIR LOS FICHEROS
C
OPEN (UNIT = 1,
- NAME = 'DRB1:[0,0]INDEXF.SYS',
C - NAME = 'INDEXF.TMP',
- STATUS = 'OLD',
- SHARED,
- IOSTAT = IOS)
C
IF ( IOS .NE. 0) THEN
TYPE *,'ERROR OPEN INDEX',IOS
CALL EXIT
END IF
C
OPEN (UNIT = 2,
- NAME = 'ID.DAT',
- STATUS = 'OLD',
- IOSTAT = IOS)
C
IF ( IOS .NE. 0) THEN
TYPE *,'ERROR OPEN ID',IOS
CALL EXIT
END IF
C
CCC LECTURA DEL ID DEL FICHERO A RECUPERAR
C
PVEZ = .TRUE.
1000 READ (2,5,ERR=9999)ID
C
IF(PVEZ) THEN
I2 = 14+ID
PVEZ = .FALSE.
IDANT = ID
ELSE
I2= ID - IDANT
IDANT = ID
END IF
C
CCC LECTURA DEL HEADER CORRESPONDIENTE AL FICHERO QUE TENGA EL ID LEIDO
C
DO I = 1,I2
READ (1,10,IOSTAT=IOS) BLOCK
IF (IOSTAT .NE. 0) THEN
TYPE *,'ERROR LECTURA (2) ',IOS
CALL EXIT
END IF
END DO
C
CCC SE DISPLAYA EL NOMBRE DEL FICHERO PARA COMPROBACION
C
TYPE 20,(BLOCK(I),I=77,90)
20 FORMAT (' ^ NOM DEL FITXER : ',14A)
C
CCC SE VERIFICA QUE ESTE ES EL FICHERO QUE SE PRETENDE RECUPERAR
C
TYPE 25
25 FORMAT (' ^ VOLS ? ',$)
ACCEPT 30,SN
30 FORMAT (A1)
C
IF (SN .EQ. 'S') THEN
C
CCC EN CASO AFIRMATIVO SE PONE EL ID, Y SE CALCULA EL CHECKSUM
C
WORD (5) = ID
ACUM = 0
DO I = 1,255
ACUM = ACUM + WORD(I)
END DO
C
WORD (256) = ACUMW
C
CCC SE REESCRIBE EL HEADER EN EL INDEX FILE
C
REWRITE (1,10,IOSTAT=IOS)BLOCK
IF (IOSTAT .NE. 0) THEN
TYPE *,'ERROR REWRITE (3) ',IOS
CALL EXIT
END IF
ELSE
TYPE *,' ^ NO HAGO NADA'
END IF
GO TO 1000
C
CCC FIN
C
9999 CALL EXIT
ENDcarl@CITHEX.CALTECH.EDU.UUCP (02/12/87)
> I've come across two ways of handling login command files, and wonder > whether anyone knows a reason to prefer (or abhor) one or the other: > 1. SYS$SYLOGIN is defined to point to a system-wide login command > procedure, which is thus invoked for all processes. LGICMD (in the > UAF) for each user is defined to point to the file LOGIN.COM in that > user's home directory. > 2. SYS$SYLOGIN is undefined, but LGICMD for *all* users points to > the system-wide login command procedure. A line late in this command > procedure checks to see if a user LOGIN.COM exists, and, if so, > executes it. > As far as I can tell, these two methods are superficially equivalent. > Each results in both levels of command procedure being executed in the > proper order, and neither chokes if no user LOGIN.COM is present. > Comments? Using the logical name SYS$SYLOGIN: forces all logins to use the command procedure so defined, regardless of the /COM= and /NOCOM qualifiers to the username, whereas either of these qualifiers may be used to override the default LGICMD specified in SYSUAF (unless appropriate flags are set).