[Pkg-libvirt-commits] [libguestfs] 371/384: New API: part_get_mbr_part_type for showing partition type

Hilko Bengen bengen at moszumanska.debian.org
Sun Mar 29 16:59:33 UTC 2015


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to branch experimental
in repository libguestfs.

commit 0c396a4bce578486dfc4a38e1f8c47fd5c2836ea
Author: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
Date:   Tue Mar 24 07:20:17 2015 -0400

    New API: part_get_mbr_part_type for showing partition type
    
    This patch will add support for getting partition type
    of a partiton numbered device.
    
    Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
---
 daemon/parted.c      | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++
 generator/actions.ml |  26 +++++++++++++
 src/MAX_PROC_NR      |   2 +-
 3 files changed, 133 insertions(+), 1 deletion(-)

diff --git a/daemon/parted.c b/daemon/parted.c
index f5aceb4..a36e4e7 100644
--- a/daemon/parted.c
+++ b/daemon/parted.c
@@ -1030,3 +1030,109 @@ do_part_get_name (const char *device, int partnum)
   reply_with_error ("cannot get the partition name from '%s' layouts", parttype);
   return NULL;
 }
+
+char *
+do_part_get_mbr_part_type (const char *device, int partnum)
+{
+  CLEANUP_FREE char *parttype;
+  char *part_type;
+
+  parttype = do_part_get_parttype (device);
+  if (parttype == NULL)
+    return NULL;
+
+  /* machine parseable output by 'parted -m' did not provide
+   * partition type info.
+   * Use traditional style.
+   */
+  CLEANUP_FREE char *out = print_partition_table (device, PARTED_OPT_NO_M);
+  if (!out)
+    return NULL;
+
+  CLEANUP_FREE_STRING_LIST char **lines = split_lines (out);
+
+  if (!lines)
+    return NULL;
+
+  size_t start = 0, end = 0, row;
+
+  for (row = 0; lines[row] != NULL; ++row)
+    if (STRPREFIX (lines[row], "Number")) {
+      start = row + 1;
+      break;
+    }
+
+  if (start == 0) {
+    reply_with_error ("parted output has no \"Number\" line");
+    return NULL;
+  }
+
+  for (row = start; lines[row] != NULL; ++row)
+    if (STREQ (lines[row], "")) {
+      end = row;
+      break;
+    }
+
+  if (end == 0) {
+    reply_with_error ("parted output has no blank after end of table");
+    return NULL;
+  }
+
+  /* Now parse the lines. */
+  size_t i;
+  int64_t temp_int64;
+  int part_num;
+  char temp_type[16] = {'\0'};
+  for (i = 0, row = start;  row < end; ++i, ++row) {
+    if (STREQ (parttype, "gpt")) {
+      memcpy (temp_type, "primary", strlen("primary"));
+      if (sscanf (lines[row], "%d%" SCNi64 "B%" SCNi64 "B%" SCNi64 "B",
+               &part_num,
+               &temp_int64,
+               &temp_int64,
+               &temp_int64) != 4) {
+        reply_with_error ("could not parse row from output of parted print command: %s", lines[row]);
+        return NULL;
+      }
+    } else {
+      if (sscanf (lines[row], "%d%" SCNi64 "B%" SCNi64 "B%" SCNi64 "B" "%15s",
+               &part_num,
+               &temp_int64,
+               &temp_int64,
+               &temp_int64,
+               temp_type) != 5) {
+        reply_with_error ("could not parse row from output of parted print command: %s", lines[row]);
+        return NULL;
+      }
+    }
+
+    if (part_num != partnum)
+        continue;
+
+    if (STRPREFIX (temp_type, "primary")) {
+      part_type = strdup("primary");
+      if (part_type == NULL)
+          goto error;
+    } else if (STRPREFIX (temp_type, "logical")) {
+      part_type = strdup("logical");
+      if (part_type == NULL)
+          goto error;
+    } else if (STRPREFIX (temp_type, "extended")) {
+      part_type = strdup("extended");
+      if (part_type == NULL)
+          goto error;
+    } else
+        goto error;
+
+    return part_type;
+  }
+
+  if (row == end) {
+    reply_with_error ("could not find partnum: %d", partnum);
+    return NULL;
+  }
+
+  error:
+    reply_with_error ("strdup failed");
+    return NULL;
+}
diff --git a/generator/actions.ml b/generator/actions.ml
index 5e462a8..bd654a3 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -12549,6 +12549,32 @@ This enable skinny metadata extent refs." };
 This is used to create an image of a btrfs filesystem.
 All data will be zeroed, but metadata and the like is preserved." };
 
+  { defaults with
+    name = "part_get_mbr_part_type";
+    style = RString "partitiontype", [Device "device"; Int "partnum"], [];
+    proc_nr = Some 454;
+    tests = [
+      InitEmpty, Always, TestResultString (
+        [["part_init"; "/dev/sda"; "mbr"];
+         ["part_add"; "/dev/sda"; "p"; "64"; "204799"];
+         ["part_add"; "/dev/sda"; "e"; "204800"; "614400"];
+         ["part_add"; "/dev/sda"; "l"; "204864"; "205988"];
+         ["part_get_mbr_part_type"; "/dev/sda"; "5"]], "logical"), [];
+      InitEmpty, Always, TestResultString (
+        [["part_init"; "/dev/sda"; "mbr"];
+         ["part_add"; "/dev/sda"; "p"; "64"; "204799"];
+         ["part_add"; "/dev/sda"; "e"; "204800"; "614400"];
+         ["part_add"; "/dev/sda"; "l"; "204864"; "205988"];
+         ["part_get_mbr_part_type"; "/dev/sda"; "2"]], "extended"), []
+    ];
+
+    shortdesc = "get the MBR partition type";
+    longdesc = "\
+This returns the partition type of an MBR partition
+numbered C<partnum> on device C<device>.
+
+It returns C<primary>, C<logical>, or C<extended>." };
+
 ]
 
 (* Non-API meta-commands available only in guestfish.
diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
index 534b992..515f19a 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-453
+454

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git



More information about the Pkg-libvirt-commits mailing list