4 #include "fsck_helper.h"
7 static bool parse_directory(uint32_t inodeidx
)
11 uint32_t den
, den_max
, den_mod
;
12 SOInode inode
, newinode
;
13 SODirEntry dec
[DPC
]; /* direntry cluster */
17 fetch_superblock(&sb
);
21 fret
= soReadInode(&inode
, inodeidx
);
22 if (fret
< 0) FABORT(fret
, "parse_directory");
24 if ((inode
.size
% sizeof(SODirEntry
)) != 0) {
25 printf("Inode %d is a directory but its size is not multiple of "
26 "sizeof(SODirEntry).\n", inodeidx
);
30 den_max
= inode
.size
/sizeof(SODirEntry
);
31 for (den
= 0; den
< den_max
; ++den
) {
32 /* read a new cluster when necessary */
35 fret
= soReadFileCluster(inodeidx
, den
/DPC
, dec
);
36 if (fret
< 0) FABORT(fret
, "parse_directory");
38 /* process direntry */
39 if (dec
[den_mod
].name
[0] != '\0') {
40 /* check validity of inode address */
41 if (dec
[den_mod
].inode
>= sb
->itotal
) {
42 printf("Direntry number %d of inode %d is pointing to %d, "
43 "which lies outside inode table.\n", den
,
44 inodeidx
, dec
[den_mod
].inode
);
48 fret
= soReadInode(&newinode
, dec
[den_mod
].inode
);
49 if (fret
< 0) FABORT(fret
, "parse_directory");
52 irtable_inc(dec
[den_mod
].inode
);
53 ictable_get(dec
[den_mod
].inode
, &icstat
);
56 ictable_set(dec
[den_mod
].inode
, busy
);
59 printf ("Inode %d is marked as free but is in use.\n",
63 /* already parsed this inode */
66 printf("BUM! ictable has something strange in it.\n");
71 /* don't parse direntries pointing to non directories, inodes
72 * already parsed or this inode
74 if (((newinode
.mode
& INODE_DIR
) == INODE_DIR
) &&
76 (dec
[den_mod
].inode
!= inodeidx
))
78 ret
= parse_directory(dec
[den_mod
].inode
);
87 testresult_t
test_inused(void)
93 /* begin in root directory */
94 if (parse_directory(0) == false) {