#!/bin/sh
#
# pcinitrd revision 1.6 1997/04/24 15:47:32 (David Hinds)
#
RELEASE=""
ALL=""
SIZE=1440
MODULES="pcmcia/pcmcia_core.o pcmcia/ds.o"

# Things to install when "all" is selected
SOCK="i82365.o tcic.o"
BLK="fixed_cs.o pcmem_cs.o aha152x_cs.o fdomain_cs.o qlogic_cs.o"
MEM="ftl_cs.o memory_cs.o sram_mtd.o iflash2_mtd.o iflash2+_mtd.o"

usage()
{
    echo "usage: $0 [-v] [-a|-all] [-u|--update] [-r|--release=kernel-release]" >&2
    echo "       [-s|--size=image-size] <initrd-image> [modules ...]" >&2
    exit 1
}

while [ $# -gt 0 ] ; do
    case $1 in
    -a|--all)
	ALL=y
	;;
    -r)
	RELEASE=$2 ; shift
	;;
    --release=*)
	RELEASE=`echo $1 | sed -e 's/^--release=//'`
	;;
    -s)
	SIZE=$2 ; shift
	;;
    --size=*)
	SIZE=`echo $1 | sed -e 's/^--size=//'`
	;;
    -u|--update)
	UPDATE=y
	;;
    -v|--verbose)
	VERBOSE=-v
	;;
    -*)
	usage
	exit 1
	;;
    *)
	break
	;;
    esac
    shift
done

if [ $# -lt 1 ] ; then usage ; fi
TARGET=$1 ; shift
if [ "$ALL" = "y" ] ; then
    for MOD in $SOCK $BLK $MEM ; do
	if [ -f /lib/modules/$RELEASE/pcmcia$MOD ] ; then
	    MODULES="$MODULES pcmcia/$MOD"
	fi
    done
else
    MODULES="$MODULES $*"
fi

if [ "$RELEASE" = "" ] ; then
    RELEASE=`uname -r`
fi
[ "$VERBOSE" ] && echo "Using version $RELEASE modules"

for MOD in $MODULES ; do
    if [ ! -f /lib/modules/$RELEASE/$MOD ] ; then
	echo "/lib/modules/$RELEASE/$MOD does not exist." 1>&2
	exit 1
    fi
done

strip_cp()
{
    if [ -d $3 ] ; then
	DEST=$3/`basename $2`
    else
	DEST=$3
    fi
    strip $1 $VERBOSE -o $DEST $2 | sed -e 's/([^ ]*)//g' || exit 1
}

MNT=/tmp/initrd.mnt-$$
mkdir $MNT

if [ "$UPDATE" = "y" ] ; then
    if [ -b $TARGET ] ; then
	mount $VERBOSE -t ext2 $TARGET $MNT || exit 1
    else
	mount $VERBOSE -t ext2 -o loop $TARGET $MNT || exit 1
    fi
    strip_cp --strip-all /sbin/cardmgr $MNT/sbin || exit 1
    CD=`pwd` ; cd $MNT
    for DIR in block misc fs net pcmcia ; do
	for MOD in $DIR/*.o ; do
	    strip_cp --discard-all /lib/modules/$MOD $DIR || exit 1
	done
    done
    cd $CD
    umount $VERBOSE $MNT
    rmdir $MNT
    exit 0
fi

[ "$VERBOSE" ] && echo "Creating filesystem on $TARGET"
if [ -b $TARGET ] ; then
    mke2fs $TARGET $SIZE > /dev/null || exit 1
    mount $VERBOSE -t ext2 $TARGET $MNT
else
    dd if=/dev/zero of=$TARGET bs=1k count=$SIZE
    echo "y" | mke2fs $TARGET $SIZE >/dev/null || exit 1
    mount $VERBOSE -t ext2 -o loop $TARGET $MNT || exit 1
fi

rm -rf $MNT/lost+found
for DIR in bin dev etc lib lib/pcmcia proc tmp ; do
    mkdir $MNT/$DIR || exit 1
done

for DEV in console null ram systty tty1 tty2 tty3 tty4 ; do
    cp -a $VERBOSE /dev/$DEV $MNT/dev || exit 1
done

BIN="/bin/mount /bin/umount /bin/sleep /sbin/insmod /sbin/cardmgr"
for F in $BIN ; do
    strip_cp --strip-all $F $MNT/bin
done
strip_cp --strip-all /bin/ash $MNT/bin/sh

strip_cp --strip-debug /lib/libc.so.? $MNT/lib
if [ -f /lib/ld.so ] ; then
    LD=/lib/ld.so
else
    LD=/lib/ld.so.?
fi
strip_cp --strip-all $LD $MNT/lib
strip_cp --strip-all /lib/ld-linux.so.? $MNT/lib

cp $VERBOSE /etc/ld.so.cache $MNT/etc || exit 1
cp $VERBOSE /etc/pcmcia/config /etc/pcmcia/config.opts $MNT/etc || exit 1

for MOD in $MODULES ; do
    strip_cp --strip-debug /lib/modules/$RELEASE/$MOD $MNT/lib/$MOD
done

[ "$VERBOSE" ] && echo "Creating linuxrc startup script"
cat > $MNT/linuxrc <<- 'EOF'
	#!/bin/sh
	
	# Should be either i82365 or tcic
	PCIC=i82365
	# Put socket driver timing parameters here
	PCIC_OPTS=
	# Put pcmcia_core options here
	CORE_OPTS=
	
	mount -t proc /proc /proc

	echo ""
	echo "==== initrd: starting PCMCIA services ===="
	echo ""
	PC=/lib/pcmcia
	insmod $PC/pcmcia_core.o $CORE_OPTS
	insmod $PC/$PCIC.o $PCIC_OPTS
	insmod $PC/ds.o
	sleep 5
	cardmgr -q -o -c /etc -m /lib -s /tmp/stab -p /tmp/pid
	umount /proc
	echo ""
	
	if [ "$SHELL" != "" ] ; then
	    /bin/sh < /dev/console
	fi
EOF
chmod +x $MNT/linuxrc

umount $VERBOSE $MNT
rmdir $MNT
