used throughout the plug-ins and main code.
*)
-val debug : bool
-(** If true, emit logs of debugging information to stderr. *)
-
val ( +* ) : int32 -> int32 -> int32
val ( -* ) : int32 -> int32 -> int32
val ( ** ) : int32 -> int32 -> int32
val ( /^ ) : int64 -> int64 -> int64
(** int32 and int64 infix operators for convenience. *)
+val debug : bool ref (** If true, emit debug info to stderr*)
val uri : string option ref (** Hypervisor/libvirt URI. *)
val inodes : bool ref (** Display inodes. *)
val human : bool ref (** Display human-readable. *)
Note the very rare use of OOP in OCaml!
*)
-class block_device :
- string ->
+class block_device : string ->
object
method name : string
method read : int64 -> int -> string
end
(** A concrete device which just direct-maps a file or /dev device. *)
+class offset_device : string -> int64 -> int64 -> device ->
+ object
+ method name : string
+ method read : int64 -> int -> string
+ method read_bitstring : int64 -> int -> string * int * int
+ method size : int64
+ end
+ (** A concrete device which maps a linear part of an underlying device.
+
+ [new offset_device name start size dev] creates a new
+ device which maps bytes from [start] to [start+size-1]
+ of the underlying device [dev] (ie. in this device they
+ appear as bytes [0] to [size-1]).
+
+ Useful for things like partitions.
+ *)
+
val null_device : device
(** The null device. Any attempt to read generates an error. *)
dom_name : string; (** Domain name. *)
dom_id : int option; (** Domain ID (if running). *)
dom_disks : disk list; (** Domain disks. *)
+ dom_lv_filesystems :
+ (lv * filesystem) list; (** Domain LV filesystems. *)
}
and disk = {
d_type : string option; (** The <disk type=...> *)
and disk_content =
[ `Filesystem of filesystem (** Contains a direct filesystem. *)
| `Partitions of partitions (** Contains partitions. *)
- | `PhysicalVolume of string (** Contains an LVM PV. *)
+ | `PhysicalVolume of pv (** Contains an LVM PV. *)
| `Unknown (** Not probed or unknown. *)
]
and partitions = {
and partition_status = Bootable | Nonbootable | Malformed | NullEntry
and partition_content =
[ `Filesystem of filesystem (** Filesystem. *)
- | `PhysicalVolume of string (** Contains an LVM PV. *)
+ | `PhysicalVolume of pv (** Contains an LVM PV. *)
| `Unknown (** Not probed or unknown. *)
]
and filesystem = {
fs_inodes_avail : int64; (** Inodes free (available). *)
fs_inodes_used : int64; (** Inodes in use. *)
}
+and pv = {
+ lvm_plugin_id : lvm_plugin_id; (** The LVM plug-in which detected
+ this. *)
+ pv_uuid : string; (** UUID. *)
+}
+and lv = {
+ lv_dev : device; (** Logical volume device. *)
+}
+
+and lvm_plugin_id
val string_of_partition : partition -> string
val string_of_filesystem : filesystem -> string
(** Convert a partition or filesystem struct to a string (for debugging). *)
+val canonical_uuid : string -> string
+(** Convert a UUID which may contain '-' characters to canonical form. *)
+
+(** {2 Plug-in registration functions} *)
+
val partition_type_register : string -> (device -> partitions) -> unit
-(** Register a partition probing plugin. *)
+(** Register a partition probing plug-in. *)
val probe_for_partitions : device -> partitions option
(** Do a partition probe on a device. Returns [Some partitions] or [None]. *)
val filesystem_type_register : string -> (device -> filesystem) -> unit
-(** Register a filesystem probing plugin. *)
+(** Register a filesystem probing plug-in. *)
val probe_for_filesystem : device -> filesystem option
(** Do a filesystem probe on a device. Returns [Some filesystem] or [None]. *)
val lvm_type_register :
- string -> (device -> bool) -> (device list -> device list) -> unit
+ string -> (lvm_plugin_id -> device -> pv) -> (device list -> lv list) -> unit
(** [lvm_type_register lvm_name probe_fn list_lvs_fn]
registers a new LVM type. [probe_fn] is a function which
should probe a device to find out if it contains a PV.
devices (PVs) and construct a list of LV devices.
*)
-val probe_for_pv : device -> string option
-(** Do a PV probe on a device. Returns [Some lvm_name] or [None]. *)
+val probe_for_pv : device -> pv option
+(** Do a PV probe on a device. Returns [Some pv] or [None]. *)
+
+val list_lvs : lvm_plugin_id -> device list -> lv list
+(** Construct LV devices from a list of PVs. *)
+
+(** {2 Utility functions} *)
+
+val group_by : ?cmp:('a -> 'a -> int) -> ('a * 'b) list -> ('a * 'b list) list
+(** Group a sorted list of pairs by the first element of the pair. *)
+
+val range : int -> int -> int list
+(** [range a b] returns the list of integers [a <= i < b].
+ If [a >= b] then the empty list is returned.
+*)