regress: use parsecmd() instead of strncmp on user pointers
[akaros.git] / kern / kfs / ifconfig
index 39734db..9c153cc 100755 (executable)
@@ -1,7 +1,40 @@
 #!/bin/ash
 
-NIC='0'
-MAC=`cat "#ether/ether$NIC/addr"`
+/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
@@ -11,35 +44,20 @@ export rootdir=/root
 export rootspec=''
 export rootsrv=boot
 
-if [ -f /etc/network/default ]
-then
-       source /etc/network/default
-else
-       echo '/etc/network/default not found'
-fi
-
-if [ -f /etc/network/local ]
-then
-       source /etc/network/local
-else
-       echo '/etc/network/local not found'
-fi
-
 if [ -d /etc/network/local.d ]
 then
        for cfg in /etc/network/local.d/*
        do
                source $cfg
        done
-else
-       echo '/etc/network/local.d not found'
 fi
 
 #
 # Set up the initial namespace for starting networking.
 #
-/bin/bind -b '#cons' /dev
 /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
@@ -51,24 +69,34 @@ fi
 /bin/bind -a '#ip' /net
 /bin/bind -a '#ether'.$NIC /net
 
+# Need to set /dev/sysname before ipconfig.  ipconfig will grab this and put it
+# in ndb.
+if [ "x$HOST" != "x" ]
+then
+       echo "$HOST" > /dev/sysname
+fi
+
 if [ -x /bin/ipconfig ]
 then
-       if [ ! -z "$me" ]
+       if [ -n "$me" ]
        then
                ipconfig -g $route ether /net/ether$NIC $me $mask
        else
                # No explicit configuration; use DHCP.
-               ipconfig ether /net/ether$NIC
+               daemonize /bin/ipconfig -S ether /net/ether$NIC
        fi
-       ipconfig loopback /dev/null 127.0.0.1
+       ipconfig -P loopback /dev/null 127.0.0.1
 else
-       if [ -z "$me" ]
+       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.
@@ -92,19 +120,32 @@ else
        echo 'add 127.0.0.1 255.0.0.0 127.0.0.0' > /net/ipifc/$i/ctl
 fi
 
-#
-# Start cs (the name resolution server) and wait for it to post a
-# file descriptor in #srv, then mount it in /net.
-#
-cs &
-if [ ! -e '#srv/cs' ]
+######### 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
-       echo 'cs has not created #srv/cs yet, spinning until it does....'
-       until [ -e '#srv/cs' ]
-       do
-               usleep 1000
-       done
+       echo -e "\tdns=$dns" >> /net/ndb
 fi
+# 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
+       echo "search $search" >> /etc/resolv.conf
+fi
+# 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
+       IP=`cat /net/ipifc/0/local | cut -f 1 -d ' '`
+       echo "$IP $FQDN $HOST" >> /etc/hosts
+fi
+
+daemonize /bin/cs -S
 mount -a '#srv/cs' /net
 
 # This is noisy, so it is off by default.