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));