dvd-sector-copy.c: Extract the post-recovery code into a function.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 18 Feb 2022 18:58:47 +0000 (18:58 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 18 Feb 2022 18:58:47 +0000 (18:58 +0000)
The `goto' is ugly.

dvd-sector-copy.c

index ff4e54a..d663c0b 100644 (file)
@@ -466,6 +466,29 @@ static void report_bad_blocks_progress(secaddr lo, secaddr hi, int err)
   fflush(stdout);
 }
 
+static void recovered(secaddr bad_lo, secaddr bad_hi)
+{
+  clear_progress();
+  moan("skipping %"PRIuSEC" bad sectors (%"PRIuSEC" .. %"PRIuSEC")",
+       bad_hi - bad_lo, bad_lo, bad_hi);
+  if (mapfile) {
+    if (!mapfp) {
+      mapfp = fopen(mapfile, "w");
+      if (!mapfp)
+       bail_syserr(errno, "failed to open bad-sector map file `%s'",
+                   optarg);
+      fprintf(mapfp, "## bad sector map\n\n");
+    }
+    fprintf(mapfp, "%"PRIuSEC" %"PRIuSEC"\n", bad_lo, bad_hi);
+    fflush(mapfp);
+    if (ferror(mapfp))
+      bail_syserr(errno, "error writing bad-sector map file");
+  }
+  if (lseek(outfd, (off_t)(bad_hi - bad_lo)*SECTORSZ, SEEK_CUR) < 0)
+    bail_syserr(errno, "failed to seek past bad sectors");
+  status = 1;
+}
+
 static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
                                unsigned char *buf, secaddr sz)
 {
@@ -480,7 +503,7 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
       clear_progress();
       moan("sector %"PRIuSEC" read ok after retry", pos);
       bad_lo = bad_hi = pos;
-      goto recovered;
+      return (n);
     }
   }
 
@@ -490,7 +513,7 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
     if (bad_hi >= end) {
       clear_progress();
       moan("giving up on this extent");
-      n = 0; goto recovered;
+      recovered(bad_lo, end); *pos_inout = end; return (0);
     }
     step *= 2;
     if (step > end - bad_lo) step = end - bad_lo;
@@ -508,29 +531,7 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
     if (n > 0) good = pos;
     else bad_hi = pos + 1;
   }
-recovered:
-  if (bad_hi > bad_lo) {
-    clear_progress();
-    moan("skipping %"PRIuSEC" bad sectors (%"PRIuSEC" .. %"PRIuSEC")",
-        bad_hi - bad_lo, bad_lo, bad_hi);
-    if (mapfile) {
-      if (!mapfp) {
-       mapfp = fopen(mapfile, "w");
-       if (!mapfp)
-         bail_syserr(errno, "failed to open bad-sector map file `%s'",
-                     optarg);
-       fprintf(mapfp, "## bad sector map\n\n");
-      }
-      fprintf(mapfp, "%"PRIuSEC" %"PRIuSEC"\n", bad_lo, bad_hi);
-      fflush(mapfp);
-      if (ferror(mapfp))
-       bail_syserr(errno, "error writing bad-sector map file");
-    }
-    if (lseek(outfd, (off_t)(bad_hi - bad_lo)*SECTORSZ, SEEK_CUR) < 0)
-      bail_syserr(errno, "failed to seek past bad sectors");
-    status = 1;
-  }
-  *pos_inout = bad_hi;
+  recovered(bad_lo, bad_hi); *pos_inout = good;
   return (n);
 }