On Friday, 14 July 2017 15:39:28 CEST Richard W.M. Jones wrote:
+let print_partition_table ~add_m_option device = + udev_settle (); + + let args = ref [] in + if add_m_option then push_back args "-m"; + push_back args "-s"; + push_back args "--"; + push_back args device; + push_back args "unit"; + push_back args "b"; + push_back args "print"; + + let out = + try command "parted" !args + with + (* Translate "unrecognised disk label" into an errno code. *) + Failure str when String.find str "unrecognised disk label" >= 0 -> + raise (Unix.Unix_error (Unix.EINVAL, "parted", device ^ ": " ^ str)) in + + udev_settle (); + + (* Split the output into lines. *) + let out = String.trim out in + let lines = String.nsplit "\n" out in + + (* lines[0] is "BYT;", lines[1] is the device line which we ignore, + * lines[2..] are the partitions themselves. + *) + match lines with + | "BYT;" :: _ :: lines -> lines + | [] | [_] -> + failwith "too few rows of output from 'parted print' command" + | _ -> + failwith "did not see 'BYT;' magic value in 'parted print' command"
Note the first two lines with "BYT;", and the device name must be filtered only when running in machine-parseable mode, otherwise the match above will fail (since the output is very different in non-machine-parseable mode). The other option is making this function always use -m, and implement a separate print_partition_table only in case part_get_mbr_part_type is ported to OCaml (since it's the single user of it).
diff --git a/daemon/parted.mli b/daemon/parted.mli index 33eb6d30d..057d7e8c7 100644 --- a/daemon/parted.mli +++ b/daemon/parted.mli @@ -16,4 +16,12 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *)
+type partition = { + part_num : int32; + part_start : int64; + part_end : int64; + part_size : int64; +}
Is this needed? Could Structs.partition be used below? -- Pino Toscano