| Open_images of string list * rw_flag callback
| Get_volumes of volume callback
| Read_directory of string * string * direntry list callback
+ | Disk_usage of string * string * int64 callback
+ | Export_dir_to of export_t * string * string * string * unit callback
and domain = {
dom_id : int;
dent_link : string;
}
-let string_of_command = function
+and export_t =
+ | Export_tar
+ | Export_tgz
+ | Export_checksums of string
+ | Export_list
+
+let rec string_of_command = function
| Exit_thread -> "Exit_thread"
| Connect (Some name, _) -> sprintf "Connect %s" name
| Connect (None, _) -> "Connect NULL"
sprintf "Open_images [%s]" (String.concat "; " images)
| Get_volumes _ -> "Get_volumes"
| Read_directory (dev, dir, _) -> sprintf "Read_directory %s %s" dev dir
+ | Disk_usage (dev, dir, _) -> sprintf "Disk_usage %s %s" dev dir
+ | Export_dir_to (t, dev, dir, file, _) ->
+ sprintf "Export_dir_to %s %s %s %s" (string_of_export_t t) dev dir file
+
+and string_of_export_t = function
+ | Export_tar -> "Export_tar"
+ | Export_tgz -> "Export_tgz"
+ | Export_checksums alg -> sprintf "Export_checksums %s" alg
+ | Export_list -> "Export_list"
-let string_of_rw_flag = function RO -> "RO" | RW -> "RW"
+and string_of_rw_flag = function RO -> "RO" | RW -> "RW"
let no_callback _ = ()
let open_domain name cb = send_to_slave (Open_domain (name, cb))
let open_images images cb = send_to_slave (Open_images (images, cb))
let read_directory dev dir cb = send_to_slave (Read_directory (dev, dir, cb))
+let disk_usage dev dir cb = send_to_slave (Disk_usage (dev, dir, cb))
+let export_dir_to t dev dir file cb =
+ send_to_slave (Export_dir_to (t, dev, dir, file, cb))
(*----- Slave thread starts here -----*)
) ()
let rec loop () =
+ debug "thread id %d: top of slave loop ..." (Thread.id (Thread.self ()));
+
(* Get the next command. *)
let cmd =
with_lock q_lock (
) entries in
GtkThread.async cb entries
+ | Disk_usage (dev, dir, cb) ->
+ let g = get_g () in
+ let kb = with_mount_ro g dev (fun () -> G.du g dir) in
+ GtkThread.async cb kb
+
+ | Export_dir_to (t, dev, dir, file, cb) ->
+ let g = get_g () in
+ with_mount_ro g dev (
+ fun () ->
+ (match t with
+ | Export_tar -> G.tar_out g
+ | Export_tgz -> G.tgz_out g
+ | Export_checksums alg -> G.checksums_out g alg
+ | Export_list -> G.find0 g) dir file
+ );
+ GtkThread.async cb ()
+
(* Expect to be connected, and return the current libvirt connection. *)
and get_conn () =
match !conn with