diff options
author | David Disseldorp <ddiss@suse.de> | 2025-08-19 13:05:45 +1000 |
---|---|---|
committer | Nathan Chancellor <nathan@kernel.org> | 2025-08-20 16:02:55 -0700 |
commit | ae18b94099b04264b32e33b057114024bc72c993 (patch) | |
tree | 7f6c3d0c4887cdb626b7fd23d37c5cbc173be09f /usr/gen_init_cpio.c | |
parent | 1400227773201918f270dda48f20afcd613d9bc3 (diff) |
gen_init_cpio: support -o <output_file> parameter
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>
Diffstat (limited to 'usr/gen_init_cpio.c')
-rw-r--r-- | usr/gen_init_cpio.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c index 235bfc574e6b..ea4b9b5fed01 100644 --- a/usr/gen_init_cpio.c +++ b/usr/gen_init_cpio.c @@ -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]); |