(* Registration function used by the tools. *)
let register
?(needs_ksyms = false) ?(needs_utsname = false)
- ?(needs_tasks = false) ?(needs_everything = false)
+ ?(needs_tasks = false) ?(needs_net_devices = false)
+ ?(needs_everything = false)
~run
?(external_cmd = true)
?(extra_args = [])
name summary description =
tools :=
(name, (name, summary, description,
- needs_ksyms, needs_utsname, needs_tasks, needs_everything,
+ needs_ksyms, needs_utsname, needs_tasks, needs_net_devices,
+ needs_everything,
run, external_cmd, extra_args, argcheck))
:: !tools
match tool with
| None -> (* Generic usage message. *)
let tools = List.map (
- fun (name, (_, summary, _, _, _, _, _, _, external_cmd, _, _)) ->
+ fun (name, (_, summary, _, _, _, _, _, _, _, external_cmd, _, _)) ->
if external_cmd then "virt-"^name, summary
else "virt-mem "^name, summary
) tools in
Options:") tools
(* Tool-specific usage message. *)
- | Some (name, summary, description, _, _, _, _, _, external_cmd, _, _) ->
+ | Some (name, summary, description, _, _, _, _, _, _, external_cmd, _, _) ->
let cmd =
if external_cmd then "virt-" ^ name else "virt-mem " ^ name in
exit 0
in
+ (* Handle --list-kernels option. *)
+ let list_kernels () =
+ List.iter print_endline Virt_mem_kernels.kernels;
+ exit 0
+ in
+
(* Function to collect up any anonymous args (domain names/IDs). *)
let anon_arg str = anon_args := str :: !anon_args in
let argspec =
let extra_args = match tool with
| None -> []
- | Some (_, _, _, _, _, _, _, _, _, extra_args, _) -> extra_args in
+ | Some (_, _,_, _, _, _, _, _, _, _, extra_args, _) -> extra_args in
let argspec = [
"-A", Arg.String set_architecture,
"arch " ^ s_"Set kernel architecture, endianness and word size";
"uri " ^ s_ "Connect to URI";
"--debug", Arg.Set debug,
" " ^ s_"Debug mode (default: false)";
+ "--list-kernels", Arg.Unit list_kernels,
+ " " ^ s_"List known kernels";
"-t", Arg.String memory_image,
"image " ^ s_"Use saved kernel memory image";
"--version", Arg.Unit version,
* Detect that final case now and give an error.
*)
let name, _, _,
- needs_ksyms, needs_utsname, needs_tasks, needs_everything,
+ needs_ksyms, needs_utsname, needs_tasks, needs_net_devices,
+ needs_everything,
run, external_cmd, extra_args, argcheck =
match tool with
| Some t -> t
let images =
List.map (
fun image ->
- let kdata = { ksyms = None; utsname = None; tasks = None } in
+ let kdata = { ksyms = None; utsname = None; tasks = None;
+ net_devices = None } in
image, kdata
) images in
(* Certain needs are dependent on others ... *)
let needs_ksyms, needs_utsname =
if needs_tasks then true, true
else needs_ksyms, needs_utsname in
- let needs_ksyms, needs_utsname, needs_tasks =
- if needs_everything then true, true, true
- else needs_ksyms, needs_utsname, needs_tasks in
+ let needs_ksyms, needs_utsname =
+ if needs_net_devices then true, true
+ else needs_ksyms, needs_utsname in
+ let needs_ksyms, needs_utsname, needs_tasks, needs_net_devices =
+ if needs_everything then true, true, true, true
+ else needs_ksyms, needs_utsname, needs_tasks, needs_net_devices in
(* Do the kernel symbol analysis. *)
let images =
List.map (
fun (image, ({ ksyms = ksyms; utsname = utsname } as kdata)) ->
match ksyms, utsname with
- | Some ksyms, Some { kernel_release = kversion } ->
+ | Some ksyms, Some { uts_kernel_release = kversion } ->
let image, tasks =
Virt_mem_tasks.find_tasks debug image ksyms kversion in
let kdata = { kdata with tasks = tasks } in
| _, _ -> image, kdata
) images in
+ (* Get the net devices. *)
+ let images =
+ if not needs_net_devices then images
+ else
+ List.map (
+ fun (image, ({ ksyms = ksyms; utsname = utsname } as kdata)) ->
+ match ksyms, utsname with
+ | Some ksyms, Some { uts_kernel_release = kversion } ->
+ let image, net_devices =
+ Virt_mem_net_devices.find_net_devices debug
+ image ksyms kversion in
+ let kdata = { kdata with net_devices = net_devices } in
+ image, kdata
+ | _, _ -> image, kdata
+ ) images in
+
(* Run the tool's main function. *)
let errors = ref 0 in
List.iter (
failwith (s_"could not read kernel version")
else if needs_tasks && kdata.tasks = None then
failwith (s_"could not read process table")
+ else if needs_net_devices && kdata.net_devices = None then
+ failwith (s_"could not read net device table")
);
run debug image kdata
with exn ->