ranges: const-correctness
[virt-bmap.git] / examiner.c
index 0bef724..640bd88 100644 (file)
@@ -294,6 +294,7 @@ static int count_filesystems = 0;
 static int count_regular = 0;
 static int count_directory = 0;
 
+static int examine_devices (guestfs_h *g);
 static int examine_partitions (guestfs_h *g);
 static int examine_lvs (guestfs_h *g);
 static int examine_filesystems (guestfs_h *g);
@@ -343,6 +344,8 @@ start_thread (void *infov)
     goto error;
 
   /* Examine non-filesystem objects. */
+  if (examine_devices (g) == -1)
+    goto error;
   if (examine_partitions (g) == -1)
     goto error;
   if (examine_lvs (g) == -1)
@@ -377,11 +380,47 @@ start_thread (void *infov)
 }
 
 static int
+examine_devices (guestfs_h *g)
+{
+  CLEANUP_FREE_STRING_LIST char **devices = NULL;
+  size_t i;
+
+  /* Get list of devices. */
+  devices = guestfs_list_devices (g);
+  if (devices == NULL)
+    return -1;
+
+  for (i = 0; devices[i] != NULL; ++i) {
+    CLEANUP_FREE char *object = NULL;
+    int64_t size;
+
+    printf ("virt-bmap: examining %s ...\n", devices[i]);
+
+    if (asprintf (&object, "v %s", devices[i]) == -1)
+      return -1;
+
+    /* We don't actually bother to examine the device, which would be
+     * slow and pointless.  We just mark it in the map.
+     */
+    size = guestfs_blockdev_getsize64 (g, devices[i]);
+    if (size == -1)
+      return -1;
+
+    pthread_mutex_lock (&current_object_mutex);
+    insert_range (ranges, 0, size, object);
+    pthread_mutex_unlock (&current_object_mutex);
+  }
+
+  return 0;
+}
+
+static int
 examine_partitions (guestfs_h *g)
 {
   CLEANUP_FREE_STRING_LIST char **parts = NULL;
   size_t i;
-  int r;
+  const char *argv[2];
+  char *r;
 
   /* Get partitions. */
   parts = guestfs_list_partitions (g);
@@ -390,23 +429,28 @@ examine_partitions (guestfs_h *g)
 
   for (i = 0; parts[i] != NULL; ++i) {
     CLEANUP_FREE char *object = NULL;
-
     printf ("virt-bmap: examining %s ...\n", parts[i]);
     count_partitions++;
 
     if (asprintf (&object, "p %s", parts[i]) == -1)
       return -1;
 
-    if (guestfs_bmap_device (g, parts[i]) == -1)
+    argv[0] = parts[i];
+    argv[1] = NULL;
+    r = guestfs_debug (g, "bmap_device", (char **) argv);
+    if (r == NULL)
       return -1;
+    free (r);
     mark_start (object);
-    r = guestfs_bmap (g);
+    argv[0] = NULL;
+    r = guestfs_debug (g, "bmap", (char **) argv);
     mark_end ();
-    if (r == -1) return -1;
+    if (r == NULL)
+      return -1;
+    free (r);
   }
 
   return 0;
-
 }
 
 static int
@@ -414,7 +458,8 @@ examine_lvs (guestfs_h *g)
 {
   CLEANUP_FREE_STRING_LIST char **lvs = NULL;
   size_t i;
-  int r;
+  const char *argv[2];
+  char *r;
 
   /* Get LVs. */
   lvs = guestfs_lvs (g);
@@ -427,15 +472,22 @@ examine_lvs (guestfs_h *g)
     printf ("virt-bmap: examining %s ...\n", lvs[i]);
     count_lvs++;
 
-    if (asprintf (&object, "lvm_lv %s", lvs[i]) == -1)
+    if (asprintf (&object, "l %s", lvs[i]) == -1)
       return -1;
 
-    if (guestfs_bmap_device (g, lvs[i]) == -1)
+    argv[0] = lvs[i];
+    argv[1] = NULL;
+    r = guestfs_debug (g, "bmap_device", (char **) argv);
+    if (r == NULL)
       return -1;
+    free (r);
     mark_start (object);
-    r = guestfs_bmap (g);
+    argv[0] = NULL;
+    r = guestfs_debug (g, "bmap", (char **) argv);
     mark_end ();
-    if (r == -1) return -1;
+    if (r == NULL)
+      return -1;
+    free (r);
   }
 
   return 0;
@@ -528,7 +580,8 @@ visit_fn (const char *dir, const char *name,
   guestfs_h *g = context->g;
   char type = '?';
   CLEANUP_FREE char *path = NULL, *object = NULL;
-  int r;
+  const char *argv[2];
+  char *r;
 
   context->files_processed++;
   if ((context->files_processed & 255) == 0) {
@@ -556,12 +609,19 @@ visit_fn (const char *dir, const char *name,
   if (type == 'f') {            /* regular file */
     count_regular++;
   bmap_file:
-    if (guestfs_bmap_file (g, path) == -1)
+    argv[0] = path;
+    argv[1] = NULL;
+    r = guestfs_debug (g, "bmap_file", (char **) argv);
+    if (r == NULL)
       return -1;
+    free (r);
     mark_start (object);
-    r = guestfs_bmap (g);
+    argv[0] = NULL;
+    r = guestfs_debug (g, "bmap", (char **) argv);
     mark_end ();
-    if (r == -1) return -1;
+    if (r == NULL)
+      return -1;
+    free (r);
   }
   else if (type == 'd') {       /* directory */
     count_directory++;