mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
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:
101
daemon/parted.c
101
daemon/parted.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
230
|
||||
236
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user