#!/bin/bash

# mkcdboot
#
# Copyright (C) 1998 Jakub Jelinek <jj@ultralinux.cz>
#
# Partly based on mkinitrd, which is copyrighted by:
#	Erik Troan <ewt@redhat.com>
#	Elliot Lee <sopwith@cuc.edu>
#	Miguel de Icaza <miguel@nuclecu.unam.mx>
#	Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
#	Michael K. Johnson <johnsonm@redhat.com>

MNTIMAGE=.tmp-mntimage
IMAGE=.tmp-image
MNTPOINT=.tmp-mnt
TARGET=cdboot/boot/initrd.img
MODULES32=ramdisk/modules/modules.cgz
MODULES64=ramdisk/modules/modules64.cgz
RCFILE=$MNTIMAGE/linuxrc

inst() {
    if [ "$#" != "2" ];then
	echo "usage: inst <file> <destination>"
	return
    fi
    echo "$1 -> $2"
    install $1 $2
}

if [ -f $MNTIMAGE ]; then
    echo "$MNTIMAGE already exists.  Remove it and try again" >&2
    exit 1
fi

if [ -f $IMAGE ]; then
    echo "$IMAGE already exists. Remove it and try again" >&2
    exit 1
fi

dd if=/dev/zero of=$IMAGE bs=1k count=1500 2> /dev/null

for devnum in 0 1 2 3 4 5 6 7 8; do
    if losetup /dev/loop$devnum $IMAGE 2>/dev/null ; then break; fi
done

if [ "$devnum" = "8" ]; then
    rm -rf $MNTPOINT $IMAGE
    echo "All of your loopback devices are in use!" >&2
    exit 1
fi

LODEV=/dev/loop$devnum

echo y | mke2fs $LODEV 1500

mkdir -p $MNTPOINT
mount -t ext2 $LODEV $MNTPOINT || {
	echo "Can't get a loopback device"
	exit 1
}

mkdir -p $MNTIMAGE
mkdir -p $MNTIMAGE/lib
mkdir -p $MNTIMAGE/bin
mkdir -p $MNTIMAGE/etc
mkdir -p $MNTIMAGE/dev
mkdir -p $MNTIMAGE/proc

# We don't need this directory, so let's save space
rm -rf $MNTPOINT/lost+found

inst /bin/ash "$MNTIMAGE/bin/sh"
inst /sbin/insmod64 "$MNTIMAGE/bin/insmod64"
inst /sbin/insmod "$MNTIMAGE/bin/insmod32"
inst /bin/mount "$MNTIMAGE/bin/mount"
inst /bin/umount "$MNTIMAGE/bin/umount"
inst /bin/cat "$MNTIMAGE/bin/cat"
inst /bin/grep "$MNTIMAGE/bin/grep"
inst /bin/doexec "$MNTIMAGE/bin/doexec"
echo Installing libs
(cd /lib; tar cSpf - ld-2*.so ld-linux.so.2* libc[.-]*) | (cd $MNTIMAGE/lib; tar xSpf -)

echo Stripping libs
strip $MNTIMAGE/bin/* $MNTIMAGE/lib/*

echo Extracting modules
zcat $MODULES64 | ( cd $MNTIMAGE/lib; cpio -iv isofs.o; mv isofs.o isofs64.o )
zcat $MODULES32 | ( cd $MNTIMAGE/lib; cpio -iv isofs.o; mv isofs.o isofs32.o )

echo Making devices
for n in console null ram systty tty[1234]; do
    cp -a /dev/$n $MNTIMAGE/dev
done

echo Building linuxrc
cat > $RCFILE <<EOF
#!/bin/sh

/bin/mount -n -t proc /proc /proc

IDE=""
[ -d /proc/ide ] && cd /proc/ide; for n in hd[a-l]; do
    if [ "\$n" = 'hd[a-l]' ]; then
	IDE=""
    elif [ -z "\$IDE" -a "\`/bin/cat \$n/media\`" = "cdrom" ]; then
	IDE=\$n
    fi
done
cd /
if [ -n "\$IDE" ]; then
    case "\$IDE" in
	hda) ROOT=0x03000000;;
	hdb) ROOT=0x03400000;;
	hdc) ROOT=0x16000000;;
	hdd) ROOT=0x16400000;;
	hde) ROOT=0x21000000;;
	hdf) ROOT=0x21400000;;
	hdg) ROOT=0x22000000;;
	hdh) ROOT=0x22400000;;
	hdi) ROOT=0x38000000;;
	hdj) ROOT=0x38400000;;
	hdk) ROOT=0x39000000;;
	hdl) ROOT=0x39400000;;
    esac
    DEVICE="\$IDE"
    
else
    DEVICE="scd0"
    ROOT=0x0b000000
fi
echo "Setting root device to /dev/\$DEVICE"
echo "\$ROOT" > /proc/sys/kernel/real-root-dev

if /bin/grep "type[ 	]*: sun4u" /proc/cpuinfo > /dev/null 2>&1; then
    /bin/doexec /bin/insmod64 insmod /lib/isofs64.o
else
    /bin/doexec /bin/insmod32 insmod /lib/isofs32.o
fi

umount /proc

EOF

chmod +x $RCFILE

(cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)

umount $MNTPOINT
losetup -d $LODEV

echo Gzipping...
gzip -9 < $IMAGE > $TARGET
rm -rf $MNTIMAGE $MNTPOINT $IMAGE
