summaryrefslogtreecommitdiff
path: root/packages/busybox
diff options
context:
space:
mode:
Diffstat (limited to 'packages/busybox')
-rw-r--r--packages/busybox/switchbox-1.00/defconfig2
-rw-r--r--packages/busybox/switchbox-1.00/linuxrc199
-rw-r--r--packages/busybox/switchbox_1.00.bb2
3 files changed, 156 insertions, 47 deletions
diff --git a/packages/busybox/switchbox-1.00/defconfig b/packages/busybox/switchbox-1.00/defconfig
index d2587d30ce..40f6b415e5 100644
--- a/packages/busybox/switchbox-1.00/defconfig
+++ b/packages/busybox/switchbox-1.00/defconfig
@@ -63,7 +63,7 @@ CONFIG_CAT=y
CONFIG_CHROOT=y
# CONFIG_CMP is not set
CONFIG_CP=y
-# CONFIG_CUT is not set
+CONFIG_CUT=y
# CONFIG_DATE is not set
CONFIG_DD=y
CONFIG_DF=y
diff --git a/packages/busybox/switchbox-1.00/linuxrc b/packages/busybox/switchbox-1.00/linuxrc
index cd49b16ccf..ef97ba11f6 100644
--- a/packages/busybox/switchbox-1.00/linuxrc
+++ b/packages/busybox/switchbox-1.00/linuxrc
@@ -1,73 +1,182 @@
#!/bin/sh
mounted=
+runboot=
+prefroot=
/bin/mount -t proc proc /proc
-/bin/echo "0x0100" > /proc/sys/kernel/real-root-dev
+# /bin/echo "5" > /proc/sys/kernel/panic
+# /bin/echo "0x0100" > /proc/sys/kernel/real-root-dev
-if [ -z "$mounted" ] && /bin/mount -rt jffs2 /dev/mtdblock4 /mnt/tmpmnt ; then
+sysconflen=`/bin/dd if=/dev/mtd1 bs=4 count=1 | hexdump -n 6 -e '"%02d"'`
+ipaddr=`/bin/dd if=/dev/mtd1 bs=1 count=$sysconflen skip=4 | grep ip_addr | sed -e s/ip_addr=//`
+netmask=`/bin/dd if=/dev/mtd1 bs=1 count=$sysconflen skip=4 | grep netmask | sed -e s/netmask=//`
+gateway=`/bin/dd if=/dev/mtd1 bs=1 count=$sysconflen skip=4 | grep gateway | sed -e s/gateway=//`
+nfsrootloc=`/bin/dd if=/dev/mtd1 bs=1 count=$sysconflen skip=4 | grep nfsroot | sed -e s/nfsroot=// | cut -d, -f 1`
+nfsrootopts=`/bin/dd if=/dev/mtd1 bs=1 count=$sysconflen skip=4 | grep nfsroot | sed -e s/nfsroot=// | cut -d, -f 2- | sed -e s/\"//g`
+device=/dev/`/bin/sed -n -e 's/^\(mtd[0-9]*\): .* "FIS directory"/\1/p' /proc/mtd`
+length=`/bin/dd if=$device bs=2 skip=2048 | /bin/hexdump -n 4 -e '4/1 "%02X"' $device`
- if [ -x /mnt/tmpmnt/sbin/init -o -L /mnt/tmpmnt/sbin/init -o -x /mnt/tmpmnt/bin/init -o -L /mnt/tmpmnt/bin/init ] ; then
- if [ -f /mnt/tmpmnt/.recovery ] ; then
+# Determine desired rootfs
+if [ -z "$mounted" ] && /bin/mount -rt jffs2 /dev/mtdblock4 /mnt/jffs2 ; then
+ if [ -f /mnt/jffs2/.recovery ] ; then
+ /bin/echo "Preferred root device is /dev/ram0 (recovery)"
+ mounted=
+ runboot=
+ prefroot=
+ elif [ -f /mnt/jffs2/.sda2root ] ; then
+ /bin/echo "Preferred root device is /dev/sda2 (disk 1)"
+ mounted=/mnt/newroot
+ runboot=/bin/init
+ prefroot=sda2
+ elif [ -f /mnt/jffs2/.sdb2root ] ; then
+ /bin/echo "Preferred root device is /dev/sdb2 (disk 2)"
+ mounted=/mnt/newroot
+ runboot=/bin/init
+ prefroot=sdb2
+ elif [ -f /mnt/jffs2/.ramdisk ] ; then
+ /bin/echo "Preferred root device is /dev/ram1 (maintenence)"
+ mounted=/mnt/newroot
+ runboot=/bin/init
+ prefroot=maintenence
+ elif [ -f /mnt/jffs2/.nfsroot ] ; then
+ /bin/echo "Preferred root device is through NFS"
+ mounted=/mnt/newroot
+ runboot=/linuxrc
+ prefroot=nfsroot
+ else
+ /bin/echo "Preferred root device is jffs2"
+ mounted=/mnt/jffs2
+ runboot=/linuxrc
+ prefroot=jffs2
+ fi
+fi
+
+# perform prepatory tasks
+if [ -n "$prefroot" ] ; then
+
+ if [ $prefroot = "sda2" -o $prefroot = "sdb2" ] ; then
+ /bin/echo "Sleeping 10sec while waiting for disk..."
+ sleep 10
+ /bin/mount -rt ext3 /dev/$prefroot /mnt/newroot
+ if [ -x /mnt/newroot/bin/init ] && [ -r /mnt/newroot/.unslung ] ; then
+ /bin/echo "Root filesystem will be mounted from /dev/$prefroot ..."
+ else
+ /bin/echo "Cant find valid rootfs on /dev/$prefroot, using recovery ..."
+ mounted=
+ runboot=
+ fi
+
+ elif [ $prefroot = "maintenence" ] ; then
+ /bin/dd if=/dev/zero of=/dev/ram1 bs=1k count=12k
+ /bin/mkdir /lib
+ /bin/ln -s /mnt/jffs2/lib/* /lib
+ /bin/mkdir /usr/bin
+ /bin/ln -s /mnt/jffs2/usr/bin/mke2fs /usr/bin
+ /bin/ln -s /mnt/jffs2/usr/bin/find /usr/bin
+ /bin/ln -s /mnt/jffs2/usr/bin/cpio /usr/bin
+ /usr/bin/mke2fs -m 0 /dev/ram1 12288
+ /bin/mount -t ext2 /dev/ram1 /mnt/newroot
+ ( cd /mnt/jffs2 ; /usr/bin/find . -print0 -mount | /usr/bin/cpio -p -0 -d -m -u /mnt/newroot )
+ if [ -x /mnt/newroot/bin/init ] && [ -r /mnt/newroot/.unslung ] ; then
+ /bin/cp /mnt/newroot/home/httpd/html/Management/upgrade.cgi /mnt/newroot/home/httpd/html/Management/upgrade-real.cgi
+ /bin/echo "#!/bin/sh" > /mnt/newroot/home/httpd/html/Management/upgrade.cgi
+ /bin/echo >> /mnt/newroot/home/httpd/html/Management/upgrade.cgi
+ /bin/echo "/bin/mount -t ramfs none /upload -o size=8196 2>/dev/null" \
+ >> /mnt/newroot/home/httpd/html/Management/upgrade.cgi
+ /bin/echo "/bin/dd if=/dev/zero of=/upload/free-ram bs=1k count=8k 2>/dev/null" \
+ >> /mnt/newroot/home/httpd/html/Management/upgrade.cgi
+ /bin/echo "/bin/umount /upload 2>/dev/null" \
+ >> /mnt/newroot/home/httpd/html/Management/upgrade.cgi
+ /bin/echo "exec /home/httpd/html/Management/upgrade-real.cgi" \
+ >> /mnt/newroot/home/httpd/html/Management/upgrade.cgi
+ /bin/echo "Root filesystem will be mounted from /dev/ram1 (a copy of /dev/mtdblock4) ..."
+ else
+ /bin/echo "Cant find valid rootfs on ram1, using recovery ..."
mounted=
- elif [ -f /mnt/tmpmnt/.ramdisk ] ; then
- /bin/dd if=/dev/zero of=/dev/ram1 bs=1k count=12k
- /bin/mkdir /lib
- /bin/ln -s /mnt/tmpmnt/lib/* /lib
- /bin/mkdir /usr/bin
- /bin/ln -s /mnt/tmpmnt/usr/bin/mke2fs /usr/bin
- /bin/ln -s /mnt/tmpmnt/usr/bin/find /usr/bin
- /bin/ln -s /mnt/tmpmnt/usr/bin/cpio /usr/bin
- /usr/bin/mke2fs -m 0 /dev/ram1 12288
- /bin/mount -t ext2 /dev/ram1 /mnt/repair
- ( cd /mnt/tmpmnt ; /usr/bin/find . -print0 -mount | /usr/bin/cpio -p -0 -d -m -u /mnt/repair )
- /bin/cp /mnt/repair/home/httpd/html/Management/upgrade.cgi /mnt/repair/home/httpd/html/Management/upgrade-real.cgi
- /bin/echo "#!/bin/sh" > /mnt/repair/home/httpd/html/Management/upgrade.cgi
- /bin/echo >> /mnt/repair/home/httpd/html/Management/upgrade.cgi
- /bin/echo "/bin/mount -t ramfs none /upload -o size=8196 2>/dev/null" \
- >> /mnt/repair/home/httpd/html/Management/upgrade.cgi
- /bin/echo "/bin/dd if=/dev/zero of=/upload/free-ram bs=1k count=8k 2>/dev/null" \
- >> /mnt/repair/home/httpd/html/Management/upgrade.cgi
- /bin/echo "/bin/umount /upload 2>/dev/null" \
- >> /mnt/repair/home/httpd/html/Management/upgrade.cgi
- /bin/echo "exec /home/httpd/html/Management/upgrade-real.cgi" \
- >> /mnt/repair/home/httpd/html/Management/upgrade.cgi
- /bin/umount /mnt/repair
- /bin/echo "Root filesystem will be mounted from /dev/ram1 (a copy of /dev/mtdblock4) ..."
- /bin/echo "0x0101" > /proc/sys/kernel/real-root-dev
- mounted=/mnt/tmpmnt
+ runboot=
+ fi
+
+ elif [ $prefroot = "nfsroot" ] ; then
+
+ # Should the network drivers come from payload or the jffs2?
+ if ( [ "$length" != "FFFFFFFF" ] ); then
+ /bin/dd if=$device bs=2 skip=2056 | /bin/tar zxvf -
+ /sbin/insmod ixp400
+ /sbin/insmod ixp425_eth
+ /sbin/ifconfig ixp0 up $ipaddr netmask $netmask
+ /sbin/route add default gw $gateway
+ fi
+
+ /bin/mkdir -p /lib
+ /bin/ln -s /mnt/jffs2/lib/* /lib
+ /bin/mkdir -p /sbin
+ /bin/ln -s /mnt/jffs2/sbin/portmap /sbin
+
+ /sbin/ifconfig lo up 127.0.0.1
+ /sbin/portmap
+
+ . /mnt/jffs2/.nfsroot
+
+ mount -o $nfsrootopts $nfsrootloc /mnt/newroot
+
+ if [ -e /mnt/newroot/sbin/init -o -e /mnt/newroot/bin/init ] ; then
+ /bin/echo "Root filesystem will be mounted from a NFS root ..."
+ mounted=/mnt/newroot
+ runboot=/linuxrc
else
+ /bin/echo "Cant find valid NFS rootfs, using recovery ..."
+ mounted=
+ runboot=
+ fi
+
+ else
+ if [ -e /mnt/jffs2/sbin/init -o -e /mnt/jffs2/bin/init ] ; then
/bin/echo "Root filesystem will be mounted from /dev/mtdblock4 ..."
- /bin/echo "0x1f04" > /proc/sys/kernel/real-root-dev
- mounted=/mnt/tmpmnt
+ mounted=/mnt/jffs2
+ runboot=/linuxrc
+ else
+ /bin/echo "Cant find valid rootfs on jffs2, using recovery ..."
+ mounted=
+ runboot=
fi
fi
-
- /bin/umount /mnt/tmpmnt
fi
-if [ -z "$mounted" ] ; then
-
- if [ -e /mnt/tmpmnt/sbin/init -o -e /mnt/tmpmnt/bin/init ] ; then
- /bin/echo "Root filesystem will be mounted from /dev/ram0 ..."
- mounted=/mnt/tmpmnt
- /bin/echo "0x0100" > /proc/sys/kernel/real-root-dev
+# Pivot
+if [ -n "$mounted" ] ; then
+ /bin/killall portmap
+ if [ $mounted != "/mnt/jffs2" ] ; then
+ sleep 1
+ /bin/umount /mnt/jffs2
fi
+# /bin/echo "5" > /proc/sys/kernel/panic
+ umount /proc
+ cd $mounted
+ /sbin/pivot_root . initrd
+ exec chroot . $runboot < dev/console > dev/console 2>&1
fi
+#if [ -z "$mounted" ] ; then
+#
+# /bin/umount /mnt/jffs2
+# if [ -e /mnt/jffs2/sbin/init -o -e /mnt/jffs2/bin/init ] ; then
+# /bin/echo "5" > /proc/sys/kernel/panic
+# /bin/echo "Root filesystem will be mounted from /dev/ram0 ..."
+# /bin/echo "0x0100" > /proc/sys/kernel/real-root-dev
+# fi
+#fi
+
if [ -z "$mounted" ] ; then
/bin/echo "Root filesystem cannot be found - dropping into shell ..."
- /bin/echo "5" > /proc/sys/kernel/panic
-
- device=/dev/`/bin/sed -n -e 's/^\(mtd[0-9]*\): .* "FIS directory"/\1/p' /proc/mtd`
- length=`/bin/dd if=$device bs=2 skip=2048 | /bin/hexdump -n 4 -e '4/1 "%02X"' $device`
+# /bin/echo "5" > /proc/sys/kernel/panic
if ( [ "$length" != "FFFFFFFF" ] ); then
/bin/dd if=$device bs=2 skip=2056 | /bin/tar zxvf -
/sbin/insmod ixp400
/sbin/insmod ixp425_eth
- /sbin/ifconfig ixp0 up 192.168.1.77 netmask 255.255.0.0
+ /sbin/ifconfig ixp0 up $ipaddr netmask $netmask
/sbin/telnetd
fi
diff --git a/packages/busybox/switchbox_1.00.bb b/packages/busybox/switchbox_1.00.bb
index 3e86966411..cc6247ed25 100644
--- a/packages/busybox/switchbox_1.00.bb
+++ b/packages/busybox/switchbox_1.00.bb
@@ -46,5 +46,5 @@ do_compile () {
do_install () {
oe_runmake 'PREFIX=${D}' install
install -m 0755 ${WORKDIR}/linuxrc ${D}/
- mkdir -p ${D}/proc ${D}/mnt/tmpmnt ${D}/mnt/repair
+ mkdir -p ${D}/proc ${D}/mnt/jffs2 ${D}/mnt/repair ${D}/mnt/newroot
}