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