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