diff options
author | Richard Jones <rjones@redhat.com> | 2010-04-10 13:19:43 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-04-10 13:43:35 +0100 |
commit | b68c030adfdbefe65bc9ecdd673844c01bddb32a (patch) | |
tree | fbdb4f081db99bd9d36a4521f0b0987dae2ccee1 /daemon | |
parent | cb9350019cc6382a35c98f522c9c4d221c92b605 (diff) | |
download | libguestfs-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.c | 101 |
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; +} |