summaryrefslogtreecommitdiff
path: root/lsinitramfs
diff options
context:
space:
mode:
authorKevin Locke <kevin@kevinlocke.name>2016-02-09 20:01:05 -0800
committerBen Hutchings <ben@decadent.org.uk>2016-12-15 21:49:33 +0000
commitf1f18a44fd2097818337f405ecc075ec5e232b8b (patch)
tree999e1a93e3ee1ee5d46102bc145755e43fb21978 /lsinitramfs
parentc48108dc0ed7e52e3efcfe3995384175061cc108 (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-xlsinitramfs71
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