Since we use the input password in various places in the VMX module,
store the input password in vmx_source.  This neutral refactoring
makes later changes simpler.
---
 input/parse_domain_from_vmx.mli |  7 ++++---
 input/input_vmx.ml              | 13 ++++++-------
 input/parse_domain_from_vmx.ml  | 12 ++++++------
 3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/input/parse_domain_from_vmx.mli b/input/parse_domain_from_vmx.mli
index 42f8100ee7..208797a736 100644
--- a/input/parse_domain_from_vmx.mli
+++ b/input/parse_domain_from_vmx.mli
@@ -17,8 +17,9 @@
  *)
 
 type vmx_source =
-  | File of string              (** local file or NFS *)
-  | SSH of Xml.uri              (** SSH URI *)
+  | File of string                       (** local file or NFS *)
+  | SSH of Nbdkit_ssh.password * Xml.uri (** SSH URI *)
 
-val vmx_source_of_arg : [`SSH] option -> string -> vmx_source
+val vmx_source_of_arg : Nbdkit_ssh.password -> [`SSH] option -> string ->
+                        vmx_source
 val parse_domain_from_vmx : vmx_source -> Types.source * string list
diff --git a/input/input_vmx.ml b/input/input_vmx.ml
index bd20420ca0..b9cce10fed 100644
--- a/input/input_vmx.ml
+++ b/input/input_vmx.ml
@@ -45,13 +45,17 @@ module VMX = struct
     let vmx_source =
       match args with
       | [arg] ->
+         let input_password =
+           match options.input_password with
+           | None -> Nbdkit_ssh.NoPassword
+           | Some ip -> Nbdkit_ssh.PasswordFile ip in
          let input_transport =
            match options.input_transport with
            | None -> None
            | Some `SSH -> Some `SSH
            | Some `VDDK ->
               error (f_"-i vmx: cannot use -it vddk in this input mode") in
-         vmx_source_of_arg input_transport arg
+         vmx_source_of_arg input_password input_transport arg
       | _ ->
          error (f_"-i vmx: expecting a VMX file or ssh:// URI") in
 
@@ -73,7 +77,7 @@ module VMX = struct
             On_exit.kill pid
         ) filenames
 
-     | SSH uri ->
+     | SSH (password, uri) ->
         List.iteri (
           fun i filename ->
             let socket = sprintf "%s/in%d" dir i in
@@ -95,11 +99,6 @@ module VMX = struct
             let server = Ssh.server_of_uri uri in
             let port = Option.map string_of_int (Ssh.port_of_uri uri) in
             let user = uri.Xml.uri_user in
-            let password =
-              match options.input_password with
-              | None -> Nbdkit_ssh.NoPassword
-              | Some ip -> Nbdkit_ssh.PasswordFile ip in
-
             let cor = dir // "convert" in
             let bandwidth = options.bandwidth in
             let nbdkit = Nbdkit_ssh.create_ssh ?bandwidth ~cor ~password
diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml
index e6500da64a..94ae9957e3 100644
--- a/input/parse_domain_from_vmx.ml
+++ b/input/parse_domain_from_vmx.ml
@@ -29,13 +29,13 @@ open Utils
 open Name_from_disk
 
 type vmx_source =
-  | File of string              (* local file or NFS *)
-  | SSH of Xml.uri              (* SSH URI *)
+  | File of string                       (* local file or NFS *)
+  | SSH of Nbdkit_ssh.password * Xml.uri (* SSH URI *)
 
 (* The single filename on the command line is intepreted either as
  * a local file or a remote SSH URI (only if ‘-it ssh’).
  *)
-let vmx_source_of_arg input_transport arg =
+let vmx_source_of_arg input_password input_transport arg =
   match input_transport, arg with
   | None, arg -> File arg
   | Some `SSH, arg ->
@@ -49,7 +49,7 @@ let vmx_source_of_arg input_transport arg =
        error (f_"vmx URI remote server name omitted");
      if uri.Xml.uri_path = None || uri.Xml.uri_path = Some "/" then
        error (f_"vmx URI path component looks incorrect");
-     SSH uri
+     SSH (input_password, uri)
 
 let rec find_disks vmx vmx_source =
   (* Set the s_disk_id field to an incrementing number. *)
@@ -334,7 +334,7 @@ let parse_domain_from_vmx vmx_source =
   let vmx =
     match vmx_source with
     | File filename -> Parse_vmx.parse_file filename
-    | SSH uri ->
+    | SSH (password, uri) ->
        let filename = tmpdir // "source.vmx" in
        Ssh.download_file uri filename;
        Parse_vmx.parse_file filename in
@@ -346,7 +346,7 @@ let parse_domain_from_vmx vmx_source =
        warning (f_"no displayName key found in VMX file");
        match vmx_source with
        | File filename -> name_from_disk filename
-       | SSH uri -> name_from_disk (Ssh.path_of_uri uri) in
+       | SSH (_, uri) -> name_from_disk (Ssh.path_of_uri uri) in
 
   let genid =
     (* See: 
https://lists.nongnu.org/archive/html/qemu-devel/2018-07/msg02019.html *)
-- 
2.43.0