#!/bin/sh -
#
# CatRescue 1.01E * June 1995 * Oleg Kibirev * oleg@gd.cs.CSUFresno.EDU
#
ELFDIRS="/lib /usr/lib"
#ELFDIRS="/lib/elf"


PATH=".:/sbin:/usr/local/bin:$PATH"
umask 022

case "$#" in
3) ;;
*) echo "Usage: CatRescue /dev/floppy_device /mount_point /your_vmlinuz" 1>&2
   exit 1
   ;;
esac

if [ `whoami` != root ]; then
   echo Sorry, you need to be root to build a rescue floppy. 1>&2
   echo If you got locked out, you can try a pre-built image instead. 1>&2
   exit 1
fi

case "$1" in
/dev/fd*) ;;
*) echo "$1 doesn't look like a floppy. Edit the script if you really want it." 1>&2
   exit 1
   ;;
esac

set -e

yn()
{
  while :; do
    echo -n "$@"
    read _yn_a
    case "$_yn_a" in
	y|Y) return 0 ;;
	n|N) return 1 ;;
    esac
  done
}

echo "CatRescue V1.01E running..."

yn "Format floppy? " && superformat -t83 -s21 `echo $1 | sed 's/^\(.*fd[01]\).*$/\1/g'`
yn "Make filesystem on floppy? " && mke2fs -m 0 $1
if yn "Mount floppy on $2? "; then
  mount -t ext2 $1 $2
  trap "umount $2" 0 1 2 3 15
fi

if yn "Copy files? "; then

rmdir $2/lost+found || true


cat <<END

#####################################
# Installing kernel & support files #
#####################################
END
TARLIST=/boot/*.b
TARLIST="$TARLIST /usr/lib/terminfo/c/console /usr/lib/terminfo/l/linux /sbin/update usr/lib/zoneinfo/localtime root/README.CatRescue.gz etc/ld.so.cache"

for i in /dev/mouse /dev/cdrom /dev/modem /dev/*cd /dev/fd*; do
	if [ -L $i -o -b $i ]; then
	   echo $i
	   TARLIST="$TARLIST $i"
        fi
done

mkdir -p $2/lib $2/usr/lib/zoneinfo $2/etc $2/root || true

lc=`find $ELFDIRS -name libc.so.5 -type l -printf '%H/%l'`
if [ -z "$lc" ]; then
  echo "Cannot find your ELF C library" 1>&2
  exit 1
fi
echo $lc
blc=`basename $lc`
cp -a $lc $2/lib/$blc
zum $2/lib/$blc
ln -s $blc $2/lib/libc.so.5

cp -a /lib/ld-linux.so.1 $2/lib
zum $2/lib/ld-linux.so.1

for l in libss.so.1 libext2fs.so.1 libe2p.so.1 libcom_err.so.1 libcurses.so.1 libtermcap.so.2; do
  lx=`find $ELFDIRS -name $l -type l -printf '%H/%l'`
  if [ -z "$lx" ]; then
    echo "Cannot find $l" 1>&2
    exit 1
  fi
  echo $lx
  TARLIST="$TARLIST $lx `dirname $lx`/$l"
done

cp -a $3 $2/vmlinuz
zum $2/vmlinuz 

echo /usr/lib/zoneinfo/localtime
cat /usr/lib/zoneinfo/localtime > $2/usr/lib/zoneinfo/localtime
echo README.CatRescue
gzip -9 < README.CatRescue > $2/root/README.CatRescue.gz

if [ -f /etc/lilo.conf ]; then
cat - /etc/lilo.conf > $2/etc/lilo.conf <<END
backup = /dev/null
install = /rootfs/boot/boot.b
map = /rootfs/boot/map
END
echo /etc/lilo.conf
TARLIST="$TARLIST etc/lilo.conf"
fi

# HACK HACK HACK
cp /sbin/ldconfig $2
chroot $2 /ldconfig -v
rm -f $2/ldconfig

(cd $2; tar -cvf - $TARLIST | gzip -9 > ubase.tgz)
rm -rf $2/etc $2/usr/lib $2/root


cat <<END

#######################
# Unpacking skeletion #
#######################
END

zcat skeletion.tgz | ( cd $2 && tar --preserve --same-owner -xvvf - )
find $2 -xdev -type f ! \( -name vmlinuz -o -name '*.so*' \) -print | zum

cat <<END

########################
# Copying normal files #
########################
END

exec < files.copy &&
while read i; do
cp -a /$i $2/$i
zum $2/$i
done

cat <<END

########################
# Copying TZX files    #
########################
END

exec < files.tzx &&
while read i; do
  echo $i
  cp -a /$i /tmp/CatRescue.$$ 
  chmod gu-s /tmp/CatRescue.$$
  chown root.root /tmp/CatRescue.$$
  tzx /tmp/CatRescue.$$
  mv /tmp/CatRescue.$$ $2/$i
done
rm /tmp/CatRescue.$$~ 2>/dev/null || true

cat <<END

##########################
# Special (user) actions #
##########################
END
special

fi
echo
exec <&2
if yn "Install LILO? "; then
sed "s'@floppy@'$1'g
s'@mount@'$2'g" < lilo.template > lilo.CatRescue
lilo -C lilo.CatRescue -v -v -v 
fi

cat <<END

#########
# Done! #
#########
END

exit 0


