2 * ncheck.c --- given a list of inodes, generate a list of names
4 * Copyright (C) 1994 Theodore Ts'o. This file may be redistributed
5 * under the terms of the GNU Public License.
18 #include <sys/types.h>
28 struct inode_walk_struct
{
35 unsigned int get_pathname_failed
:1;
36 unsigned int check_dirent
:1;
39 static int ncheck_proc(struct ext2_dir_entry
*dirent
,
40 int offset
EXT2FS_ATTR((unused
)),
41 int blocksize
EXT2FS_ATTR((unused
)),
42 char *buf
EXT2FS_ATTR((unused
)),
45 struct inode_walk_struct
*iw
= (struct inode_walk_struct
*) private;
46 struct ext2_inode inode
;
48 int filetype
= ext2fs_dirent_file_type(dirent
);
52 if (iw
->position
<= 2)
54 for (i
=0; i
< iw
->num_inodes
; i
++) {
55 if (iw
->iarray
[i
] == dirent
->inode
) {
56 if (!iw
->parent
&& !iw
->get_pathname_failed
) {
57 retval
= ext2fs_get_pathname(current_fs
,
61 com_err("ncheck", retval
,
62 "while calling ext2fs_get_pathname for inode #%u", iw
->dir
);
63 iw
->get_pathname_failed
= 1;
67 printf("%u\t%s/%.*s", iw
->iarray
[i
],
69 ext2fs_dirent_name_len(dirent
),
72 printf("%u\t<%u>/%.*s", iw
->iarray
[i
],
74 ext2fs_dirent_name_len(dirent
),
76 if (iw
->check_dirent
&& filetype
) {
77 if (!debugfs_read_inode(dirent
->inode
, &inode
,
79 filetype
!= ext2_file_type(inode
.i_mode
)) {
80 printf(" <--- BAD FILETYPE");
93 void do_ncheck(int argc
, char **argv
, int sci_idx
EXT2FS_ATTR((unused
)),
94 void *infop
EXT2FS_ATTR((unused
)))
96 struct inode_walk_struct iw
;
98 ext2_inode_scan scan
= 0;
100 struct ext2_inode inode
;
107 while ((c
= getopt (argc
, argv
, "c")) != EOF
) {
119 com_err(argv
[0], 0, "Usage: ncheck [-c] <inode number> ...");
122 if (check_fs_open(argv
[0]))
127 iw
.iarray
= malloc(sizeof(ext2_ino_t
) * argc
);
129 com_err("ncheck", ENOMEM
,
130 "while allocating inode number array");
133 memset(iw
.iarray
, 0, sizeof(ext2_ino_t
) * argc
);
136 for (i
=0; i
< argc
; i
++) {
137 iw
.iarray
[i
] = strtol(argv
[i
], &tmp
, 0);
139 com_err("ncheck", 0, "Bad inode - %s", argv
[i
]);
142 if (debugfs_read_inode(iw
.iarray
[i
], &inode
, *argv
))
144 if (LINUX_S_ISDIR(inode
.i_mode
))
147 iw
.names_left
+= inode
.i_links_count
;
150 iw
.num_inodes
= argc
;
152 retval
= ext2fs_open_inode_scan(current_fs
, 0, &scan
);
154 com_err("ncheck", retval
, "while opening inode scan");
159 retval
= ext2fs_get_next_inode(scan
, &ino
, &inode
);
160 } while (retval
== EXT2_ET_BAD_BLOCK_IN_INODE_TABLE
);
162 com_err("ncheck", retval
, "while starting inode scan");
166 printf("Inode\tPathname\n");
168 if (!inode
.i_links_count
)
171 * To handle filesystems touched by 0.3c extfs; can be
176 /* Ignore anything that isn't a directory */
177 if (!LINUX_S_ISDIR(inode
.i_mode
))
183 iw
.get_pathname_failed
= 0;
185 retval
= ext2fs_dir_iterate(current_fs
, ino
, 0, 0,
187 ext2fs_free_mem(&iw
.parent
);
189 com_err("ncheck", retval
,
190 "while calling ext2_dir_iterate");
194 if (iw
.names_left
== 0)
199 retval
= ext2fs_get_next_inode(scan
, &ino
, &inode
);
200 } while (retval
== EXT2_ET_BAD_BLOCK_IN_INODE_TABLE
);
203 com_err("ncheck", retval
,
204 "while doing inode scan");
212 ext2fs_close_inode_scan(scan
);