+ case 'B':
+ p = optarg;
+#define SKIP_PREFIX(s) \
+ (STRNCMP(p, ==, s "=", sizeof(s)) && (p += sizeof(s), 1))
+ for (;;) {
+ if (SKIP_PREFIX("cf"))
+ clear_factor = parse_float(&p, 0, DBL_MAX, "clear factor");
+ else if (SKIP_PREFIX("cmin"))
+ clear_min = parse_int(&p, 1, SECLIMIT, "clear minimum");
+ else if (SKIP_PREFIX("cmax"))
+ clear_max = parse_int(&p, 1, SECLIMIT, "clear maximum");
+ else if (SKIP_PREFIX("sf"))
+ step_factor = parse_float(&p, 0, DBL_MAX, "step factor");
+ else if (SKIP_PREFIX("smin"))
+ step_min = parse_int(&p, 1, SECLIMIT - 1, "step minimum");
+ else if (SKIP_PREFIX("smax"))
+ step_max = parse_int(&p, 1, SECLIMIT - 1, "step maximum");
+ else if (SKIP_PREFIX("retry"))
+ max_retries = parse_int(&p, 0, INT_MAX, "retries");
+ else if (SKIP_PREFIX("_badwait"))
+ bad_block_delay = parse_float(&p, 0, DBL_MAX, "bad-block delay");
+ else if (SKIP_PREFIX("_blkwait"))
+ good_block_delay = parse_float(&p, 0, DBL_MAX, "good block delay");
+ else
+ bail("unknown bad blocks parameter `%s'", p);
+ if (!*p) break;
+ else if (*p != ',') bail("unexpected junk in parameters");
+ p++;
+ }
+#undef SKIP_PREFIX
+ break;
+ case 'E': errfile = optarg; break;