[continued from previous message]
- # very roughly based on linux/lib/earlycpio.c
- end=$start
- while true; do
- headoff=$end
- magic="$(readhex "$initramfs" $end 6)" || break
- test "$magic" = 070701 || test "$magic" = 070702 || break
- namesize=$((0x$(readhex "$initramfs" $((end + 94)) 8))) - filesize=$((0x$(readhex "$initramfs" $((end + 54)) 8))) - nameoff=$((end + 110))
- end=$(((nameoff + namesize + 3) & ~3))
- end=$(((end + filesize + 3) & ~3))
-
- # Check for EOF marker. Note that namesize
- # includes a null terminator.
- if [ $namesize = 11 ] \
- && name="$(dd if="$initramfs" bs=1 skip=$nameoff count=$((namesize - 1)) 2> /dev/null)" \
- && [ "$name" = 'TRAILER!!!' ]; then
- # There might be more zero padding
- # before the next archive, so read
- # through all of it.
- while checkzero "$initramfs" $end; do
- end=$((end + 4))
- done
- break
- fi
- done
-
- if [ $end -eq $start ]; then
- break
- fi
-
- # Check whether this should be treated as an "early"
- # or "main" initramfs. Currently all filenames the
- # kernel looks for in an early initramfs begin with
- # kernel/ subdirectory, but we should never create
- # this in the main initramfs.
- if dd < "$initramfs" skip=$start count=$((end - start)) \
- iflag=skip_bytes,count_bytes 2> /dev/null |
- cpio -i --list 2> /dev/null |
- grep -q ^kernel/; then
- # Extract to early, early2, ... subdirectories
- count=$((count + 1))
- if [ $count -eq 1 ]; then
- subdir=early
- else
- subdir=early$count
- fi
- dd < "$initramfs" skip=$start count=$((end - start)) \ - iflag=skip_bytes,count_bytes 2> /dev/null |
- (
- if [ -n "$dir" ]; then
- mkdir -p -- "$dir/$subdir"
- cd -- "$dir/$subdir"
- fi
- cpio -i "$@"
- )
- else
- # Append to main-uncomp.cpio, excluding the
- # trailer so cpio won't stop before the
- # (de)compressed part.
- dd < "$initramfs" skip=$start \
- count=$((headoff - start)) \
- iflag=skip_bytes,count_bytes \
- >> "$tempdir/main-uncomp.cpio" 2> /dev/null
- fi
-
- start=$end
- done
-
- # Split out final archive if necessary
- if [ "$end" -gt 0 ]; then
- subarchive="$tempdir/main-comp.cpio"
- dd < "$initramfs" skip="$end" iflag=skip_bytes 2> /dev/null \
- > "$subarchive"
- else
- subarchive="$initramfs"
- fi
-
- # If we found an early initramfs, extract main initramfs to
- # main subdirectory. Otherwise don't use a subdirectory (for
- # backward compatibility).
- if [ "$count" -gt 0 ]; then
- subdir=main
- else
- subdir=.
- fi
-
- xcpio "$tempdir/main-uncomp.cpio" "$subarchive" \
- "${dir:+$dir/$subdir}" -i "$@"
-}
-
-OPTIONS=$(getopt -o hv --long help,list,verbose -n "$0" -- "$@") || usage_error
-
-cpio_opts="--preserve-modification-time --no-absolute-filenames --quiet" -expected_args=2
-eval set -- "$OPTIONS"
-
-while true; do
- case "$1" in
- -h|--help)
- usage
- exit 0
- ;;
- --list)
- # For lsinitramfs
- cpio_opts="${cpio_opts:+${cpio_opts} --list}"
- expected_args=1
- shift
- ;;
- -v|--verbose)
- cpio_opts="${cpio_opts:+${cpio_opts} --verbose}"
- shift
- ;;
- --)
- shift
- break
- ;;
- *)
- echo "Internal error!" >&2
- exit 1
- esac
-done
-
-if [ $# -ne $expected_args ]; then
- usage_error
-fi
-
-tempdir="$(mktemp -d "${TMPDIR:-/var/tmp}/unmkinitramfs_XXXXXX")"
-trap 'rm -rf "$tempdir"' EXIT
-
-# shellcheck disable=SC2086
-splitinitramfs "$1" "${2:-}" $cpio_opts
diff -Nru initramfs-tools-0.147/unmkinitramfs.8 initramfs-tools-0.148.1/unmkinitramfs.8
--- initramfs-tools-0.147/unmkinitramfs.8 2025-03-25 00:52:03.000000000 +0100
+++ initramfs-tools-0.148.1/unmkinitramfs.8 2025-05-28 20:21:18.000000000 +0200
@@ -18,8 +18,8 @@
and the appropriate decompressor command.
The initramfs image may be a single compressed cpio archive, or the -concatenation of any number of uncompressed cpio archives followed by
-a compressed cpio archive.
+concatenation of any number of uncompressed cpio archives optionally
+followed by a compressed cpio archive.
When the initramfs image includes one or more "early initramfs"
archives, that is uncompressed archives with microcode or other files
@@ -51,8 +51,8 @@
.SH BUGS
.BR unmkinitramfs
-does not support initramfs images with more or less than one
-compressed cpio archive.
+does not support initramfs images with more than one compressed cpio
+archive.
.SH AUTHOR
The initramfs-tools are written by Maximilian Attems <
[email protected]>
diff -Nru initramfs-tools-0.147/unmkinitramfs.c initramfs-tools-