/[baselayout]/branches/baselayout-1_12/sbin/runscript.sh
Gentoo

Contents of /branches/baselayout-1_12/sbin/runscript.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2091 - (show annotations) (download) (as text)
Wed Jun 14 21:13:31 2006 UTC (7 years, 10 months ago) by uberlord
File MIME type: text/x-sh
File size: 17987 byte(s)
    {start,stop}_volumes moved to rc and halt.sh respectively.

    net services are now depended upon more correctly.
1 #!/bin/bash
2 # Copyright 1999-2006 Gentoo Foundation
3 # Distributed under the terms of the GNU General Public License v2
4
5 # Common functions
6 [[ ${RC_GOT_FUNCTIONS} != "yes" ]] && source /sbin/functions.sh
7
8 # User must be root to run most script stuff (except status)
9 if [[ ${EUID} != "0" ]] && ! [[ $2 == "status" && $# -eq 2 ]] ; then
10 eerror "$0: must be root to run init scripts"
11 exit 1
12 fi
13
14 myscript="$1"
15 if [[ -L $1 && ! -L "/etc/init.d/${1##*/}" ]] ; then
16 SVCNAME="$(readlink "$1")"
17 else
18 SVCNAME="$1"
19 fi
20
21 declare -r SVCNAME="${SVCNAME##*/}"
22 export SVCNAME
23 # Support deprecated myservice variable
24 myservice="${SVCNAME}"
25
26 svc_trap() {
27 trap 'eerror "ERROR: ${SVCNAME} caught an interrupt"; exit 1' \
28 INT QUIT TSTP
29 }
30
31 # Setup a default trap
32 svc_trap
33
34 # coldplug events can trigger init scripts, but we don't want to run them
35 # until after rc sysinit has completed so we punt them to the boot runlevel
36 if [[ -e /dev/.rcsysinit ]] ; then
37 eerror "ERROR: cannot run ${SVCNAME} until sysinit completes"
38 [[ ${RC_COLDPLUG:-yes} != "yes" ]] && exit 1
39 set -f
40 for x in ${RC_PLUG_SERVICES} ; do
41 [[ ${SVCNAME} == ${x} ]] && break
42 [[ "!${SVCNAME}" == ${x} ]] && exit 1
43 done
44 eerror "${SVCNAME} will be started in the ${BOOTLEVEL} runlevel"
45 if [[ ! -L /dev/.rcboot/"${SVCNAME}" ]] ; then
46 [[ ! -d /dev/.rcboot ]] && mkdir /dev/.rcboot
47 ln -snf "$1" /dev/.rcboot/"${SVCNAME}"
48 fi
49 exit 1
50 fi
51
52 # Only hotplug if we're allowed to
53 if [[ ${IN_HOTPLUG} == "1" ]] ; then
54 if [[ ${RC_HOTPLUG:-yes} != "yes" ]] ; then
55 eerror "${SVCNAME} is not allowed to be hotplugged"
56 exit 1
57 fi
58
59 set -f
60 for x in ${RC_PLUG_SERVICES} ; do
61 [[ ${SVCNAME} == ${x} ]] && break
62 if [[ "!${SVCNAME}" == ${x} ]] ; then
63 eerror "${SVCNAME} is not allowed to be hotplugged"
64 exit 1
65 fi
66 done
67 set +f
68 fi
69
70 # State variables
71 svcpause="no"
72 svcrestart="no"
73
74 # Functions to handle dependencies and services
75 [[ ${RC_GOT_SERVICES} != "yes" ]] && source "${svclib}/sh/rc-services.sh"
76 # Functions to control daemons
77 [[ ${RC_GOT_DAEMON} != "yes" ]] && source "${svclib}/sh/rc-daemon.sh"
78
79 # Source configuration files.
80 # (1) Source /etc/conf.d/net if it is a net.* service
81 # (2) Source /etc/conf.d/${SVCNAME} to get initscript-specific
82 # configuration (if it exists).
83 # (3) Source /etc/rc.conf to pick up potentially overriding
84 # configuration, if the system administrator chose to put it
85 # there (if it exists).
86 if net_service "${SVCNAME}" ; then
87 conf="$(add_suffix /etc/conf.d/net)"
88 [[ -e ${conf} ]] && source "${conf}"
89 fi
90 conf="$(add_suffix "/etc/conf.d/${SVCNAME}")"
91 [[ -e ${conf} ]] && source "${conf}"
92 conf="$(add_suffix /etc/rc.conf)"
93 [[ -e ${conf} ]] && source "${conf}"
94
95 mylevel="${SOFTLEVEL}"
96 [[ ${SOFTLEVEL} == "${BOOTLEVEL}" \
97 || ${SOFTLEVEL} == "reboot" || ${SOFTLEVEL} == "shutdown" ]] \
98 && mylevel="${DEFAULTLEVEL}"
99
100 # Call svc_quit if we abort AND we have obtained a lock
101 service_started "${SVCNAME}"
102 svcstarted="$?"
103 service_inactive "${SVCNAME}"
104 svcinactive="$?"
105 svc_quit() {
106 eerror "ERROR: ${SVCNAME} caught an interrupt"
107 if service_inactive "${SVCNAME}" || [[ ${svcinactive} == "0" ]] ; then
108 mark_service_inactive "${SVCNAME}"
109 elif [[ ${svcstarted} == "0" ]] ; then
110 mark_service_started "${SVCNAME}"
111 else
112 mark_service_stopped "${SVCNAME}"
113 fi
114 exit 1
115 }
116
117 usage() {
118 local IFS="|"
119 myline="Usage: ${SVCNAME} { $* "
120 echo
121 eerror "${myline}}"
122 eerror " ${SVCNAME} without arguments for full help"
123 }
124
125 stop() {
126 # Return success so the symlink gets removed
127 return 0
128 }
129
130 start() {
131 eerror "ERROR: ${SVCNAME} does not have a start function."
132 # Return failure so the symlink doesn't get created
133 return 1
134 }
135
136 restart() {
137 svc_restart
138 }
139
140 status() {
141 # Dummy function
142 return 0
143 }
144
145 svc_schedule_start() {
146 local service="$1" start="$2"
147 [[ ! -d "${svcdir}/scheduled/${service}" ]] \
148 && mkdir -p "${svcdir}/scheduled/${service}"
149 [[ ! -e "${svcdir}/scheduled/${service}/${start}" ]] \
150 && ln -snf "/etc/init.d/${service}" \
151 "${svcdir}/scheduled/${service}/${start}"
152 }
153
154 svc_start_scheduled() {
155 [[ ! -d "${svcdir}/scheduled/${SVCNAME}" ]] && return
156 local x= services=
157
158 for x in $(dolisting "${svcdir}/scheduled/${SVCNAME}/") ; do
159 services="${services} ${x##*/}"
160 done
161
162 for x in ${services} ; do
163 service_stopped "${x}" && start_service "${x}"
164 rm -f "${svcdir}/scheduled/${SVCNAME}/${x}"
165 done
166
167 rmdir "${svcdir}/scheduled/${SVCNAME}"
168 }
169
170 svc_stop() {
171 local x= mydep= mydeps= retval=0
172 local -a servicelist=()
173
174 # Do not try to stop if it had already failed to do so
175 if is_runlevel_stop && service_failed "${SVCNAME}" ; then
176 return 1
177 elif service_stopped "${SVCNAME}" ; then
178 ewarn "WARNING: ${SVCNAME} has not yet been started."
179 return 0
180 fi
181 if ! mark_service_stopping "${SVCNAME}" ; then
182 eerror "ERROR: ${SVCNAME} is already stopping."
183 return 1
184 fi
185
186 # Ensure that we clean up if we abort for any reason
187 trap "svc_quit" INT QUIT TSTP
188
189 mark_service_starting "${SVCNAME}"
190 service_message "Service ${SVCNAME} stopping"
191
192 if in_runlevel "${SVCNAME}" "${BOOTLEVEL}" && \
193 [[ ${SOFTLEVEL} != "reboot" && ${SOFTLEVEL} != "shutdown" && \
194 ${SOFTLEVEL} != "single" ]] ; then
195 ewarn "WARNING: you are stopping a boot service."
196 fi
197
198 if [[ ${svcpause} != "yes" && ${RC_NO_DEPS} != "yes" ]] ; then
199 if net_service "${SVCNAME}" ; then
200 is_net_up || mydeps="net"
201 fi
202 mydeps="${mydeps} ${SVCNAME}"
203 fi
204
205 # Save the IN_BACKGROUND var as we need to clear it for stopping depends
206 local ib_save="${IN_BACKGROUND}"
207 unset IN_BACKGROUND
208
209 for mydep in ${mydeps} ; do
210 for x in $(needsme "${mydep}") ; do
211 service_started "${x}" && stop_service "${x}"
212 service_list=( "${service_list[@]}" "${x}" )
213 done
214 done
215
216 for x in "${service_list[@]}" ; do
217 # We need to test if the service has been marked stopped
218 # as the fifo may still be around if called by custom code
219 # such as postup from a net script.
220 service_stopped "${mynetservice}" && continue
221
222 wait_service "${x}"
223 if ! service_stopped "${x}" ; then
224 retval=1
225 break
226 fi
227 done
228
229 IN_BACKGROUND="${ib_save}"
230
231 if [[ ${retval} != "0" ]] ; then
232 eerror "ERROR: problems stopping dependent services."
233 eerror " ${SVCNAME} is still up."
234 else
235 # Now that deps are stopped, stop our service
236 (
237 exit() {
238 RC_QUIET_STDOUT="no"
239 eerror "DO NOT USE EXIT IN INIT.D SCRIPTS"
240 eerror "This IS a bug, please fix your broken init.d"
241 unset -f exit
242 exit "$@"
243 }
244 # Stop einfo/ebegin/eend from working as parallel messes us up
245 [[ ${RC_PARALLEL_STARTUP} == "yes" ]] && RC_QUIET_STDOUT="yes"
246 stop
247 )
248 retval="$?"
249
250 # If a service has been marked inactive, exit now as something
251 # may attempt to start it again later
252 if [[ ${retval} == "0" ]] && service_inactive "${SVCNAME}" ; then
253 svcinactive=0
254 return 0
255 fi
256 fi
257
258 if [[ ${retval} != 0 ]] ; then
259 # Did we fail to stop? create symlink to stop multible attempts at
260 # runlevel change. Note this is only used at runlevel change ...
261 is_runlevel_stop && mark_service_failed "${SVCNAME}"
262
263 # If we are halting the system, do it as cleanly as possible
264 if [[ ${SOFTLEVEL} == "reboot" || ${SOFTLEVEL} == "shutdown" ]] ; then
265 mark_service_stopped "${SVCNAME}"
266 else
267 if [[ ${svcinactive} == "0" ]] ; then
268 mark_service_inactive "${SVCNAME}"
269 else
270 mark_service_started "${SVCNAME}"
271 fi
272 fi
273
274 service_message "eerror" "ERROR: ${SVCNAME} failed to stop"
275 else
276 svcstarted=1
277 if service_inactive "${SVCNAME}" ; then
278 svcinactive=0
279 else
280 mark_service_stopped "${SVCNAME}"
281 fi
282 service_message "Service ${SVCNAME} stopped"
283 fi
284
285 # Reset the trap
286 svc_trap
287
288 return "${retval}"
289 }
290
291 svc_start() {
292 local x= y= retval=0 startfail= startinactive=
293
294 # Do not try to start if i have done so already on runlevel change
295 if is_runlevel_start && service_failed "${SVCNAME}" ; then
296 return 1
297 elif service_started "${SVCNAME}" ; then
298 ewarn "WARNING: ${SVCNAME} has already been started."
299 return 0
300 elif service_inactive "${SVCNAME}" ; then
301 if [[ ${IN_BACKGROUND} != "true" ]] ; then
302 ewarn "WARNING: ${SVCNAME} has already been started."
303 return 0
304 fi
305 fi
306
307 if ! mark_service_starting "${SVCNAME}" ; then
308 if service_stopping "${SVCNAME}" ; then
309 eerror "ERROR: ${SVCNAME} is already stopping."
310 else
311 eerror "ERROR: ${SVCNAME} is already starting."
312 fi
313 return 1
314 fi
315
316 # Ensure that we clean up if we abort for any reason
317 trap "svc_quit" INT QUIT TSTP
318
319 service_message "Service ${SVCNAME} starting"
320
321 if broken "${SVCNAME}" ; then
322 eerror "ERROR: Some services needed are missing. Run"
323 eerror " './${SVCNAME} broken' for a list of those"
324 eerror " services. ${SVCNAME} was not started."
325 retval=1
326 fi
327
328 # Save the IN_BACKGROUND var as we need to clear it for starting depends
329 local ib_save="${IN_BACKGROUND}"
330 unset IN_BACKGROUND
331
332 if [[ ${retval} == "0" && ${RC_NO_DEPS} != "yes" ]] ; then
333 local startupservices="$(ineed "${SVCNAME}") $(valid_iuse "${SVCNAME}")"
334 local netservices=
335 for x in $(dolisting "/etc/runlevels/${BOOTLEVEL}/net.*") \
336 $(dolisting "/etc/runlevels/${mylevel}/net.*") ; do
337 netservices="${netservices} ${x##*/}"
338 done
339
340 # Start dependencies, if any.
341 if ! is_runlevel_start ; then
342 for x in ${startupservices} ; do
343 if [[ ${x} == "net" ]] && ! net_service "${SVCNAME}" \
344 && ! is_net_up ; then
345 for y in ${netservices} ; do
346 service_stopped "${y}" && start_service "${y}"
347 done
348 elif [[ ${x} != "net" ]] ; then
349 if service_stopped "${x}" ; then
350 start_service "${x}"
351 fi
352 fi
353 done
354 fi
355
356 # We also wait for any services we're after to finish incase they
357 # have a "before" dep but we don't dep on them.
358 if is_runlevel_start ; then
359 startupservices="${startupservices} $(valid_iafter "${SVCNAME}")"
360 if net_service "${SVCNAME}" ; then
361 startupservices="${startupservices} $(valid_iafter "net")"
362 fi
363 fi
364
365 if [[ " ${startupservices} " == *" net "* ]] ; then
366 startupservices=" ${startupservices} "
367 startupservices="${startupservices/ net / ${netservices} }"
368 startupservices="${startupservices// net /}"
369 fi
370
371 # Wait for dependencies to finish.
372 for x in ${startupservices} ; do
373 service_started "${x}" && continue
374 wait_service "${x}"
375 if ! service_started "${x}" ; then
376 # A 'need' dependency is critical for startup
377 if ineed -t "${SVCNAME}" "${x}" >/dev/null \
378 || net_service "${x}" && ineed -t "${SVCNAME}" net \
379 && ! is_net_up ; then
380 if service_inactive "${x}" || service_wasinactive "${x}" || \
381 [[ -n $(ls "${svcdir}"/scheduled/*/"${x}" 2>/dev/null) ]] ; then
382 if svc_schedule_start "${x}" "${SVCNAME}" ; then
383 [[ -n ${startinactive} ]] && startinactive="${startinactive}, "
384 startinactive="${startinactive}${x}"
385 fi
386 else
387 startfail="${x}"
388 break
389 fi
390 fi
391 fi
392 done
393
394 if [[ -n ${startfail} ]] ; then
395 eerror "ERROR: Problem starting needed service ${startfail}"
396 eerror " ${SVCNAME} was not started."
397 retval=1
398 elif [[ -n ${startinactive} ]] ; then
399 # Change the last , to or for correct grammar.
400 x="${startinactive##*, }"
401 startinactive="${startinactive/%, ${x}/ or ${x}}"
402 ewarn "WARNING: ${SVCNAME} is scheduled to start when ${startinactive} has started."
403 retval=1
404 fi
405 fi
406
407 if [[ ${retval} == "0" ]] ; then
408 IN_BACKGROUND="${ib_save}"
409 (
410 exit() {
411 RC_QUIET_STDOUT="no"
412 eerror "DO NOT USE EXIT IN INIT.D SCRIPTS"
413 eerror "This IS a bug, please fix your broken init.d"
414 unset -f exit
415 exit "$@"
416 }
417
418 # Apply any ulimits if defined
419 [[ -n ${RC_ULIMIT} ]] && ulimit ${RC_ULIMIT}
420
421 # Stop einfo/ebegin/eend from working as parallel messes us up
422 [[ ${RC_PARALLEL_STARTUP} == "yes" ]] && RC_QUIET_STDOUT="yes"
423
424 start
425 )
426 retval="$?"
427
428 # If a service has been marked inactive, exit now as something
429 # may attempt to start it again later
430 if [[ ${retval} == "0" ]] && service_inactive "${SVCNAME}" ; then
431 svcinactive=0
432 service_message "ewarn" "WARNING: ${SVCNAME} has started but is inactive"
433 return 1
434 fi
435 fi
436
437 if [[ ${retval} != "0" ]] ; then
438 if [[ ${svcinactive} == "0" ]] ; then
439 mark_service_inactive "${SVCNAME}"
440 else
441 mark_service_stopped "${SVCNAME}"
442 fi
443
444 if [[ -z ${startinactive} ]] ; then
445 is_runlevel_start && mark_service_failed "${SVCNAME}"
446 service_message "eerror" "ERROR: ${SVCNAME} failed to start"
447 fi
448 else
449 svcstarted=0
450 mark_service_started "${SVCNAME}"
451 service_message "Service ${SVCNAME} started"
452 fi
453
454 # Reset the trap
455 svc_trap
456
457 return "${retval}"
458 }
459
460 svc_restart() {
461 if ! service_stopped "${SVCNAME}" ; then
462 svc_stop || return "$?"
463 fi
464 svc_start
465 }
466
467 svc_status() {
468 # The basic idea here is to have some sort of consistent
469 # output in the status() function which scripts can use
470 # as an generic means to detect status. Any other output
471 # should thus be formatted in the custom status() function
472 # to work with the printed " * status: foo".
473 local efunc="" state=""
474
475 # If we are effectively root, check to see if required daemons are running
476 # and update our status accordingly
477 [[ ${EUID} == 0 ]] && update_service_status "${SVCNAME}"
478
479 if service_stopping "${SVCNAME}" ; then
480 efunc="eerror"
481 state="stopping"
482 elif service_starting "${SVCNAME}" ; then
483 efunc="einfo"
484 state="starting"
485 elif service_inactive "${SVCNAME}" ; then
486 efunc="ewarn"
487 state="inactive"
488 elif service_started "${SVCNAME}" ; then
489 efunc="einfo"
490 state="started"
491 else
492 efunc="eerror"
493 state="stopped"
494 fi
495 [[ ${RC_QUIET_STDOUT} != "yes" ]] \
496 && ${efunc} "status: ${state}"
497
498 status
499 # Return 0 if started, otherwise 1
500 [[ ${state} == "started" ]]
501 }
502
503 rcscript_errors="$(bash -n "${myscript}" 2>&1)" || {
504 [[ -n ${rcscript_errors} ]] && echo "${rcscript_errors}" >&2
505 eerror "ERROR: ${myscript} has syntax errors in it; aborting ..."
506 exit 1
507 }
508
509 # set *after* wrap_rcscript, else we get duplicates.
510 opts="start stop restart"
511
512 source "${myscript}"
513
514 # make sure whe have valid $opts
515 if [[ -z ${opts} ]] ; then
516 opts="start stop restart"
517 fi
518
519 svc_homegrown() {
520 local x arg="$1"
521 shift
522
523 # Walk through the list of available options, looking for the
524 # requested one.
525 for x in ${opts} ; do
526 if [[ ${x} == "${arg}" ]] ; then
527 if typeset -F "${x}" &>/dev/null ; then
528 # Run the homegrown function
529 "${x}"
530
531 return $?
532 fi
533 fi
534 done
535 x=""
536
537 # If we're here, then the function wasn't in $opts.
538 [[ -n $* ]] && x="/ $* "
539 eerror "ERROR: wrong args ( "${arg}" ${x})"
540 # Do not quote this either ...
541 usage ${opts}
542 exit 1
543 }
544
545 shift
546 if [[ $# -lt 1 ]] ; then
547 eerror "ERROR: not enough args."
548 usage ${opts}
549 exit 1
550 fi
551 for arg in $* ; do
552 case "${arg}" in
553 --quiet)
554 RC_QUIET="yes"
555 RC_QUIET_STDOUT="yes"
556 ;;
557 # We check this in functions.sh ...
558 # --nocolor)
559 # RC_NOCOLOR="yes"
560 # ;;
561 --nodeps)
562 RC_NO_DEPS="yes"
563 ;;
564 --verbose)
565 RC_VERBOSE="yes"
566 ;;
567 esac
568 done
569
570 retval=0
571 for arg in $* ; do
572 case "${arg}" in
573 stop)
574 if [[ -e "${svcdir}/scheduled/${SVCNAME}" ]] ; then
575 rm -Rf "${svcdir}/scheduled/${SVCNAME}"
576 fi
577
578 # Stoped from the background - treat this as a restart so that
579 # stopped services come back up again when started.
580 if [[ ${IN_BACKGROUND} == "true" ]] ; then
581 rm -rf "${svcdir}/snapshot/$$"
582 mkdir -p "${svcdir}/snapshot/$$"
583 cp -pP "${svcdir}"/started/* "${svcdir}/snapshot/$$/"
584 rm -f "${svcdir}/snapshot/$$/${SVCNAME}"
585 fi
586
587 svc_stop
588 retval="$?"
589
590 if [[ ${IN_BACKGROUND} == "true" ]] ; then
591 for x in $(dolisting "${svcdir}/snapshot/$$/") ; do
592 if service_stopped "${x##*/}" ; then
593 svc_schedule_start "${SVCNAME}" "${x##*/}"
594 fi
595 done
596 else
597 rm -f "${svcdir}"/scheduled/*/"${SVCNAME}"
598 fi
599
600 ;;
601 start)
602 svc_start
603 retval="$?"
604 service_started "${SVCNAME}" && svc_start_scheduled
605 ;;
606 needsme|ineed|usesme|iuse|broken)
607 trace_dependencies "-${arg}"
608 ;;
609 status)
610 svc_status
611 retval="$?"
612 ;;
613 zap)
614 einfo "Manually resetting ${SVCNAME} to stopped state."
615 mark_service_stopped "${SVCNAME}"
616 ;;
617 restart)
618 svcrestart="yes"
619
620 # We don't kill child processes if we're restarting
621 # This is especically important for sshd ....
622 RC_KILL_CHILDREN="no"
623
624 # Create a snapshot of started services
625 rm -rf "${svcdir}/snapshot/$$"
626 mkdir -p "${svcdir}/snapshot/$$"
627 cp -pP "${svcdir}"/started/* "${svcdir}/snapshot/$$/"
628 rm -f "${svcdir}/snapshot/$$/${SVCNAME}"
629
630 # Simple way to try and detect if the service use svc_{start,stop}
631 # to restart if it have a custom restart() funtion.
632 if [[ -n $(egrep '^[[:space:]]*restart[[:space:]]*()' "/etc/init.d/${SVCNAME}") ]] ; then
633 if [[ -z $(egrep 'svc_stop' "/etc/init.d/${SVCNAME}") || \
634 -z $(egrep 'svc_start' "/etc/init.d/${SVCNAME}") ]] ; then
635 echo
636 ewarn "Please use 'svc_stop; svc_start' and not 'stop; start' to"
637 ewarn "restart the service in its custom 'restart()' function."
638 ewarn "Run ${SVCNAME} without arguments for more info."
639 echo
640 svc_restart
641 else
642 restart
643 fi
644 else
645 restart
646 fi
647 retval="$?"
648
649 [[ -e "${svcdir}/scheduled/${SVCNAME}" ]] \
650 && rm -Rf "${svcdir}/scheduled/${SVCNAME}"
651
652 # Restart dependencies as well
653 for x in $(dolisting "${svcdir}/snapshot/$$/") ; do
654 if service_stopped "${x##*/}" ; then
655 if service_inactive "${SVCNAME}" \
656 || service_wasinactive "${SVCNAME}" ; then
657 svc_schedule_start "${SVCNAME}" "${x##*/}"
658 ewarn "WARNING: ${x##*/} is scheduled to start when ${SVCNAME} has started."
659 elif service_started "${SVCNAME}" ; then
660 start_service "${x##*/}"
661 fi
662 fi
663 done
664 rm -rf "${svcdir}/snapshot/$$"
665
666 service_started "${SVCNAME}" && svc_start_scheduled
667
668 # Wait for services to come up
669 [[ ${RC_PARALLEL_STARTUP} == "yes" ]] && wait
670
671 svcrestart="no"
672 ;;
673 pause)
674 svcpause="yes"
675 svc_stop
676 retval="$?"
677 svcpause="no"
678 ;;
679 --quiet|--nocolor|--nodeps)
680 ;;
681 help)
682 exec "${svclib}"/sh/rc-help.sh "${myscript}" help
683 ;;
684 *)
685 # Allow for homegrown functions
686 svc_homegrown ${arg}
687 retval="$?"
688 ;;
689 esac
690 done
691
692 exit "${retval}"
693
694 # vim:ts=4

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.20