Unbreak kernel building
[dragonfly.git] / sbin / rcrun / rcrun.sh
blobabcbd27fedf807a80c438a3ce5bd9fe78a7ad46d
1 #!/bin/sh
3 # Copyright (c) 2003
4 # The DragonFly Project. All rights reserved.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in
14 # the documentation and/or other materials provided with the
15 # distribution.
16 # 3. Neither the name of The DragonFly Project nor the names of its
17 # contributors may be used to endorse or promote products derived
18 # from this software without specific, prior written permission.
20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 # COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 # INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 # SUCH DAMAGE.
34 if [ -r /etc/defaults/rc.conf ]; then
35 . /etc/defaults/rc.conf
38 if [ -r /etc/rc.conf ]; then
39 . /etc/rc.conf
42 buildrclist()
44 rcfiles=`find /etc/rc.d -type f`
45 for d in $local_startup; do
46 if [ -d $d ]; then
47 rcfiles="$rcfiles `find $d -type f`"
49 done
50 # The last element of this list is the script that provides the target
51 # we want to run.
53 rclist=`rcorder -o $1 $rcfiles`
56 dostart()
58 arg=$1
59 shift
61 for tgt in $@; do
62 case X`varsym -s -q rcng_$tgt` in
63 Xrunning*)
64 echo "$tgt has already been started"
66 Xconfigured*)
67 echo "$tgt has already been configured"
70 _return=0
71 buildrclist $tgt
72 for dep in $rclist; do
73 need=1
74 dep_prvd_list=`rcorder -p $dep`
75 # Because the dependency could actually provide more than one
76 # keyword, iterate it twice, first looking for a match in any
77 # of its PROVIDEs.
79 for dep_prvd in $dep_prvd_list; do
80 if [ $dep_prvd = $tgt ]; then
81 need=0
83 done
84 if [ $need = 1 ]; then
85 for dep_prvd in $dep_prvd_list; do
86 state=`varsym -s -q rcng_$dep_prvd`
87 case X$state in
88 Xrunning*|Xconfigured*|Xirrelevant*|Xdisabled*)
91 echo "$tgt depends on $dep_prvd, current state: $state"
92 _return=1
94 esac
95 done
97 done
98 # $dep contains the last dependency, which we run
100 if [ X$dep = X ]; then
101 echo "Unable to find keyword $tgt"
102 elif [ $_return = 0 ]; then
103 echo "Running $dep $arg"
104 (sh $dep $arg)
105 case X`varsym -s -q rcng_$tgt` in
106 Xdisabled*)
107 echo "$tgt is disabled, enable in rc.conf first or use rcforce/rcone"
109 Xfailed*)
110 echo "$tgt has failed to start"
113 esac
116 esac
117 done
120 arg=$0
121 case ${0##*/} in
122 rcstart)
123 arg=start
125 rcstop)
126 arg=stop
128 rcrestart)
129 arg=restart
131 rcreload)
132 arg=reload
134 rcstatus)
135 arg=status
137 rcvar)
138 arg=rcvar
140 rcvars)
141 arg=rcvar
143 rclist)
144 arg=list
146 rcforce)
147 arg=forcestart
149 rcfast)
150 arg=faststart
152 rcone)
153 arg=onestart
155 rcenable)
156 arg=enable
158 rcdisable)
159 arg=disable
162 arg=$1
163 shift
165 esac
167 case $arg in
168 start)
169 dostart start $@
171 forcestart)
172 dostart forcestart $@
174 faststart)
175 dostart faststart $@
177 onestart)
178 dostart onestart $@
180 stop)
181 for tgt in $@; do
182 buildrclist $tgt
183 dep=`echo "$rclist" | tail -1`
184 if [ X$dep = X ]; then
185 echo "Unable to find keyword $tgt"
186 else
187 (sh $dep stop)
189 done
191 restart)
192 for tgt in $@; do
193 buildrclist $tgt
194 dep=`echo "$rclist" | tail -1`
195 if [ X$dep = X ]; then
196 echo "Unable to find keyword $tgt"
197 else
198 (sh $dep restart)
200 done
202 reload)
203 for tgt in $@; do
204 buildrclist $tgt
205 dep=`echo "$rclist" | tail -1`
206 if [ X$dep = X ]; then
207 echo "Unable to find keyword $tgt"
208 else
209 (sh $dep reload)
211 done
213 status)
214 for tgt in $@; do
215 buildrclist $tgt
216 dep=`echo "$rclist" | tail -1`
217 if [ X$dep = X ]; then
218 echo "Unable to find keyword $tgt"
219 else
220 (sh $dep status)
222 done
224 disable|enable)
225 if [ "$arg" = "enable" ]; then
226 mode=YES
227 else
228 mode=NO
230 for tgt in $@; do
231 buildrclist $tgt
232 dep=`echo "$rclist" | tail -1`
233 if [ X$dep = X ]; then
234 echo "Unable to find provider id $tgt"
235 elif [ `varsym -s -q rcng_$tgt` = "$mode" ]; then
236 echo "$tgt is already $mode"
237 else
238 vars=`(sh $dep rcvar) 2>/dev/null | grep = | sed -e 's/\\$//g' | sed -e 's/=.*//g'`
239 cp /etc/rc.conf /etc/rc.conf.bak
240 if [ $arg = disable ]; then
241 rcstop $tgt
243 for k in $vars; do
244 rm -f /etc/rc.conf.$$
245 ( egrep -v "# rcrun enable ${k}$" /etc/rc.conf; printf "${k}=${mode}\t# rcrun enable ${k}\n" ) > /etc/rc.conf.$$
246 mv -f /etc/rc.conf.$$ /etc/rc.conf
247 echo "added/modified: ${k}=${mode}"
248 done
249 if [ $arg = enable ]; then
250 rcstart $tgt
253 done
255 rcvar)
256 for tgt in $@; do
257 buildrclist $tgt
258 dep=`echo "$rclist" | tail -1`
259 if [ X$dep = X ]; then
260 echo "Unable to find provider id $tgt"
261 else
262 (sh $dep rcvar)
264 done
266 list)
267 if [ "X$*" = X ]; then
268 for tgt in `varsym -a -s | egrep '^rcng_'`; do
269 echo $tgt
270 done
271 else
272 for tgt in $@; do
273 varsym -s rcng_$tgt 2>/dev/null || varsym -s rcng_$tgt
274 done
278 echo "usage: rcrun action rcscript1 ..."
279 echo " where 'action' is one of:"
280 echo " start|stop|restart|reload|status|rcvar|list|forcestart|faststart"
281 echo " onestart|disable|enable"
283 esac