if (n == want) good = pos;
else bad_hi = pos + n + 1;
}
- recovered(bad_lo, bad_hi); *pos_inout = good;
- if (good < r.pos + r.start || r.pos + r.end <= good)
+ recovered(bad_lo, bad_hi); *pos_inout = bad_hi;
+ if (bad_hi < r.pos + r.start || r.pos + r.end <= bad_hi)
n = 0;
else {
- n = r.pos + r.end - good;
- rearrange_sectors(&r, 0, good - r.pos, n);
+ n = r.pos + r.end - bad_hi;
+ rearrange_sectors(&r, 0, bad_hi - r.pos, n);
}
#ifdef DEBUG
show_recovery_buffer_map(&r, "returning %zd good sectors at %"PRIuSEC"",
- n, good);
+ n, bad_hi);
#endif
return (n);
}
return (0);
}
-static double parse_float(const char **p_inout, double min, double max,
- const char *what)
-{
- const char *p;
- char *q;
- double x;
- int err;
-
- err = errno; errno = 0;
- p = *p_inout;
- x = strtod(p, &q);
- if (errno || x < min || x > max) bail("bad %s `%s'", what, p);
- *p_inout = q; errno = err;
- return (x);
-}
-
-static long parse_int(const char **p_inout, long min, long max,
- const char *what)
-{
- const char *p;
- char *q;
- long x;
- int err;
-
- err = errno; errno = 0;
- p = *p_inout;
- x = strtoul(p, &q, 0);
- if (errno || x < min || x > max) bail("bad %s `%s'", what, p);
- *p_inout = q; errno = err;
- return (x);
-}
-
#define PRF_HYPHEN 1u
static int parse_range(const char *p, unsigned f,
secaddr *start_out, secaddr *end_out)
(STRNCMP(p, ==, s "=", sizeof(s)) && (p += sizeof(s), 1))
for (;;) {
if (SKIP_PREFIX("cf"))
- clear_factor = parse_float(&p, 0, DBL_MAX, "clear factor");
+ clear_factor = parse_float(&p, PNF_JUNK, 0, DBL_MAX,
+ "clear factor");
else if (SKIP_PREFIX("cmin"))
- clear_min = parse_int(&p, 1, SECLIMIT, "clear minimum");
+ clear_min = parse_int(&p, PNF_JUNK, 1, SECLIMIT,
+ "clear minimum");
else if (SKIP_PREFIX("cmax"))
- clear_max = parse_int(&p, 1, SECLIMIT, "clear maximum");
+ clear_max = parse_int(&p, PNF_JUNK, 1, SECLIMIT,
+ "clear maximum");
else if (SKIP_PREFIX("sf"))
- step_factor = parse_float(&p, 0, DBL_MAX, "step factor");
+ step_factor = parse_float(&p, PNF_JUNK, 0, DBL_MAX,
+ "step factor");
else if (SKIP_PREFIX("smin"))
- step_min = parse_int(&p, 1, SECLIMIT - 1, "step minimum");
+ step_min = parse_int(&p, PNF_JUNK, 1, SECLIMIT - 1,
+ "step minimum");
else if (SKIP_PREFIX("smax"))
- step_max = parse_int(&p, 1, SECLIMIT - 1, "step maximum");
+ step_max = parse_int(&p, PNF_JUNK, 1, SECLIMIT - 1,
+ "step maximum");
else if (SKIP_PREFIX("retry"))
- max_retries = parse_int(&p, 0, INT_MAX, "retries");
+ max_retries = parse_int(&p, PNF_JUNK, 0, INT_MAX, "retries");
else if (SKIP_PREFIX("alpha"))
- alpha = parse_float(&p, 0, 1, "average decay factor");
+ alpha = parse_float(&p, PNF_JUNK, 0, 1, "average decay factor");
else if (SKIP_PREFIX("_badwait"))
- bad_block_delay = parse_float(&p, 0, DBL_MAX, "bad-block delay");
+ bad_block_delay = parse_float(&p, PNF_JUNK, 0, DBL_MAX,
+ "bad-block delay");
else if (SKIP_PREFIX("_blkwait"))
- good_block_delay = parse_float(&p, 0, DBL_MAX, "good block delay");
+ good_block_delay = parse_float(&p, PNF_JUNK, 0, DBL_MAX,
+ "good block delay");
else
bail("unknown bad blocks parameter `%s'", p);
if (!*p) break;
#endif
}
- open_dvd(device, &dvdfd, &dvd);
+ open_dvd(device, O_RDONLY, &dvdfd, &dvd);
blksz = SECTORSZ; volsz = device_size(dvdfd, device, &blksz);
if (blksz != SECTORSZ)
device, volsz, SECTORSZ);
if (f&f_checkid) {
- open_dvd(outfile, 0, &dvd_out);
+ open_dvd(outfile, O_RDONLY, 0, &dvd_out);
if (dvd_id(id_in, dvd, DIF_MUSTIFOHASH, device) ||
dvd_id(id_out, dvd_out, DIF_MUSTIFOHASH, device))
exit(2);
for (i = 0; i < filetab.n; i++) {
file = &filetab.v[i];
store_filename(fn, file->id);
- printf(";;\t%8"PRIuSEC" %s\n", file->start, fn);
+ printf(";;\t%8"PRIuSEC" .. %-8"PRIuSEC" %s\n",
+ file->start, file->end, fn);
}
#endif
switch (ev->ev) {
case EV_WRITE:
if (f&f_write)
- bail("overlapping ranges: range from %"PRIuSEC" still open at %"PRIuSEC"",
+ bail("overlapping ranges: range from %"PRIuSEC" "
+ "still open at %"PRIuSEC"",
start, ev->pos);
f |= f_write; start = ev->pos;
break;
f &= ~f_write; start = 0;
for (i = 0; i < eventq.n; i++) {
ev = &eventq.v[i];
- switch (ev->ev) {
- case EV_WRITE: start = ev->pos; f |= f_write; break;
- case EV_STOP: nsectors += ev->pos - start; f &= ~f_write; break;
- }
+ if (ev->ev == EV_WRITE) { start = ev->pos; f |= f_write; }
if (ev->pos >= limit) break;
+ if (ev->ev == EV_STOP) { nsectors += ev->pos - start; f &= ~f_write; }
if (f&f_fixup) start = ev->pos;
}
eventq.n = i;
if (f&f_stats) {
gettimeofday(&tv1, 0); t = tvdiff(&tv0, &tv1);
- if (nsectors == limit - start) { ndone -= start; nsectors -= start; }
+ if (nsectors == limit) { ndone -= start; nsectors -= start; }
tot = scale_bytes((double)nsectors*SECTORSZ, &totunit);
rate = scale_bytes((double)nsectors*SECTORSZ/t, &rateunit);
moan("all done: %.1f %sB in %s -- %.1f %sB/s",