1 /*
2  * Test to see how quickly we can scan the inode table (not doing
3  * anything else)
4  */
5 
6 #include "config.h"
7 #include <string.h>
8 #include <fcntl.h>
9 #include <ctype.h>
10 #include <termios.h>
11 #include <time.h>
12 #ifdef HAVE_GETOPT_H
13 #include <getopt.h>
14 #endif
15 #include <unistd.h>
16 #ifdef HAVE_ERRNO_H
17 #include <errno.h>
18 #endif
19 #include <sys/ioctl.h>
20 #ifdef HAVE_MALLOC_H
21 #include <malloc.h>
22 #endif
23 
24 #include "et/com_err.h"
25 #include "e2fsck.h"
26 #include "../version.h"
27 
28 extern int isatty(int);
29 
30 const char * program_name = "iscan";
31 const char * device_name = NULL;
32 
33 int yflag = 0;
34 int nflag = 0;
35 int preen = 0;
36 int inode_buffer_blocks = 0;
37 int invalid_bitmaps = 0;
38 
39 struct resource_track	global_rtrack;
40 
usage(void)41 static void usage(void)
42 {
43 	fprintf(stderr,
44 		_("Usage: %s [-F] [-I inode_buffer_blocks] device\n"),
45 		program_name);
46 	exit(1);
47 }
48 
PRS(int argc,char * argv[])49 static void PRS(int argc, char *argv[])
50 {
51 	int		flush = 0;
52 	int		c;
53 #ifdef MTRACE
54 	extern void	*mallwatch;
55 #endif
56 	errcode_t	retval;
57 
58 	setbuf(stdout, NULL);
59 	setbuf(stderr, NULL);
60 	initialize_ext2_error_table();
61 
62 	if (argc && *argv)
63 		program_name = *argv;
64 	while ((c = getopt (argc, argv, "FI")) != EOF)
65 		switch (c) {
66 		case 'F':
67 			flush = 1;
68 			break;
69 		case 'I':
70 			inode_buffer_blocks = atoi(optarg);
71 			break;
72 		default:
73 			usage ();
74 		}
75 	device_name = argv[optind];
76 	if (flush) {
77 		int	fd = open(device_name, O_RDONLY, 0);
78 
79 		if (fd < 0) {
80 			com_err("open", errno,
81 			    _("while opening %s for flushing"), device_name);
82 			exit(FSCK_ERROR);
83 		}
84 		if ((retval = ext2fs_sync_device(fd, 1))) {
85 			com_err("ext2fs_sync_device", retval,
86 				_("while trying to flush %s"), device_name);
87 			exit(FSCK_ERROR);
88 		}
89 		close(fd);
90 	}
91 }
92 
main(int argc,char * argv[])93 int main (int argc, char *argv[])
94 {
95 	errcode_t	retval = 0;
96 	int		exit_value = FSCK_OK;
97 	ext2_filsys	fs;
98 	ext2_ino_t	ino;
99 	__u32	num_inodes = 0;
100 	struct ext2_inode inode;
101 	ext2_inode_scan	scan;
102 
103 	init_resource_track(&global_rtrack);
104 
105 	PRS(argc, argv);
106 
107 	retval = ext2fs_open(device_name, 0,
108 			     0, 0, unix_io_manager, &fs);
109 	if (retval) {
110 		com_err(program_name, retval, _("while trying to open '%s'"),
111 			device_name);
112 		exit(1);
113 	}
114 
115 	ehandler_init(fs->io);
116 
117 	retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan);
118 	if (retval) {
119 		com_err(program_name, retval, _("while opening inode scan"));
120 		exit(1);
121 	}
122 
123 	while (1) {
124 		retval = ext2fs_get_next_inode(scan, &ino, &inode);
125 		if (retval) {
126 			com_err(program_name, retval,
127 				_("while getting next inode"));
128 			exit(1);
129 		}
130 		if (ino == 0)
131 			break;
132 		num_inodes++;
133 	}
134 
135 	print_resource_track(NULL, &global_rtrack);
136 	printf(_("%u inodes scanned.\n"), num_inodes);
137 
138 	exit(0);
139 }
140