[Libguestfs] [PATCH 20/27] daemon: Reimplement ‘part_list’ API in OCaml.

Pino Toscano ptoscano at redhat.com
Thu Jul 20 15:15:20 UTC 2017


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20170720/a7bb95d3/attachment.sig>


More information about the Libguestfs mailing list