Compare commits

...

30 Commits

Author SHA1 Message Date
Roy Marples
52711bdca7 Release openrc-0.2.3 2008-04-28 18:39:51 +00:00
Roy Marples
53902cefb8 Add rc_program function which uses fork and signal masking to try and resolve the waitpid issue, Gentoo #219179. 2008-04-28 16:04:16 +00:00
Roy Marples
75f991068d Fix multi platform a little. 2008-04-28 12:48:20 +00:00
Roy Marples
e499e58310 Don't re-start or re-stop failed services if runlevel is changing. 2008-04-27 21:04:37 +00:00
Roy Marples
b08b6cd91b Always define template start/stop functions so that the real script name isn't hidden when errors are in the real start/stop functions, Gentoo #219179 2008-04-26 19:32:28 +00:00
Roy Marples
3c2b93fc9c Check we have a list before running depends. 2008-04-26 14:59:07 +00:00
Roy Marples
b5d829789f Check we have a list before running depends. 2008-04-26 14:57:39 +00:00
Roy Marples
1e3442f95d Work with aliases on NetBSD. 2008-04-23 13:17:13 +00:00
Roy Marples
2bda1871a1 When fsck_passno is set, show this so output is clearer when fsck is multiplexed, Gentoo #218141. 2008-04-22 13:46:53 +00:00
Roy Marples
d3b111bd58 Our init scripts normally output context in [ .. ] 2008-04-22 08:12:26 +00:00
Roy Marples
dbea63b76d Fix logic for templates. 2008-04-21 21:34:52 +00:00
Roy Marples
6a5287dbb5 Typo 2008-04-21 19:26:56 +00:00
Roy Marples
df8eeba2fb Punt is_function in favour of POSIX shell builtin command, thanks to Harald van Dijk for the idea. 2008-04-21 17:32:17 +00:00
Roy Marples
54fce42c6f Merge branch 'master' of git@git.overlays.gentoo.org:proj/openrc 2008-04-21 13:07:04 +00:00
Roy Marples
54d7aa39dd If we don't have permission to inspect the pidfile, don't report crashed. Gentoo #218028. 2008-04-21 10:56:28 +00:00
Roy Marples
dc5d63aa97 Add RC_TMPDIR so that there's a writeable location during boot. 2008-04-21 10:29:29 +00:00
Roy Marples
bab5d7767d Merge branch 'master' of git@git.overlays.gentoo.org:proj/openrc 2008-04-21 10:26:40 +00:00
Roy Marples
799686e40d Fix force_preferred, #60. 2008-04-20 14:24:35 +00:00
Roy Marples
d83ae59cca Add help for mountargs, #63 2008-04-19 17:19:59 +00:00
Mike Frysinger
18b4108755 add support for parsing newer ifconfig output
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2008-04-19 07:22:30 +00:00
Roy Marples
e96347523f We should check type output to ensure that we're really calling a shell function and not some badly named binary like stop from boinc, Gentoo #218063. 2008-04-18 23:00:43 +00:00
Roy Marples
f0aacec02e Cast to unsigned char for ctype calls. 2008-04-17 10:19:58 +00:00
Roy Marples
57e1dd7389 Fix rc-status some more. 2008-04-17 00:25:08 +00:00
Roy Marples
c89b3763fb Respect shutdown -F on Linux to force fsck, #59 2008-04-17 00:09:34 +00:00
Roy Marples
425abe40c5 Only report unassigned services when there are any, Gentoo #218005. 2008-04-16 19:47:19 +00:00
Roy Marples
725b9dc89c Use qlen instead of txqueuelen so we work with busybox iproute2, Gentoo #217948 2008-04-16 15:23:57 +00:00
Roy Marples
22d650c450 Merge branch 'master' of git@git.overlays.gentoo.org:proj/openrc 2008-04-16 15:02:19 +00:00
Roy Marples
809ac86c69 We should only check dependencies in files. 2008-04-16 15:01:52 +00:00
Roy Marples
b3310e8e10 Fix rebooting for OpenVZ systems. 2008-04-15 21:50:08 +00:00
Roy Marples
29369c44c1 Add help text for rc-service --resole. 2008-04-15 16:16:59 +00:00
28 changed files with 227 additions and 203 deletions

View File

@@ -3,7 +3,7 @@
# All rights reserved. Released under the 2-clause BSD license.
NAME= openrc
VERSION= 0.2.2
VERSION= 0.2.3
PKG= ${NAME}-${VERSION}
SUBDIR= conf.d doc etc init.d man net sh src

View File

@@ -3,5 +3,8 @@ SRCS= avahi-dnsconfd.in avahid.in dbus.in hald.in named.in ntpd.in \
openvpn.in polkitd.in sshd.in
MK= ../mk
SED_EXTRA+= -e 's:@VARBASE@:/var:g'
include ${MK}/scripts.mk
include Makefile.${OS}

View File

@@ -3,7 +3,7 @@
# All rights reserved. Released under the 2-clause BSD license.
command=@PKG_PREFIX@/bin/dbus-daemon
pidfile=@VARBASE@/run/dbus/dbus.pid
pidfile=@VARBASE@/run/dbus/pid
command_args="${dbusd_args---system}"
name="Message Bus Daemon"

View File

@@ -4,12 +4,22 @@
command=/usr/sbin/named
command_args=${named_args}
pidfile=@VARBASE@/run/named/pid
pidfile=@VARBASE@/run/named.pid
name="Domain Name server"
extra_started_commands="reload"
namedb=/etc/namedb
named_uid=${named_uid:-bind}
uid=named
case "${RC_UNAME}" in
FreeBSD)
uid=bind
pidfile=@VARBASE@/run/named/pid
;;
Linux)
uid=bind
;;
esac
named_uid=${named_uid:-${uid}}
depend()
{

View File

@@ -27,14 +27,21 @@ _reboot() {
start()
{
local reboot_opts= fsck_opts= p=
local reboot_opts= fsck_opts= p= check_extra=
if [ -e /fastboot ]; then
ewarn "Skipping fsck due to /fastboot"
return 0
fi
if [ -e /forcefsck ]; then
fsck_opts="${fsck_opts} -f"
check_extra="(check forced)"
fi
ebegin "Checking local filesystems"
if [ -n "${fsck_passno}" ]; then
check_extra="[passno ${fsck_passno}] ${check_extra}"
fi
ebegin "Checking local filesystems ${check_extra}"
for p in ${fsck_passno}; do
local IFS="${_IFS}"
case "${p}" in
@@ -45,7 +52,7 @@ start()
done
if [ "${RC_UNAME}" = "Linux" ]; then
fsck_opts="-C0 -T"
fsck_opts="${fsck_opts} -C0 -T"
if [ -z "${fsck_passno}" ]; then
fsck_args=${fsck_args--A -p}
if echo 2>/dev/null >/.test.$$; then

View File

@@ -28,6 +28,7 @@ sync; sync
# 1) we don't need (and by default can't) umount anything (VServer) or
# 2) the host utils take care of all umounting stuff (OpenVZ)
if [ "${RC_SYS}" = "VSERVER" -o "${RC_SYS}" = "OPENVZ" ]; then
[ "${RC_SYS}" = "OPENVZ" -a "$1" = "reboot" ] && echo "" > /reboot
if [ -e @SYSCONFDIR@/init.d/"$1".sh ]; then
. @SYSCONFDIR@/init.d/"$1".sh
else

View File

@@ -26,7 +26,7 @@ start()
local usbfs=$(grep -Fow usbfs /proc/filesystems ||
grep -Fow usbdevfs /proc/filesystems)
if [ -n "${usbfs}" ]; then
ebegin "Mounting USB device filesystem (${usbfs})"
ebegin "Mounting USB device filesystem [${usbfs}]"
local usbgid="$(getent group usb | \
sed -e 's/.*:.*:\(.*\):.*/\1/')"
mount -t ${usbfs} \

View File

@@ -13,7 +13,7 @@ depend()
start()
{
if echo 2>/dev/null >/.test.$$; then
rm -f /.test.$$ /fastboot
rm -f /.test.$$ /fastboot /forcefsck
return 0
fi
@@ -22,6 +22,7 @@ start()
Linux) mount -n -o remount,rw /;;
*) mount -u -o rw /;;
esac
eend $? "Root filesystem could not be mounted read/write"
rm -f /fastboot
if eend $? "Root filesystem could not be mounted read/write"; then
rm -f /fastboot /forcefsck
fi
}

View File

@@ -151,9 +151,12 @@ _delete_addresses()
{
einfo "Removing addresses"
eindent
LC_ALL=C ifconfig "${IFACE}" | while read inet address rest; do
LC_ALL=C ifconfig "${IFACE}" | while read inet address ali rest; do
case "${inet}" in
inet|inet6)
if [ "${address}" = "alias" ]; then
address="${ali}"
fi
case "${address}" in
*"%${IFACE}"|::1) continue;;
127.0.0.1) [ "${IFACE}" = "lo0" ] && continue;;

View File

@@ -56,7 +56,7 @@ _set_flag()
_get_mac_address()
{
local mac=$(LC_ALL=C ifconfig "${IFACE}" | \
sed -n -e 's/.* HWaddr \(..:..:..:..:..:..\).*/\1/p')
sed -n -e 's/.* \(HWaddr\|ether\) \(..:..:..:..:..:..\).*/\2/p')
case "${mac}" in
00:00:00:00:00:00);;
@@ -77,7 +77,7 @@ _set_mac_address()
_get_inet_address()
{
set -- $(LC_ALL=C ifconfig "${IFACE}" |
sed -n -e 's/.*inet addr:\([^ ]*\).*Mask:\([^ ]*\).*/\1 \2/p')
sed -n -e 's/.*\(inet addr:\|inet \)\([^ ]*\).*\(Mask:\|netmask \)\([^ ]*\).*/\2 \4/p')
[ -z "$1" ] && return 1
echo -n "$1"
@@ -145,7 +145,7 @@ _add_address()
# IPv4 is tricky - ifconfig requires an aliased device
# for multiple addresses
local iface="${IFACE}"
if LC_ALL=C ifconfig "${iface}" | grep -Eq "\<inet addr:.*"; then
if LC_ALL=C ifconfig "${iface}" | grep -Eq '\<inet (addr:)?.*'; then
# Get the last alias made for the interface and add 1 to it
i=$(ifconfig | sed '1!G;h;$!d' | grep -m 1 -o "^${iface}:[0-9]*" \
| sed -n -e 's/'"${iface}"'://p')
@@ -234,7 +234,7 @@ _delete_addresses()
# Remove IPv6 addresses
local addr=
for addr in $(LC_ALL=C ifconfig "${IFACE}" | \
sed -n -e 's/^.*inet6 addr: \([^ ]*\) Scope:[^L].*/\1/p'); do
sed -n -e 's/^.*\(inet6 addr:\|inet6\) \([^ ]*\) .*\(Scope:[^L]\|scopeid [^<]*<[^l]\).*/\2/p'); do
[ "${addr}" = "::1/128" -a "${IFACE}" = "lo" ] && continue
einfo "${addr}"
ifconfig "${IFACE}" inet6 del "${addr}"

View File

@@ -189,7 +189,7 @@ iproute2_pre_start()
# TX Queue Length support
local len=
eval len=\$txqueuelen_${IFVAR}
[ -n "${len}" ] && ip link set txqueuelen "${len}" dev "${IFACE}"
[ -n "${len}" ] && ip link set qlen "${len}" dev "${IFACE}"
local tunnel=
eval tunnel=\$iptunnel_${IFVAR}

View File

@@ -414,8 +414,9 @@ iwconfig_connect_preferred()
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
[ $# = 0 ] && return 1
local ssid= i=0 mode= mac= caps= freq= chan=
local ssid= i= mode= mac= caps= freq= chan=
for ssid; do
i=0
while [ ${i} -le ${APS} ] ; do
eval e=\$SSID_${i}
if [ "${e}" = "${ssid}" ] ; then
@@ -484,7 +485,7 @@ iwconfig_defaults()
iwconfig_configure()
{
local x APS
local x= APS=-1
eval SSID=\$ssid_${IFVAR}
# Setup ad-hoc mode?

View File

@@ -525,7 +525,7 @@ iwconfig_force_preferred()
i=$((${i} + 1))
done
if ! ${found_AP}; then
SSID=${e}
SSID=${ssid}
iwconfig_associate && return 0
fi
done
@@ -610,7 +610,7 @@ iwconfig_defaults()
iwconfig_configure()
{
local x= APS=
local x= APS=-1
eval SSID=\$ssid_${IFVAR}
# Support old variable

View File

@@ -48,7 +48,7 @@ do
cd "${_dir}"
for RC_SERVICE in *; do
[ -x "${RC_SERVICE}" ] || continue
[ -x "${RC_SERVICE}" -a -f "${RC_SERVICE}" ] || continue
# Only generate dependencies for runscripts
read one two < "${RC_SERVICE}"

View File

@@ -28,7 +28,7 @@ depend()
*) after net.lo net.lo0;;
esac
if type depend_${IFVAR} >/dev/null 2>&1; then
if [ "$(command -v "depend_${IFVAR}")" = "depend_${IFVAR}" ]; then
depend_${IFVAR}
fi
@@ -344,7 +344,7 @@ _load_modules()
# Wrap our provides
local f=
for f in pre_start start post_start; do
eval "${provides}_${f}() { type ${mod}_${f} >/dev/null 2>&1 || return 0; ${mod}_${f} \"\$@\"; }"
eval "${provides}_${f}() { [ "$(command -v "${mod}_${f}")" = "${mod}_${f}" ] || return 0; ${mod}_${f} \"\$@\"; }"
done
eval module_${mod}_provides="${provides}"
@@ -358,7 +358,7 @@ _load_modules()
eval x=\$module_${mod}_provides
[ -z "${x}" ] && continue
for f in pre_start start post_start; do
eval "${x}_${f}() { type ${mod}_${f} >/dev/null 2>&1 || return 0; ${mod}_${f} \"\$@\"; }"
eval "${x}_${f}() { [ "$(command -v "${mod}_${f}")" = "${mod}_${f}" ] || return 0; ${mod}_${f} \"\$@\"; }"
done
eval module_${x}_providedby="${mod}"
;;
@@ -462,7 +462,7 @@ start()
# We up the iface twice if we have a preup to ensure it's up if
# available in preup and afterwards incase the user inadvertently
# brings it down
if type preup >/dev/null 2>&1; then
if [ "$(command -v preup)" = "preup" ]; then
_up 2>/dev/null
ebegin "Running preup"
eindent
@@ -473,7 +473,7 @@ start()
_up 2>/dev/null
for module in ${MODULES}; do
if type "${module}_pre_start" >/dev/null 2>&1; then
if [ "$(command -v "${module}_pre_start")" = "${module}_pre_start" ]; then
${module}_pre_start || exit $?
fi
done
@@ -522,7 +522,7 @@ start()
null) :;;
[0-9]*|*:*) _add_address ${config};;
*)
if type "${config}_start" >/dev/null 2>&1; then
if [ "$(command -v "${config}_start")" = "${config}_start" ]; then
"${config}"_start
else
eerror "nothing provides \`${config}'"
@@ -547,7 +547,7 @@ start()
done
if ! ${oneworked}; then
if type failup >/dev/null 2>&1; then
if [ "$(command -v failup)" = "failup" ]; then
ebegin "Running failup"
eindent
failup
@@ -600,12 +600,12 @@ ${routes}"
fi
for module in ${MODULES}; do
if type "${module}_post_start" >/dev/null 2>&1; then
if [ "$(command -v "${module}_post_start")" = "${module}_post_start" ]; then
${module}_post_start || exit $?
fi
done
if type postup >/dev/null 2>&1; then
if [ "$(command -v postup)" = "postup" ]; then
ebegin "Running postup"
eindent
postup
@@ -628,7 +628,7 @@ stop()
_load_modules false
fi
if type predown >/dev/null 2>&1; then
if [ "$(command -v predown)" = "predown" ]; then
ebegin "Running predown"
eindent
predown || return 1
@@ -641,24 +641,24 @@ stop()
fi
for module in ${MODULES}; do
if type "${module}_pre_stop" >/dev/null 2>&1; then
if [ "$(command -v "${module}_pre_stop")" = "${module}_pre_stop" ]; then
${module}_pre_stop || exit $?
fi
done
for module in ${MODULES}; do
if type "${module}_stop" >/dev/null 2>&1; then
if [ "$(command -v "${module}_stop")" = "${module}_stop" ]; then
${module}_stop
fi
done
# Only delete addresses for non PPP interfaces
if ! type is_ppp >/dev/null 2>&1 || ! is_ppp; then
if ! [ "$(command -v is_ppp)" = "is_ppp" ] || ! is_ppp; then
_delete_addresses "${IFACE}"
fi
for module in ${MODULES}; do
if type "${module}_post_stop" >/dev/null 2>&1; then
if [ "$(command -v "${module}_post_stop")" = "${module}_post_stop" ]; then
${module}_post_stop
fi
done
@@ -669,7 +669,7 @@ stop()
type resolvconf >/dev/null 2>&1 && resolvconf -d "${IFACE}" 2>/dev/null
if type postdown >/dev/null 2>&1; then
if [ "$(command -v "postdown")" = "postdown" ]; then
ebegin "Running postdown"
eindent
postdown

View File

@@ -20,6 +20,7 @@ fi
# So daemons know where to recall us if needed
export RC_SERVICE="$1"
shift
# Compat
export SVCNAME=${RC_SVCNAME}
@@ -44,9 +45,49 @@ describe()
done
}
# Template start / stop functions
start()
{
[ -n "${command}" ] || return 0
local _background=
ebegin "Starting ${name:-${RC_SVCNAME}}"
if yesno "${command_background}"; then
_background="--background --pidfile"
fi
if yesno "${start_inactive}"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
start-stop-daemon --start \
--exec ${command} \
${procname:+--name} ${procname} \
${pidfile:+--pidfile} ${pidfile} \
${_background} ${start_stop_daemon_args} \
-- ${command_args}
eend $? "Failed to start ${RC_SVCNAME}" && return 0
if yesno "${start_inactive}"; then
if ! ${_inactive}; then
mark_service_stopped
fi
fi
return 1
}
stop()
{
[ -n "${command}" -o -n "${procname}" -o -n "${pidfile}" ] || return 0
ebegin "Stopping ${name:-${RC_SVCNAME}}"
start-stop-daemon --stop \
${command:+--exec} ${command} \
${procname:+--name} ${procname} \
${pidfile:+--pidfile} ${pidfile}
eend $? "Failed to stop ${RC_SVCNAME}"
}
yesno ${RC_DEBUG} && set -x
_conf_d=${1%/*}/../conf.d
_conf_d=${RC_SERVICE%/*}/../conf.d
# If we're net.eth0 or openvpn.work then load net or openvpn config
_c=${RC_SVCNAME%%.*}
if [ -n "${_c}" -a "${_c}" != "${RC_SVCNAME}" ]; then
@@ -73,8 +114,7 @@ unset _conf_d
[ -n "${rc_ulimit:-${RC_ULIMIT}}" ] && ulimit ${rc_ulimit:-${RC_ULIMIT}}
# Load our script
. $1
shift
. "${RC_SERVICE}"
for _d in ${required_dirs}; do
if [ ! -d ${_d} ]; then
@@ -92,58 +132,12 @@ for _f in ${required_files}; do
done
unset _f
# If we have a default command then supply a default start function
if [ -n "${command}" ]; then
if ! type start >/dev/null 2>&1; then
start() {
local _background=
ebegin "Starting ${name:-${RC_SVCNAME}}"
if yesno "${command_background}"; then
_background="--background --pidfile"
fi
if yesno "${start_inactive}"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
start-stop-daemon --start \
--exec ${command} \
${procname:+--name} ${procname} \
${pidfile:+--pidfile} ${pidfile} \
${_background} ${start_stop_daemon_args} \
-- ${command_args}
eend $? "Failed to start ${RC_SVCNAME}" && return 0
if yesno "${start_inactive}"; then
if ! ${_inactive}; then
mark_service_stopped
fi
fi
return 1
}
fi
fi
# If we have a default command, procname or pidfile then supply a default stop
# function
if [ -n "${command}" -o -n "${procname}" -o -n "${pidfile}" ]; then
if ! type stop >/dev/null 2>&1; then
stop() {
ebegin "Stopping ${name:-${RC_SVCNAME}}"
start-stop-daemon --stop \
${command:+--exec} ${command} \
${procname:+--name} ${procname} \
${pidfile:+--pidfile} ${pidfile}
eend $? "Failed to stop ${RC_SVCNAME}"
}
fi
fi
while [ -n "$1" ]; do
# See if we have the required function and run it
for _cmd in describe start stop ${extra_commands:-${opts}} \
${extra_started_commands}; do
if [ "${_cmd}" = "$1" ]; then
if type "$1" >/dev/null 2>&1; then
if [ "$(command -v "$1")" = "$1" ]; then
# If we're in the background, we may wish to
# fake some commands. We do this so we can
# "start" ourselves from inactive which then
@@ -168,11 +162,11 @@ while [ -n "$1" ]; do
fi
done
unset _cmd
if type "$1"_pre >/dev/null 2>&1; then
if [ "$(command -v "$1_pre")" = "$1_pre" ]; then
"$1"_pre || exit $?
fi
"$1" || exit $?
if type "$1"_post >/dev/null 2>&1; then
if [ "$(command -v "$1_post")" = "$1_post" ]; then
"$1"_post || exit $?
fi
shift

View File

@@ -561,14 +561,13 @@ bool rc_service_daemons_crashed(const char *service)
if ((fp = fopen(pidfile, "r"))) {
if (fscanf(fp, "%d", &pid) == 1)
retval = false;
fclose (fp);
}
free(pidfile);
pidfile = NULL;
/* We have the pid, so no need to match on name */
free (name);
free(name);
name = NULL;
} else {
if (exec) {

View File

@@ -655,6 +655,7 @@ static const char *const depdirs[] =
RC_SVCDIR "/options",
RC_SVCDIR "/exclusive",
RC_SVCDIR "/scheduled",
RC_SVCDIR "/tmp",
NULL
};
@@ -847,7 +848,7 @@ bool rc_deptree_update(void)
nosys[0] = 'n';
nosys[1] = 'o';
for (i = 0; i < len; i++)
nosys[i + 2] = (char) tolower((int) sys[i]);
nosys[i + 2] = (char)tolower((unsigned char)sys[i]);
nosys[i + 2] = '\0';
STAILQ_FOREACH_SAFE(depinfo, deptree, entries, depinfo_np)

View File

@@ -138,7 +138,8 @@ static const struct option longopts[] = {
};
static const char * const longopts_help[] = {
"Extract the block device",
"Mounts the filesytem from the mountpoint",
"Mounts the filesytem from the mountpoint",
"Show arguments needed to mount the entry",
"Extract the options field",
"Extract or query the pass number field",
"List entries with matching file system type",

View File

@@ -58,7 +58,7 @@ static int syslog_decode(char *name, CODE *codetab)
{
CODE *c;
if (isdigit((int) *name))
if (isdigit((unsigned char)*name))
return atoi(name);
for (c = codetab; c->c_name; c++)
@@ -351,7 +351,7 @@ static int do_shell_var(int argc, char **argv)
putchar(' ');
while (*p) {
c = *p++;
c = (unsigned char)*p++;
if (! isalnum(c))
c = '_';
putchar(c);

View File

@@ -103,7 +103,7 @@ static void write_log(int logfd, const char *buffer, size_t bytes)
continue;
}
if (! in_term || isalpha((int) *p))
if (! in_term || isalpha((unsigned char)*p))
in_escape = in_term = false;
cont:
p++;

View File

@@ -93,8 +93,8 @@ char *rc_conf_value(const char *setting)
TAILQ_FOREACH(s, rc_conf, entries) {
p = s->value;
while (p && *p && *p != '=') {
if (isupper((int) *p))
*p = tolower((int) *p);
if (isupper((unsigned char)*p))
*p = tolower((unsigned char)*p);
p++;
}
}
@@ -224,6 +224,7 @@ void env_config(void)
setenv("RC_LIBDIR", RC_LIBDIR, 1);
setenv("RC_SVCDIR", RC_SVCDIR, 1);
setenv("RC_TMPDIR", RC_SVCDIR "/tmp", 1);
setenv("RC_BOOTLEVEL", RC_LEVEL_BOOT, 1);
e = rc_runlevel_get();
setenv("RC_RUNLEVEL", e, 1);

View File

@@ -122,14 +122,15 @@ int rc_waitpid(pid_t pid)
{
int status = 0;
pid_t savedpid = pid;
int retval = -1;
errno = 0;
while ((pid = waitpid(savedpid, &status, 0)) > 0) {
if (pid == savedpid)
retval = WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE;
}
int retval = EXIT_FAILURE;
do {
pid = waitpid(savedpid, &status, 0);
if (pid == -1 && errno != EINTR)
return EXIT_FAILURE;
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
if (pid == savedpid)
retval = WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE;
return retval;
}

View File

@@ -53,6 +53,7 @@ static const struct option longopts[] = {
static const char * const longopts_help[] = {
"tests if the service exists or not",
"list all available services",
"resolve the service name to an init script",
longopts_help_COMMON
};
#include "_usage.c"

View File

@@ -103,9 +103,13 @@ static void print_service(const char *service)
snprintf(status, sizeof(status), "inactive ");
color = ECOLOR_WARN;
} else if (state & RC_SERVICE_STARTED) {
if (test_crashed && rc_service_daemons_crashed(service))
errno = 0;
if (test_crashed &&
rc_service_daemons_crashed(service) &&
errno != EACCES)
{
snprintf(status, sizeof(status), " crashed ");
else {
} else {
snprintf(status, sizeof(status), " started ");
color = ECOLOR_GOOD;
}
@@ -149,6 +153,8 @@ static void print_services(const char *runlevel, RC_STRINGLIST *services)
l = rc_deptree_depends(deptree, types, services, r ? r : runlevel,
RC_DEP_STRICT | RC_DEP_TRACE | RC_DEP_START);
free(r);
if (!l)
return;
TAILQ_FOREACH(s, l, entries) {
TAILQ_FOREACH(t, services, entries)
if (strcmp(t->value, s->value) == 0)
@@ -185,7 +191,7 @@ static const char * const longopts_help[] = {
int rc_status(int argc, char **argv)
{
RC_STRINGLIST *levels = NULL;
RC_STRINGLIST *services;
RC_STRINGLIST *services = NULL;
RC_STRING *s, *l, *t;
char *p;
int opt;
@@ -256,9 +262,10 @@ int rc_status(int argc, char **argv)
}
/* Show unassigned running too */
if (argc < 2) {
if (argc < 2 &&
(services = rc_services_in_runlevel(NULL)))
{
print_level("UNASSIGNED");
services = rc_services_in_runlevel(NULL);
rc_stringlist_free(levels);
levels = rc_runlevel_list();
TAILQ_FOREACH_SAFE(s, services, entries, t) {

View File

@@ -277,13 +277,53 @@ static void mark_interactive(void)
fclose(fp);
}
static void sulogin(bool cont)
static void run_program(const char *prog)
{
int status = 0;
struct sigaction sa;
sigset_t full;
sigset_t old;
pid_t pid;
/* We need to block signals until we have forked */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_DFL;
sigemptyset(&sa.sa_mask);
sigfillset(&full);
sigprocmask(SIG_SETMASK, &full, &old);
pid = fork();
if (pid == -1)
eerrorx("%s: fork: %s", applet, strerror(errno));
if (pid == 0) {
/* Restore default handlers */
sigaction(SIGCHLD, &sa, NULL);
sigaction(SIGHUP, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGWINCH, &sa, NULL);
/* Unmask signals */
sigprocmask(SIG_SETMASK, &old, NULL);
if (termios_orig)
tcsetattr(fileno(stdin), TCSANOW, termios_orig);
execl(prog, prog, (char *) NULL);
eerror("%s: unable to exec `%s': %s", applet, prog,
strerror(errno));
_exit(EXIT_FAILURE);
}
/* Unmask signals and wait for child */
sigprocmask(SIG_SETMASK, &old, NULL);
if (rc_waitpid(pid) == -1)
eerrorx("%s: failed to exec `%s'", applet, prog);
}
static void sulogin(bool cont)
{
#ifdef __linux__
const char *sys = rc_sys();
@@ -306,47 +346,11 @@ static void sulogin(bool cont)
#endif
}
/* We need to block signals until we have forked */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_DFL;
sigemptyset(&sa.sa_mask);
sigfillset(&full);
sigprocmask(SIG_SETMASK, &full, &old);
pid = vfork();
if (pid == -1)
eerrorx("%s: fork: %s", applet, strerror(errno));
if (pid == 0) {
/* Restore default handlers */
sigaction(SIGCHLD, &sa, NULL);
sigaction(SIGHUP, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGWINCH, &sa, NULL);
/* Unmask signals */
sigprocmask(SIG_SETMASK, &old, NULL);
if (termios_orig)
tcsetattr(fileno(stdin), TCSANOW, termios_orig);
#ifdef __linux__
execl(SULOGIN, SULOGIN, (char *) NULL);
eerror("%s: unable to exec `%s': %s", applet, SULOGIN,
strerror(errno));
run_program(SULOGIN);
#else
execl("/bin/sh", "/bin/sh", (char *) NULL);
eerror("%s: unable to exec `/bin/sh': %s", applet,
strerror(errno));
run_program("/bin/sh");
#endif
_exit(EXIT_FAILURE);
}
/* Unmask signals and wait for child */
sigprocmask(SIG_SETMASK, &old, NULL);
waitpid(pid, &status, 0);
}
static void single_user(void)
@@ -449,7 +453,7 @@ static void handle_signal(int sig)
eerror("waitpid: %s", strerror(errno));
return;
}
} while (! WIFEXITED(status) && ! WIFSIGNALED(status));
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
/* Remove that pid from our list */
if (pid > 0)
@@ -511,31 +515,6 @@ static void handle_signal(int sig)
errno = serrno;
}
static void run_script(const char *script)
{
int status = 0;
pid_t pid = vfork();
pid_t wpid;
if (pid < 0)
eerrorx("%s: vfork: %s", applet, strerror(errno));
else if (pid == 0) {
execl(script, script, (char *) NULL);
eerror("%s: unable to exec `%s': %s",
script, applet, strerror(errno));
_exit(EXIT_FAILURE);
}
do {
wpid = waitpid(pid, &status, 0);
if (wpid < 1)
eerror("waitpid: %s", strerror(errno));
} while (! WIFEXITED(status) && ! WIFSIGNALED(status));
if (! WIFEXITED(status) || ! WEXITSTATUS(status) == 0)
eerrorx("%s: failed to exec `%s'", applet, script);
}
static void do_coldplug(void)
{
size_t l;
@@ -582,7 +561,7 @@ static void do_coldplug(void)
strncmp(d->d_name, "ums", 3) == 0)
{
p = d->d_name + 3;
if (p && isdigit((int) *p)) {
if (p && isdigit((unsigned char)*p)) {
l = strlen("moused.") + strlen(d->d_name) + 1;
service = xmalloc(sizeof(char) * l);
snprintf (service, l, "moused.%s", d->d_name);
@@ -660,7 +639,7 @@ static void do_newlevel(const char *newlevel)
* This should just setup the console to use the correct
* font. Maybe it should setup the keyboard too? */
if (exists(INITEARLYSH))
run_script(INITEARLYSH);
run_program(INITEARLYSH);
uname(&uts);
printf("\n %sOpenRC %s" VERSION "%s is starting up %s",
@@ -688,7 +667,7 @@ static void do_newlevel(const char *newlevel)
setenv("RC_RUNLEVEL", newlevel, 1);
rc_plugin_run(RC_HOOK_RUNLEVEL_START_IN, newlevel);
hook_out = RC_HOOK_RUNLEVEL_START_OUT;
run_script(INITSH);
run_program(INITSH);
#ifdef __linux__
/* If we requested a runlevel, save it now */

View File

@@ -156,7 +156,7 @@ static void handle_signal(int sig)
if (write(signal_pipe[1], &sig, sizeof(sig)) == -1)
eerror("%s: send: %s", service, strerror(errno));
} else
rc_waitpid (-1);
rc_waitpid(-1);
break;
case SIGWINCH:
@@ -559,8 +559,10 @@ static RC_SERVICE svc_status(void)
snprintf(status, sizeof(status), "inactive");
e = &ewarn;
} else if (state & RC_SERVICE_STARTED) {
errno = 0;
if (_rc_can_find_pids() &&
rc_service_daemons_crashed(service))
rc_service_daemons_crashed(service) &&
errno != EACCES)
{
snprintf(status, sizeof(status), "crashed");
e = &eerror;
@@ -738,43 +740,52 @@ static void svc_start(bool deps)
runlevel, depoptions);
if (! rc_runlevel_starting() && use_services)
TAILQ_FOREACH(svc, use_services, entries)
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED) {
TAILQ_FOREACH(svc, use_services, entries) {
state = rc_service_state(svc->value);
/* Don't stop failed services again.
* If you remove this check, ensure that the
* exclusive file isn't created. */
if (state & RC_SERVICE_FAILED &&
rc_runlevel_starting())
continue;
if (state & RC_SERVICE_STOPPED) {
pid_t pid = service_start(svc->value);
if (! rc_conf_yesno("rc_parallel"))
rc_waitpid(pid);
}
}
/* Now wait for them to start */
services = rc_deptree_depends(deptree, types_nua, applet_list,
runlevel, depoptions);
runlevel, depoptions);
if (services) {
/* We use tmplist to hold our scheduled by list */
tmplist = NULL;
TAILQ_FOREACH(svc, services, entries) {
RC_SERVICE svcs = rc_service_state(svc->value);
if (svcs & RC_SERVICE_STARTED)
state = rc_service_state(svc->value);
if (state & RC_SERVICE_STARTED)
continue;
/* Don't wait for services which went inactive but are now in
* starting state which we are after */
if (svcs & RC_SERVICE_STARTING &&
svcs & RC_SERVICE_WASINACTIVE)
if (state & RC_SERVICE_STARTING &&
state & RC_SERVICE_WASINACTIVE)
{
if (!in_list(need_services, svc->value) &&
!in_list(use_services, svc->value))
continue;
}
if (! svc_wait(svc->value))
if (!svc_wait(svc->value))
eerror ("%s: timed out waiting for %s",
applet, svc->value);
if ((svcs = rc_service_state(svc->value)) & RC_SERVICE_STARTED)
applet, svc->value);
state = rc_service_state(svc->value);
if (state & RC_SERVICE_STARTED)
continue;
if (in_list(need_services, svc->value)) {
if (svcs & RC_SERVICE_INACTIVE ||
svcs & RC_SERVICE_WASINACTIVE)
if (state & RC_SERVICE_INACTIVE ||
state & RC_SERVICE_WASINACTIVE)
{
if (! tmplist)
tmplist = rc_stringlist_new();
@@ -937,14 +948,20 @@ static void svc_stop(bool deps)
runlevel, depoptions);
if (services) {
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
RC_SERVICE svcs = rc_service_state(svc->value);
if (svcs & RC_SERVICE_STARTED ||
svcs & RC_SERVICE_INACTIVE)
state = rc_service_state(svc->value);
/* Don't stop failed services again.
* If you remove this check, ensure that the
* exclusive file isn't created. */
if (state & RC_SERVICE_FAILED &&
rc_runlevel_stopping())
continue;
if (state & RC_SERVICE_STARTED ||
state & RC_SERVICE_INACTIVE)
{
svc_wait(svc->value);
svcs = rc_service_state(svc->value);
if (svcs & RC_SERVICE_STARTED ||
svcs & RC_SERVICE_INACTIVE)
state = rc_service_state(svc->value);
if (state & RC_SERVICE_STARTED ||
state & RC_SERVICE_INACTIVE)
{
pid_t pid = service_stop(svc->value);
if (! rc_conf_yesno("rc_parallel"))
@@ -963,8 +980,6 @@ static void svc_stop(bool deps)
TAILQ_FOREACH(svc, tmplist, entries) {
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
continue;
/* We used to loop 3 times here - maybe re-do this if needed */
svc_wait(svc->value);
if (! (rc_service_state(svc->value) & RC_SERVICE_STOPPED)) {
if (rc_runlevel_stopping()) {
@@ -977,7 +992,6 @@ static void svc_stop(bool deps)
continue;
rc_service_mark(service, RC_SERVICE_FAILED);
}
eerrorx("ERROR: cannot stop %s as %s is still up",
applet, svc->value);
}

View File

@@ -190,7 +190,7 @@ static SCHEDULEITEM *parse_schedule_item(const char *string)
item->gotoitem = NULL;
if (strcmp(string,"forever") == 0)
item->type = SC_FOREVER;
else if (isdigit((int) string[0])) {
else if (isdigit((unsigned char)string[0])) {
item->type = SC_TIMEOUT;
errno = 0;
if (sscanf(string, "%d", &item->value) != 1)