diff options
author | Kevin Locke <kevin@kevinlocke.name> | 2016-02-09 20:01:05 -0800 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2016-12-15 21:49:33 +0000 |
commit | f1f18a44fd2097818337f405ecc075ec5e232b8b (patch) | |
tree | 999e1a93e3ee1ee5d46102bc145755e43fb21978 /lsinitramfs | |
parent | c48108dc0ed7e52e3efcfe3995384175061cc108 (diff) |
Create unmkinitramfs command
This command supports extracting files from an initramfs image. It is
designed to be a drop-in for cpio wherever an initramfs may be present.
It is implemented using the code from lsinitramfs, which now delegates
to uninitramfs instead of cpio.
Signed-off-by: Kevin Locke <kevin@kevinlocke.name>
[bwh: Rename it from uninitramfs to unmkinitramfs; add to .install list]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'lsinitramfs')
-rwxr-xr-x | lsinitramfs | 71 |
1 files changed, 2 insertions, 69 deletions
diff --git a/lsinitramfs b/lsinitramfs index 34d84e4..14705ad 100755 --- a/lsinitramfs +++ b/lsinitramfs @@ -12,7 +12,7 @@ if [ "$#" -eq 0 ] ; then exit 1 fi -cpio_args="--extract --quiet --list" +cpio_args="--quiet --list" OPTIONS=`getopt -o hl --long help,long -n "$0" -- "$@"` # Check for non-GNU getopt @@ -40,73 +40,6 @@ while true; do esac done -listarchive() -{ - archive="$1" - if zcat -t "${archive}" >/dev/null 2>&1 ; then - zcat "${archive}" | cpio ${cpio_args} - elif xzcat -t "${archive}" >/dev/null 2>&1 ; then - xzcat "${archive}" | cpio ${cpio_args} - elif bzip2 -t "${archive}" >/dev/null 2>&1 ; then - bzip2 -c -d "${archive}" | cpio ${cpio_args} - elif lzop -t "${archive}" >/dev/null 2>&1 ; then - lzop -c -d "${archive}" | cpio ${cpio_args} - fi -} - -# Read bytes out of a file, checking that they are valid hex digits -readhex() -{ - dd < "$1" bs=1 skip="$2" count="$3" 2> /dev/null | \ - LANG=C grep -E "^[0-9A-Fa-f]{$3}\$" -} - -# Check for a zero byte in a file -checkzero() -{ - dd < "$1" bs=1 skip="$2" count=1 2> /dev/null | \ - LANG=C grep -q -z '^$' -} - for initramfs in "$@" ; do - if ! [ -r "${initramfs}" ] ; then - echo "Specified file could not be read." >&2 - exit 1 - else - echo "${initramfs}" - - # There may be a prepended uncompressed archive. cpio - # won't tell us the true size of this so we have to - # parse the headers and padding ourselves. This is - # very roughly based on linux/lib/earlycpio.c - offset=0 - while true; do - if checkzero "$initramfs" $offset; then - offset=$((offset + 4)) - continue - fi - magic="$(readhex "$initramfs" $offset 6)" || break - test $magic = 070701 || test $magic = 070702 || break - namesize=0x$(readhex "$initramfs" $((offset + 94)) 8) - filesize=0x$(readhex "$initramfs" $((offset + 54)) 8) - offset=$(((offset + 110))) - offset=$(((offset + $namesize + 3) & ~3)) - offset=$(((offset + $filesize + 3) & ~3)) - done - - if [ $offset -ne 0 ]; then - # List uncompressed archive - cpio ${cpio_args} < "$initramfs" - - # List main archive - subarchive=$(mktemp ${TMPDIR:-/var/tmp}/lsinitramfs_XXXXXX) - trap "rm -f $subarchive" EXIT - dd < "$initramfs" bs="$offset" skip=1 2> /dev/null \ - > $subarchive - listarchive $subarchive - else - listarchive "${initramfs}" - fi - - fi + unmkinitramfs $cpio_args < "$initramfs" done |