Blob Blame History Raw
From 9c81b523857e057b8361cbbcc4647ed02b572ca0 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 19 Jan 2021 11:38:46 +0000
Subject: [PATCH] v2v: windows: Refactor uninstallation_commands function.

Simplify and shorten this function:

 - Remove unnecessary use of Not_found exception and generally
   simplify flow control.

 - Use sprintf.

This shouldn't change what the function does.

(cherry picked from commit d48530209a79725f26d6e25101bed6f228f45e8d)
---
 v2v/convert_windows.ml | 89 ++++++++++++++++++------------------------
 1 file changed, 37 insertions(+), 52 deletions(-)

diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml
index f2f7b95c..84db742f 100644
--- a/v2v/convert_windows.ml
+++ b/v2v/convert_windows.ml
@@ -135,56 +135,41 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
   (* Locate and retrieve all the uninstallation commands for installed
    * applications.
    *)
-  let uninstallation_commands pretty_name matchfn extra_uninstall_string =
-    let uninsts = ref [] in
+  let uninstallation_commands pretty_name matchfn extra_uninstall_params =
+    let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
+    let uninstval = "UninstallString" in
+    let ret = ref [] in
 
-    Registry.with_hive_readonly g inspect.i_windows_software_hive
-      (fun reg ->
-       try
-         let path = ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"] in
-         let node =
-           match Registry.get_node reg path with
-           | None -> raise Not_found
-           | Some node -> node in
-         let uninstnodes = g#hivex_node_children node in
-
-         Array.iter (
-           fun { G.hivex_node_h = uninstnode } ->
-             try
+    Registry.with_hive_readonly g inspect.i_windows_software_hive (
+      fun reg ->
+        match Registry.get_node reg path with
+        | None -> ()
+        | Some node ->
+           let uninstnodes = g#hivex_node_children node in
+           Array.iter (
+             fun { G.hivex_node_h = uninstnode } ->
                let valueh = g#hivex_node_get_value uninstnode "DisplayName" in
-               if valueh = 0L then
-                 raise Not_found;
-
-               let dispname = g#hivex_value_string valueh in
-               if not (matchfn dispname) then
-                 raise Not_found;
-
-               let uninstval = "UninstallString" in
-               let valueh = g#hivex_node_get_value uninstnode uninstval in
-               if valueh = 0L then (
-                 let name = g#hivex_node_name uninstnode in
-                 warning (f_"cannot uninstall %s: registry key ‘HKLM\\SOFTWARE\\%s\\%s’ with DisplayName ‘%s’ doesn't contain value ‘%s’")
-                    pretty_name (String.concat "\\" path) name dispname uninstval;
-                 raise Not_found
-               );
-
-               let uninst = (g#hivex_value_string valueh) ^
-                     " /quiet /norestart /l*v+ \"%~dpn0.log\"" ^
-                     " REBOOT=ReallySuppress REMOVE=ALL" in
-               let uninst =
-                 match extra_uninstall_string with
-                 | None -> uninst
-                 | Some s -> uninst ^ " " ^ s in
-
-               List.push_front uninst uninsts
-             with
-               Not_found -> ()
-         ) uninstnodes
-       with
-         Not_found -> ()
-      );
-
-    !uninsts
+               if valueh <> 0L then (
+                 let dispname = g#hivex_value_string valueh in
+                 if matchfn dispname then (
+                   let valueh = g#hivex_node_get_value uninstnode uninstval in
+                   if valueh <> 0L then (
+                     let reg_cmd = g#hivex_value_string valueh in
+                     let cmd =
+                       sprintf "%s /quiet /norestart /l*v+ \"%%~dpn0.log\" REBOOT=ReallySuppress REMOVE=ALL %s"
+                         reg_cmd extra_uninstall_params in
+                     List.push_front cmd ret
+                   )
+                   else
+                     let name = g#hivex_node_name uninstnode in
+                     warning (f_"cannot uninstall %s: registry key ‘HKLM\\SOFTWARE\\%s\\%s’ with DisplayName ‘%s’ doesn't contain value ‘%s’")
+                       pretty_name (String.concat "\\" path) name
+                       dispname uninstval
+                 )
+               )
+             ) uninstnodes
+    ) (* with_hive_readonly *);
+    !ret
   in
 
   (* Locate and retrieve all uninstallation commands for Parallels Tools. *)
@@ -196,16 +181,16 @@ let convert (g : G.guestfs) inspect _ output rcaps static_ips =
     (* Without these custom Parallels-specific MSI properties the
      * uninstaller still shows a no-way-out reboot dialog.
      *)
-    let extra_uninstall_string =
-      Some "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
-    uninstallation_commands "Parallels Tools" matchfn extra_uninstall_string in
+    let extra_uninstall_params =
+      "PREVENT_REBOOT=Yes LAUNCHED_BY_SETUP_EXE=Yes" in
+    uninstallation_commands "Parallels Tools" matchfn extra_uninstall_params in
 
   (* Locate and retrieve all uninstallation commands for VMware Tools. *)
   let vmwaretools_uninst =
     let matchfn s =
       String.find s "VMware Tools" != -1
     in
-    uninstallation_commands "VMware Tools" matchfn None in
+    uninstallation_commands "VMware Tools" matchfn "" in
 
   (*----------------------------------------------------------------------*)
   (* Perform the conversion of the Windows guest. *)