X-Git-Url: https://git.distorted.org.uk/~mdw/dvdrip/blobdiff_plain/ffe6038ceb711413c9dfb9ded4f6d0d750181fc3..a238b544458f64e91bfbadc492f248325d2677be:/dvd-sector-copy.c diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 46aa0d6..b1ca133 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -335,8 +335,7 @@ static void update_progress(secaddr pos) struct timeval now; double t, f, g; - gettimeofday(&now, 0); - t = tvdiff(&last_time, &now); + gettimeofday(&now, 0); t = tvdiff(&last_time, &now); #define BETA (1 - alpha) @@ -903,6 +902,7 @@ int main(int argc, char *argv[]) #define f_fixup 4u #define f_stats 8u #define f_checkid 16u +#define f_retry 32u #define f_write 256u set_prog(argv[0]); @@ -960,7 +960,7 @@ int main(int argc, char *argv[]) i = 0; last = -1; for (;;) { buf_rewind(&buf); if (read_line(fp, &buf)) break; - p = buf.p; i++; + i++; p = buf.p; while (ISSPACE(*p)) p++; if (!*p || *p == '#') continue; if (parse_range(p, 0, &start, &end) || @@ -978,6 +978,7 @@ int main(int argc, char *argv[]) } if (ferror(fp)) bail_syserr(errno, "failed to read ranges file `%s'", optarg); + f |= f_retry; break; case 'X': fp = fopen(optarg, "r"); @@ -992,8 +993,10 @@ int main(int argc, char *argv[]) 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); @@ -1005,7 +1008,7 @@ int main(int argc, char *argv[]) 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) { @@ -1020,8 +1023,6 @@ int main(int argc, char *argv[]) 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) { @@ -1035,6 +1036,8 @@ int main(int argc, char *argv[]) #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); @@ -1063,8 +1066,9 @@ int main(int argc, char *argv[]) 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. */ @@ -1079,8 +1083,6 @@ int main(int argc, char *argv[]) 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++) { @@ -1093,8 +1095,7 @@ int main(int argc, char *argv[]) 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: @@ -1113,20 +1114,19 @@ int main(int argc, char *argv[]) #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) { @@ -1151,8 +1151,7 @@ int main(int argc, char *argv[]) #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); @@ -1178,11 +1177,11 @@ int main(int argc, char *argv[]) "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; @@ -1224,11 +1223,11 @@ int main(int argc, char *argv[]) carefully_fclose(errfp, "bad-sector error log"); progress_free(&progress); + return (0); + #undef f_bogus #undef f_continue #undef f_fixup #undef f_stats #undef f_write - - return (0); }