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.
17 #include <sys/types.h>
27 struct inode_walk_struct {
28 struct inode_info *iarray;
35 static int ncheck_proc(struct ext2_dir_entry *dirent,
41 struct inode_walk_struct *iw = (struct inode_walk_struct *) private;
45 if (iw->position <= 2)
47 for (i=0; i < iw->num_inodes; i++) {
48 if (iw->iarray[i].ino == dirent->inode) {
49 iw->iarray[i].parent = iw->parent;
59 void do_ncheck(int argc, char **argv)
61 struct inode_walk_struct iw;
62 struct inode_info *iinfo;
64 ext2_inode_scan scan = 0;
66 struct ext2_inode inode;
71 com_err(argv[0], 0, "Usage: ncheck <inode number> ...");
74 if (check_fs_open(argv[0]))
77 iw.iarray = malloc(sizeof(struct inode_info) * argc);
79 com_err("do_ncheck", ENOMEM,
80 "while allocating inode info array");
83 memset(iw.iarray, 0, sizeof(struct inode_info) * argc);
85 for (i=1; i < argc; i++) {
86 iw.iarray[i-1].ino = strtol(argv[i], &tmp, 0);
88 com_err(argv[0], 0, "Bad inode - %s", argv[i]);
93 iw.num_inodes = iw.inodes_left = argc-1;
95 retval = ext2fs_open_inode_scan(current_fs, 0, &scan);
97 com_err("ncheck", retval, "while opening inode scan");
101 retval = ext2fs_get_next_inode(scan, &ino, &inode);
103 com_err("ncheck", retval, "while starting inode scan");
108 if (!inode.i_links_count)
111 * To handle filesystems touched by 0.3c extfs; can be
116 /* Ignore anything that isn't a directory */
117 if (!LINUX_S_ISDIR(inode.i_mode))
123 retval = ext2fs_dir_iterate(current_fs, ino, 0, 0,
126 com_err("ncheck", retval,
127 "while calling ext2_dir_iterate");
131 if (iw.inodes_left == 0)
135 retval = ext2fs_get_next_inode(scan, &ino, &inode);
137 com_err("ncheck", retval,
138 "while doing inode scan");
143 for (i=0, iinfo = iw.iarray; i < iw.num_inodes; i++, iinfo++) {
144 if (iinfo->parent == 0)
146 retval = ext2fs_get_pathname(current_fs, iinfo->parent,
147 iinfo->ino, &iinfo->pathname);
149 com_err("ncheck", retval,
150 "while resolving pathname for inode %d (%d)",
151 iinfo->parent, iinfo->ino);
154 printf("Inode\tPathname\n");
155 for (i=0, iinfo = iw.iarray; i < iw.num_inodes; i++, iinfo++) {
156 if (iinfo->parent == 0) {
157 printf("%ld\t<inode not found>\n", iinfo->ino);
160 printf("%ld\t%s\n", iinfo->ino, iinfo->pathname ?
161 iinfo->pathname : "<unknown pathname>");
163 free(iinfo->pathname);
169 ext2fs_close_inode_scan(scan);