[Pkg-libvirt-commits] [libguestfs] 03/31: inspector: recognize ppc64 and ppc64le archs (RHBZ#1211996)

Hilko Bengen bengen at moszumanska.debian.org
Sun Nov 1 17:13:03 UTC 2015


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to annotated tag upstream/1.29.46
in repository libguestfs.

commit 33d2b4a7341830efeddb1f258ac77f67a8004d30
Author: Maros Zatko <mzatko at redhat.com>
Date:   Fri May 22 17:10:14 2015 +0200

    inspector: recognize ppc64 and ppc64le archs (RHBZ#1211996)
---
 generator/actions.ml |  8 ++++++++
 src/filearch.c       | 29 +++++++++++++++++++----------
 2 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/generator/actions.ml b/generator/actions.ml
index 613a2da..e9374a3 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -790,6 +790,10 @@ to specify the QEMU interface emulation to use at run time." };
       InitISOFS, Always, TestResultString (
         [["file_architecture"; "/bin-i586-dynamic"]], "i386"), [];
       InitISOFS, Always, TestResultString (
+        [["file_architecture"; "/bin-ppc64-dynamic"]], "ppc64"), [];
+      InitISOFS, Always, TestResultString (
+        [["file_architecture"; "/bin-ppc64le-dynamic"]], "ppc64le"), [];
+      InitISOFS, Always, TestResultString (
         [["file_architecture"; "/bin-sparc-dynamic"]], "sparc"), [];
       InitISOFS, Always, TestResultString (
         [["file_architecture"; "/bin-win32.exe"]], "i386"), [];
@@ -804,6 +808,10 @@ to specify the QEMU interface emulation to use at run time." };
       InitISOFS, Always, TestResultString (
         [["file_architecture"; "/lib-i586.so"]], "i386"), [];
       InitISOFS, Always, TestResultString (
+        [["file_architecture"; "/lib-ppc64.so"]], "ppc64"), [];
+      InitISOFS, Always, TestResultString (
+        [["file_architecture"; "/lib-ppc64le.so"]], "ppc64le"), [];
+      InitISOFS, Always, TestResultString (
         [["file_architecture"; "/lib-sparc.so"]], "sparc"), [];
       InitISOFS, Always, TestResultString (
         [["file_architecture"; "/lib-win32.dll"]], "i386"), [];
diff --git a/src/filearch.c b/src/filearch.c
index 8fb1acf..29c9ba6 100644
--- a/src/filearch.c
+++ b/src/filearch.c
@@ -59,14 +59,14 @@ cleanup_magic_t_free (void *ptr)
 # endif
 
 COMPILE_REGEXP (re_file_elf,
-                "ELF.*(?:executable|shared object|relocatable), (.+?),", 0)
-COMPILE_REGEXP (re_elf_ppc64, "64.*PowerPC", 0)
+                "ELF.*(MSB|LSB).*(?:executable|shared object|relocatable), (.+?),", 0)
+COMPILE_REGEXP (re_elf_ppc64, ".*64.*PowerPC", 0)
 
 /* Convert output from 'file' command on ELF files to the canonical
  * architecture string.  Caller must free the result.
  */
 static char *
-canonical_elf_arch (guestfs_h *g, const char *elf_arch)
+canonical_elf_arch (guestfs_h *g, const char *endianness, const char *elf_arch)
 {
   const char *r;
   char *ret;
@@ -85,8 +85,16 @@ canonical_elf_arch (guestfs_h *g, const char *elf_arch)
     r = "sparc64";
   else if (strstr (elf_arch, "IA-64"))
     r = "ia64";
-  else if (match (g, elf_arch, re_elf_ppc64))
-    r = "ppc64";
+  else if (match (g, elf_arch, re_elf_ppc64)) {
+    if (strstr (endianness, "MSB"))
+      r = "ppc64";
+    else if (strstr (endianness, "LSB"))
+      r = "ppc64le";
+    else {
+      error (g, "file_architecture: unknown endianness '%s'", endianness);
+      return NULL;
+    }
+  }
   else if (strstr (elf_arch, "PowerPC"))
     r = "ppc";
   else if (strstr (elf_arch, "ARM aarch64"))
@@ -116,6 +124,7 @@ magic_for_file (guestfs_h *g, const char *filename, bool *loading_ok,
   CLEANUP_MAGIC_T_FREE magic_t m = NULL;
   const char *line;
   CLEANUP_FREE char *elf_arch = NULL;
+  CLEANUP_FREE char *endianness = NULL;
 
   flags = g->verbose ? MAGIC_DEBUG : 0;
   flags |= MAGIC_ERROR | MAGIC_RAW;
@@ -145,8 +154,7 @@ magic_for_file (guestfs_h *g, const char *filename, bool *loading_ok,
   if (loading_ok)
     *loading_ok = true;
 
-  elf_arch = match1 (g, line, re_file_elf);
-  if (elf_arch == NULL) {
+  if (!match2 (g, line, re_file_elf, &endianness, &elf_arch)) {
     error (g, "no re_file_elf match in '%s'", line);
     return NULL;
   }
@@ -154,7 +162,7 @@ magic_for_file (guestfs_h *g, const char *filename, bool *loading_ok,
   if (matched)
     *matched = true;
 
-  return canonical_elf_arch (g, elf_arch);
+  return canonical_elf_arch (g, endianness, elf_arch);
 }
 
 /* Download and uncompress the cpio file to find binaries within. */
@@ -315,6 +323,7 @@ guestfs_impl_file_architecture (guestfs_h *g, const char *path)
 {
   CLEANUP_FREE char *file = NULL;
   CLEANUP_FREE char *elf_arch = NULL;
+  CLEANUP_FREE char *endianness = NULL;
   char *ret = NULL;
 
   /* Get the output of the "file" command.  Note that because this
@@ -324,8 +333,8 @@ guestfs_impl_file_architecture (guestfs_h *g, const char *path)
   if (file == NULL)
     return NULL;
 
-  if ((elf_arch = match1 (g, file, re_file_elf)) != NULL)
-    ret = canonical_elf_arch (g, elf_arch);
+  if ((match2 (g, file, re_file_elf, &endianness, &elf_arch)) != 0)
+    ret = canonical_elf_arch (g, endianness, elf_arch);
   else if (strstr (file, "PE32 executable"))
     ret = safe_strdup (g, "i386");
   else if (strstr (file, "PE32+ executable"))

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git



More information about the Pkg-libvirt-commits mailing list