9
static char *input_path = 0;
10
static int quiet = 0, showpaths = 0, searchcount = 1;
11
static int error_count = 0, bad_count = 0;
12
static path_hashinfo phi;
13
static dump_parser dp;
15
/* Print a usage message and exit */
16
static void usage(int status, char *msg)
18
if (msg) fprintf(stderr, "%s: %s\n", argv0, msg);
19
fprintf(stderr, "Usage: %s [options] [file]\n", argv0);
20
fprintf(stderr, " -h Print this help message\n");
21
fprintf(stderr, " -p Print paths of bad vnodes\n");
22
fprintf(stderr, " -q Quiet mode (don't print errors)\n");
27
/* Parse the command-line options */
28
static void parse_options(int argc, char **argv)
32
if (argv0 = strrchr(argv[0], '/')) argv0++;
35
/* Parse the options */
36
while ((c = getopt(argc, argv, "n:hpq")) != EOF) {
38
case 'n': searchcount = atoi(optarg); continue;
39
case 'p': showpaths = 1; continue;
40
case 'q': quiet = 1; continue;
41
case 'h': usage(0, 0);
42
default: usage(1, "Invalid option!");
46
if (argc - optind > 1) usage(1, "Too many arguments!");
47
input_path = (argc == optind) ? "-" : argv[optind];
51
/* A callback to count and print errors */
52
static afs_uint32 my_error_cb(afs_uint32 code, int fatal, void *ref, char *msg, ...)
59
com_err_va(argv0, code, msg, alist);
65
/* A callback to process file vnodes */
66
static afs_uint32 my_file_cb(afs_vnode *v, XFILE *X, void *refcon)
68
static char buf[1024];
69
afs_uint32 size, nulls, cnulls, maxcnulls, n, r;
73
nulls = cnulls = maxcnulls = 0;
75
if ((r = xfseek(X, &v->d_offset))) return r;
77
n = (size > 1024) ? 1024 : size;
78
if (r = xfread(X, buf, n)) return r;
79
for (i = 0; i < n; i++) {
81
if (cnulls > maxcnulls) maxcnulls = cnulls;
90
if (maxcnulls >= searchcount) {
92
if (showpaths) Path_Build(X, &phi, v->vnode, &name, 0);
94
printf("*** BAD %d (%s) - %d nulls, %d consecutive\n",
95
v->vnode, name, nulls, maxcnulls);
98
printf("*** BAD %d - %d nulls, %d consecutive\n",
99
v->vnode, nulls, maxcnulls);
106
int main(int argc, char **argv)
111
parse_options(argc, argv);
112
initialize_acfg_error_table();
113
initialize_AVds_error_table();
114
initialize_rxk_error_table();
115
initialize_u_error_table();
116
initialize_vl_error_table();
117
initialize_vols_error_table();
118
initialize_xFil_error_table();
119
r = xfopen(&input_file, O_RDONLY, input_path);
121
com_err(argv0, r, "opening %s", input_path);
125
memset(&dp, 0, sizeof(dp));
126
dp.cb_error = my_error_cb;
127
if (input_file.is_seekable) dp.flags |= DSFLAG_SEEK;
131
memset(&phi, 0, sizeof(phi));
134
if ((r = xftell(&input_file, &where))
135
|| (r = Path_PreScan(&input_file, &phi, 0))
136
|| (r = xfseek(&input_file, &where))) {
137
com_err(argv0, r, "- path initialization failed");
138
xfclose(&input_file);
143
dp.cb_vnode_file = my_file_cb;
144
r = ParseDumpFile(&input_file, &dp);
145
xfclose(&input_file);
147
if (error_count) printf("*** %d errors\n", error_count);
148
if (bad_count) printf("*** %d bad files\n", bad_count);
149
if (r && !quiet) printf("*** FAILED: %s\n", error_message(r));