#define f_fixup 4u
#define f_stats 8u
#define f_checkid 16u
+#define f_retry 32u
#define f_write 256u
set_prog(argv[0]);
}
if (ferror(fp))
bail_syserr(errno, "failed to read ranges file `%s'", optarg);
+ f |= f_retry;
break;
case 'X':
fp = fopen(optarg, "r");
if (parse_range(p, 0, &start, &end) ||
(last <= SECLIMIT && start < last))
bail("bad range `%s' at `%s' line %zu", buf.p, optarg, i);
- if (start < end)
- { VEC_PUSH(bad, &badblocks); bad->start = start; bad->end = end; }
+ if (start < end) {
+ VEC_PUSH(bad, &badblocks);
+ bad->start = start; bad->end = end;
+ }
}
if (ferror(fp))
bail_syserr(errno, "failed to read bad-blocks file `%s'", optarg);
case 'c': f |= f_continue; break;
case 'i': f |= f_checkid; break;
case 'r':
- start = 0; end = -1;
+ start = 0; end = -1; f |= f_retry;
if (parse_range(optarg, PRF_HYPHEN, &start, &end))
bail("bad range `%s'", optarg);
if (start < end) {
if (argc - optind != 2) f |= f_bogus;
if (f&f_bogus) { usage(stderr); exit(2); }
- setlocale(LC_ALL, "");
- progress_init(&progress);
device = argv[optind]; outfile = argv[optind + 1];
if (badblocks.n) {
#endif
}
+ setlocale(LC_ALL, "");
+ progress_init(&progress);
if (open_dvd(device, O_RDONLY, &dvdfd, &dvd)) exit(2);
blksz = SECTORSZ; volsz = device_size(dvdfd, device, &blksz);
if (off < 0)
bail_syserr(errno, "failed to seek to end of output file `%s'",
outfile);
- put_event(EV_WRITE, 0, off/SECTORSZ);
- } else if (!eventq.n && !(f&f_fixup))
+ put_event(EV_WRITE, 0, off/SECTORSZ); f |= f_retry;
+ }
+ if (!(f&(f_retry | f_fixup)))
put_event(EV_WRITE, 0, 0);
/* It's fast enough just to check everything. */
for (i = 0, limit = 0; i < filetab.n; i++)
if (filetab.v[i].end > limit) limit = filetab.v[i].end;
- if (end > limit) end = limit;
-
#ifdef DEBUG
printf("\n;; files:\n");
for (i = 0; i < filetab.n; i++) {
qsort(eventq.v, eventq.n, sizeof(struct event), compare_event);
- f &= ~f_write; start = 0;
- for (i = 0; i < eventq.n; i++) {
+ for (i = 0, f &= ~f_write, start = 0; i < eventq.n; i++) {
ev = &eventq.v[i];
switch (ev->ev) {
case EV_WRITE:
#ifdef DEBUG
dump_eventq("initial");
#endif
- f &= ~f_write; start = 0;
- for (i = 0; i < eventq.n; i++) {
+ for (i = 0, f &= ~f_write, start = last = 0; i < eventq.n; i++) {
ev = &eventq.v[i];
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;
+ if (f&f_fixup) last = ev->pos;
}
eventq.n = i;
#ifdef DEBUG
dump_eventq("trimmed");
#endif
if (f&f_fixup) {
- put_event(EV_WRITE, 0, start);
+ put_event(EV_WRITE, 0, last);
f |= f_write;
}
if (f&f_write) {
#ifdef DEBUG
printf("\n;; event sweep:\n");
#endif
- f &= ~f_write;
- for (pos = 0, i = 0; i < eventq.n; i++) {
+ for (pos = 0, i = 0, f &= ~f_write; i < eventq.n; i++) {
ev = &eventq.v[i];
if (ev->pos > pos) {
if (f&f_write) emit(pos, ev->pos);
"failed to seek to resume position "
"(sector %"PRIuSEC") in output file `%s'",
ev->pos, outfile);
+ f |= f_write;
#ifdef DEBUG
progress_clear(&progress);
printf(";; %8"PRIuSEC": begin write\n", pos);
#endif
- f |= f_write;
break;
case EV_STOP:
f &= ~f_write;