Files
libguestfs/daemon/utils.mli
Laszlo Ersek 0efccea844 daemon/parted: work around part table type misreporting by "parted"
"parted" incorrectly reports "loop" rather than "msdos" for the partition
table type, when the (fake) partition table comes from the "--mbr" option
of "mkfs.fat" (in dosfstools-4.2+), and the FAT variant in question is
FAT16 or FAT32. (See RHBZ#2026224.) Work this around by
- parsing the partition table ourselves, and
- overriding "loop" with "msdos" when appropriate.

Note that when the FAT variant is FAT12, "parted" fails to parse the fake
MBR partition table completely (see RHBZ#2026220), which we cannot work
around. However, FAT12 should be a rare corner case in libguestfs usage --
"mkfs.fat" auto-chooses FAT12 only below 9MB disk size, and even "-F 12"
can only be forced up to and including 255MB disk size.

Add the helper function "has_bogus_mbr" to the Utils module; we'll use it
elsewhere too.

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1931821
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: Richard W.M. Jones <rjones@redhat.com>
Message-Id: <20211125094954.9713-5-lersek@redhat.com>
[lersek@redhat.com: drop "fun" keyword, and use partial application, in
 the definition of "sec0at" [Rich]]
2021-12-09 13:54:15 +00:00

123 lines
4.9 KiB
OCaml

(* guestfs-inspection
* Copyright (C) 2009-2020 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*)
val prog_exists : string -> bool
(** Return true iff the program is found on [$PATH]. *)
val udev_settle : ?filename:string -> unit -> unit
(**
* LVM and other commands aren't synchronous, especially when udev is
* involved. eg. You can create or remove some device, but the
* [/dev] device node won't appear until some time later. This means
* that you get an error if you run one command followed by another.
*
* Use [udevadm settle] after certain commands, but don't be too
* fussed if it fails.
*
* The optional [?filename] passes the [udevadm settle -E filename]
* option, which means udevadm stops waiting as soon as the named
* file is created (or if it exists at the start).
*)
val is_root_device : string -> bool
(** Return true if this is the root (appliance) device. *)
val is_device_parameter : string -> bool
(** Use this function to tell the difference between a device
or path for [Dev_or_Path] parameters. *)
val split_device_partition : string -> string * int
(** Split a device name like [/dev/sda1] into a device name and
partition number, eg. ["sda", 1].
The [/dev/] prefix is skipped and removed, if present.
If the partition number is not present (a whole device), 0 is returned.
This function splits [/dev/md0p1] to ["md0", 1]. *)
val sort_device_names : string list -> string list
(** Sort device names correctly so that /dev/sdaa appears after /dev/sdz.
This also deals with partition numbers, and works whether or not
[/dev/] is present. *)
val has_bogus_mbr : string -> bool
(** Check whether the first sector of the device contains a bogus MBR partition
table; namely one where the first partition table entry describes a
partition that starts at absolute sector 0, thereby overlapping the
partition table itself.
dosfstools-4.2+ creates bogus partition tables like this by default when
formatting non-removable, non-partitioned block devices. Refer to
RHBZ#1931821. *)
val proc_unmangle_path : string -> string
(** Reverse kernel path escaping done in fs/seq_file.c:mangle_path.
This is inconsistently used for /proc fields. *)
val command : ?fold_stdout_on_stderr:bool -> string -> string list -> string
(** Run an external command without using the shell, and collect
stdout and stderr separately. Returns stdout if the command
runs successfully.
On failure of the command, this throws an exception containing
the stderr from the command.
[?fold_stdout_on_stderr] (default: false)
For broken external commands that send error messages to stdout
(hello, parted) but that don't have any useful stdout information,
use this flag to capture the error messages in the [stderr]
buffer. Nothing will be captured on stdout if you use this flag. *)
val commandr : ?fold_stdout_on_stderr:bool -> string -> string list -> (int * string * string)
(** Run an external command without using the shell, and collect
stdout and stderr separately.
Returns [status, stdout, stderr]. As with the C function in
[daemon/command.c], this strips the trailing [\n] from stderr,
but {b not} from stdout. *)
val is_small_file : string -> bool
(** Return true if the path is a small regular file. *)
val read_small_file : string -> string list option
(** If [filename] is a small file (see {!is_small_file}) then read it
split into lines. Otherwise emits a debug message and returns
[None]. *)
val unix_canonical_path : string -> string
(** Canonicalize a Unix path, so "///usr//local//" -> "/usr/local"
The path is modified in place because the result is always
the same length or shorter than the argument passed. *)
val simple_unquote : string -> string
(** Unquote the string, by removing a pair of single- or double-quotes
at the beginning and the end of the string.
No other handling is done, unlike what {!shell_unquote} does. *)
val parse_key_value_strings : ?unquote:(string -> string) -> string list -> (string * string) list
(** Split the lines by the [=] separator; if [unquote] is specified,
it is applied on the values as unquote function. Empty lines,
or that start with a comment character [#], are ignored. *)
(**/**)
val get_verbose_flag : unit -> bool