From ed07f2e8b46362e4e9bc03d41fff69cf5cc05e0e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 1 Jan 1970 00:00:00 +0000
Subject: [PATCH] Fix kernel_size on 32 bit architectures. Obey list of domains
 passed on the command line.

---
 lib/virt_mem.ml | 61 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 47 insertions(+), 14 deletions(-)

diff --git a/lib/virt_mem.ml b/lib/virt_mem.ml
index 9a00ead..384a089 100644
--- a/lib/virt_mem.ml
+++ b/lib/virt_mem.ml
@@ -32,8 +32,13 @@ module MMap = Virt_mem_mmap
 let min_kallsyms_tabsize = 1_000L
 let max_kallsyms_tabsize = 250_000L
 
-let kernel_size = 0x100_0000
-let max_memory_peek = 0x1_000
+(* Make the kernel size around 16 MB, but just a bit smaller than
+ * maximum string length so we can still run this on a 32 bit platform.
+ *)
+let kernel_size =
+  if Sys.word_size = 32 then Sys.max_string_length
+  else 0x100_0000
+let max_memory_peek = 0x1000
 
 type ksym = string
 
@@ -94,6 +99,7 @@ let start usage_msg =
   (* List of kernel images. *)
   let images = ref [] in
   let uri = ref "" in
+  let anon_args = ref [] in
 
   let memory_image filename =
     images :=
@@ -132,14 +138,14 @@ let start usage_msg =
       " " ^ s_"Display version and exit";
   ] in
 
-  let anon_fun str =
-    raise (Arg.Bad (sprintf (f_"%s: unknown parameter") str)) in
+  let anon_arg str = anon_args := str :: !anon_args in
   let usage_msg = usage_msg ^ s_"\n\nOPTIONS" in
-  Arg.parse argspec anon_fun usage_msg;
+  Arg.parse argspec anon_arg usage_msg;
 
   let images = !images in
   let debug = !debug in
   let uri = if !uri = "" then None else Some !uri in
+  let anon_args = List.rev !anon_args in
 
   (* Get the kernel images. *)
   let images =
@@ -155,14 +161,36 @@ let start usage_msg =
 	  );
 	  exit 1 in
 
-      (* List of active domains. *)
+      (* If we have a list of parameters, then it is the domain names / UUIDs /
+       * IDs ONLY that we wish to display.  Otherwise, display all active.
+       *)
       let doms =
-	let nr_active_doms = C.num_of_domains conn in
-	let active_doms =
-	  Array.to_list (C.list_domains conn nr_active_doms) in
-	let active_doms =
-	  List.map (D.lookup_by_id conn) active_doms in
-	active_doms in
+	if anon_args = [] then (
+	  (* List of active domains. *)
+	  let nr_active_doms = C.num_of_domains conn in
+	  let active_doms =
+	    Array.to_list (C.list_domains conn nr_active_doms) in
+	  List.map (D.lookup_by_id conn) active_doms
+	) else (
+	  List.map (
+	    fun arg ->
+	      let dom =
+		try D.lookup_by_uuid_string conn arg
+		with _ ->
+		  try D.lookup_by_name conn arg
+		  with _ ->
+		    try D.lookup_by_id conn (int_of_string arg)
+		    with _ ->
+		      failwith (sprintf (f_"%s: unknown domain (not a UUID, name or ID of any active domain)") arg) in
+
+	      (* XXX Primitive test to see if the domain is active. *)
+	      let is_active = try D.get_id dom >= 0 with _ -> false in
+	      if not is_active then
+		failwith (sprintf (f_"%s: domain is not running") arg);
+
+	      dom
+	  ) anon_args
+	) in
 
       (* Get their XML. *)
       let xmls = List.map (fun dom -> dom, D.get_xml_desc dom) doms in
@@ -235,7 +263,11 @@ let start usage_msg =
 
 	  (name, arch, mem)
       ) xmls
-    ) else
+    ) else (
+      (* One or more -t options passed. *)
+      if anon_args <> [] then
+	failwith (s_"virt-mem: if -t given on command line, then no domain arguments should be listed");
+
       List.map (
 	fun (wordsize, endian, arch, text_addr, filename) ->
 	  (* Quite a lot of limitations on the kernel images we can
@@ -278,7 +310,8 @@ let start usage_msg =
 	  let mem = MMap.set_endian mem endian in
 
 	  (filename, arch, mem)
-      ) images in
+      ) images
+    ) in
 
   let images =
     List.map (
-- 
1.8.3.1