#!/bin/sh

set -e

umask 002

# Rootpath of initrd hierachy
export ROOT=/var/tmp/initrd

# Paths of source directories to uClibc, BusyBox, e2fsprogs, ...
export UCLIBC_SRC=uClibc
export BUSYBOX_SRC=busybox-0.51
export DUMP_SRC=dump-0.4b21
export E2FSPROGS_SRC=e2fsprogs-1.19
export MODUTILS_SRC=modutils-2.4.6
export RAIDTOOLS_SRC=raidtools-0.90
export UTIL_LINUX_SRC=util-linux-2.10r

export LDCONFIG="chroot $ROOT /sbin/ldconfig -v"

########################################################################
# uClibc                                                               #
########################################################################

# Patch uClibc
patch_uClibc() {
    : No patch required
}

# Build the complete uClibc environment
build_uClibc() {
    make -C $UCLIBC_SRC INSTALL_DIR=/ DEVEL=false \
	    DYNAMIC_LINKER=/lib/ld-linux-uclibc.so.0 all
}

# Install uClibc environment (including ldconfig)
install_uClibc() {
    make -C $UCLIBC_SRC INSTALL_DIR=$ROOT DEVEL=false \
	    DYNAMIC_LINKER=/lib/ld-linux-uclibc.so.0 install
    # Currently, make install overwrites /etc/ld.so.cache on the build system,
    # which isn't really what we want.
    ldconfig
    install -d $ROOT/usr/lib $ROOT/etc $ROOT/sbin
    install -s -m 755 $UCLIBC_SRC/ld.so-1/util/ldconfig $ROOT/sbin
    $LDCONFIG
}

# Remove any uClibc stuff not needed for runtime
cleanup_uClibc() {
    set /bin/addr2line /bin/ar /bin/as /bin/cc /bin/cpp /bin/gasp /bin/gcc \
        /bin/ld /bin/nm /bin/objcopy /bin/objdump /bin/ranlib /bin/readelf \
        /bin/size /bin/strings /bin/strip /sbin/ldconfig
    for i; do rm -f $ROOT/$i; done
    rm -f $ROOT/usr/bin/i386-uclibc-*
    rm -rf $ROOT/include
    rm -f $ROOT/lib/*.o $ROOT/lib/*.a
}

########################################################################
# BusyBox                                                              #
########################################################################

patch_BusyBox() {
    patch -d $BUSYBOX_SRC -E -p1 << 'EOF'
diff -rNu ../busybox-0.51/Config.h ./Config.h
--- ../busybox-0.51/Config.h	Tue Apr 10 00:48:11 2001
+++ ./Config.h	Tue May  8 21:34:32 2001
@@ -15,13 +15,13 @@
 #define BB_CHROOT
 #define BB_CHVT
 #define BB_CLEAR
-//#define BB_CMP
+#define BB_CMP
 #define BB_CP_MV
 #define BB_CUT
 #define BB_DATE
 //#define BB_DC
 #define BB_DD
-//#define BB_DEALLOCVT
+#define BB_DEALLOCVT
 #define BB_DF
 #define BB_DIRNAME
 #define BB_DMESG
@@ -33,29 +33,29 @@
 //#define BB_DUMPKMAP
 #define BB_ECHO
 #define BB_ENV
-//#define BB_EXPR
+#define BB_EXPR
 //#define BB_FBSET
 //#define BB_FDFLUSH
 #define BB_FIND
 #define BB_FREE
-//#define BB_FREERAMDISK
+#define BB_FREERAMDISK
 //#define BB_FSCK_MINIX
-//#define BB_GETOPT
+#define BB_GETOPT
 #define BB_GREP
 #define BB_GUNZIP
 #define BB_GZIP
 #define BB_HALT
 #define BB_HEAD
-//#define BB_HOSTID
-//#define BB_HOSTNAME
+#define BB_HOSTID
+#define BB_HOSTNAME
 #define BB_ID
-//#define BB_IFCONFIG
+#define BB_IFCONFIG
 #define BB_INIT
 //#define BB_INSMOD
 #define BB_KILL
 #define BB_KILLALL
 #define BB_KLOGD
-//#define BB_LENGTH
+#define BB_LENGTH
 #define BB_LN
 //#define BB_LOADACM
 //#define BB_LOADFONT
@@ -63,53 +63,53 @@
 #define BB_LOGGER
 //#define BB_LOGNAME
 #define BB_LS
-#define BB_LSMOD
-//#define BB_MAKEDEVS
-//#define BB_MD5SUM
+//#define BB_LSMOD
+#define BB_MAKEDEVS
+#define BB_MD5SUM
 #define BB_MKDIR
-//#define BB_MKFIFO
+#define BB_MKFIFO
 //#define BB_MKFS_MINIX
 #define BB_MKNOD
 #define BB_MKSWAP
-//#define BB_MKTEMP
-//#define BB_NC
+#define BB_MKTEMP
+#define BB_NC
 #define BB_MORE
 #define BB_MOUNT
-//#define BB_MT
-//#define BB_NSLOOKUP
-//#define BB_PING
-//#define BB_PIVOT_ROOT
+#define BB_MT
+#define BB_NSLOOKUP
+#define BB_PING
+#define BB_PIVOT_ROOT
 #define BB_POWEROFF
-//#define BB_PRINTF
+#define BB_PRINTF
 #define BB_PS
 #define BB_PWD
 //#define BB_RDATE
-//#define BB_READLINK
+#define BB_READLINK
 #define BB_REBOOT
-//#define BB_RENICE
+#define BB_RENICE
 #define BB_RESET
 #define BB_RM
 #define BB_RMDIR
 //#define BB_RMMOD
-//#define BB_ROUTE
+#define BB_ROUTE
 //#define BB_RPMUNPACK
 #define BB_SED
 //#define BB_SETKEYCODES
 #define BB_SH
 #define BB_SLEEP
 #define BB_SORT
-//#define BB_STTY
+#define BB_STTY
 #define BB_SWAPONOFF
 #define BB_SYNC
 #define BB_SYSLOGD
 #define BB_TAIL
 #define BB_TAR
-//#define BB_TEE
-//#define BB_TEST
-//#define BB_TELNET
-//#define BB_TFTP
+#define BB_TEE
+#define BB_TEST
+#define BB_TELNET
+#define BB_TFTP
 #define BB_TOUCH
-//#define BB_TR
+#define BB_TR
 #define BB_TRUE_FALSE
 #define BB_TTY
 //#define BB_UUENCODE
@@ -119,11 +119,11 @@
 #define BB_UNAME
 //#define BB_UPDATE
 #define BB_UPTIME
-//#define BB_USLEEP
-//#define BB_VI
-//#define BB_WATCHDOG
+#define BB_USLEEP
+#define BB_VI
+#define BB_WATCHDOG
 #define BB_WC
-//#define BB_WGET
+#define BB_WGET
 #define BB_WHICH
 #define BB_WHOAMI
 #define BB_XARGS
@@ -189,19 +189,19 @@
 #define BB_FEATURE_USE_INITTAB
 //
 //Enable init being called as /linuxrc
-#define BB_FEATURE_LINUXRC
+//#define BB_FEATURE_LINUXRC
 //
 //Have init enable core dumping for child processes (for debugging only) 
 //#define BB_FEATURE_INIT_COREDUMPS
 //
 //Make sure nothing is printed to the console on boot
-//#define BB_FEATURE_EXTRA_QUIET
+#define BB_FEATURE_EXTRA_QUIET
 //
 // enable syslogd -R remotehost
 #define BB_FEATURE_REMOTE_LOG
 //
 // enable syslogd -C
-//#define BB_FEATURE_IPC_SYSLOG
+#define BB_FEATURE_IPC_SYSLOG
 //
 //Simple tail implementation (2.34k vs 3k for the full one).
 //Both provide 'tail -f', but this cuts out -c, -q, -s, and -v. 
@@ -277,33 +277,33 @@
 //#define BB_FEATURE_FBSET_READMODE
 //
 // Support insmod/lsmod/rmmod for post 2.1 kernels
-//#define BB_FEATURE_NEW_MODULE_INTERFACE
+#define BB_FEATURE_NEW_MODULE_INTERFACE
 //
 // Support insmod/lsmod/rmmod for pre 2.1 kernels
 //#define BB_FEATURE_OLD_MODULE_INTERFACE
 //
 // Support module version checking
-//#define BB_FEATURE_INSMOD_VERSION_CHECKING
+#define BB_FEATURE_INSMOD_VERSION_CHECKING
 //
 // Support for Minix filesystem, version 2
 //#define BB_FEATURE_MINIX2
 //
 // Enable ifconfig status reporting output -- this feature adds 12k.
-//#define BB_FEATURE_IFCONFIG_STATUS
+#define BB_FEATURE_IFCONFIG_STATUS
 //
 // Enable ifconfig slip-specific options "keepalive" and "outfill"
 //#define BB_FEATURE_IFCONFIG_SLIP
 //
 // Enable ifconfig options "mem_start", "io_addr", and "irq".
-//#define BB_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
+#define BB_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
 //
 // Enable ifconfig option "hw".  Currently works for only with "ether".
-//#define BB_FEATURE_IFCONFIG_HW
+#define BB_FEATURE_IFCONFIG_HW
 //
 // Enable busybox --install [-s]
 // to create links (or symlinks) for all the commands that are 
 // compiled into the binary.  (needs /proc filesystem)
-// #define BB_FEATURE_INSTALLER
+#define BB_FEATURE_INSTALLER
 //
 // Enable a nifty progress meter in wget (adds just under 2k)
 #define BB_FEATURE_WGET_STATUSBAR
@@ -329,10 +329,10 @@
 #define BB_FEATURE_FIND_MTIME
 //
 // Support for the -A -B and -C context flags in grep
-//#define BB_FEATURE_GREP_CONTEXT
+#define BB_FEATURE_GREP_CONTEXT
 //
 // Support for the EGREP applet (alias to the grep applet)
-//#define BB_FEATURE_GREP_EGREP_ALIAS
+#define BB_FEATURE_GREP_EGREP_ALIAS
 //
 // Tell tftp what commands that should be supported.
 #define BB_FEATURE_TFTP_PUT
EOF
}

build_BusyBox() {
    make -C $BUSYBOX_SRC CROSS=$ROOT/bin/
}

install_BusyBox() {
    make -C $BUSYBOX_SRC PREFIX=$ROOT install-hardlinks
}

cleanup_BusyBox() {
    :
}


########################################################################
# e2fsprogs                                                            #
########################################################################

patch_e2fsprogs() {
    : No patch required
}

build_e2fsprogs() {
    (
	cd $E2FSPROGS_SRC
	./configure --prefix=$ROOT \
	    --with-root-prefix=$ROOT \
	    --with-cc=$ROOT/bin/gcc \
	    --with-ccopts=-Os \
	    --with-linker=$ROOT/bin/ld \
	    --with-ldopts=-s \
	    --enable-dynamic-e2fsck --enable-elf-shlibs
	make all
    )
}

install_e2fsprogs() {
    make -C $E2FSPROGS_SRC install install-libs
    (
	cd $ROOT/lib
	ln -sf libcom_err.so.2 libcom_err.so
	ln -sf libe2p.so.2 libe2p.so
	ln -sf libext2fs.so.2 libext2fs.so
	ln -sf libss.so.2 libss.so
	ln -sf libuuid.so.1 libuuid.so
    )
    $LDCONFIG
}

cleanup_e2fsprogs() {
    rm -rf $ROOT/include $ROOT/info $ROOT/man $ROOT/share
    rm -f $ROOT/bin/mk_cmds $ROOT/bin/compile_et
    rm -f $ROOT/lib/*.a
}


########################################################################
# dump/restore                                                         #
########################################################################

patch_dump() {
    patch -d $DUMP_SRC -E -p1 << 'EOF'
diff -rNu ../dump-0.4b21/MCONFIG.in ./MCONFIG.in
--- ../dump-0.4b21/MCONFIG.in	Wed Apr 25 22:00:15 2001
+++ ./MCONFIG.in	Sun May  6 20:13:51 2001
@@ -24,8 +24,8 @@
 INSTALLBIN=	$(INSTALL) -o $(BINOWNER) -g $(BINGRP) -m $(BINMODE)
 INSTALLMAN=	$(INSTALL) -o $(MANOWNER) -g $(MANGRP) -m $(MANMODE)
 
-BINDIR=		/sbin
-MANDIR=		/usr/man/man8
+BINDIR=		@prefix@/sbin
+MANDIR=		@prefix@/man/man8
 
 DUMPDATESPATH=	@DUMPDATESPATH@
 #
diff -rNu ../dump-0.4b21/common/dumprmt.c ./common/dumprmt.c
--- ../dump-0.4b21/common/dumprmt.c	Wed Apr 25 22:00:15 2001
+++ ./common/dumprmt.c	Sun May  6 20:04:02 2001
@@ -110,12 +110,8 @@
 static	void rmtgets __P((char *, size_t));
 static	int rmtreply __P((const char *));
 static  int piped_child __P((const char **command));
-#ifdef KERBEROS
-int	krcmd __P((char **, int /*u_short*/, char *, char *, int *, char *));
-#endif
 
 static	int errfd = -1;
-extern	int dokerberos;
 extern	int ntrec;		/* blocking factor on tape */
 #ifndef errno
 extern	int errno;
@@ -164,7 +160,6 @@
 {
 	register char *cp;
 	register const char *rmt;
-	static struct servent *sp = NULL;
 	static struct passwd *pwd = NULL;
 	const char *tuser;
 	const char *rsh;
@@ -174,13 +169,10 @@
 	char *rmtpeercopy;
 
 	rsh = getenv("RSH");
-
-	if (!rsh && sp == NULL) {
-		sp = getservbyname(dokerberos ? "kshell" : "shell", "tcp");
-		if (sp == NULL)
-			errx(1, "%s/tcp: unknown service",
-			    dokerberos ? "kshell" : "shell");
+	if(!rsh) {
+	    rsh = "rsh";
 	}
+
 	if (pwd == NULL) {
 		pwd = getpwuid(getuid());
 		if (pwd == NULL)
@@ -198,7 +190,7 @@
 		rmt = _PATH_RMT;
 	msg("");
 
-	if (rsh) {
+	{
 		const char *rshcmd[6];
 		rshcmd[0] = rsh;
 		rshcmd[1] = rmtpeer;
@@ -217,41 +209,6 @@
 			msg("cannot open connection\n");
 			return 0;
 		}
-	}
-	else {
-		/* Copy rmtpeer to rmtpeercopy to ignore the
-		   return value from rcmd. I cannot figure if
-		   this is this a bug in rcmd or in my code... */
-		rmtpeercopy = (char *)rmtpeer;
-#ifdef KERBEROS
-		if (dokerberos)
-			tormtape = krcmd(&rmtpeercopy, sp->s_port, tuser, rmt, &errfd,
-				       (char *)0);
-		else
-#endif
-			tormtape = rcmd(&rmtpeercopy, (u_short)sp->s_port, pwd->pw_name,
-				      tuser, rmt, &errfd);
-		if (tormtape < 0) {
-			msg("login to %s as %s failed.\n", rmtpeer, tuser);
-			return 0;
-		}
-		size = ntrec * TP_BSIZE;
-		if (size > 60 * 1024)		/* XXX */
-			size = 60 * 1024;
-		/* Leave some space for rmt request/response protocol */
-		size += 2 * 1024;
-		while (size > TP_BSIZE &&
-		    setsockopt(tormtape, SOL_SOCKET, SO_SNDBUF, &size, sizeof (size)) < 0)
-			    size -= TP_BSIZE;
-		(void)setsockopt(tormtape, SOL_SOCKET, SO_RCVBUF, &size, sizeof (size));
-		throughput = IPTOS_THROUGHPUT;
-		if (setsockopt(tormtape, IPPROTO_IP, IP_TOS,
-		    &throughput, sizeof(throughput)) < 0)
-			perror("IP_TOS:IPTOS_THROUGHPUT setsockopt");
-		on = 1;
-		if (setsockopt(tormtape, IPPROTO_TCP, TCP_NODELAY, &on, sizeof (on)) < 0)
-			perror("TCP_NODELAY setsockopt");
-		fromrmtape = tormtape;
 	}
 	(void)fprintf(stderr, "Connection to %s established.\n", rmtpeer);
 	return 1;
diff -rNu ../dump-0.4b21/dump/dump.8.in ./dump/dump.8.in
--- ../dump-0.4b21/dump/dump.8.in	Wed Apr 25 22:00:15 2001
+++ ./dump/dump.8.in	Sun May  6 19:58:38 2001
@@ -425,8 +425,8 @@
 uses the contents of this variable to determine the name of the
 remote shell command to use when doing remote backups (rsh, ssh etc.). 
 If this variable is not set, 
-.Xr rcmd 3
-will be used, but only root will be able to do remote backups.
+.Xr rsh 1
+will be used as default.
 .Sh FILES
 .Bl -tag -width __DUMPDATES__ -compact
 .It Pa /dev/st0
diff -rNu ../dump-0.4b21/restore/restore.8.in ./restore/restore.8.in
--- ../dump-0.4b21/restore/restore.8.in	Wed Apr 25 22:00:15 2001
+++ ./restore/restore.8.in	Sun May  6 19:59:03 2001
@@ -524,8 +524,8 @@
 uses the contents of this variable to determine the name of the
 remote shell command to use when doing a network restore (rsh, ssh etc.).
 If this variable is not set,
-.Xr rcmd 3
-will be used, but only root will be able to do a network restore.
+.Xr rsh 1
+will be used as default.
 .Sh FILES
 .Bl -tag -width "./restoresymtable" -compact
 .It Pa /dev/st0
EOF
}

build_dump() {
    (
	cd $DUMP_SRC
	./configure --prefix=$ROOT \
	    --with-cc=$ROOT/bin/gcc \
	    --with-ccopts=-Os \
	    --with-linker=$ROOT/bin/gcc \
	    --with-ldopts=-s --disable-readline --enable-rmt \
	    --with-manowner=root --with-mangrp=root --with-manmode=644
	make
    )
}

install_dump() {
    (
	cd $DUMP_SRC
	strip dump/dump
	strip restore/restore
	strip rmt/rmt
	make install
    )
}

cleanup_dump() {
    rm -rf $ROOT/man
}


########################################################################
# util-linux (fdisk and sfdisk only)                                   #
########################################################################

patch_util_linux() {
    patch -d $UTIL_LINUX_SRC -E -p1 << 'EOF'
diff -rNu ../util-linux-2.10r/fdisk/fdisk.c ./fdisk/fdisk.c
--- ../util-linux-2.10r/fdisk/fdisk.c	Sun Dec  3 01:34:34 2000
+++ ./fdisk/fdisk.c	Wed May  9 01:28:34 2001
@@ -2138,7 +2138,6 @@
 	int j, c;
 	int optl = 0, opts = 0;
 
-	setlocale(LC_ALL, "");
 	bindtextdomain(PACKAGE, LOCALEDIR);
 	textdomain(PACKAGE);
 
diff -rNu ../util-linux-2.10r/fdisk/sfdisk.c ./fdisk/sfdisk.c
--- ../util-linux-2.10r/fdisk/sfdisk.c	Tue Apr 25 20:37:20 2000
+++ ./fdisk/sfdisk.c	Wed May  9 01:30:08 2001
@@ -2338,7 +2338,6 @@
     char *activatearg = 0;
     char *unhidearg = 0;
 
-    setlocale(LC_ALL, "");
     bindtextdomain(PACKAGE, LOCALEDIR);
     textdomain(PACKAGE);
 
EOF
}

build_util_linux() {
    (
	cd $UTIL_LINUX_SRC
	CC=$ROOT/bin/gcc CFLAGS=-Os \
	LD=$ROOT/bin/gcc LDFLAGS=-s \
	./configure
	make -C fdisk DESTDIR=$ROOT
    )
}

install_util_linux() {
    (
	cd $UTIL_LINUX_SRC
	CC=$ROOT/bin/gcc CFLAGS=-Os \
	LD=$ROOT/bin/gcc LDFLAGS=-s \
	make -C fdisk DESTDIR=$ROOT install
    )
}

cleanup_util_linux() {
    :
}



########################################################################
# modutils                                                             #
########################################################################

patch_modutils() {
    :
}

build_modutils() {
    (
	cd $MODUTILS_SRC
	CC=$ROOT/bin/gcc CFLAGS=-Os \
	LD=$ROOT/bin/gcc LDFLAGS=-s \
	./configure --disable-compat-2-0 \
	--prefix=$ROOT --exec-prefix=$ROOT
	make all
    )
}

install_modutils() {
    make -C $MODUTILS_SRC install
    install -d $ROOT/etc
    cat > $ROOT/etc/modules.conf << 'EOF'
alias scsi_hostadapter sym53c8xx
alias block-major-1 rd
alias block-major-7 loop
alias char-major-4 serial
alias char-major-5 serial
alias char-major-10 misc
alias char-major-10-130 softdog
alias char-major-10-1 psaux
alias block-major-3 off
alias char-major-35 off
alias net-pf-3 off
alias net-pf-4 off
alias net-pf-5 off
alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate
EOF
}

cleanup_modutils() {
    rm -rf $ROOT/man
}


########################################################################
# raidtools                                                            #
########################################################################

patch_raidtools() {
    :
}

build_raidtools() {
    (
	cd $RAIDTOOLS_SRC
	CC=$ROOT/bin/gcc \
	LD=$ROOT/bin/gcc \
	CFLAGS=-Os LDFLAGS=-s ./configure --prefix=$ROOT
	make
    )
}

install_raidtools() {
    make -C $RAIDTOOLS_SRC ROOTDIR=$ROOT install_bin install_dev
    install -d $ROOT/etc
    cat > $ROOT/etc/raidtab << 'EOF'
# /tmp: 512M x 2, blocksize = 1K, stride = 16
raiddev /dev/md0
    raid-level 0
    nr-raid-disks 2
    nr-spare-disks 0
    persistent-superblock 1
    chunk-size 16
    device /dev/sda6
    raid-disk 0
    device /dev/sdb6
    raid-disk 1

# /var: 1G x 2, blocksize = 1K, stride  = 4
raiddev /dev/md1
    raid-level 0
    nr-raid-disks 2
    nr-spare-disks 0
    persistent-superblock 1
    chunk-size 4
    device /dev/sda7
    raid-disk 0
    device /dev/sdb7
    raid-disk 1

# /usr: 2G x 2, blocksize = 4K, stride = 16
raiddev /dev/md2
    raid-level 0
    nr-raid-disks 2
    nr-spare-disks 0
    persistent-superblock 1
    chunk-size 64
    device /dev/sda8
    raid-disk 0
    device /dev/sdb8
    raid-disk 1

# /home: 4G x 2, blocksize = 4K, stride = 8
raiddev /dev/md3
    raid-level 0
    nr-raid-disks 2
    nr-spare-disks 0
    persistent-superblock 1
    chunk-size 32
    device /dev/sda9
    raid-disk 0
    device /dev/sdb9
    raid-disk 1
EOF
}

cleanup_raidtools() {
    :
}


########################################################################
# devices                                                              #
########################################################################

install_devices() {
    # Note: /dev/md* allready created by install_raidtools
    install -d $ROOT/dev

    # Setup some symlinks
    while read n l; do
	rm -f $ROOT/dev/$n
	ln -s $l $ROOT/dev/$n
    done << 'EOF'
fd /proc/self/fd
console tty0
stderr fd/2
stdin fd/0
stdout fd/1
tape nst0
EOF

    # Create device files
    while read t ma mi name; do
	rm -f $ROOT/dev/$name
	mknod $ROOT/dev/$name $t $ma $mi
    done << 'EOF'
b 2 0 fd0
b 2 1 fd1
b 3 0 hda
b 3 1 hda1
b 3 2 hda2
b 3 3 hda3
b 3 4 hda4
b 3 5 hda5
b 3 6 hda6
b 3 7 hda7
b 3 8 hda8
b 3 9 hda9
b 3 10 hda10
b 3 11 hda11
b 3 12 hda12
b 3 13 hda13
b 3 14 hda14
b 3 15 hda15
c 9 128 nst0
c 9 129 nst1
c 9 130 nst2
c 9 131 nst3
c 9 132 nst4
c 9 133 nst5
c 9 134 nst6
c 9 135 nst7
c 1 3 null
b 1 0 ram0
b 1 1 ram1
b 1 2 ram2
b 1 3 ram3
b 1 4 ram4
b 1 5 ram5
b 1 6 ram6
b 1 7 ram7
b 8 0 sda
b 8 1 sda1
b 8 2 sda2
b 8 3 sda3
b 8 4 sda4
b 8 5 sda5
b 8 6 sda6
b 8 7 sda7
b 8 8 sda8
b 8 9 sda9
b 8 10 sda10
b 8 11 sda11
b 8 12 sda12
b 8 13 sda13
b 8 14 sda14
b 8 15 sda15
b 8 16 sdb
b 8 17 sdb1
b 8 18 sdb2
b 8 19 sdb3
b 8 20 sdb4
b 8 21 sdb5
b 8 22 sdb6
b 8 23 sdb7
b 8 24 sdb8
b 8 25 sdb9
b 8 26 sdb10
b 8 27 sdb11
b 8 28 sdb12
b 8 29 sdb13
b 8 30 sdb14
b 8 31 sdb15
c 9 0 st0
c 9 1 st1
c 9 2 st2
c 9 3 st3
c 9 4 st4
c 9 5 st5
c 9 6 st6
c 9 7 st7
c 5 0 tty
c 4 0 tty0
c 4 1 tty1
c 4 2 tty2
c 4 3 tty3
c 4 4 tty4
c 4 5 tty5
c 4 6 tty6
c 4 7 tty7
c 4 8 tty8
c 4 9 tty9
c 1 5 zero
EOF
}


########################################################################
# Kernel modules                                                       #
########################################################################

install_modules() {
    modules_dir="/lib/modules/`uname -r`"
    while read mod; do
	dir="`dirname $mod`"
	install -d $ROOT/$modules_dir/$dir
	cp -p $modules_dir/$mod $ROOT/$modules_dir/$mod
    done << 'EOF'
kernel/drivers/md/raid0.o
kernel/drivers/md/md.o
kernel/drivers/scsi/scsi_mod.o
kernel/drivers/scsi/sym53c8xx.o
kernel/drivers/scsi/st.o
kernel/drivers/scsi/sd_mod.o
kernel/fs/ext2/ext2.o
kernel/fs/ramfs/ramfs.o
kernel/net/unix/unix.o
EOF
    chroot $ROOT /sbin/depmod -ae
}


########################################################################
# misc. configuration files and directories                            #
########################################################################

install_misc() {
    install -d $ROOT/dev $ROOT/etc

    cat > $ROOT/etc/fstab << 'EOF'
none	/proc	proc	defaults	0 0
tmpfs	/tmp	tmpfs	defaults	0 0
EOF

    cat > $ROOT/etc/passwd << 'EOF'
root:x:0:0:root:/:/bin/sh
EOF

    cat > $ROOT/etc/group << 'EOF'
root::0:root
EOF

    cat > $ROOT/linuxrc << 'EOF'
#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin.

mount /proc
mount /tmp
chmod a+rwxt /tmp

echo "Welcome to Kili's universal rescue disk"

sh -i

echo "Unmounting all mounted file systems."

umount -a
umount /proc

echo "Now trying to continue normal boot."
EOF
    chmod +x $ROOT/linuxrc

    install -d $ROOT/mnt $ROOT/proc $ROOT/tmp $ROOT/var
    chmod a+rwxt $ROOT/tmp
}

# Build and install all stuff
install_all() {
    patch_uClibc
    build_uClibc
    install_uClibc

    patch_BusyBox
    build_BusyBox
    install_BusyBox

    patch_util_linux
    build_util_linux
    install_util_linux

    patch_e2fsprogs
    build_e2fsprogs
    install_e2fsprogs

    patch_dump
    build_dump
    install_dump

    patch_modutils
    build_modutils
    install_modutils

    patch_raidtools
    build_raidtools
    install_raidtools

    install_misc
    install_devices
    install_modules
}

# Cleanup
cleanup_all() {
    cleanup_uClibc
    cleanup_BusyBox
    cleanup_util_linux
    cleanup_e2fsprogs
    cleanup_dump
    cleanup_modutils
    cleanup_raidtools
}



if [ $# -eq 0 ]; then
    install_all
    cleanup_all
else
    for cmd; do $cmd; done
fi
