Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/dvdrip
[dvdrip] / dvd-sector-copy.c
index cd45710..6f14bb5 100644 (file)
@@ -730,16 +730,16 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
     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);
 }
@@ -861,38 +861,6 @@ static int read_line(FILE *fp, struct buf *b)
   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)
@@ -1012,25 +980,33 @@ int main(int argc, char *argv[])
        (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;
@@ -1123,7 +1099,7 @@ int main(int argc, char *argv[])
 #endif
   }
 
-  open_dvd(device, &dvdfd, &dvd);
+  open_dvd(device, O_RDONLY, &dvdfd, &dvd);
 
   blksz = SECTORSZ; volsz = device_size(dvdfd, device, &blksz);
   if (blksz != SECTORSZ)
@@ -1133,7 +1109,7 @@ int main(int argc, char *argv[])
         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);
@@ -1174,7 +1150,8 @@ int main(int argc, char *argv[])
   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
 
@@ -1186,7 +1163,8 @@ int main(int argc, char *argv[])
     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;
@@ -1202,11 +1180,9 @@ int main(int argc, char *argv[])
   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;