* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
static char sccsid
[] = "@(#)dcheck.c 5.1 (Berkeley) %G%";
* dcheck - check directory consistency
#define MAXNINDIR (MAXBSIZE / sizeof (daddr_t))
struct dinode itab
[MAXIPG
];
printf("Bad flag %c\n", (*argv
)[1]);
printf("cannot open %s\n", file
);
bread(SBLOCK
, (char *)&sblock
, SBSIZE
);
if (sblock
.fs_magic
!= FS_MAGIC
) {
printf("%s: not a file system\n", file
);
nfiles
= sblock
.fs_ipg
* sblock
.fs_ncg
;
ecount
= (ino_t
*)malloc((nfiles
+1) * sizeof (*ecount
));
printf("%s: not enough core for %d files\n", file
, nfiles
);
for (i
= 0; i
<=nfiles
; i
++)
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(fsbtodb(&sblock
, cgimin(&sblock
, c
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for (j
= 0; j
< sblock
.fs_ipg
; j
++) {
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
bread(fsbtodb(&sblock
, cgimin(&sblock
, c
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for (j
= 0; j
< sblock
.fs_ipg
; j
++) {
register struct dinode
*ip
;
register struct direct
*dp
;
if((ip
->di_mode
&IFMT
) != IFDIR
)
for (dp
= readdir(&dirp
); dp
!= NULL
; dp
= readdir(&dirp
)) {
if(dp
->d_ino
> nfiles
|| dp
->d_ino
< ROOTINO
) {
printf("%d bad; %d/%s\n",
dp
->d_ino
, ino
, dp
->d_name
);
for (k
= 0; ilist
[k
] != 0; k
++)
if (ilist
[k
] == dp
->d_ino
) {
printf("%d arg; %d/%s\n",
dp
->d_ino
, ino
, dp
->d_name
);
register struct dinode
*ip
;
if ((ip
->di_mode
&IFMT
)==0 && ecount
[i
]==0)
if (ip
->di_nlink
==ecount
[i
] && ip
->di_nlink
!=0)
printf(" entries link cnt\n");
printf("%u\t%d\t%d\n", ino
,
ecount
[i
], ip
->di_nlink
);
* get next entry in a directory.
register struct dirstuff
*dirp
;
register struct direct
*dp
;
if (dirp
->loc
>= dirp
->ip
->di_size
)
if ((lbn
= lblkno(&sblock
, dirp
->loc
)) == 0) {
bread(fsbtodb(&sblock
, d
), dirp
->dbuf
,
dblksize(&sblock
, dirp
->ip
, lbn
));
(dirp
->dbuf
+ blkoff(&sblock
, dirp
->loc
));
dirp
->loc
+= dp
->d_reclen
;
lseek(fi
, bno
* DEV_BSIZE
, 0);
if (read(fi
, buf
, cnt
) != cnt
) {
printf("read error %d\n", bno
);
if(i
> NINDIR(&sblock
)) {
printf("%u - huge directory\n", ino
);
bread(fsbtodb(&sblock
, gip
->di_ib
[0]), (char *)ibuf
, sizeof(ibuf
));