#!/bin/sh
#
### BEGIN INIT INFO
# Provides:          bootcdram
# Required-Start:    mountall-bootclean
# Required-Stop:
# Default-Start:     S
# Default-Stop:      
# Short-Description: bootcdram starts ramdisks for bootcd
# Description:       When running from bootcd this script creates
#                    ramdisks and mounts them. If not running from
#                    bootcd this script does nothing.
### END INIT INFO

CHNG=""
CHNGGREP="cat"
BORDERLINKS=""

startscript()
{
  # bootcdram.sh	Necessary steps to boot diskless from cd
  # at Boottime /etc -> /ram1/etc -> /etc.ro (also dev, tmp, var, home, root)

  
  # Make sure ramdisk Module (brd) is loaded if it exists
  modprobe -q rd
  
  # INODES are expensive (8192 INODES need 1 MB RAM)
  echo -n "Minimum of needed INODES: "
  if [ -f /ram1.cpio.gz ]; then
    I1=$(zcat /ram1.cpio.gz | cpio -it | wc -l)
  else
    I1=$(find /home.ro /root.ro /etc.ro /dev.ro | $CHNGGREP | wc -l)
  fi
  
  if [ -f /ram2.cpio.gz ]; then
    I2=$(zcat /ram2.cpio.gz | cpio -it | wc -l)
  else
    I2=$(find /var.ro -type d | $CHNGGREP | wc -l)
  fi
  
  I=$I1; [ $I2 -gt $I ] && I=$I2
  I=$(expr $I \* 11 / 10)
  
  echo "$I"
  
  RAMDISK_SIZE=$(sfdisk -s /dev/ram1) # Could be changed at boot prompt
  # Use at least $I inodes per ramdisk
  if [ $RAMDISK_SIZE -le $I ]; then 
    INODES="-N $I"
    echo "Creating ram1 and ram2 with exactly $I INODES each"
  else
    INODES="-i 1024"
    echo "Creating ram with 1024 INODES per MB"
  fi
  
  mke2fs -q $INODES /dev/ram1 # Size is defined by ramdisk_size at boottime
  
  if [ -c /dev/.devfsd ]; then
    mount /dev/ram1 /ram1 -o defaults,rw
    echo 'Remounting devfs'
    mkdir /ram1/dev
    mount -n -t devfs none /dev
  else
    mount -n /dev/ram1 /ram1 -o defaults,rw
  fi
  
  if [ -f /ram1.cpio.gz ]; then
    echo 'Extracting /ram1.cpio.gz'
    cd /ram1; zcat /ram1.cpio.gz | cpio -idum
  else
    mkdir /ram1/tmp; chmod 1777 /ram1/tmp
    for i in home root etc dev; do find /$i.ro | $CHNGGREP | cpio -pdm /ram1; done
    for i in home root etc dev; do mv /ram1/$i.ro /ram1/$i; done
  fi
  
  for i in $BORDERLINKS; do
    ln -sf ../$i /ram1/$i
  done
  
  # if udev is used, make sure udev is mounted on /dev
  # Reason is that as /etc/init.d/udev was called /dev pointed to /dev.ro
  # Without "mount --move" for example /dev/pts/* will not be created, 
  # but /dev.ro/pts/* will be managed by udev.
  [ "$(mount | grep "^udev\>.*dev.ro\>")" ] && mount --move /dev.ro /dev
  
  # Next lines are no longer needed, instead the line before does 
  # the job in the right way.
  # Recreate udev (needed for kernel >2.6.8)
  #if [ -x /etc/init.d/udev ]; then 
    #/etc/init.d/udev stop
    #/etc/init.d/udev start
  #fi
  
  # This may be overwritten by mounting /dev on kernels without compiled-in rd
  [ -b /dev/ram2 ] || mknod /dev/ram2 b 1 2
  
  mke2fs -q $INODES /dev/ram2 # Size is defined by ramdisk_size at boottime
  mount /dev/ram2 /ram2 -o defaults,rw
  if [ -f /ram2.cpio.gz ]; then
    echo 'Extracting /ram2.cpio.gz'
    cd /ram2; zcat /ram2.cpio.gz | cpio -idum
  else
    find /var.ro -type d | $CHNGGREP | cpio -pdm /ram2
    for i in var; do mv /ram2/$i.ro /ram2/$i; done
  fi
  
  # enable wtmp and lastlog record keeping
  touch /var/log/wtmp /var/log/lastlog
  chown root.utmp /var/log/wtmp /var/log/lastlog
  chmod 664 /var/log/wtmp /var/log/lastlog

  for i in $CHNG; do
    j=$(echo $i | sed "s/\.ro//")
    mkdir -p $(dirname $j)
    [ -e $j ] || ln -s $i $j
  done
}

case "$1" in
  start)
        # Only run this script if we have booted from bootcd
        if [ "$(grep "\<bootcd=" /proc/cmdline)" ]; then
          startscript
        fi
	;;
  restart) 
  	;;
  force-reload)
  	;;
  stop)
  	;;
  restart)
  	;;
  force-reload)
        ;;
  *)
	echo "Usage: /etc/init.d/bootcdram start" >&2
	exit 1
	;;
esac

exit 0
