+ for (argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++)
+ ;
+ if (nl[X_DK_NDRIVE].n_value == 0) {
+ printf("dk_ndrive undefined in system\n");
+ exit(1);
+ }
+ lseek(mf, nl[X_DK_NDRIVE].n_value, L_SET);
+ read(mf, &dk_ndrive, sizeof (dk_ndrive));
+ if (dk_ndrive <= 0) {
+ printf("dk_ndrive %d\n", dk_ndrive);
+ exit(1);
+ }
+ dr_select = (int *)calloc(dk_ndrive, sizeof (int));
+ dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
+ dk_mspw = (float *)calloc(dk_ndrive, sizeof (float));
+#define allocate(e, t) \
+ s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \
+ s1./**/e = (t *)calloc(dk_ndrive, sizeof (t));
+ allocate(dk_time, long);
+ allocate(dk_wds, long);
+ allocate(dk_seek, long);
+ allocate(dk_xfer, long);
+ for (arg = buf, i = 0; i < dk_ndrive; i++) {
+ dr_name[i] = arg;
+ sprintf(dr_name[i], "dk%d", i);
+ arg += strlen(dr_name[i]) + 1;
+ }
+ read_names();
+ lseek(mf, (long)nl[X_HZ].n_value, L_SET);
+ read(mf, &hz, sizeof hz);
+ lseek(mf, (long)nl[X_PHZ].n_value, L_SET);
+ read(mf, &phz, sizeof phz);
+ if (phz)
+ hz = phz;
+ lseek(mf, (long)nl[X_DK_MSPW].n_value, L_SET);
+ read(mf, dk_mspw, dk_ndrive*sizeof (dk_mspw));
+ /*
+ * Choose drives to be displayed. Priority
+ * goes to (in order) drives supplied as arguments,
+ * default drives. If everything isn't filled
+ * in and there are drives not taken care of,
+ * display the first few that fit.
+ */
+ ndrives = 0;
+ while (argc > 0 && !isdigit(argv[0][0])) {
+ for (i = 0; i < dk_ndrive; i++) {
+ if (strcmp(dr_name[i], argv[0]))
+ continue;
+ dr_select[i] = 1;
+ ndrives++;
+ }
+ argc--, argv++;
+ }
+ for (i = 0; i < dk_ndrive && ndrives < 4; i++) {
+ if (dr_select[i] || dk_mspw[i] == 0.0)
+ continue;
+ for (cp = defdrives; *cp; cp++)
+ if (strcmp(dr_name[i], *cp) == 0) {
+ dr_select[i] = 1;
+ ndrives++;
+ break;
+ }
+ }
+ for (i = 0; i < dk_ndrive && ndrives < 4; i++) {
+ if (dr_select[i])
+ continue;
+ dr_select[i] = 1;
+ ndrives++;
+ }
+ if (argc > 1)
+ iter = atoi(argv[1]);
+ signal(SIGCONT, printhdr);