utimens(2) system call
[minix3.git] / etc / rc
blobea244857fcd6bb3060fbe696f5fc1310719e12e0
1 # /etc/rc - System startup script run by init before going multiuser.
3 exec >/dev/log
4 exec 2>/dev/log
5 exec </dev/null
7 umask 022
8 FSTAB=/etc/fstab
9 TERM="${TERM-minix}"
10 PATH=/usr/local/bin:/bin:/usr/bin:/usr/sbin:/usr/pkg/bin:/usr/pkg/sbin:/sbin
11 RC_TZ=/etc/rc.timezone
12 export TERM PATH
14 ARCH="`sysenv arch`"
16 if [ ! "$ARCH" ]
17 then    # Older kernels do not provide an arch sysenv variable.
18         # We assume we are on x86 then, as existing systems with
19         # kernel and userland (i.e. this script) unsynchronized
20         # will be x86.
21         ARCH=i386
24 usage()
26     echo >&2 "Usage: $0 [-saf] start|stop|down"
27     exec intr sh
30 up()
32     # Function to dynamically start a system service
33     opt=""
34     prefix=$(expr "$1 " : '\(-\)')
35     if [ "$prefix" = "-" ];
36     then
37          opt=$1
38          shift
39     fi
40     service=$1
41     shift
43     service $opt up /sbin/$service "$@"
46 edit()
48     # Function to dynamically edit system service settings
49     opt=""
50     prefix=$(expr "$1 " : '\(-\)')
51     if [ "$prefix" = "-" ];
52     then
53          opt=$1
54          shift
55     fi
56     service=$1
57     shift
59     # Assume binaries are always in /usr/sbin
60     service $opt edit /usr/sbin/$service -label $service "$@" 
63 # This function parses the deprecated minix shellscript-style 
64 # /etc/fstab, and fscks and mounts its filesystems.
65 mountfstab_poorman()
67     echo "WARNING: old fstab format, please upgrade!"
69     # /etc/fstab lists the root, home, and usr devices.
70     . $FSTAB
72     intr fsck.mfs $fsckopts $usr
73     if [ ! -z "$home" ]
74     then intr fsck.mfs $fsckopts $home
75     fi
77     # mount /usr
78     mount $bin_img $usr /usr
80     if [ ! -z "$home" ]
81     then mount $bin_img $home /home || echo "WARNING: couldn't mount $home on /home"
82     fi
85 while getopts 'saf' opt
87     case $opt in
88     s)  sflag=t ;;      # Single user
89     a)  aflag=t ;;      # Ask for /usr
90     f)  fflag=-f ;;     # Force a full file system check
91     *)  usage
92     esac
93 done
94 shift `expr $OPTIND - 1`
96 case "$#:$1" in
97 1:start|1:stop|1:down)
98     action=$1
99     ;;
100 *)  usage
101 esac
103 case $action in
104 start)
106     # National keyboard?
107     test -f /etc/keymap && loadkeys /etc/keymap
109     # options for fsck. default is -r, which prompts the user for repairs.
110     optname=fsckopts
111     fsckopts=-p
112     if sysenv $optname >/dev/null
113     then       fsckopts="`sysenv $optname`"
114     fi
116     if [ "`sysenv debug_fkeys`" != 0 ]
117     then
118         up -n is -period 5HZ
119     fi
121     # Set timezone.
122     export TZ=GMT0
123     if [ -f "$RC_TZ" ]
124     then . "$RC_TZ"
125     fi
127     if [ $ARCH = i386 ]
128     then
129         # Try to read the hardware real-time clock, otherwise do it manually.
130         readclock || intr date -q
131     fi
133     if [ $ARCH = earm ]
134     then
135         date 201301010000
136     fi
137   
139     # Initialize files.
140     >/etc/utmp                          # /etc/utmp keeps track of logins
142     # Use MFS binary only from kernel image?
143     if [ "`sysenv bin_img`" = 1 ]
144     then
145         bin_img="-i "
146     fi
148     # Are we booting from CD?
149     bootcd="`/bin/sysenv bootcd`"
151     # If booting from CD, mounting is a special case.
152     # We know what to do - only /usr is mounted and it's readonly.
153     if [ "$bootcd" = 1 ]
154     then        usrdev="$cddev"p2
155                 echo "/usr on cd is $usrdev"
156                 mount -r $usrdev /usr
157     else        
158     # If we're not booting from CD, fsck + mount using /etc/fstab.
159                 read <$FSTAB fstabline
160                 if [ "$fstabline" = "# Poor man's File System Table." ]
161                 then    mountfstab_poorman      # Old minix /etc/fstab
162                 else    fsck -x / $fflag $fsckopts
163                         mount -a
164                 fi
165     fi
167     # Unmount and free now defunct ramdisk
168     umount /dev/imgrd > /dev/null || echo "Failed to unmount boot ramdisk"
169     ramdisk 0 /dev/imgrd || echo "Failed to free boot ramdisk"
171     # Edit settings for boot system services
172     if [ "`sysenv skip_boot_config`" != 1 ]
173     then
174         edit rs
175         edit vm
176         edit pm
177         edit sched
178         edit vfs
179         edit ds
180         edit tty
181         edit memory
182         edit -p log
183         edit -c pfs
184         edit init
185     fi
187     # This file is necessary for above 'shutdown -C' check.
188     # (Silence stderr in case of running from cd.)
189     touch /usr/adm/wtmp /etc/wtmp 2>/dev/null
191     if [ "$sflag" ]
192     then
193         echo "Single user. Press ^D to resume multiuser startup."
194         intr sh
195         echo
196     fi
198     echo "Multiuser startup in progress ..."
200     case "`printroot -r`":$bootcd in
201     /dev/ram:)
202         # Remove boot-only things to make space,
203         # unless booting from CD, in which case we need them.
204         rm -rf /boot
205         # put the compiler on ram
206         cp /usr/lib/em* /usr/lib/cpp* /lib
207     esac
209     if [ $ARCH = i386 ]
210     then
211         echo -n "Starting hotplugging infrastructure... "
212         rm -f /var/run/devmand.pid
213         devmand -d /etc/devmand -d /usr/pkg/etc/devmand &
214         echo "done."
215     fi
217     # Things should be alright now.
218     ;;
219 down|stop)
220     sync
221     if [ $ARCH = i386 ]
222     then
223         if [ -f /var/run/devmand.pid ]
224         then
225                 kill -INT `cat /var/run/devmand.pid`
226                 # without this delay the following will 
227                 # be printed in the console
228                 # RS: devman not running?
229                 sleep 1
230         fi
231         #
232         # usbd needs to be stopped exactly 
233         # at this stage(before stopping devman
234         # and after stopping the services
235         # stated by devmand)
236         if [ -x /usr/pkg/etc/rc.d/usbd ]
237         then 
238                 /usr/pkg/etc/rc.d/usbd stop
239         fi
240     fi
242     # Tell RS server we're going down.
243     service shutdown
244     ;;
245 esac
247 # Further initialization.
248 test -f /usr/etc/rc && sh /usr/etc/rc $action
249 test -f /usr/local/etc/rc && sh /usr/local/etc/rc $action
251 # Any messages?
252 test "$action" = start -a -f /etc/issue && cat /etc/issue
254 exit 0