]> www.infradead.org Git - users/hch/misc.git/commitdiff
gen_init_cpio: support -o <output_file> parameter
authorDavid Disseldorp <ddiss@suse.de>
Tue, 19 Aug 2025 03:05:45 +0000 (13:05 +1000)
committerNathan Chancellor <nathan@kernel.org>
Wed, 20 Aug 2025 23:02:55 +0000 (16:02 -0700)
This is another preparatory change to allow for reflink-optimized
cpio archives with file data written / cloned via copy_file_range().
The output file is truncated prior to write, so that it maps to
usr/gen_initramfs.sh usage. It may make sense to offer an append option
in future, for easier archive concatenation.

Signed-off-by: David Disseldorp <ddiss@suse.de>
Reviewed-by: Nicolas Schier <nsc@kernel.org>
Link: https://lore.kernel.org/r/20250819032607.28727-3-ddiss@suse.de
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
usr/gen_init_cpio.c

index 235bfc574e6b1799a2f5f8ca857f0f3109889e6d..ea4b9b5fed01428bdb5305755871f3db13894e4f 100644 (file)
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
@@ -110,7 +111,7 @@ static int cpio_trailer(void)
            push_pad(padlen(offset, 512)) < 0)
                return -1;
 
-       return 0;
+       return fsync(outfd);
 }
 
 static int cpio_mkslink(const char *name, const char *target,
@@ -532,7 +533,7 @@ static int cpio_mkfile_line(const char *line)
 static void usage(const char *prog)
 {
        fprintf(stderr, "Usage:\n"
-               "\t%s [-t <timestamp>] [-c] <cpio_list>\n"
+               "\t%s [-t <timestamp>] [-c] [-o <output_file>] <cpio_list>\n"
                "\n"
                "<cpio_list> is a file containing newline separated entries that\n"
                "describe the files to be included in the initramfs archive:\n"
@@ -569,7 +570,8 @@ static void usage(const char *prog)
                "as mtime for symlinks, directories, regular and special files.\n"
                "The default is to use the current time for all files, but\n"
                "preserve modification time for regular files.\n"
-               "-c: calculate and store 32-bit checksums for file data.\n",
+               "-c: calculate and store 32-bit checksums for file data.\n"
+               "<output_file>: write cpio to this file instead of stdout\n",
                prog);
 }
 
@@ -611,7 +613,7 @@ int main (int argc, char *argv[])
 
        default_mtime = time(NULL);
        while (1) {
-               int opt = getopt(argc, argv, "t:ch");
+               int opt = getopt(argc, argv, "t:cho:");
                char *invalid;
 
                if (opt == -1)
@@ -630,6 +632,16 @@ int main (int argc, char *argv[])
                case 'c':
                        do_csum = true;
                        break;
+               case 'o':
+                       outfd = open(optarg,
+                                    O_WRONLY | O_CREAT | O_LARGEFILE | O_TRUNC,
+                                    0600);
+                       if (outfd < 0) {
+                               fprintf(stderr, "failed to open %s\n", optarg);
+                               usage(argv[0]);
+                               exit(1);
+                       }
+                       break;
                case 'h':
                case '?':
                        usage(argv[0]);