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
+ let r, _, err =
+ commandr ~fold_stdout_on_stderr:true
+ "sgdisk" [ device; "-A"; arg ] in
+ if r <> 0 then
+ failwithf "sgdisk: %s" err;
+
+ udev_settle ()
+
let extract_guid value =
(* The value contains only valid GUID characters. *)
String.sub value 0 (String.span value "-0123456789ABCDEF")
+let extract_hex value =
+ (* The value contains only valid numeric characters. *)
+ let str = String.sub value 0 (String.span value "0123456789ABCDEF") in
+ Int64.of_string ("0x" ^ str)
+
let sgdisk_info_extract_field device partnum field extractor =
if partnum <= 0 then failwith "partition number must be >= 1";
@@ -179,3 +199,6 @@ let rec part_get_gpt_type device partnum =
and part_get_gpt_guid device partnum =
sgdisk_info_extract_field device partnum "Partition unique GUID"
extract_guid
+and part_get_gpt_attributes device partnum =
+ sgdisk_info_extract_field device partnum "Attribute flags"
+ extract_hex
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
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." };
+
+ { 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.
+For MBR partitions, return all flags set to 0." };
+
{ defaults with
name = "rename"; added = (1, 21, 5);
style = RErr, [String (Pathname, "oldpath"); String (Pathname,
"newpath")], [];
diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml
index 3e393da73..9e16ab14a 100644
--- a/generator/proc_nr.ml
+++ b/generator/proc_nr.ml
@@ -510,6 +510,8 @@ let proc_nr = [
500, "inspect_get_mountpoints";
501, "inspect_get_filesystems";
502, "inspect_get_drive_mappings";
+503, "part_set_gpt_attributes";
+504, "part_get_gpt_attributes";
]
(* End of list. If adding a new entry, add it at the end of the list
diff --git a/lib/MAX_PROC_NR b/lib/MAX_PROC_NR
index cc5027eed..3091e8eea 100644
--- a/lib/MAX_PROC_NR
+++ b/lib/MAX_PROC_NR
@@ -1 +1 @@
-502
+504
--
2.15.1