regress: use parsecmd() instead of strncmp on user pointers
[akaros.git] / kern / kfs / ifconfig
index 1a3f574..9c153cc 100755 (executable)
@@ -1,27 +1,40 @@
 #!/bin/ash
 
-# known good.
-hossinMAC=00241d1054e1
-c89MAC=001e67652333
-c99MAC=001e67c2f479
-altdraMAC=525400b0c2ec
-qemuMAC=525400123456
-tower1MAC=00032d196d88
-tower2MAC=00032d196ddd
-tower3MAC=00032d196d46
-tower4MAC=00032d196db0
-tower5MAC=00032d196daa
-
-MAC=`cat '#ether/ether0/addr'`
-
-#bind -a '#ip' /net
-#bind -a '#ether.0' /net
-#cat /net/ipifc/clone
-## bind the ether0 to it
-#echo 'bind ether /net/ether0' > /net/ipifc/0/ctl
-#exit
-
-# ifconfig it
+/bin/bind -b '#cons' /dev
+
+NIC=0
+while true; do
+       cat "#ether.$NIC" 2>&1 > /dev/null
+
+       # cat will fail if there is no device.  We can only tell by trying
+       if [ $? -ne 0 ]; then
+               break
+       fi
+
+       # the cfg files ID machines by the MAC of their preferred NIC
+       MAC=`cat "#ether.$NIC/ether$NIC/addr"`
+       if [ -d /etc/network/local.d ]
+       then
+               for cfg in /etc/network/local.d/*
+               do
+                       source $cfg
+               done
+       fi
+
+       # cfg files set $me when they have a match
+       if [ "x$me" != "x" ]; then
+               break;
+       fi
+
+       let NIC=$NIC+1
+done
+
+# Default back to ether.0 when we didn't find anything
+if [ "x$me" == "x" ]; then
+       NIC=0
+fi
+
+MAC=`cat "#ether.$NIC/ether$NIC/addr"`
 
 export cputype=amd64
 export objtype=$cputype
@@ -31,149 +44,113 @@ export rootdir=/root
 export rootspec=''
 export rootsrv=boot
 
-NIC="0"
-#authentication='nvram=/boot/adm/nvram auth/factotum -sfactotum -S'      # -a ...
-# test xyzip=(0 0 0 104.9.33)
-# test fsaddr='tcp!135.$xyzip(4)^!564'
-# (me network server server-addr
-# wrong addresses.
-
-# qemu is the default
-me=10.0.2.15
-mask=255.255.255.0
-# brho: i don't know what exactly 'remote' is supposed to be, but that is
-# the third argument processed by adding to an ipifc.  if we pass nothing,
-# it'll build 'remote' by masking me & mask.
-remote=10.0.2.0
-route=10.0.2.2
-
-if [ "$MAC" = "$qemuMAC" ]
+if [ -d /etc/network/local.d ]
 then
-    echo "Welcome to QEMU!"
+       for cfg in /etc/network/local.d/*
+       do
+               source $cfg
+       done
 fi
 
-# the tower of ... tower
-# all defaults are fine.
-if [ "$MAC" = "$tower1MAC" ]
-then
-    me=10.0.2.15
-fi
-if [ "$MAC" = "$tower2MAC" ]
-then
-    me=10.0.2.16
-fi
-if [ "$MAC" = "$tower3MAC" ]
-then
-    me=10.0.2.17
-fi
-if [ "$MAC" = "$tower4MAC" ]
-then
-    me=10.0.2.18
-fi
-if [ "$MAC" = "$tower5MAC" ]
-then
-    me=10.0.2.19
-fi
+#
+# Set up the initial namespace for starting networking.
+#
+/bin/bind -b '#random' /dev
+/bin/bind -a '#capability' /dev
+/bin/bind -a '#sd' /dev
+#/bin/bind '#d' /fd
+#/bin/bind -c '#e' /env
+/bin/bind -b '#proc' /proc
+/bin/bind -b '#srv' /srv
+
+#
+# Configure the network mount point.
+#
+/bin/bind -a '#ip' /net
+/bin/bind -a '#ether'.$NIC /net
 
-if [ "$MAC" = "$c89MAC" ]
+# Need to set /dev/sysname before ipconfig.  ipconfig will grab this and put it
+# in ndb.
+if [ "x$HOST" != "x" ]
 then
-       # c89's config.  use c96 for eth0 (.196).
-       # $ cat /9/net/ipifc/clone (get e.g. 2)
-       # $ echo "add 169.229.49.196 255.255.255.0" > /9/net/ipifc/2/ctl
-       me=169.229.49.196
-       mask=255.255.255.0
-       remote=169.229.49.0
-       route=169.229.49.1
-       # the i350 NIC that is plugged in is the first NIC
-       NIC="0"
+       echo "$HOST" > /dev/sysname
 fi
 
-if [ "$MAC" = "$c99MAC" ]
+if [ -x /bin/ipconfig ]
 then
-       # c99's config.  use c95 for eth0 (.195).
-       # $ cat /9/net/ipifc/clone (get e.g. 2)
-       # $ echo "add 169.229.49.195 255.255.255.0" > /9/net/ipifc/2/ctl
-       me=169.229.49.195
-       mask=255.255.255.0
-       remote=169.229.49.0
-       route=169.229.49.1
-       # the i350 NIC that is plugged in is the first NIC
-       NIC="0"
+       if [ -n "$me" ]
+       then
+               ipconfig -g $route ether /net/ether$NIC $me $mask
+       else
+               # No explicit configuration; use DHCP.
+               daemonize /bin/ipconfig -S ether /net/ether$NIC
+       fi
+       ipconfig -P loopback /dev/null 127.0.0.1
+else
+       if [ ! -n "$me" ]
+       then
+               # By default, configure for QEMU.
+               # We only use qemu's setting when we don't have ipconfig so
+               # that we can test ipconfig + DHCP with qemu.
+               me='10.0.2.15'
+               mask='255.255.255.0'
+               remote='10.0.2.0'
+               route='10.0.2.2'
+               dns='10.0.2.3'
+       fi
+       #
+       # Get an instance of an IP stack and bind ether$NIC to it.
+       # The kernel sets errno but 'echo' doesn't return any sort of
+       # error indicator.  Our busybox hacks doesn't know any better
+       # and will think it was an error so direct stderr to /dev/null.
+       #
+       i=`cat /net/ipifc/clone`
+       echo "bind ether /net/ether$NIC" >/net/ipifc/$i/ctl 2>/dev/null
+       #
+       # Configure the stack.
+       #
+       echo "add $me $mask $remote" > /net/ipifc/$i/ctl
+       echo "add 0 0 $route" > /net/iproute
+       echo "I am $me, default route $route"
+       #
+       # Configure the loopback interface.
+       #
+       i=`cat /net/ipifc/clone`
+       echo 'bind loopback /dev/null' > /net/ipifc/$i/ctl
+       echo 'add 127.0.0.1 255.0.0.0 127.0.0.0' > /net/ipifc/$i/ctl
 fi
 
-if [ "$MAC" = "$altdraMAC" ]
+######### DNS Config #############
+
+# If we used some form of static configuration, /net/ndb doesn't know about our
+# DNS server.  This assumes the last contents of ndb is the IP block
+if [ -n "$me" ]
 then
-       # yuzhu's soda hall bridged vm
-       me=128.32.37.37
-       mask=255.255.255.0
-       remote=128.32.37.0
-       route=128.32.37.1
+       echo -e "\tdns=$dns" >> /net/ndb
 fi
-
-if [ "$MAC" = "$hossinMAC" ]
+# Either way, we have DNS in ndb now, but some apps want it in resolv.conf
+DNS=`grep "dns=" /net/ndb | cut -f 2 -d'='`
+echo "nameserver $DNS" >> /etc/resolv.conf
+# And we may have some additional search paths for resolv.conf
+if [ -n "$me" ]
 then
-       # brho's soda hall desktop
-       me=128.32.37.46
-       mask=255.255.255.0
-       remote=128.32.37.0
-       route=128.32.37.1
+       echo "search $search" >> /etc/resolv.conf
 fi
-#
-# Post the read-only filesystem in #s/$beetroot
-# and mount it on /boot so the commands in /boot/$cputype/bin
-# are available to create the namespace (namespaces like to
-# mount #s/boot on / and that should not be the read-only
-# filesystem).
-# Must set hostowner to be that of the owner of the nvram file
-# before paqfs starts otherwise factotum will not be able to
-# open it.
-#
-#/boot/echo -n sys > '#c/hostowner'
-#/boot/paqfs -p -S $beetroot -m /boot -q /boot/$beetroot
-#cd /boot/$cputype/bin
-bind -b '#cons' /dev
-#bind '#d' /fd
-#bind -c '#e' /env
-bind -b '#proc' /proc
-#bind -b -c '#srv' /srv
-bind -b '#srv' /srv
-
-#
-# Configure the networks.
-#
-bind -a '#ip' /net
-bind -a \#ether.$NIC /net
-
-# note: dhcp is possible, just not done yet.
-#get an instance of a network stack
-i=`cat /net/ipifc/clone`
-# bind the ether0 to it
-# the kernel sets errno, though it doesn't return -1 or anything.  but our bb
-# hacks doesn't know any better, and echo will think it was an error
-echo "bind ether /net/ether$NIC " > /net/ipifc/$i/ctl 2> /dev/null
-# ifconfig it
-echo "add $me $mask $remote" > /net/ipifc/$i/ctl
-echo "add 0 0 $route" > /net/iproute
-echo I am $me, default route $route
-
-i=`cat /net/ipifc/clone`
-echo "bind loopback /dev/null " > /net/ipifc/$i/ctl
-echo "add 127.0.0.1 255.0.0.0 127.0.0.0 " > /net/ipifc/$i/ctl
-
-cs&
-if [ ! -e "#srv/cs" ]
+# We also can provide an etc hosts file for loopback
+echo "127.0.0.1 localhost" >> /etc/hosts
+# You can set HOST and then you may set FQDN, and we'll add it to etc hosts
+if [ "x$HOST" != "x" ]
 then
-       echo "cs hasn't created #srv/cs yet, sleeping until it does..."
-       until [ -e "#srv/cs" ]
-       do
-               usleep 1000
-       done
+       IP=`cat /net/ipifc/0/local | cut -f 1 -d ' '`
+       echo "$IP $FQDN $HOST" >> /etc/hosts
 fi
-mount -a \#srv/cs /net
 
-# this is noisy, so it is off by default.
+daemonize /bin/cs -S
+mount -a '#srv/cs' /net
+
+# This is noisy, so it is off by default.
 #echo debug > /net/cs
 
-bind -a \#kprof /prof/
+/bin/bind -a '#kprof' /prof
 
-echo "ifconfig complete"
+echo 'ifconfig complete'