#
#	/lib/libresolv-2.5.so
#	/lib/libresolv.so.2 -> /lib/libresolv-2.5.so
#	/lib/libwrap.so.0 -> /lib/libwrap.so.0.7.6
#	/lib/libwrap.so.0.7.6
#	/sbin/dhclient
#	/sbin/ip
#	/sbin/portmap
#
diff -Ndpru initrd_old/create_initrd initrd_new/create_initrd
--- initrd_old/create_initrd	1970-01-01 01:00:00.000000000 +0100
+++ initrd_new/create_initrd	2007-08-25 22:27:33.438209000 +0200
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+find . -mindepth 1 ! -name create_initrd | sort | cut -b 3- | \
+    cpio -cov | gzip -9v >../initrd.cpio.gz;
diff -Ndpru initrd_old/init initrd_new/init
--- initrd_old/init	2007-08-25 22:27:49.828209000 +0200
+++ initrd_new/init	2007-08-25 22:26:23.998209000 +0200
@@ -2,8 +2,13 @@
 
 export PATH=/sbin:/usr/sbin:/bin:/usr/bin
 
+# Please do not remove, thanks.
+echo -e "\e[1;32m""openSUSE Netboot""\e[0m"", by jengelh@medozas.de";
+echo -e "See http://jengelh.hopto.org/linux/adm_dxsuse.php for details.";
+
 devpts=no
 die() {
+	/bin/sh;
     umount /proc
     umount /sys
     umount /dev
@@ -162,10 +167,15 @@ for o in $(cat /proc/cmdline); do
 done
 
 if [ -z "$rootdev" ]; then
-    rootdev=/dev/zero
+    rootdev=none
 fi
 # lilo strips off the /dev/prefix from device names!
 case $rootdev in
+	(none)
+		if [ -z "$rootfstype" ]; then
+			rootfstype="aufs";
+		fi;
+		;;
 	/dev/disk/by-name/*)
 	    rootdevid=${rootdev#/dev/disk/by-name/}
 	    rootdevid=${rootdevid%-part*}
@@ -696,6 +706,9 @@ if [ -z "$rootfstype" ]; then
     echo "invalid root filesystem -- exiting to /bin/sh"
     cd /
     PATH=$PATH PS1='$ ' /bin/sh -i
+elif [ "$rootfstype" == "aufs" ]; then
+	feature_DHCP=1;
+	feature_UNION=1;
 elif [ -x /bin/fsck.${rootfstype} ]; then
     # fsck is unhappy without it
     echo "$rootdev / $rootfstype defaults 1 1" > /etc/fstab
@@ -731,6 +744,7 @@ fi
 
 opt="-o ro"
 [ -n "$read_write" ] && opt="-o rw"
+[ -n "$read_write" -o -n "$feature_UNION" ] && opt="-o rw"
 [ "$rootfstype" = "nfs" ] && opt="${opt},nolock"
 
 # mount the actual root device below /root
@@ -740,12 +754,60 @@ echo "Mounting root $rootdev"
 [ "$rootfstype" = "xfs" -a -n "$rootfsflags" ] && opt="${opt},$rootfsflags"
 [ "$rootfstype" = "reiserfs" -a -n "$journaldev" ] && opt="${opt},jdev=$journaldev"
 [ -n "$rootflags" ] && opt="${opt},$rootflags"
+
+if [ -n "$feature_DHCP" ]; then
+	ip addr add 127.0.0.1/8 dev lo;
+	ip link set lo up;
+	ip route add 127.0.0.0/8 dev lo scope link;
+	dhclient -sf /sbin/dhclient-script -lf /dhclient.leases eth0;
+fi;
+
+if [ -n "$feature_UNION" ]; then
+	mkdir -p /.STATIC /.DYNAMIC;
+	NFS=1;
+	opt="$opt,br:/.DYNAMIC=rw:/.STATIC=ro";
+	if [ "$NFS" -gt 0 ]; then
+		echo -en "\e[0;33m""Using NFS""\e[0m\n"; # ]]
+		portmap -d &
+		portmap_id=$!;
+		mount `cat /.DYNAMIC/.next-server`:/daten/tftpboot/linux /.STATIC \
+		  -o async,nolock,rsize=32768 || {
+			echo -en "\e[0;31m""nfsroot could not be mounted""\e[0m\a\n"; # ]]
+			die 1;
+		};
+		kill -TERM $portmap_id 2>/dev/null;
+	else
+		echo -en "\e[0;33m""Using CIFS""\e[0m\n"; # ]]
+		mount -t cifs -o username=tftpboot,password=tftpboot \
+		  //`cat /.DYNAMIC/.next-server`/linux /.STATIC || {
+			echo -en "\e[0;31m""cifsroot could not be mounted""\e[0m\a\n"; # ]]
+			die 1;
+		};
+	fi;
+
+	fail;
+	mount LABEL=tmp /.DYNAMIC
+	if [ "$?" -ne 0 ]; then
+		echo -en "\e[1;31m""Not good.""\e[0;31m"" Will use RAM for temporal storage for now.""\e[0m\a\n"; # ]]]
+		mount -t tmpfs none /.DYNAMIC;
+	fi;
+	echo "Clearing DYNAMIC";
+	rm -Rf /.DYNAMIC/* /.DYNAMIC/.[A-Za-z0-9]*;
+fi;
+
 [ -n "$rootfstype" ] && opt="${opt} -t $rootfstype"
 if [ -x /bin/nfsmount -a "$rootfstype" = "nfs" ]; then
     nfsmount $rootdev /root || die 1
 else
     mount $opt $rootdev /root || die 1
 fi
+
+if [ -n "$feature_UNION" ]; then
+	mkdir -p /root/{.STATIC,.DYNAMIC};
+	mount -n --move /.STATIC /root/.STATIC;
+	mount -n --move /.DYNAMIC /root/.DYNAMIC;
+fi;
+
 # Look for an init binary on the root filesystem
 if [ -n "$init" ] ; then
     if [ ! -f "/root$init" ]; then
@@ -834,6 +896,7 @@ umount /sys
 ROOTFS_BLKDEV="$rootdev"
 export ROOTFS_BLKDEV
 
+echo "\e[32m""Now starting the usual system""\e[0m";
 exec /bin/run-init -c ./dev/console /root $init ${kernel_cmdline[@]}
 echo could not exec run-init!
 die 0
diff -Ndpru initrd_old/sbin/dhclient-script initrd_new/sbin/dhclient-script
--- initrd_old/sbin/dhclient-script	1970-01-01 01:00:00.000000000 +0100
+++ initrd_new/sbin/dhclient-script	2007-08-25 22:27:33.438209000 +0200
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+exec </dev/console;
+exec >/dev/console;
+exec 2>/dev/console;
+exec 255>/dev/console;
+
+function make_resolv_conf() {
+	mkdir -p /.DYNAMIC/etc;
+	f="/.DYNAMIC/etc/resolv.conf";
+	>"$f";
+	echo -e "search $new_domain_name" >>"$f";
+	for n in $new_domain_name_servers; do
+		echo -e "nameserver $n" >>"$f";
+	done;
+}
+
+function to_cidr() {
+	case "$1" in
+		0|0.0.0.0)          echo 0;;
+		1|128.0.0.0)        echo 1;;
+		2|192.0.0.0)        echo 2;;
+		3|224.0.0.0)        echo 3;;
+		4|240.0.0.0)        echo 4;;
+		5|248.0.0.0)        echo 5;;
+		6|252.0.0.0)        echo 6;;
+		7|254.0.0.0)        echo 7;;
+		8|255.0.0.0)        echo 8;;
+		9|255.128.0.0)      echo 9;;
+		10|255.192.0.0)     echo 10;;
+		11|255.224.0.0)     echo 11;;
+		12|255.240.0.0)     echo 12;;
+		13|255.248.0.0)     echo 13;;
+		14|255.252.0.0)     echo 14;;
+		15|255.254.0.0)     echo 15;;
+		16|255.255.0.0)     echo 16;;
+		17|255.255.128.0)   echo 17;;
+		18|255.255.192.0)   echo 18;;
+		19|255.255.224.0)   echo 19;;
+		20|255.255.240.0)   echo 20;;
+		21|255.255.248.0)   echo 21;;
+		22|255.255.252.0)   echo 22;;
+		23|255.255.254.0)   echo 23;;
+		24|255.255.255.0)   echo 24;;
+		25|255.255.255.128) echo 25;;
+		26|255.255.255.192) echo 26;;
+		27|255.255.255.224) echo 27;;
+		28|255.255.255.240) echo 28;;
+		29|255.255.255.248) echo 29;;
+		30|255.255.255.252) echo 30;;
+		31|255.255.255.254) echo 31;;
+		32|255.255.255.255) echo 32;;
+		*)                  echo "*";;
+	esac;
+}
+
+export PATH="/bin:/sbin";
+
+case "$reason" in
+    (PREINIT)
+	ip link set dev "$interface" up;
+	;;
+    (BOUND)
+	mask="`to_cidr $new_subnet_mask`";
+	ip addr add "$new_ip_address/$mask" brd "$new_broadcast_address" \
+	  dev "$interface";
+	# ip route add "$new_network_number/$mask" dev "$interface" \
+	#   proto kernel scope link src "$new_ip_address";
+	for r in $new_routers; do
+		ip route add via "$r" dev "$interface";
+	done;
+	make_resolv_conf;
+	env;
+	[ ! -e /.DYNAMIC/.next-server ] && \
+	  echo -e "$new_dhcp_server_identifier" >/.DYNAMIC/.next-server;
+
+	# Kill dhclient
+	kill -KILL $pid 2>/dev/null;
+	:;
+	;;
+    (FAIL)
+	exit 1;
+	;;
+    (*)
+	;;
+esac;
