Hi.

On Thu, Sep 26, 2013 at 06:19:38AM +0100, Ben Hutchings wrote:
> On Tue, 2013-09-24 at 16:11 +0100, Brett Parker wrote:
> > Hi,
> > 
> > Here's a patch to lsinitramfs to deal with initramfs images that start
> > with the microcode archive and then a real archive afterwards.
> 
> Thanks, Brett.
> 

What do you think of the proposed version I'm attaching ?

I don't know about the +8 offset, but I do hope I have addressed the rest of 
the comments.

Not tested on various compressions, but basically helps solve this bug here, 
AFAICT.

I'm adding the new file as well, as it may help others without having to replay 
the patch.

Na warranty whatsoever.


Hope this helps.

Best regards,

-- 
Olivier BERGER 
http://www-public.telecom-sudparis.eu/~berger_o/ - OpenPGP-Id: 2048R/5819D7E8
Ingenieur Recherche - Dept INF
Institut Mines-Telecom, Telecom SudParis, Evry (France)

--- lsinitramfs.orig	2013-07-23 19:19:27.000000000 +0200
+++ lsinitramfs	2013-10-29 18:51:44.000000000 +0100
@@ -4,7 +4,7 @@
 
 usage()
 {
-	echo "Usage: $(basename $0) <initramfs file>"
+	echo "Usage: $(basename $0) [--long] <initramfs file>"
 }
 
 if [ "$#" -eq 0 ] ; then
@@ -40,20 +40,44 @@
 	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
+}
+
 for initramfs in "$@" ; do
 	if ! [ -r "${initramfs}" ] ; then
 		echo "Specified file could not be read." >&2
 		exit 1
 	else
 		echo "${initramfs}"
-		if zcat -t "${initramfs}" >/dev/null 2>&1 ; then
-			zcat "${initramfs}" | cpio ${cpio_args}
-		elif xzcat -t "$initramfs" >/dev/null 2>&1 ; then
-			xzcat "$initramfs" | cpio ${cpio_args}
-		elif bzip2 -t "$initramfs" >/dev/null 2>&1 ; then
-			bzip2 -c -d "$initramfs" | cpio ${cpio_args}
-		elif lzop -t "$initramfs" >/dev/null 2>&1 ; then
-			lzop -c -d "$initramfs" | cpio ${cpio_args}
+		if cpio ${cpio_args} < "$initramfs" >/dev/null 2>&1; then
+			# this is a straight cpio archive followed by a compressed one, yay!
+			cpio ${cpio_args} < "$initramfs"
+			
+			real_offset=$(cpio --io-size=1 --extract --list < "$initramfs" 2>&1 >/dev/null | sed -e '$ { s# .*$##; p; }; d;')
+			# now we need to find the beginning of the actual archive, this is
+			# going to be the number of bytes from above + 8
+			real_offset=$((real_offset+8))
+
+			subarchive=$(mktemp ${TMPDIR:-/var/tmp}/lsinitramfs_XXXXXX)
+                        dd if="$initramfs" bs=$real_offset skip=1 status=noxfer >$subarchive 2>/dev/null 
+
+                        listarchive $subarchive
+
+                        rm -fr $subarchive
+                else
+                        listarchive "${initramfs}"
 		fi
 
 	fi
#!/bin/sh

set -eu

usage()
{
        echo "Usage: $(basename $0) [--long] <initramfs file>"
}

if [ "$#" -eq 0 ] ; then
        usage >&2
        exit 1
fi

cpio_args="--extract --quiet --list"

OPTIONS=`getopt -o hl --long help,long -n "$0" -- "$@"`
# Check for non-GNU getopt
if [ $? != 0 ] ; then echo "W: non-GNU getopt" >&2 ; exit 1 ; fi

eval set -- "$OPTIONS"

while true; do
        case "$1" in
        -h|--help)
                usage
                exit 0
        ;;
        -l|--long)
                cpio_args="${cpio_args:+${cpio_args} --verbose}"
                shift
        ;;
        --)
                shift
                break
        ;;
        *)
                echo "Internal error!" >&2
                exit 1
        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
}

for initramfs in "$@" ; do
        if ! [ -r "${initramfs}" ] ; then
                echo "Specified file could not be read." >&2
                exit 1
        else
                echo "${initramfs}"
                if cpio ${cpio_args} < "$initramfs" >/dev/null 2>&1; then
                        # this is a straight cpio archive followed by a 
compressed one, yay!
                        cpio ${cpio_args} < "$initramfs"
                        
                        real_offset=$(cpio --io-size=1 --extract --list < 
"$initramfs" 2>&1 >/dev/null | sed -e '$ { s# .*$##; p; }; d;')
                        # now we need to find the beginning of the actual 
archive, this is
                        # going to be the number of bytes from above + 8
                        real_offset=$((real_offset+8))

                        subarchive=$(mktemp 
${TMPDIR:-/var/tmp}/lsinitramfs_XXXXXX)
                        dd if="$initramfs" bs=$real_offset skip=1 status=noxfer 
>$subarchive 2>/dev/null 

                        listarchive $subarchive

                        rm -fr $subarchive
                else
                        listarchive "${initramfs}"
                fi

        fi
done

Reply via email to