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
28extern int isatty(int);
29
30const char * program_name = "iscan";
31const char * device_name = NULL;
32
33int yflag = 0;
34int nflag = 0;
35int preen = 0;
36int inode_buffer_blocks = 0;
37int invalid_bitmaps = 0;
38
39struct resource_track	global_rtrack;
40
41static 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
49static 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
93int 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