[Libguestfs] [PATCH nbdkit] DDRESCUE: MISC FIXES

Richard W.M. Jones rjones at redhat.com
Fri May 22 19:53:18 UTC 2020


Use vector type to store map ranges.

Test filenames unique.

Remove some unused variables.

Break up long lines.
---
 filters/ddrescue/nbdkit-ddrescue-filter.pod |  6 ++-
 filters/ddrescue/ddrescue.c                 | 42 ++++++++++-----------
 tests/test-ddrescue-filter.sh               | 10 ++---
 3 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/filters/ddrescue/nbdkit-ddrescue-filter.pod b/filters/ddrescue/nbdkit-ddrescue-filter.pod
index 8210866b..601d58fa 100644
--- a/filters/ddrescue/nbdkit-ddrescue-filter.pod
+++ b/filters/ddrescue/nbdkit-ddrescue-filter.pod
@@ -4,9 +4,11 @@ nbdkit-ddrescue-filter - nbdkit filter for serving from ddrescue dump
 
 =head1 SYNOPSIS
 
- nbdkit --filter=ddrescue plugin [plugin-args...] ddrescue-mapfile=file.map
+ nbdkit --filter=ddrescue plugin [plugin-args...]
+                                 ddrescue-mapfile=file.map
 
- nbdkit --filter=ddrescue file file=file.img ddrescue-mapfile=file.map [plugin-args...]
+ nbdkit --filter=ddrescue file file=file.img ddrescue-mapfile=file.map
+                               [plugin-args...]
 
 =head1 DESCRIPTION
 
diff --git a/filters/ddrescue/ddrescue.c b/filters/ddrescue/ddrescue.c
index e4b51de4..a60f07e6 100644
--- a/filters/ddrescue/ddrescue.c
+++ b/filters/ddrescue/ddrescue.c
@@ -43,6 +43,7 @@
 #include <nbdkit-filter.h>
 
 #include "cleanup.h"
+#include "vector.h"
 
 struct range {
   int64_t start;
@@ -50,13 +51,14 @@ struct range {
   int64_t size;
   char status;
 };
+DEFINE_VECTOR_TYPE(ranges, struct range);
 
 struct mapfile {
   int ranges_count;
-  struct range *ranges;
+  ranges ranges;
 };
 
-static struct mapfile map = { 0, NULL };
+static struct mapfile map = { 0, empty_vector };
 
 static int
 parse_mapfile (const char *filename)
@@ -75,8 +77,6 @@ parse_mapfile (const char *filename)
   }
 
   while ((len = getline (&line, &linelen, fp)) != -1) {
-    const char *delim = " \t";
-    char *sp, *p;
     int64_t offset, length;
     char status;
 
@@ -95,7 +95,8 @@ parse_mapfile (const char *filename)
       continue;
     }
 
-    if (sscanf (line, "%" SCNi64 "\t%" SCNi64 "\t%c", &offset, &length, &status) == 3) {
+    if (sscanf (line, "%" SCNi64 "\t%" SCNi64 "\t%c",
+                &offset, &length, &status) == 3) {
       if (offset < 0) {
         nbdkit_error ("block offset must not be negative");
         return -1;
@@ -105,19 +106,17 @@ parse_mapfile (const char *filename)
         return -1;
       }
       if (status == '+') {
-        int i = map.ranges_count++;
-        map.ranges = realloc(map.ranges, map.ranges_count * sizeof(struct range));
-        if (map.ranges == NULL) {
+        struct range new_range = { .start = offset, .end = offset + length - 1,
+                                   .size = length, .status = status };
+
+        if (ranges_append (&map.ranges, new_range) == -1) {
           nbdkit_error ("%s: ddrescue: realloc: %m", filename);
           goto out;
         }
-        map.ranges[i].start = offset;
-        map.ranges[i].end = offset + length - 1;
-        map.ranges[i].size = length;
-        map.ranges[i].status = status;
       }
 
-      nbdkit_debug ("%s: range: 0x%" PRIx64 " 0x%" PRIx64 " '%c'", filename, offset, length, status);
+      nbdkit_debug ("%s: range: 0x%" PRIx64 " 0x%" PRIx64 " '%c'",
+                    filename, offset, length, status);
     }
   }
 
@@ -133,9 +132,7 @@ parse_mapfile (const char *filename)
 static void
 ddrescue_unload (void)
 {
-  free (map.ranges);
-  map.ranges = NULL;
-  map.ranges_count = 0;
+  free (map.ranges.ptr);
 }
 
 static int
@@ -180,20 +177,21 @@ ddrescue_pread (struct nbdkit_next_ops *next_ops, void *nxdata,
                 void *handle, void *buf, uint32_t count, uint64_t offset,
                 uint32_t flags, int *err)
 {
-  int i;
+  size_t i;
 
-  for (i = 0; i < map.ranges_count; i++) {
-    if (map.ranges[i].status != '+')
+  for (i = 0; i < map.ranges.size; i++) {
+    if (map.ranges.ptr[i].status != '+')
       continue;
-    if (offset >= map.ranges[i].start && offset <= map.ranges[i].end) {
-      if (offset + count - 1 <= map.ranges[i].end) {
+    if (offset >= map.ranges.ptr[i].start && offset <= map.ranges.ptr[i].end) {
+      if (offset + count - 1 <= map.ranges.ptr[i].end) {
         /* entirely contained within this range */
         return next_ops->pread (nxdata, buf, count, offset, flags, err);
       }
     }
   }
   /* read was not fully covered */
-  nbdkit_debug ("ddrescue: pread: range: 0x%" PRIx64 " 0x%" PRIx32 " failing with EIO", offset, count);
+  nbdkit_debug ("ddrescue: pread: range: 0x%" PRIx64 " 0x%" PRIx32
+                " failing with EIO", offset, count);
   *err = EIO;
   return -1;
 }
diff --git a/tests/test-ddrescue-filter.sh b/tests/test-ddrescue-filter.sh
index f08bbd4e..10a78e4d 100755
--- a/tests/test-ddrescue-filter.sh
+++ b/tests/test-ddrescue-filter.sh
@@ -40,13 +40,13 @@ set -x
 requires nbdsh --version
 
 sock=`mktemp -u`
-files="data-file.pid $sock data-ddrescue.txt ddrescue-test1.map"
+files="ddrescue.pid $sock ddrescue.txt ddrescue-test1.map"
 rm -f $files
 cleanup_fn rm -f $files
 
-rm -f data-ddrescue.txt
+rm -f ddrescue.txt
 for i in {0..1000}; do
-    printf "ddrescue" >> data-ddrescue.txt
+    printf "ddrescue" >> ddrescue.txt
 done
 
 echo "#
@@ -59,12 +59,12 @@ echo "#
 
 
 # Run nbdkit.
-start_nbdkit -P data-file.pid -U $sock \
+start_nbdkit -P ddrescue.pid -U $sock \
        --filter=ddrescue data \
        ddrescue-mapfile="ddrescue-test1.map"\
        size=1M \
        data="
-   @0x000 <data-ddrescue.txt
+   @0x000 <ddrescue.txt
    "
 
 nbdsh --connect "nbd+unix://?socket=$sock" \
-- 
2.25.0




More information about the Libguestfs mailing list