dvd-sector-copy.c (find_good_sector): Use plain `read_sectors' for retries.
[dvdrip] / dvd-sector-copy.c
index ef099b7..8c4ba1f 100644 (file)
@@ -365,27 +365,6 @@ static ssize_t read_sectors(secaddr pos, void *buf, secaddr want)
   return (!done && errno ? -1 : done);
 }
 
-static void record_bad_sectors(secaddr bad_lo, secaddr bad_hi)
-{
-  char fn[MAXFNSZ];
-
-  if (!mapfile) return;
-
-  open_file_on_demand(mapfile, &mapfp, "bad-sector region map");
-  fprintf(mapfp, "%"PRIuSEC" %"PRIuSEC" # %"PRIuSEC" sectors",
-         bad_lo, bad_hi, bad_hi - bad_lo);
-
-  if (file && id_kind(file->id) != RAW) {
-    store_filename(fn, file->id);
-    fprintf(mapfp, "; `%s' %"PRIuSEC" .. %"PRIuSEC" of %"PRIuSEC"",
-           fn, bad_lo - file->start, bad_hi - file->start,
-           file->end - file->start);
-  }
-
-  fputc('\n', mapfp);
-  check_write(mapfp, "bad-sector region map");
-}
-
 static void recovered(secaddr bad_lo, secaddr bad_hi)
 {
   char fn[MAXFNSZ];
@@ -404,7 +383,19 @@ static void recovered(secaddr bad_lo, secaddr bad_hi)
         file->end - file->start);
   }
 
-  record_bad_sectors(bad_lo, bad_hi);
+  if (mapfile) {
+    open_file_on_demand(mapfile, &mapfp, "bad-sector region map");
+    fprintf(mapfp, "%"PRIuSEC" %"PRIuSEC" # %"PRIuSEC" sectors",
+           bad_lo, bad_hi, bad_hi - bad_lo);
+
+    if (file && id_kind(file->id) != RAW)
+      fprintf(mapfp, "; `%s' %"PRIuSEC" .. %"PRIuSEC" of %"PRIuSEC"",
+             fn, bad_lo - file->start, bad_hi - file->start,
+             file->end - file->start);
+
+    fputc('\n', mapfp);
+    check_write(mapfp, "bad-sector region map");
+  }
 
   if (lseek(outfd, (off_t)(bad_hi - bad_lo)*SECTORSZ, SEEK_CUR) < 0)
     bail_syserr(errno, "failed to seek past bad sectors");
@@ -617,7 +608,7 @@ static secaddr run_length_wanted(secaddr pos, secaddr badlen, secaddr end)
 {
   secaddr want;
 
-  want = clear_factor*badlen;
+  want = ceil(clear_factor*badlen);
   if (want < clear_min) want = clear_min;
   if (want > end - pos) want = end - pos;
   if (clear_max && want > clear_max) want = clear_max;
@@ -638,13 +629,10 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
   badblock_progress.render = render_badblock_progress;
   progress_additem(&progress, &badblock_progress);
 
-  r.buf = buf; r.sz = sz; r.pos = r.start = r.end = 0;
-  r.good_lo = r.good_hi = 0;
-
   want = sz; if (want > end - pos) want = end - pos;
   for (retry = 0; retry < max_retries; retry++) {
     report_bad_blocks_progress(pos, errno);
-    n = recovery_read(&r, pos, want);
+    n = read_sectors(pos, buf, want);
 #ifdef DEBUG
     progress_clear(&progress);
     printf(";; [retry] try reading %"PRIuSEC" .. %"PRIuSEC" -> %zd\n",
@@ -659,6 +647,9 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
     }
   }
 
+  r.buf = buf; r.sz = sz; r.pos = r.start = r.end = 0;
+  r.good_lo = r.good_hi = 0;
+
   bad_lo = pos; bad_hi = pos + 1;
   for (;;) {
     report_bad_blocks_progress(bad_hi, errno);