xref: /minix3/etc/usr/rc (revision 26f14d6b5df2ddb37311bda69ae4bb8d42051657)
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