1b684a8edSBen Gras# /usr/etc/rc - continued system initialization. 2b684a8edSBen Gras 361a4e15bSJorrit HerderRANDOM_FILE=/usr/adm/random.dat 4e21c135fSBen GrasLOCAL_FILE=/usr/etc/rc.local 561a4e15bSJorrit Herder 65acaa081SBen GrasARCH="`sysenv arch`" 75acaa081SBen Gras 85acaa081SBen Grasif [ ! "$ARCH" ] 95acaa081SBen Grasthen # Older kernels do not provide an arch sysenv variable. 105acaa081SBen Gras # We assume we are on x86 then, as existing systems with 115acaa081SBen Gras # kernel and userland (i.e. this script) unsynchronized 125acaa081SBen Gras # will be x86. 135acaa081SBen Gras ARCH=i386 145acaa081SBen Grasfi 155acaa081SBen Gras 16349a1580SBen Gras# Get $SERVICES_DIRS 17349a1580SBen Gras. /etc/rc.conf 18349a1580SBen Gras 19349a1580SBen Gras# Directories to find services in 20349a1580SBen Grasif [ ! "$SERVICES_DIRS" ] 21349a1580SBen Grasthen SERVICES_DIRS=/usr/sbin 22349a1580SBen Grasfi 23349a1580SBen Gras 24a03f679eSBen Gras# Booting from cd? 25a03f679eSBen Grasbootcd="`/bin/sysenv bootcd`" 26a03f679eSBen Gras 27b684a8edSBen Grascase "$#:$1" in 28b684a8edSBen Gras1:start|1:stop|1:down) 29b684a8edSBen Gras action=$1 30b684a8edSBen Gras ;; 31b684a8edSBen Gras*) echo >&2 "Usage: $0 start|stop|down" 32b684a8edSBen Gras exit 1 33b684a8edSBen Grasesac 34b684a8edSBen Gras 35e21c135fSBen Grasif [ -f "$LOCAL_FILE" ] 36e21c135fSBen Grasthen . "$LOCAL_FILE" $1 37e21c135fSBen Grasfi 38e21c135fSBen Gras 3940e9875fSJorrit Herderdisabled() 4040e9875fSJorrit Herder{ 4140e9875fSJorrit Herder ifs="$IFS"; IFS=, 428cb902dcSJorrit Herder for skip in `sysenv disable` 4340e9875fSJorrit Herder do 448cb902dcSJorrit Herder if [ "$skip" = "$1" ] 4540e9875fSJorrit Herder then 4640e9875fSJorrit Herder IFS="$ifs"; unset ifs 4740e9875fSJorrit Herder return 0 4840e9875fSJorrit Herder fi 4940e9875fSJorrit Herder done 5040e9875fSJorrit Herder IFS="$ifs"; unset ifs 5140e9875fSJorrit Herder return 1 5240e9875fSJorrit Herder} 5340e9875fSJorrit Herder 54b684a8edSBen Grasdaemonize() 55b684a8edSBen Gras{ 56b684a8edSBen Gras # Function to start a daemon, if it exists. 57b684a8edSBen Gras local IFS=':' 58b684a8edSBen Gras local name="$1" 59b684a8edSBen Gras test "$1" = tcpd && name="$2" 60b684a8edSBen Gras 61b684a8edSBen Gras for dir in $PATH 62b684a8edSBen Gras do 63b684a8edSBen Gras if [ -f "$dir/$1" ] 64b684a8edSBen Gras then 6540e9875fSJorrit Herder 6640e9875fSJorrit Herder # check if this service is disabled at the boot monitor. 6740e9875fSJorrit Herder if disabled $name; then return; fi 6840e9875fSJorrit Herder 69b684a8edSBen Gras echo -n " $name" 70b684a8edSBen Gras "$@" & 71b684a8edSBen Gras return 72b684a8edSBen Gras fi 73b684a8edSBen Gras done 74b684a8edSBen Gras} 75b684a8edSBen Gras 7661a4e15bSJorrit Herderup() 7761a4e15bSJorrit Herder{ 783de6a807SCristiano Giuffrida # Function to dynamically start a system service 793de6a807SCristiano Giuffrida opt="" 803de6a807SCristiano Giuffrida prefix=$(expr "$1 " : '\(-\)') 813de6a807SCristiano Giuffrida if [ "$prefix" = "-" ]; 823de6a807SCristiano Giuffrida then 8365ef5397SCristiano Giuffrida opt=$1 8465ef5397SCristiano Giuffrida shift 853de6a807SCristiano Giuffrida fi 8661a4e15bSJorrit Herder service=$1 872aac756eSJorrit Herder shift 8861a4e15bSJorrit Herder 8961a4e15bSJorrit Herder # First check if this service is disabled at the boot monitor. 9040e9875fSJorrit Herder if disabled $service; then return; fi 9161a4e15bSJorrit Herder 9261a4e15bSJorrit Herder # Service is not disabled. Try to bring it up. 93349a1580SBen Gras found="" 94349a1580SBen Gras for dir in $SERVICES_DIRS 95349a1580SBen Gras do bin=$dir/$service 96349a1580SBen Gras if [ -x $bin -a -z "$found" ] 97349a1580SBen Gras then service $opt up $bin "$@" 9861a4e15bSJorrit Herder echo -n " $service" 99349a1580SBen Gras found=yes 100349a1580SBen Gras fi 101349a1580SBen Gras done 102349a1580SBen Gras if [ -z "$found" ] 103349a1580SBen Gras then echo " ($service not found in $SERVICES_DIRS)" 104349a1580SBen Gras fi 10561a4e15bSJorrit Herder} 106f8c380c1SPhilip Homburg 1079ba65d2eSDavid van Moolenbroekget_eth_labels() { 1089ba65d2eSDavid van Moolenbroek # Filter out the non-vlan ethernet entries from inet.conf. 1099ba65d2eSDavid van Moolenbroek # Produce as output a list of "drivername_instancenr"-formatted labels. 1106759b24cSThomas Veerman sed 's/\008/ /g' /etc/inet.conf | \ 1119ba65d2eSDavid van Moolenbroek sed -n 's/^ *eth[0-9][0-9]* *\([^ ][^ ]*\) *\([0-9][0-9]*\).*$/\1_\2/p' | \ 1129ba65d2eSDavid van Moolenbroek grep -v '^vlan_' 1139ba65d2eSDavid van Moolenbroek} 114103f18cbSBen Gras 115103f18cbSBen GrasDAEMONS=/etc/rc.daemons 116103f18cbSBen Gras 117b684a8edSBen Grascase $action in 118b684a8edSBen Grasstart) 119b684a8edSBen Gras # Select console font. 120b684a8edSBen Gras test -f /etc/font && loadfont /etc/font </dev/console 121b684a8edSBen Gras 122b684a8edSBen Gras # Cleanup. 123e257c999SThomas Veerman rm -rf /tmp/* /usr/run/* /usr/spool/lpd/* /usr/spool/locks/* 124b684a8edSBen Gras 125e5610815SJorrit Herder # Start servers and drivers set at the boot monitor. 1263cb00065SJorrit Herder echo -n "Starting services:" 1273de6a807SCristiano Giuffrida up -n random -dev /dev/random -devstyle STYLE_DEVA -period 3HZ 128c12b74daSPhilip Homburg 129f8c380c1SPhilip Homburg # load random number generator 130f8c380c1SPhilip Homburg if [ -f $RANDOM_FILE ] 131f8c380c1SPhilip Homburg then 132f8c380c1SPhilip Homburg cat < $RANDOM_FILE >/dev/random 133f8c380c1SPhilip Homburg # overwrite $RANDOM_FILE. We don't want to use this data again 1340bd61375SJorrit Herder dd if=/dev/random of=$RANDOM_FILE bs=1024 count=1 2> /dev/null 135f8c380c1SPhilip Homburg fi 136f8c380c1SPhilip Homburg 1379ba65d2eSDavid van Moolenbroek # start network driver instances for all configured ethernet devices 1389ba65d2eSDavid van Moolenbroek for label in $(get_eth_labels); do 1399ba65d2eSDavid van Moolenbroek driver=$(echo $label | sed 's/\(.*\)_.*/\1/') 1409ba65d2eSDavid van Moolenbroek instance=$(echo $label | sed 's/.*_//') 1419ba65d2eSDavid van Moolenbroek eval arg=\$${label}_arg 1429ba65d2eSDavid van Moolenbroek if [ ! -z "$arg" ]; then arg=" $arg"; fi 1439ba65d2eSDavid van Moolenbroek arg="-args \"instance=$instance$arg\"" 1449ba65d2eSDavid van Moolenbroek eval up $driver -label $label $arg -period 5HZ 145e5610815SJorrit Herder done 1460039e023STomas Hruby if [ X`/bin/sysenv lwip` = Xyes ] 1470039e023STomas Hruby then 148fb31513bSTomas Hruby up lwip -script /etc/rs.inet -dev /dev/ip -devstyle STYLE_CLONE_A 1490039e023STomas Hruby else 1505a98cd3eSCristiano Giuffrida up inet -script /etc/rs.inet -dev /dev/ip -devstyle STYLE_CLONE 1510039e023STomas Hruby fi 1525acaa081SBen Gras 1533de6a807SCristiano Giuffrida up -n ipc 1545acaa081SBen Gras 1555acaa081SBen Gras if [ $ARCH = i386 ] 1565acaa081SBen Gras then 1575acaa081SBen Gras up -n printer -dev /dev/lp -period 10HZ 1580aa01a2dSDavid van Moolenbroek # start VirtualBox time sync driver if the device is there 1590aa01a2dSDavid van Moolenbroek if grep '^[^ ]* [^ ]* 80EE:CAFE ' /proc/pci >/dev/null; then 1600aa01a2dSDavid van Moolenbroek up -n vbox -period 10HZ 1610aa01a2dSDavid van Moolenbroek fi 1625acaa081SBen Gras fi 1635acaa081SBen Gras 16461a4e15bSJorrit Herder echo . 165b684a8edSBen Gras 166b684a8edSBen Gras # Network initialization. 167b684a8edSBen Gras (: </dev/tcp) 2>/dev/null && net=t # Is there a TCP/IP server? 168b684a8edSBen Gras 169b684a8edSBen Gras echo -n "Starting daemons:" 170b684a8edSBen Gras daemonize update 1719748a653SBen Gras 1729748a653SBen Gras # Ugly error message when starting cron from CD. 1739748a653SBen Gras # (and cron unnecessary then so..) 1749748a653SBen Gras if [ ! -f /CD ] 175ea398f99SBen Gras then daemonize cron 1763775ce2eSBen Gras else mkdir /tmp/log 177ea398f99SBen Gras rm -f /var/log || true 1783775ce2eSBen Gras ln -s /tmp/log /var/log || true 1793775ce2eSBen Gras . /etc/rc.cd 1809748a653SBen Gras fi 1817a1853a5SBen Gras # syslogd has not been started yet 1826137c589SBen Gras rm -f /var/run/syslogd.pid 183a3dfe3c9SBen Gras daemonize syslogd 1840bd61375SJorrit Herder echo . 185b684a8edSBen Gras 186550fdfb4SThomas Cort # i2c only supported on ARM at the moment 187550fdfb4SThomas Cort if [ $ARCH = earm ] 188550fdfb4SThomas Cort then 189550fdfb4SThomas Cort echo -n "Starting i2c subsystem: " 190550fdfb4SThomas Cort for bus in 1 2 3 191550fdfb4SThomas Cort do 192550fdfb4SThomas Cort test -e /dev/i2c-${bus} || (cd /dev && MAKEDEV i2c-${bus}) 193550fdfb4SThomas Cort up i2c -dev /dev/i2c-${bus} -label i2c.${bus} \ 194550fdfb4SThomas Cort -args instance=${bus} 195550fdfb4SThomas Cort done 196550fdfb4SThomas Cort echo . 197fdbede5dSThomas Cort 198fdbede5dSThomas Cort BOARD_NAME=`eepromread -i | sed -n 's/^BOARD_NAME : \(.*\)$/\1/p'` 199fdbede5dSThomas Cort case "${BOARD_NAME}" in 200*26f14d6bSThomas Cort 201fdbede5dSThomas Cort A335BONE) 202fdbede5dSThomas Cort echo "Detected BeagleBone" 203fdbede5dSThomas Cort echo -n "Starting i2c device drivers: " 204*26f14d6bSThomas Cort 205*26f14d6bSThomas Cort # start EEPROM driver for reading board info 206*26f14d6bSThomas Cort test -e /dev/eepromb1s50 || \ 207*26f14d6bSThomas Cort (cd /dev && MAKEDEV eepromb1s50) 208fdbede5dSThomas Cort up cat24c256 -dev /dev/eepromb1s50 \ 209d9b62047SThomas Cort -label cat24c256.1.50 \ 210d9b62047SThomas Cort -args 'bus=1 address=0x50' 211d9b62047SThomas Cort 212d9b62047SThomas Cort # Start TPS65217 driver for power management. 213d9b62047SThomas Cort up tps65217 -label tps65217.1.24 \ 214d9b62047SThomas Cort -args 'bus=1 address=0x24' 215d9b62047SThomas Cort 216*26f14d6bSThomas Cort # check for the presence of a display 217*26f14d6bSThomas Cort eepromread -f /dev/i2c-2 -n > /dev/null 2>&1 218*26f14d6bSThomas Cort RESULT=$? 219*26f14d6bSThomas Cort if [ $RESULT -eq 0 ] 220*26f14d6bSThomas Cort then 221*26f14d6bSThomas Cort # start eeprom driver for reading EDID. 222*26f14d6bSThomas Cort test -e /dev/eepromb2s50 || \ 223*26f14d6bSThomas Cort (cd /dev && MAKEDEV eepromb2s50) 224*26f14d6bSThomas Cort up cat24c256 -dev /dev/eepromb2s50 \ 225*26f14d6bSThomas Cort -label cat24c256.2.50 \ 226*26f14d6bSThomas Cort -args 'bus=2 address=0x50' 227*26f14d6bSThomas Cort 228*26f14d6bSThomas Cort # start frame buffer 229*26f14d6bSThomas Cort #up fb -dev /dev/fb0 -args edid.0=cat24c256.2.50 230*26f14d6bSThomas Cort # fb hasn't been ported to AM335X yet. 231*26f14d6bSThomas Cort fi 232*26f14d6bSThomas Cort 233fdbede5dSThomas Cort ;; 234*26f14d6bSThomas Cort 235fdbede5dSThomas Cort A335BNLT) 236fdbede5dSThomas Cort echo "Detected BeagleBone Black" 237fdbede5dSThomas Cort echo -n "Starting i2c device drivers: " 238*26f14d6bSThomas Cort 239*26f14d6bSThomas Cort # start EEPROM driver for reading board info 240*26f14d6bSThomas Cort test -e /dev/eepromb1s50 || \ 241*26f14d6bSThomas Cort (cd /dev && MAKEDEV eepromb1s50) 242fdbede5dSThomas Cort up cat24c256 -dev /dev/eepromb1s50 \ 243*26f14d6bSThomas Cort -label cat24c256.1.50 \ 244*26f14d6bSThomas Cort -args 'bus=1 address=0x50' 2451b78e86fSThomas Cort 246d9b62047SThomas Cort # Start TPS65217 driver for power management. 247d9b62047SThomas Cort up tps65217 -label tps65217.1.24 \ 248d9b62047SThomas Cort -args 'bus=1 address=0x24' 249d9b62047SThomas Cort 250d9b62047SThomas Cort # Start TDA19988 driver for reading EDID. 2511b78e86fSThomas Cort up tda19988 -label tda19988.1.3470 -args \ 2521b78e86fSThomas Cort 'cec_bus=1 cec_address=0x34 hdmi_bus=1 hdmi_address=0x70' 253*26f14d6bSThomas Cort 254*26f14d6bSThomas Cort # start frame buffer 255*26f14d6bSThomas Cort #up fb -dev /dev/fb0 -args edid.0=tda19988.1.3470 256*26f14d6bSThomas Cort # fb hasn't been ported to AM335X yet. 257*26f14d6bSThomas Cort 258fdbede5dSThomas Cort ;; 259*26f14d6bSThomas Cort 260fdbede5dSThomas Cort UNKNOWN) 261fdbede5dSThomas Cort echo "Unable to detect board -- assuming BeagleBoard-xM" 262fdbede5dSThomas Cort echo -n "Starting i2c device drivers: " 263bab2a34eSThomas Cort 264bab2a34eSThomas Cort # Start TPS65950 driver for power management. 265bab2a34eSThomas Cort up tps65950 -label tps65950.1.48 \ 266bab2a34eSThomas Cort -args 'bus=1 address=0x48' 267bab2a34eSThomas Cort 268039c8db7SThomas Cort # Set the system time to the time in the TPS65950's RTC 269039c8db7SThomas Cort readclock 270039c8db7SThomas Cort 271*26f14d6bSThomas Cort # check for the presence of a display 272*26f14d6bSThomas Cort eepromread -f /dev/i2c-3 -n > /dev/null 2>&1 273*26f14d6bSThomas Cort RESULT=$? 274*26f14d6bSThomas Cort if [ $RESULT -eq 0 ] 275*26f14d6bSThomas Cort then 276*26f14d6bSThomas Cort # start eeprom driver for reading edid 277*26f14d6bSThomas Cort test -e /dev/eepromb3s50 || \ 278*26f14d6bSThomas Cort (cd /dev && MAKEDEV eepromb3s50) 279*26f14d6bSThomas Cort up cat24c256 -dev /dev/eepromb3s50 \ 280*26f14d6bSThomas Cort -label cat24c256.3.50 \ 281*26f14d6bSThomas Cort -args 'bus=3 address=0x50' 282*26f14d6bSThomas Cort 283*26f14d6bSThomas Cort # start frame buffer 284*26f14d6bSThomas Cort up fb -dev /dev/fb0 -args edid.0=cat24c256.3.50 285*26f14d6bSThomas Cort fi 286*26f14d6bSThomas Cort 287fdbede5dSThomas Cort ;; 288fdbede5dSThomas Cort esac 289fdbede5dSThomas Cort 290fdbede5dSThomas Cort echo . 291550fdfb4SThomas Cort fi 292550fdfb4SThomas Cort 293b684a8edSBen Gras if [ "$net" ] 294b684a8edSBen Gras then 295b684a8edSBen Gras if [ -f /etc/rc.net ] 296b684a8edSBen Gras then 297b684a8edSBen Gras # Let a customized TCP/IP initialization script figure it out. 298b684a8edSBen Gras . /etc/rc.net 299b684a8edSBen Gras else 300b684a8edSBen Gras # Standard network daemons. 3010bd61375SJorrit Herder echo -n "Starting networking:" 3029a37f632SDavid van Moolenbroek if grep -s 'psip0.*default' /etc/inet.conf >/dev/null 303ef676bd3SBen Gras then ifconfig -h 10.0.0.1 30448c6bb79SCristiano Giuffrida else 3050039e023STomas Hruby if [ X`/bin/sysenv lwip` = Xyes ] 3060039e023STomas Hruby then 3070039e023STomas Hruby dhcpd --lwip & 3080039e023STomas Hruby echo -n " dhcpd" 3090039e023STomas Hruby else 310816f5dd5SBen Gras daemonize dhcpd 311ef676bd3SBen Gras fi 3120039e023STomas Hruby fi 3137a0f8e28SBen Gras daemonize nonamed -L 314103f18cbSBen Gras if [ -f "$DAEMONS" ] 315103f18cbSBen Gras then . "$DAEMONS" 316103f18cbSBen Gras fi 317b684a8edSBen Gras # The last daemon has been started, so close the list: 318b684a8edSBen Gras echo . 31994095d87SBen Gras fi 32094095d87SBen Gras fi 321b684a8edSBen Gras 322b684a8edSBen Gras if [ "$net" ] 323b684a8edSBen Gras then 324b684a8edSBen Gras # Get the nodename from the DNS and set it. 325b684a8edSBen Gras trap '' 2 326b857dec7SBen Gras intr -t 20 hostaddr -h 327b684a8edSBen Gras trap 2 328b684a8edSBen Gras fi 329b684a8edSBen Gras 330b684a8edSBen Gras # Recover files being edited when the system crashed. 331b684a8edSBen Gras test -f /usr/bin/elvprsv && elvprsv /usr/tmp/elv* 332b684a8edSBen Gras 333b684a8edSBen Gras # Run the daily cleanup on systems that are not on at night. 334b684a8edSBen Gras test -f /usr/etc/daily && sh /usr/etc/daily boot & 335f8c380c1SPhilip Homburg;; 336f8c380c1SPhilip Homburgstop|down) 337093cfe11SBen Gras # Save random data, if /usr is mounted rw. 338d9f4f719SThomas Veerman if grep ' \/usr .*rw.*' /etc/mtab >/dev/null 339093cfe11SBen Gras then 340f8c380c1SPhilip Homburg if dd if=/dev/random of=$RANDOM_FILE.new bs=1024 count=1 2>/dev/null 341f8c380c1SPhilip Homburg then 342f8c380c1SPhilip Homburg mv $RANDOM_FILE.new $RANDOM_FILE 343f8c380c1SPhilip Homburg else 344f8c380c1SPhilip Homburg echo 'Failed to save random data.' 345f8c380c1SPhilip Homburg fi 346428f9d63SBen Gras fi 347b684a8edSBen Grasesac 348ba667a07SBen Gras 3499ce3961bSBen Grasd= 350ba667a07SBen Gras# Let packages run their own scripts 3519ce3961bSBen Grasfor d in /usr/local/etc/rc.d /usr/pkg/etc/rc.d 3529ce3961bSBen Grasdo 353a03f679eSBen Grasif [ -d "$d" -a -z "$bootcd" ] 3549ce3961bSBen Grasthen ( if cd $d 355ba667a07SBen Gras then 356fec2fa95SBen Gras echo -n "Local packages ($action): " 357ba667a07SBen Gras for f in * 358ba667a07SBen Gras do 359ba667a07SBen Gras if [ -x "$f" ] 360ba667a07SBen Gras then echo -n "$f " 361ba667a07SBen Gras sh "$f" "$action" 362ba667a07SBen Gras fi 363ba667a07SBen Gras done 364ba667a07SBen Gras echo " done." 365ba667a07SBen Gras fi 3669ce3961bSBen Gras ) 367ba667a07SBen Grasfi 3689ce3961bSBen Grasdone 369