Use offset_device
[virt-top.git] / virt-df / virt_df.mli
index db98af2..f35e0db 100644 (file)
@@ -21,9 +21,6 @@
     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
@@ -34,6 +31,7 @@ val ( *^ ) : int64 -> int64 -> int64
 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. *)
@@ -102,8 +100,7 @@ class virtual device :
      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
@@ -112,6 +109,23 @@ class block_device :
   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. *)
 
@@ -119,6 +133,8 @@ type domain = {
   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=...> *)
@@ -131,7 +147,7 @@ and disk = {
 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 = {
@@ -147,7 +163,7 @@ and partition = {
 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 = {
@@ -163,25 +179,40 @@ 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.
@@ -189,5 +220,18 @@ val lvm_type_register :
     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.
+*)