New partition APIs: part_del, part_get_bootable, part_get/set_mbr_id

These APIs flesh out further the partitioning API.
This commit is contained in:
Richard Jones
2010-04-10 13:19:43 +01:00
parent cb9350019c
commit b68c030adf
3 changed files with 157 additions and 1 deletions

View File

@@ -158,6 +158,18 @@ do_part_add (const char *device, const char *prlogex,
return 0;
}
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)
{
@@ -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;
}

View File

@@ -1 +1 @@
230
236

View File

@@ -4388,6 +4388,61 @@ See also L<ntfsresize(8)>.");
This rescans all block devices and rebuilds the list of LVM
physical volumes, volume groups and logical volumes.");
("part_del", (RErr, [Device "device"; Int "partnum"]), 233, [],
[InitEmpty, Always, TestRun (
[["part_init"; "/dev/sda"; "mbr"];
["part_add"; "/dev/sda"; "primary"; "1"; "-1"];
["part_del"; "/dev/sda"; "1"]])],
"delete a partition",
"\
This command deletes the partition numbered C<partnum> on C<device>.
Note that in the case of MBR partitioning, deleting an
extended partition also deletes any logical partitions
it contains.");
("part_get_bootable", (RBool "bootable", [Device "device"; Int "partnum"]), 234, [],
[InitEmpty, Always, TestOutputTrue (
[["part_init"; "/dev/sda"; "mbr"];
["part_add"; "/dev/sda"; "primary"; "1"; "-1"];
["part_set_bootable"; "/dev/sda"; "1"; "true"];
["part_get_bootable"; "/dev/sda"; "1"]])],
"return true if a partition is bootable",
"\
This command returns true if the partition C<partnum> on
C<device> has the bootable flag set.
See also C<guestfs_part_set_bootable>.");
("part_get_mbr_id", (RInt "idbyte", [Device "device"; Int "partnum"]), 235, [],
[InitEmpty, Always, TestOutputInt (
[["part_init"; "/dev/sda"; "mbr"];
["part_add"; "/dev/sda"; "primary"; "1"; "-1"];
["part_set_mbr_id"; "/dev/sda"; "1"; "0x7f"];
["part_get_mbr_id"; "/dev/sda"; "1"]], 0x7f)],
"get the MBR type byte (ID byte) from a partition",
"\
Returns the MBR type byte (also known as the ID byte) from
the numbered partition C<partnum>.
Note that only MBR (old DOS-style) partitions have type bytes.
You will get undefined results for other partition table
types (see C<guestfs_part_get_parttype>).");
("part_set_mbr_id", (RErr, [Device "device"; Int "partnum"; Int "idbyte"]), 236, [],
[], (* tested by part_get_mbr_id *)
"set the MBR type byte (ID byte) of a partition",
"\
Sets the MBR type byte (also known as the ID byte) of
the numbered partition C<partnum> to C<idbyte>. Note
that the type bytes quoted in most documentation are
in fact hexadecimal numbers, but usually documented
without any leading \"0x\" which might be confusing.
Note that only MBR (old DOS-style) partitions have type bytes.
You will get undefined results for other partition table
types (see C<guestfs_part_get_parttype>).");
]
let all_functions = non_daemon_functions @ daemon_functions