summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-04-10 13:19:43 +0100
committerRichard Jones <rjones@redhat.com>2010-04-10 13:43:35 +0100
commitb68c030adfdbefe65bc9ecdd673844c01bddb32a (patch)
treefbdb4f081db99bd9d36a4521f0b0987dae2ccee1 /daemon
parentcb9350019cc6382a35c98f522c9c4d221c92b605 (diff)
downloadlibguestfs-b68c030adfdbefe65bc9ecdd673844c01bddb32a.tar.gz
libguestfs-b68c030adfdbefe65bc9ecdd673844c01bddb32a.tar.xz
libguestfs-b68c030adfdbefe65bc9ecdd673844c01bddb32a.zip
New partition APIs: part_del, part_get_bootable, part_get/set_mbr_id
These APIs flesh out further the partitioning API.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/parted.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/daemon/parted.c b/daemon/parted.c
index b1750a51..9c65570f 100644
--- a/daemon/parted.c
+++ b/daemon/parted.c
@@ -159,6 +159,18 @@ do_part_add (const char *device, const char *prlogex,
}
int
+do_part_del (const char *device, int partnum)
+{
+ char partnum_str[16];
+ snprintf (partnum_str, sizeof partnum_str, "%d", partnum);
+
+ RUN_PARTED (return -1, device, "rm", partnum_str, NULL);
+
+ udev_settle ();
+ return 0;
+}
+
+int
do_part_disk (const char *device, const char *parttype)
{
const char *startstr;
@@ -371,3 +383,92 @@ do_part_list (const char *device)
free_strings (lines);
return NULL;
}
+
+int
+do_part_get_bootable (const char *device, int partnum)
+{
+ char **lines = print_partition_table (device);
+ if (!lines)
+ return -1;
+
+ /* We want lines[1+partnum]. */
+ if (count_strings (lines) < 1+partnum) {
+ reply_with_error ("partition number out of range: %d", partnum);
+ free_strings (lines);
+ return -1;
+ }
+
+ char *boot = get_table_field (lines[1+partnum], 6);
+ if (boot == NULL) {
+ free_strings (lines);
+ return -1;
+ }
+
+ int r = STREQ (boot, "boot");
+
+ free (boot);
+ free_strings (lines);
+
+ return r;
+}
+
+/* Currently we use sfdisk for getting and setting the ID byte. In
+ * future, extend parted to provide this functionality. As a result
+ * of using sfdisk, this won't work for non-MBR-style partitions, but
+ * that limitation is noted in the documentation and we can extend it
+ * later without breaking the ABI.
+ */
+int
+do_part_get_mbr_id (const char *device, int partnum)
+{
+ char partnum_str[16];
+ snprintf (partnum_str, sizeof partnum_str, "%d", partnum);
+
+ char *out, *err;
+ int r;
+
+ r = command (&out, &err, "sfdisk", "--print-id", device, partnum_str, NULL);
+ if (r == -1) {
+ reply_with_error ("sfdisk --print-id: %s", err);
+ free (out);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+
+ /* It's printed in hex ... */
+ int id;
+ if (sscanf (out, "%x", &id) != 1) {
+ reply_with_error ("sfdisk --print-id: cannot parse output: %s", out);
+ free (out);
+ return -1;
+ }
+
+ free (out);
+ return id;
+}
+
+int
+do_part_set_mbr_id (const char *device, int partnum, int idbyte)
+{
+ char partnum_str[16];
+ snprintf (partnum_str, sizeof partnum_str, "%d", partnum);
+
+ char idbyte_str[16];
+ snprintf (idbyte_str, sizeof partnum_str, "%x", idbyte); /* NB: hex */
+
+ char *err;
+ int r;
+
+ r = command (NULL, &err, "sfdisk",
+ "--change-id", device, partnum_str, idbyte_str, NULL);
+ if (r == -1) {
+ reply_with_error ("sfdisk --change-id: %s", err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}