On Mon, Jan 15, 2018 at 03:14:00PM +0100, Cédric Bosdonnat wrote:
Allow reading and setting the GPT partition attribute flags.
---
daemon/parted.ml | 23 +++++++++++++++++++++++
daemon/parted.mli | 3 +++
generator/actions_core.ml | 37 +++++++++++++++++++++++++++++++++++++
generator/proc_nr.ml | 2 ++
lib/MAX_PROC_NR | 2 +-
5 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/daemon/parted.ml b/daemon/parted.ml
index 6fe803613..e3ab823bd 100644
--- a/daemon/parted.ml
+++ b/daemon/parted.ml
@@ -124,10 +124,30 @@ let part_get_parttype device =
| _ ->
failwithf "%s: cannot parse the output of parted" device
+let part_set_gpt_attributes device partnum attributes =
+ if partnum <= 0 then failwith "partition number must be >= 1";
+
+ udev_settle ();
+
+ let hex = Printf.sprintf "%LX" attributes in
+ let arg = string_of_int partnum ^ ":=:" ^ hex in
You could write these two lines more simply and clearly as:
let arg = sprintf "%d:=:%LX" partnum attributes in
You will also need to add ‘open Printf’ after ‘open Scanf’ at the top
of the file so that all the Printf.* functions are available without
needing to be prefixed.
diff --git a/daemon/parted.mli b/daemon/parted.mli
index cbcb7b503..9f57bbac7 100644
--- a/daemon/parted.mli
+++ b/daemon/parted.mli
@@ -30,3 +30,6 @@ val part_get_parttype : string -> string
val part_get_gpt_type : string -> int -> string
val part_get_gpt_guid : string -> int -> string
+val part_get_gpt_attributes : string -> int -> int64
+
+val part_set_gpt_attributes : string -> int -> int64 -> unit
Unnecessary blank line added here?
diff --git a/generator/actions_core.ml b/generator/actions_core.ml
index 02759a6b7..78eee61dd 100644
--- a/generator/actions_core.ml
+++ b/generator/actions_core.ml
@@ -8265,6 +8265,43 @@ Return the type GUID of numbered GPT partition C<partnum>.
For MBR partitions,
return an appropriate GUID corresponding to the MBR type. Behaviour is undefined
for other partition types." };
+ { defaults with
+ name = "part_set_gpt_attributes"; added = (1, 21, 1);
+ style = RErr, [String (Device, "device"); Int "partnum"; Int64
"attributes"], [];
+ impl = OCaml "Parted.part_set_gpt_attributes";
+ optional = Some "gdisk";
+ tests = [
+ InitGPT, Always, TestResult (
+ [["part_set_gpt_attributes"; "/dev/sda"; "1";
+ "4"];
+ ["part_get_gpt_attributes"; "/dev/sda"; "1"]],
+ "4"), [];
+ ];
+ shortdesc = "set the attribute flags of a GPT partition";
+ longdesc = "\
+Set the attribute flags of numbered GPT partition C<partnum> to
C<attributes>. Return an
+error if the partition table of C<device> isn't GPT.
+
+See
L<https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_entries...
+for a useful list of partition attributes." };
So we're implicitly importing the ABI of GPT partition attributes into
the libguestfs ABI, which I think is fine as it seems to be
well-defined.
+ { defaults with
+ name = "part_get_gpt_attributes"; added = (1, 21, 1);
+ style = RInt64 "attributes", [String (Device, "device"); Int
"partnum"], [];
+ impl = OCaml "Parted.part_get_gpt_attributes";
+ optional = Some "gdisk";
+ tests = [
+ InitGPT, Always, TestResult (
+ [["part_set_gpt_attributes"; "/dev/sda"; "1";
+ "0"];
+ ["part_get_gpt_attributes"; "/dev/sda"; "1"]],
+ "4"), [];
+ ];
+ shortdesc = "get the attribute flags of a GPT partition";
+ longdesc = "\
+Return the attribute flags of numbered GPT partition C<partnum> as a hexadecimal
bit mask.
It's not actually returning a "hexadecimal bit mask". Just remove
that.
Seems fine apart from the changes noted.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/