[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libguestfs] [PATCH 3/5] Support fstab block device resolution for NetBSD



Make a best effort try to map NetBSD disklabel partitions to Linux
partitions. The mapping will be incorrect if there is a gap in the
disklabel partitions sequence, e.g. 'b' (swap) partition is missing but
'e' partition is defined.

Signed-off-by: Nikos Skalkotos <skalkoto grnet gr>
---
 src/inspect-fs-unix.c | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/inspect-fs-unix.c b/src/inspect-fs-unix.c
index c6fa23e..3a2f81a 100644
--- a/src/inspect-fs-unix.c
+++ b/src/inspect-fs-unix.c
@@ -83,6 +83,7 @@ COMPILE_REGEXP (re_hurd_dev, "^/dev/(h)d(\\d+)s(\\d+)$", 0)
 COMPILE_REGEXP (re_openbsd, "^OpenBSD (\\d+|\\?)\\.(\\d+|\\?)", 0)
 COMPILE_REGEXP (re_openbsd_duid, "^[0-9a-f]{16}\\.[a-z]", 0)
 COMPILE_REGEXP (re_openbsd_dev, "^/dev/(s|w)d([0-9])([a-z])$", 0)
+COMPILE_REGEXP (re_netbsd_dev, "^/dev/(l|s)d([0-9])([a-z])$", 0)
 
 static void check_architecture (guestfs_h *g, struct inspect_fs *fs);
 static int check_hostname_unix (guestfs_h *g, struct inspect_fs *fs);
@@ -92,7 +93,8 @@ static int check_fstab (guestfs_h *g, struct inspect_fs *fs);
 static int add_fstab_entry (guestfs_h *g, struct inspect_fs *fs,
                             const char *mountable, const char *mp);
 static char *resolve_fstab_device (guestfs_h *g, const char *spec,
-                                   Hash_table *md_map);
+                                   Hash_table *md_map,
+                                   enum inspect_os_type os_type);
 static int inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char **configfiles, int (*f) (guestfs_h *, struct inspect_fs *));
 static int is_partition (guestfs_h *g, const char *partition);
 
@@ -1045,7 +1047,7 @@ check_fstab (guestfs_h *g, struct inspect_fs *fs)
       /* Ignore "/.swap" (Pardus) and pseudo-devices like "tmpfs". */
     else if (STRPREFIX (spec, "/dev/"))
       /* Resolve guest block device names. */
-      mountable = resolve_fstab_device (g, spec, md_map);
+      mountable = resolve_fstab_device (g, spec, md_map, fs->type);
     else if (match (g, spec, re_openbsd_duid)) {
       /* In OpenBSD's fstab you can specify partitions on a disk by appending a
        * period and a partition letter to a Disklable Unique Identifier. The
@@ -1060,7 +1062,7 @@ check_fstab (guestfs_h *g, struct inspect_fs *fs)
         * first disk.
         */
        snprintf(device, 10, "%s%c", "/dev/sd0", part);
-       mountable = resolve_fstab_device (g, device, md_map);
+       mountable = resolve_fstab_device (g, device, md_map, fs->type);
     }
 
     /* If we haven't resolved the device successfully by this point,
@@ -1544,7 +1546,8 @@ resolve_fstab_device_diskbyid (guestfs_h *g, const char *part,
  * anything we don't recognize unchanged.
  */
 static char *
-resolve_fstab_device (guestfs_h *g, const char *spec, Hash_table *md_map)
+resolve_fstab_device (guestfs_h *g, const char *spec, Hash_table *md_map,
+                      enum inspect_os_type os_type)
 {
   char *device = NULL;
   char *type, *slice, *disk, *part;
@@ -1623,7 +1626,25 @@ resolve_fstab_device (guestfs_h *g, const char *spec, Hash_table *md_map)
       device = safe_asprintf (g, "/dev/sd%c%d", disk_i + 'a', part_i + 5);
     }
   }
-  else if (match3 (g, spec, re_openbsd_dev, &type, &disk, &part)) {
+  else if ((os_type == OS_TYPE_NETBSD) &&
+           match3 (g, spec, re_netbsd_dev, &type, &disk, &part)) {
+    int disk_i = guestfs___parse_unsigned_int (g, disk);
+    int part_i = part[0] - 'a'; /* counting from 0 */
+    free (type);
+    free (disk);
+    free (part);
+
+    if (part_i > 3)
+      /* Partition 'c' is the disklabel partition and 'd' the hard disk itself.
+       * Not mapped under Linux.
+       */
+      part_i -= 2;
+
+    if (disk_i != -1 && part_i >= 0 && part_i < 24)
+      device = safe_asprintf (g, "/dev/sd%c%d", disk_i + 'a', part_i + 5);
+  }
+  else if ((os_type == OS_TYPE_OPENBSD) &&
+           match3 (g, spec, re_openbsd_dev, &type, &disk, &part)) {
     int disk_i = guestfs___parse_unsigned_int (g, disk);
     int part_i = part[0] - 'a'; /* counting from 0 */
     free (type);
-- 
2.1.3


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]