[Libguestfs] [PATCH] aarch64: Use a common table of AAVMF paths.

Richard W.M. Jones rjones at redhat.com
Thu Feb 4 18:27:30 UTC 2016


Previously the code had two places where an identical set of AAVMF
paths were stored.  Put this information into one place.

This is just refactoring.
---
 src/appliance.c                 | 26 +++++---------------------
 src/guestfs-internal-frontend.h |  1 +
 src/utils.c                     | 12 ++++++++++++
 v2v/utils-c.c                   | 27 +++++++++++++++++++++++++++
 v2v/utils.ml                    |  7 +++----
 5 files changed, 48 insertions(+), 25 deletions(-)

diff --git a/src/appliance.c b/src/appliance.c
index 1dbf9c7..dbde35e 100644
--- a/src/appliance.c
+++ b/src/appliance.c
@@ -443,32 +443,15 @@ dir_contains_files (const char *dir, ...)
  *
  * XXX See also v2v/utils.ml:find_uefi_firmware
  */
-#ifdef __aarch64__
-
-static const char *uefi_firmware[] = {
-  "/usr/share/AAVMF/AAVMF_CODE.fd",
-  "/usr/share/AAVMF/AAVMF_VARS.fd",
-
-  "/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw",
-  "/usr/share/edk2.git/aarch64/vars-template-pflash.raw",
-
-  NULL
-};
-
-#else
-
-static const char *uefi_firmware[] = { NULL };
-
-#endif
-
 int
 guestfs_int_get_uefi (guestfs_h *g, char **code, char **vars)
 {
+#ifdef __aarch64__
   size_t i;
 
-  for (i = 0; uefi_firmware[i] != NULL; i += 2) {
-    const char *codefile = uefi_firmware[i];
-    const char *varsfile = uefi_firmware[i+1];
+  for (i = 0; guestfs_int_aavmf_firmware[i] != NULL; i += 2) {
+    const char *codefile = guestfs_int_aavmf_firmware[i];
+    const char *varsfile = guestfs_int_aavmf_firmware[i+1];
 
     if (access (codefile, R_OK) == 0 && access (varsfile, R_OK) == 0) {
       CLEANUP_CMD_CLOSE struct command *copycmd = guestfs_int_new_command (g);
@@ -495,6 +478,7 @@ guestfs_int_get_uefi (guestfs_h *g, char **code, char **vars)
       return 0;
     }
   }
+#endif
 
   /* Not found. */
   *code = *vars = NULL;
diff --git a/src/guestfs-internal-frontend.h b/src/guestfs-internal-frontend.h
index 2fbf875..6f54a73 100644
--- a/src/guestfs-internal-frontend.h
+++ b/src/guestfs-internal-frontend.h
@@ -107,6 +107,7 @@ extern int guestfs_int_random_string (char *ret, size_t len);
 extern char *guestfs_int_drive_name (size_t index, char *ret);
 extern ssize_t guestfs_int_drive_index (const char *);
 extern int guestfs_int_is_true (const char *str);
+extern const char *guestfs_int_aavmf_firmware[];
 
 /* These functions are used internally by the CLEANUP_* macros.
  * Don't call them directly.
diff --git a/src/utils.c b/src/utils.c
index 36fd458..9244d16 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -314,3 +314,15 @@ guestfs_int_is_true (const char *str)
 
   return -1;
 }
+
+/* See src/appliance.c:guestfs_int_get_uefi. */
+const char *
+guestfs_int_aavmf_firmware[] = {
+  "/usr/share/AAVMF/AAVMF_CODE.fd",
+  "/usr/share/AAVMF/AAVMF_VARS.fd",
+
+  "/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw",
+  "/usr/share/edk2.git/aarch64/vars-template-pflash.raw",
+
+  NULL
+};
diff --git a/v2v/utils-c.c b/v2v/utils-c.c
index 66291b2..4ec4063 100644
--- a/v2v/utils-c.c
+++ b/v2v/utils-c.c
@@ -57,3 +57,30 @@ v2v_utils_drive_index (value strv)
 
   CAMLreturn (Val_int (r));
 }
+
+value
+v2v_utils_aavmf_firmware (value unitv)
+{
+  CAMLparam1 (unitv);
+  CAMLlocal5 (rv, v, v1, v2, cons);
+  /* Initialize the list backwards. */
+  size_t i = guestfs_int_count_strings ((char **) guestfs_int_aavmf_firmware);
+
+  rv = Val_int (0);
+
+  while (i > 0) {
+    v1 = caml_copy_string (guestfs_int_aavmf_firmware[i-2]);
+    v2 = caml_copy_string (guestfs_int_aavmf_firmware[i-1]);
+    v = caml_alloc (2, 0);
+    Store_field (v, 0, v1);
+    Store_field (v, 1, v2);
+    cons = caml_alloc (2, 0);
+    Store_field (cons, 1, rv);
+    rv = cons;
+    Store_field (cons, 0, v);
+
+    i -= 2;
+  }
+
+  CAMLreturn (rv);
+}
diff --git a/v2v/utils.ml b/v2v/utils.ml
index 82f4377..636f3c2 100644
--- a/v2v/utils.ml
+++ b/v2v/utils.ml
@@ -81,6 +81,8 @@ let qemu_supports_sound_card = function
   | Types.USBAudio
     -> true
 
+external aavmf_firmware : unit -> (string * string) list = "v2v_utils_aavmf_firmware"
+
 (* Find the UEFI firmware. *)
 let find_uefi_firmware guest_arch =
   let files =
@@ -96,10 +98,7 @@ let find_uefi_firmware guest_arch =
          "/usr/share/qemu/ovmf-x86_64-code.bin",
          "/usr/share/qemu/ovmf-x86_64-vars.bin" ]
     | "aarch64" ->
-       [ "/usr/share/AAVMF/AAVMF_CODE.fd",
-         "/usr/share/AAVMF/AAVMF_VARS.fd";
-         "/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw",
-         "/usr/share/edk2.git/aarch64/vars-template-pflash.raw" ]
+       aavmf_firmware () (* actually defined in src/utils.c *)
     | arch ->
        error (f_"don't know how to convert UEFI guests for architecture %s")
              guest_arch in
-- 
2.5.0




More information about the Libguestfs mailing list