rc.subr revision 1.47
1#	$OpenBSD: rc.subr,v 1.47 2011/09/22 08:15:01 ajacoutot Exp $
2#
3# Copyright (c) 2010, 2011 Antoine Jacoutot <ajacoutot@openbsd.org>
4# Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
5# Copyright (c) 2010, 2011 Robert Nagy <robert@openbsd.org>
6#
7# Permission to use, copy, modify, and distribute this software for any
8# purpose with or without fee is hereby granted, provided that the above
9# copyright notice and this permission notice appear in all copies.
10#
11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
19
20# Default functions and variables used by rc.d(8) scripts.
21
22rc_err() {
23	echo $1 1>&2
24	exit 1
25}
26
27rc_usage() {
28	rc_err "usage: $0 [-df] {start|check|reload|restart|stop}"
29}
30
31rc_start() {
32	${rcexec} "${daemon} ${daemon_flags} ${_bg}"
33}
34
35rc_check() {
36	pkill -0 -f "^${pexp}"
37}
38
39rc_reload() {
40	pkill -HUP -f "^${pexp}"
41}
42
43rc_stop() {
44	pkill -f "^${pexp}"
45}
46
47rc_do() {
48	if [ -n "${RC_DEBUG}" ]; then
49		echo "doing $@" && "$@"
50	else
51		"$@" >/dev/null 2>&1
52	fi
53}
54
55rc_exit() {
56	[ -z "${INRC}" -o X"$1" != X"ok" ] && _pfix="($1)"
57	echo ${INRC:+'-n'} "${_pfix}"
58	[ X"$1" = X"ok" ] && exit 0 || exit 1
59}
60
61rc_wait() {
62	i=0
63	[ -n "$2" ] && w=$2 || w=30
64	while [ $i -lt $w ]; do
65		case "$1" in
66			reload|start)
67				rc_do rc_check && return 0
68				;;
69			stop)
70				rc_do rc_check || return 0
71				;;
72			*)
73				break
74				;;
75		esac
76		sleep 1
77		i=$((i+1))
78	done
79	return 1
80}
81
82rc_cmd() {
83	[ $(id -u) -eq 0 ] || \
84		rc_err "$0: need root privileges"
85
86	[ -z "${RC_FORCE}" ] && [ X"${daemon_flags}" = X"NO" ] && exit 1
87
88	eval _enotsup=\${rc_${1}}
89	[ X"${_enotsup}" != X"NO" ] || rc_err "$0: $1 is not supported"
90
91	[ X"${rc_bg}" = X"YES" ] && local _bg="&"
92	[ -n "${RC_DEBUG}" ] || local _n="-n"
93
94	case "$1" in
95	check)
96		rc_do rc_check
97		;;
98	start)
99		[ -z "${INRC}" ] && rc_do rc_check && exit 0
100		echo $_n "${INRC:+ }${_name}"
101		while true; do  # no real loop, only needed to break
102			if type rc_pre >/dev/null; then
103				rc_do rc_pre || break
104			fi
105			rc_do rc_start || break
106			if [ -n "${_bg}" ]; then
107				sleep 1
108				rc_do rc_wait start || break
109			fi
110			rc_exit ok
111		done
112		# handle failure
113		type rc_post >/dev/null && rc_do rc_post
114		rc_exit failed
115		;;
116	stop)
117		rc_do rc_check || exit 0
118		echo $_n "${INRC:+ }${_name}"
119		rc_do rc_stop || rc_exit failed
120		rc_do rc_wait stop || rc_exit failed
121		if type rc_post >/dev/null; then \
122			rc_do rc_post || rc_exit failed
123		fi
124		rc_exit ok
125		;;
126	reload)
127		rc_do rc_check || exit 0
128		echo $_n "${INRC:+ }${_name}"
129		rc_do rc_reload || rc_exit failed
130		rc_do rc_wait reload || rc_exit failed
131		rc_exit ok
132		;;
133	restart)
134		/etc/rc.d/${_name} stop && /etc/rc.d/${_name} start
135		;;
136	*)
137		rc_usage
138		;;
139	esac
140}
141
142[ -z "${local_rcconf}" ] && . /etc/rc.conf
143
144[ -n "${daemon}" ] || rc_err "$0: daemon is not set"
145
146unset RC_DEBUG RC_FORCE
147while getopts "df" c; do
148	case "$c" in
149		d) RC_DEBUG=1;;
150		f) RC_FORCE=1;;
151		*) rc_usage;;
152	esac
153done
154shift $((OPTIND-1))
155
156_name=$(basename $0)
157eval _rcflags=\${${_name}_flags}
158eval _rcuser=\${${_name}_user}
159
160getcap -f /etc/login.conf ${_name} 1>/dev/null 2>&1 && \
161	daemon_class=${_name}
162
163[ -z "${daemon_class}" ] && daemon_class=daemon
164[ -z "${daemon_user}"  ] && daemon_user=root
165
166[ -n "${RC_FORCE}" ] && [ X"${_rcflags}" = X"NO" ] && unset _rcflags
167[ -n "${_rcflags}" ] && daemon_flags=${_rcflags}
168[ -n "${_rcuser}"  ] && daemon_user=${_rcuser}
169
170daemon_flags=$(printf ' %s' ${daemon_flags})
171daemon_flags=${daemon_flags## }
172pexp="${daemon}${daemon_flags:+ ${daemon_flags}}"
173rcexec="su -l -c ${daemon_class} -s /bin/sh ${daemon_user} -c"
174