119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Test to see how quickly we can scan the inode table (not doing
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * anything else)
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h>
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ctype.h>
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <termios.h>
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h>
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h>
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_ERRNO_H
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h>
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_MNTENT_H
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <mntent.h>
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h>
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_MALLOC_H
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <malloc.h>
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "et/com_err.h"
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2fsck.h"
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "../version.h"
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int isatty(int);
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char * program_name = "iscan";
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char * device_name = NULL;
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint yflag = 0;
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint nflag = 0;
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint preen = 0;
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint inode_buffer_blocks = 0;
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint invalid_bitmaps = 0;
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct resource_track	global_rtrack;
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void usage(void)
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	fprintf(stderr,
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		_("Usage: %s [-F] [-I inode_buffer_blocks] device\n"),
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		program_name);
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	exit(1);
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void PRS(int argc, char *argv[])
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		flush = 0;
548558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	int		c;
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef MTRACE
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	extern void	*mallwatch;
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval;
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	setbuf(stdout, NULL);
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	setbuf(stderr, NULL);
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	initialize_ext2_error_table();
633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (argc && *argv)
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		program_name = *argv;
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while ((c = getopt (argc, argv, "FI")) != EOF)
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		switch (c) {
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case 'F':
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			flush = 1;
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case 'I':
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			inode_buffer_blocks = atoi(optarg);
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		default:
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			usage ();
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	device_name = argv[optind];
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (flush) {
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		int	fd = open(device_name, O_RDONLY, 0);
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (fd < 0) {
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			com_err("open", errno,
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			    _("while opening %s for flushing"), device_name);
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(FSCK_ERROR);
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if ((retval = ext2fs_sync_device(fd, 1))) {
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			com_err("ext2fs_sync_device", retval,
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				_("while trying to flush %s"), device_name);
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(FSCK_ERROR);
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		close(fd);
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main (int argc, char *argv[])
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval = 0;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		exit_value = FSCK_OK;
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_filsys	fs;
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_ino_t	ino;
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	__u32	num_inodes = 0;
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ext2_inode inode;
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_inode_scan	scan;
1043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	init_resource_track(&global_rtrack);
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	PRS(argc, argv);
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_open(device_name, 0,
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			     0, 0, unix_io_manager, &fs);
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval) {
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		com_err(program_name, retval, _("while trying to open %s"),
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			device_name);
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ehandler_init(fs->io);
1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan);
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval) {
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		com_err(program_name, retval, _("while opening inode scan"));
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (1) {
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		retval = ext2fs_get_next_inode(scan, &ino, &inode);
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (retval) {
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			com_err(program_name, retval,
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				_("while getting next inode"));
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(1);
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ino == 0)
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		num_inodes++;
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
1363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	print_resource_track(NULL, &global_rtrack);
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf(_("%u inodes scanned.\n"), num_inodes);
1393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	exit(0);
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
142