static char *sccsid
= "@(#)dcheck.c 1.4 (Berkeley) %G%";
* dcheck - check directory consistency
#define NDIR(fs) ((fs)->fs_bsize/sizeof(struct direct))
#define MAXNDIR (MAXBSIZE/sizeof(struct direct))
#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
, MAXBSIZE
);
if (sblock
.fs_magic
!= FS_MAGIC
) {
printf("%s: not a file system\n", file
);
nfiles
= sblock
.fs_ipg
* sblock
.fs_ncg
;
printf("%s: preposterous number of files\n", file
);
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(c
, &sblock
)), (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(c
, &sblock
)), (char *)itab
,
sblock
.fs_ipg
* sizeof (struct dinode
));
for (j
= 0; j
< sblock
.fs_ipg
; j
++) {
register struct dinode
*ip
;
struct direct dbuf
[MAXNDIR
];
if((ip
->di_mode
&IFMT
) != IFDIR
)
bread(fsbtodb(&sblock
, d
), (char *)dbuf
, sblock
.fs_bsize
);
for(j
=0; j
< NDIR(&sblock
); j
++) {
doff
+= sizeof(struct direct
);
if(kno
> nfiles
|| kno
< ROOTINO
) {
printf("%d bad; %d/%.*s\n",
kno
, ino
, DIRSIZ
, dp
->d_name
);
for (k
=0; ilist
[k
] != 0; k
++)
printf("%d arg; %d/%.*s\n",
kno
, ino
, DIRSIZ
, 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
);
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
));