On Friday, 14 July 2017 15:39:20 CEST Richard W.M. Jones wrote:
+(* Convert output from 'file' command on ELF files to the
canonical
+ * architecture string. Caller must free the result.
No more need to free anything, I guess?
+and cpio_arch magic orig_path path =
+ let sysroot = Sysroot.sysroot () in
+
+ let zcat =
+ if String.find magic "gzip" >= 0 then "zcat"
+ else if String.find magic "bzip2" >= 0 then "bzcat"
+ else if String.find magic "XZ compressed" >= 0 then "xzcat"
+ else "cat" in
+
+ let tmpdir = sprintf "/tmp/%s" (String.random8 ()) in
+ mkdir tmpdir 0o700;
This could use Mkdtemp.temp_dir (from mlutils, Unix_utils). Even if
there is not much advantage, at least it makes slightly easier to read
the code, and to discover where temporary directories are created.
+ (* Construct a command to extract named binaries from the initrd
file. *)
+ let cmd =
+ sprintf "cd %s && %s %s | cpio --quiet -id %s"
+ tmpdir zcat (quote (sysroot // path))
+ (String.concat " " (List.map quote initrd_binaries)) in
+ if verbose () then eprintf "%s\n%!" cmd;
+ if Sys.command cmd <> 0 then
+ failwith "cpio command failed";
+
+ (* See if any of the binaries were present in the output. *)
+ let rec loop = function
+ | bin :: bins ->
+ let bin_path = tmpdir // bin in
+ if is_regular_file bin_path then (
+ let out = command "file" ["-zb"; bin_path] in
+ file_architecture_of_magic out orig_path bin_path
+ )
+ else
+ loop bins
+ | [] ->
+ failwithf "could not determine architecture of cpio archive: %s" path
+ in
+ loop initrd_binaries
This must cleanup tmpdir, otherwise things will pile up and fill the
appliance.
diff --git a/docs/C_SOURCE_FILES b/docs/C_SOURCE_FILES
index 6149bba43..2dbd5a14b 100644
--- a/docs/C_SOURCE_FILES
+++ b/docs/C_SOURCE_FILES
@@ -72,6 +72,7 @@ daemon/blkdiscard.c
daemon/blkid.c
daemon/blockdev.c
daemon/btrfs.c
+daemon/caml-stubs.c
daemon/cap.c
daemon/checksum.c
daemon/cleanups.c
@@ -82,6 +83,7 @@ daemon/compress.c
daemon/copy.c
daemon/cpio.c
daemon/cpmv.c
+daemon/daemon-c.c
daemon/daemon.h
daemon/dd.c
daemon/debug-bmap.c
@@ -173,6 +175,7 @@ daemon/stubs.h
daemon/swap.c
daemon/sync.c
daemon/syslinux.c
+daemon/sysroot-c.c
daemon/tar.c
daemon/truncate.c
daemon/tsk.c
@@ -296,7 +299,6 @@ lib/errors.c
The three hunks above should be part of patch #2.
--
Pino Toscano