Compare commits
40 Commits
openrc-0.2
...
openrc-0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
292fe3a568 | ||
|
|
99d5046a56 | ||
|
|
0e38dcc4d2 | ||
|
|
9176b77c23 | ||
|
|
fad61a7c4b | ||
|
|
0e114abf5d | ||
|
|
bc369085c7 | ||
|
|
6d8b36e09d | ||
|
|
8759735711 | ||
|
|
034b9b7a12 | ||
|
|
e82435c2f4 | ||
|
|
71dd280656 | ||
|
|
594d98eddc | ||
|
|
dcdfdb442f | ||
|
|
143239e143 | ||
|
|
5d38d4d6e9 | ||
|
|
c18c4fc4cc | ||
|
|
5ebe7f1349 | ||
|
|
6a227d0c45 | ||
|
|
403abe73de | ||
|
|
be82e950d7 | ||
|
|
3ca8387966 | ||
|
|
f5a9b42215 | ||
|
|
d370918f0c | ||
|
|
e995404e3b | ||
|
|
caa4704ce6 | ||
|
|
17d28fde42 | ||
|
|
b418f2e471 | ||
|
|
ee4e861796 | ||
|
|
11e33e81c8 | ||
|
|
5e8ed2aeca | ||
|
|
742310744d | ||
|
|
4e9b58b07d | ||
|
|
c564043f86 | ||
|
|
b3d1182a2f | ||
|
|
f6cb321f9f | ||
|
|
f85c6ca84c | ||
|
|
d09f9f47eb | ||
|
|
b271ac5af5 | ||
|
|
fccff6a4ed |
2
Makefile
2
Makefile
@@ -3,7 +3,7 @@
|
|||||||
# All rights reserved. Released under the 2-clause BSD license.
|
# All rights reserved. Released under the 2-clause BSD license.
|
||||||
|
|
||||||
NAME= openrc
|
NAME= openrc
|
||||||
VERSION= 0.2
|
VERSION= 0.2.2
|
||||||
PKG= ${NAME}-${VERSION}
|
PKG= ${NAME}-${VERSION}
|
||||||
|
|
||||||
SUBDIR= conf.d doc etc init.d man net sh src
|
SUBDIR= conf.d doc etc init.d man net sh src
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CONF+= moused powerd rarpd savecore
|
CONF+= moused rarpd savecore
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
SED_EXTRA= -e 's:@TERM@:cons25:g'
|
SED_EXTRA= -e 's:@TERM@:cons25:g'
|
||||||
SRCS+= rc.conf.in rc.in rc.shutdown.in
|
SRCS+= rc.conf.in rc.in rc.shutdown.in
|
||||||
CONF+= devd.conf
|
CONF+= devd.conf
|
||||||
BIN+= rc.devd
|
BIN+= rc rc.shutdown rc.devd
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
SED_EXTRA= -e 's:@TERM@:wsvt25:g'
|
SED_EXTRA= -e 's:@TERM@:wsvt25:g'
|
||||||
SRCS+= rc.conf.in rc.in rc.shutdown.in
|
SRCS+= rc.conf.in rc.in rc.shutdown.in
|
||||||
|
BIN+= rc rc.shutdown
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
SRCS+= hwclock.in consolefont.in keymaps.in modules.in mtab.in numlock.in \
|
SRCS+= hwclock.in consolefont.in keymaps.in modules.in mtab.in numlock.in \
|
||||||
procfs.in
|
procfs.in termencoding.in
|
||||||
|
|
||||||
.SUFFIXES: .Linux.in
|
.SUFFIXES: .Linux.in
|
||||||
.Linux.in:
|
.Linux.in:
|
||||||
|
|||||||
@@ -11,11 +11,20 @@ depend()
|
|||||||
keyword noprefix
|
keyword noprefix
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dir_writeable()
|
||||||
|
{
|
||||||
|
mkdir "$1"/.test.$$ 2>/dev/null && rmdir "$1"/.test.$$
|
||||||
|
}
|
||||||
|
|
||||||
cleanup_tmp_dir()
|
cleanup_tmp_dir()
|
||||||
{
|
{
|
||||||
local dir=$1
|
local dir="$1"
|
||||||
|
|
||||||
mkdir -p "${dir}"
|
if ! [ -d "${dir}" ]; then
|
||||||
|
mkdir -p "${dir}" || return $?
|
||||||
|
fi
|
||||||
|
dir_writeable "${dir}" || return 1
|
||||||
|
chmod +t "${dir}"
|
||||||
cd "${dir}"
|
cd "${dir}"
|
||||||
if yesno ${wipe_tmp:-${WIPE_TMP:-yes}}; then
|
if yesno ${wipe_tmp:-${WIPE_TMP:-yes}}; then
|
||||||
ebegin "Wiping ${dir} directory"
|
ebegin "Wiping ${dir} directory"
|
||||||
@@ -60,12 +69,7 @@ cleanup_tmp_dir()
|
|||||||
|
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
if ! mkdir /.test.$$ 2>/dev/null; then
|
local logw=false
|
||||||
ewarn "Skipping /var and /tmp initialization (ro root?)"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
rmdir /.test.$$
|
|
||||||
|
|
||||||
# Ensure that our basic dirs exist
|
# Ensure that our basic dirs exist
|
||||||
for x in /var/log /var/run /tmp; do
|
for x in /var/log /var/run /tmp; do
|
||||||
if ! [ -d "${x}" ]; then
|
if ! [ -d "${x}" ]; then
|
||||||
@@ -76,51 +80,60 @@ start()
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
ebegin "Creating user login records"
|
if dir_writeable /var/run; then
|
||||||
cp /dev/null /var/run/utmp
|
ebegin "Creating user login records"
|
||||||
[ -e /var/log/wtmp ] || cp /dev/null /var/log/wtmp
|
cp /dev/null /var/run/utmp
|
||||||
chmod 0644 /var/run/utmp /var/log/wtmp
|
if dir_writeable /var/log; then
|
||||||
eend 0
|
logw=true
|
||||||
|
[ -e /var/log/wtmp ] || cp /dev/null /var/log/wtmp
|
||||||
|
chmod 0644 /var/run/utmp /var/log/wtmp
|
||||||
|
fi
|
||||||
|
eend 0
|
||||||
|
|
||||||
ebegin "Cleaning /var/run"
|
ebegin "Cleaning /var/run"
|
||||||
for x in $(find /var/run ! -type d ! -name utmp ! -name random-seed \
|
for x in $(find /var/run ! -type d ! -name utmp \
|
||||||
! -name ld-elf.so.hints ! -name ld.so.hints);
|
! -name random-seed \
|
||||||
do
|
! -name ld-elf.so.hints ! -name ld.so.hints);
|
||||||
[ ! -f "${x}" ] && continue
|
do
|
||||||
# Do not remove pidfiles of already running daemons
|
[ ! -f "${x}" ] && continue
|
||||||
case "${x}" in
|
# Do not remove pidfiles of already running daemons
|
||||||
*.pid)
|
case "${x}" in
|
||||||
start-stop-daemon --test --quiet --stop \
|
*.pid)
|
||||||
--pidfile "${x}"
|
start-stop-daemon --test --quiet \
|
||||||
[ $? -eq 0 ] && continue
|
--stop --pidfile "${x}" && continue
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
rm -f -- "${x}"
|
rm -f -- "${x}"
|
||||||
done
|
done
|
||||||
eend 0
|
eend 0
|
||||||
|
fi
|
||||||
|
|
||||||
# Clean up /tmp directories
|
# Clean up /tmp directories
|
||||||
local tmp=
|
local tmp=
|
||||||
for tmp in ${wipe_tmp_dirs-/tmp}; do
|
for tmp in ${wipe_tmp_dirs-/tmp}; do
|
||||||
cleanup_tmp_dir "${tmp}"
|
cleanup_tmp_dir "${tmp}"
|
||||||
done
|
done
|
||||||
chmod +t /tmp /var/tmp
|
|
||||||
|
|
||||||
# Make sure our X11 stuff have the correct permissions
|
if dir_writeable /tmp; then
|
||||||
# Omit the chown as bootmisc is run before network is up
|
# Make sure our X11 stuff have the correct permissions
|
||||||
# and users may be using lame LDAP auth #139411
|
# Omit the chown as bootmisc is run before network is up
|
||||||
rm -rf /tmp/.ICE-unix /tmp/.X11-unix
|
# and users may be using lame LDAP auth #139411
|
||||||
mkdir -p /tmp/.ICE-unix /tmp/.X11-unix
|
rm -rf /tmp/.ICE-unix /tmp/.X11-unix
|
||||||
chmod 1777 /tmp/.ICE-unix /tmp/.X11-unix
|
mkdir -p /tmp/.ICE-unix /tmp/.X11-unix
|
||||||
[ -x /sbin/restorecon ] && restorecon /tmp/.ICE-unix /tmp/.X11-unix
|
chmod 1777 /tmp/.ICE-unix /tmp/.X11-unix
|
||||||
|
[ -x /sbin/restorecon ] && restorecon /tmp/.ICE-unix /tmp/.X11-unix
|
||||||
|
fi
|
||||||
|
|
||||||
# Create an 'after-boot' dmesg log
|
if ${logw} || dir_writeable /var/log; then
|
||||||
if [ "${RC_SYS}" != "VSERVER" -a "${RC_SYS}" != "OPENVZ" ]; then
|
# Create an 'after-boot' dmesg log
|
||||||
dmesg > /var/log/dmesg
|
if [ "${RC_SYS}" != "VSERVER" -a "${RC_SYS}" != "OPENVZ" ]; then
|
||||||
chmod 640 /var/log/dmesg
|
dmesg > /var/log/dmesg
|
||||||
|
chmod 640 /var/log/dmesg
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f /etc/nologin
|
rm -f /etc/nologin
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
stop()
|
stop()
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ description="Sets a font for the consoles."
|
|||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount termencoding
|
||||||
need keymaps # sets up terminal encoding scheme
|
|
||||||
after hotplug
|
after hotplug
|
||||||
keyword noopenvz noprefix nouml novserver noxenu
|
keyword noopenvz noprefix nouml novserver noxenu
|
||||||
}
|
}
|
||||||
@@ -34,7 +33,7 @@ start()
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local x= param= sf_param= retval=0 ttydev=
|
local x= param= sf_param= retval=0 ttydev=/dev/tty
|
||||||
|
|
||||||
# Get additional parameters
|
# Get additional parameters
|
||||||
if [ -n "${consoletranslation}" ]; then
|
if [ -n "${consoletranslation}" ]; then
|
||||||
@@ -45,11 +44,8 @@ start()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Set the console font
|
# Set the console font
|
||||||
ebegin "Setting user font"
|
ebegin "Setting console font [${consolefont}]"
|
||||||
[ -d /dev/vc ] \
|
[ -d /dev/vc ] && ttydev=/dev/vc/
|
||||||
&& ttydev=/dev/vc/ \
|
|
||||||
|| ttydev=/dev/tty
|
|
||||||
|
|
||||||
x=1
|
x=1
|
||||||
while [ ${x} -le ${ttyn} ]; do
|
while [ ${x} -le ${ttyn} ]; do
|
||||||
setfont ${consolefont} ${param} -C ${ttydev}${x} >/dev/null
|
setfont ${consolefont} ${param} -C ${ttydev}${x} >/dev/null
|
||||||
@@ -61,17 +57,17 @@ start()
|
|||||||
# Store the last font so we can use it ASAP on boot
|
# Store the last font so we can use it ASAP on boot
|
||||||
if [ ${retval} -eq 0 -a -w "${RC_LIBDIR}" ]; then
|
if [ ${retval} -eq 0 -a -w "${RC_LIBDIR}" ]; then
|
||||||
mkdir -p "${RC_LIBDIR}"/console
|
mkdir -p "${RC_LIBDIR}"/console
|
||||||
|
|
||||||
for font in /usr/share/consolefonts/"${consolefont}".*; do
|
for font in /usr/share/consolefonts/"${consolefont}".*; do
|
||||||
:
|
:
|
||||||
done
|
done
|
||||||
cp "${font}" "${RC_LIBDIR}"/console
|
cp "${font}" "${RC_LIBDIR}"/console
|
||||||
echo "${font##*/}" > "${RC_LIBDIR}"/console/font
|
echo "${font##*/}" > "${RC_LIBDIR}"/console/font
|
||||||
if yesno ${unicode:-${UNICODE}}; then
|
if yesno ${unicode:-${UNICODE}}; then
|
||||||
cp /dev/null "${RC_LIBDIR}"/console/unicode
|
echo "" > "${RC_LIBDIR}"/console/unicode
|
||||||
else
|
else
|
||||||
rm -f "${RC_LIBDIR}"/console/unicode
|
rm -f "${RC_LIBDIR}"/console/unicode
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return ${retval}
|
return ${retval}
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ start()
|
|||||||
{
|
{
|
||||||
local reboot_opts= fsck_opts= p=
|
local reboot_opts= fsck_opts= p=
|
||||||
|
|
||||||
|
if [ -e /fastboot ]; then
|
||||||
|
ewarn "Skipping fsck due to /fastboot"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
ebegin "Checking local filesystems"
|
ebegin "Checking local filesystems"
|
||||||
for p in ${fsck_passno}; do
|
for p in ${fsck_passno}; do
|
||||||
local IFS="${_IFS}"
|
local IFS="${_IFS}"
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
|
|||||||
unicode=${unicode:-${UNICODE}}
|
unicode=${unicode:-${UNICODE}}
|
||||||
keymap=${keymap:-${KEYMAP}}
|
keymap=${keymap:-${KEYMAP}}
|
||||||
extended_keymaps=${extended_keymaps:-${EXTENDED_KEYMAPS}}
|
extended_keymaps=${extended_keymaps:-${EXTENDED_KEYMAPS}}
|
||||||
windowskeys=${windowskeys:-${SET_WINDOWSKEYS}}
|
windowkeys=${windowkeys:-${SET_WINDOWSKEYS}}
|
||||||
fix_euro=${fix_euro:-${FIX_EURO}}
|
fix_euro=${fix_euro:-${FIX_EURO}}
|
||||||
dumpkeys_charset=${dumpkeys_charset:-${DUMPKEYS_CHARSET}}
|
dumpkeys_charset=${dumpkeys_charset:-${DUMPKEYS_CHARSET}}
|
||||||
|
|
||||||
depend()
|
depend()
|
||||||
{
|
{
|
||||||
need localmount
|
need localmount termencoding
|
||||||
keyword noopenvz noprefix nouml novserver noxenu
|
keyword noopenvz noprefix nouml novserver noxenu
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,43 +25,41 @@ start()
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local ttydev= n=
|
local ttydev=/dev/tty n=
|
||||||
[ -d /dev/vc ] \
|
[ -d /dev/vc ] && ttydev=/dev/vc/
|
||||||
&& ttydev=/dev/vc/ \
|
|
||||||
|| ttydev=/dev/tty
|
|
||||||
|
|
||||||
# Force linux keycodes for PPC.
|
# Force linux keycodes for PPC.
|
||||||
if [ -f /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes ]; then
|
if [ -f /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes ]; then
|
||||||
echo 1 > /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes
|
echo 1 > /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ebegin "Loading key mappings"
|
ebegin "Loading key mappings [${keymap}]"
|
||||||
local loadkeys_uni= wkeys=
|
local loadkeys_uni= wkeys= kmode="-a" msg="ASCII"
|
||||||
yesno ${unicode} && loadkeys_uni="--unicode"
|
if yesno ${unicode}; then
|
||||||
yesno ${windowskeys} && wkeys="windowkeys"
|
loadkeys_uni="--unicode"
|
||||||
|
kmode="-u"
|
||||||
|
msg="UTF-8"
|
||||||
|
fi
|
||||||
|
yesno ${windowkeys} && wkeys="windowkeys"
|
||||||
loadkeys -q ${loadkeys_uni} ${wkeys} ${keymap} ${extended_keymaps}
|
loadkeys -q ${loadkeys_uni} ${wkeys} ${keymap} ${extended_keymaps}
|
||||||
eend $? "Error loading key mappings" || return $?
|
eend $? "Error loading key mappings" || return $?
|
||||||
|
|
||||||
if yesno ${fix_euro}; then
|
if yesno ${fix_euro}; then
|
||||||
|
ebegin "Fixing font for euro symbol"
|
||||||
# Fix some fonts displaying the Euro, #173528.
|
# Fix some fonts displaying the Euro, #173528.
|
||||||
echo "altgr keycode 18 = U+20AC" | loadkeys -q
|
echo "altgr keycode 18 = U+20AC" | loadkeys -q
|
||||||
|
eend $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set terminal encoding to either ASCII or UNICODE.
|
# Set terminal encoding to either ASCII or UNICODE.
|
||||||
# See utf-8(7) for more information.
|
# See utf-8(7) for more information.
|
||||||
local termencoding="%@" termmsg="ASCII" kmode="-a"
|
ebegin "Setting keyboard mode [${msg}]"
|
||||||
if yesno ${unicode}; then
|
if yesno ${unicode}; then
|
||||||
dumpkeys ${dumpkeys_charset:+-c} \
|
dumpkeys ${dumpkeys_charset:+-c} \
|
||||||
${dumpkeys_charset} | loadkeys --unicode
|
${dumpkeys_charset} | loadkeys --unicode
|
||||||
termencoding="%G"
|
|
||||||
termmsg="UTF-8"
|
|
||||||
kmode="-u"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ebegin "Setting terminal encoding to" ${termmsg}
|
|
||||||
n=1
|
n=1
|
||||||
while [ ${n} -le "${ttyn}" ]; do
|
while [ ${n} -le "${ttyn}" ]; do
|
||||||
printf "\033%s" "${termencoding}" >"${ttydev}${n}"
|
|
||||||
kbd_mode "${kmode}" -C "${ttydev}${n}"
|
kbd_mode "${kmode}" -C "${ttydev}${n}"
|
||||||
n=$((${n} + 1))
|
n=$((${n} + 1))
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ depend()
|
|||||||
{
|
{
|
||||||
# Only have portmap as a dependency if there is a nfs mount in fstab
|
# Only have portmap as a dependency if there is a nfs mount in fstab
|
||||||
# that is set to mount at boot
|
# that is set to mount at boot
|
||||||
local pmap=""
|
local pmap=
|
||||||
if need_portmap; then
|
if need_portmap; then
|
||||||
pmap="${pmap} rpc.statd"
|
pmap="rpc.statd"
|
||||||
[ -x @SYSCONFDIR@/init.d/rpcbind ] \
|
[ -x @SYSCONFDIR@/init.d/rpcbind ] \
|
||||||
&& pmap="rpcbind" \
|
&& pmap="${pmap} rpcbind" \
|
||||||
|| pmap="portmap"
|
|| pmap="${pmap} portmap"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
config /etc/fstab
|
config /etc/fstab
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ depend()
|
|||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
if echo 2>/dev/null >/.test.$$; then
|
if echo 2>/dev/null >/.test.$$; then
|
||||||
rm -f /.test.$$
|
rm -f /.test.$$ /fastboot
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -23,4 +23,5 @@ start()
|
|||||||
*) mount -u -o rw /;;
|
*) mount -u -o rw /;;
|
||||||
esac
|
esac
|
||||||
eend $? "Root filesystem could not be mounted read/write"
|
eend $? "Root filesystem could not be mounted read/write"
|
||||||
|
rm -f /fastboot
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ depend()
|
|||||||
{
|
{
|
||||||
use hostname
|
use hostname
|
||||||
before bootmisc logger
|
before bootmisc logger
|
||||||
keyword noprefix
|
keyword noopenvz noprefix novserver
|
||||||
}
|
}
|
||||||
|
|
||||||
start()
|
start()
|
||||||
|
|||||||
35
init.d/termencoding.in
Normal file
35
init.d/termencoding.in
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#!@PREFIX@/sbin/runscript
|
||||||
|
# Copyright 2008 Roy Marples <roy@marples.name>
|
||||||
|
# All rights reserved. Released under the 2-clause BSD license.
|
||||||
|
|
||||||
|
description="Configures terminal encoding."
|
||||||
|
|
||||||
|
ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
|
||||||
|
unicode=${unicode:-${UNICODE}}
|
||||||
|
|
||||||
|
depend()
|
||||||
|
{
|
||||||
|
keyword noopenvz noprefix nouml novserver noxenu
|
||||||
|
}
|
||||||
|
|
||||||
|
start()
|
||||||
|
{
|
||||||
|
local ttydev=/dev/tty n=
|
||||||
|
[ -d /dev/vc ] && ttydev=/dev/vc/
|
||||||
|
|
||||||
|
# Set terminal encoding to either ASCII or UNICODE.
|
||||||
|
# See utf-8(7) for more information.
|
||||||
|
local termencoding="%@" termmsg="ASCII"
|
||||||
|
if yesno ${unicode}; then
|
||||||
|
termencoding="%G"
|
||||||
|
termmsg="UTF-8"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ebegin "Setting terminal encoding [${termmsg}]"
|
||||||
|
n=1
|
||||||
|
while [ ${n} -le "${ttyn}" ]; do
|
||||||
|
printf "\033%s" "${termencoding}" >"${ttydev}${n}"
|
||||||
|
n=$((${n} + 1))
|
||||||
|
done
|
||||||
|
eend 0
|
||||||
|
}
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.Dd Feb 22, 2008
|
.Dd Arp 9, 2008
|
||||||
.Dt RC-STATUS 8 SMM
|
.Dt RC-STATUS 8 SMM
|
||||||
.Os OpenRC
|
.Os OpenRC
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@@ -36,7 +36,8 @@
|
|||||||
.Nm
|
.Nm
|
||||||
gathers and displays information about the status of services
|
gathers and displays information about the status of services
|
||||||
in different runlevels. The default behavior is to show information
|
in different runlevels. The default behavior is to show information
|
||||||
about the current runlevel, but any runlevel can be quickly examined.
|
about the current runlevel and any unassgined services that are not stopped,
|
||||||
|
but any runlevel can be quickly examined.
|
||||||
.Pp
|
.Pp
|
||||||
The options are as follows:
|
The options are as follows:
|
||||||
.Bl -tag -width ".Fl test , test string"
|
.Bl -tag -width ".Fl test , test string"
|
||||||
|
|||||||
@@ -31,11 +31,10 @@
|
|||||||
.Nm rc_service_mark , rc_service_extra_commands , rc_service_plugable ,
|
.Nm rc_service_mark , rc_service_extra_commands , rc_service_plugable ,
|
||||||
.Nm rc_service_resolve , rc_service_schedule_start , rc_services_scheduled_by ,
|
.Nm rc_service_resolve , rc_service_schedule_start , rc_services_scheduled_by ,
|
||||||
.Nm rc_service_schedule_clear , rc_service_state ,
|
.Nm rc_service_schedule_clear , rc_service_state ,
|
||||||
.Nm rc_service_start , rc_service_stop ,
|
|
||||||
.Nm rc_service_started_daemon , rc_service_value_get , rc_service_value_set ,
|
.Nm rc_service_started_daemon , rc_service_value_get , rc_service_value_set ,
|
||||||
.Nm rc_services_in_runlevel , rc_services_in_state , rc_services_scheduled ,
|
.Nm rc_services_in_runlevel , rc_services_in_state , rc_services_scheduled ,
|
||||||
.Nm rc_service_daemons_crashed
|
.Nm rc_service_daemons_crashed
|
||||||
.Nd functions to start, stop and query OpenRC services
|
.Nd functions to query OpenRC services
|
||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
Run Command library (librc, -lrc)
|
Run Command library (librc, -lrc)
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
@@ -66,8 +65,6 @@ Run Command library (librc, -lrc)
|
|||||||
.Ft "RC_STRINGLIST *" Fn rc_services_scheduled_by "const char *service"
|
.Ft "RC_STRINGLIST *" Fn rc_services_scheduled_by "const char *service"
|
||||||
.Ft bool Fn rc_service_schedule_clear "const char *service"
|
.Ft bool Fn rc_service_schedule_clear "const char *service"
|
||||||
.Ft RC_SERVICE Fn rc_service_state "const char *service"
|
.Ft RC_SERVICE Fn rc_service_state "const char *service"
|
||||||
.Ft pid_t Fn rc_service_start "const char *service"
|
|
||||||
.Ft pid_t Fn rc_service_stop "const char *service"
|
|
||||||
.Ft bool Fo rc_service_started_daemon
|
.Ft bool Fo rc_service_started_daemon
|
||||||
.Fa "const char *service"
|
.Fa "const char *service"
|
||||||
.Fa "const char *exec"
|
.Fa "const char *exec"
|
||||||
@@ -176,16 +173,6 @@ clears these scheduled services for
|
|||||||
.Fa service .
|
.Fa service .
|
||||||
The return value is a bitmask, where more than one state can apply.
|
The return value is a bitmask, where more than one state can apply.
|
||||||
.Pp
|
.Pp
|
||||||
.Fn rc_service_start
|
|
||||||
starts
|
|
||||||
.Fa service ,
|
|
||||||
returning the pid of new process.
|
|
||||||
.Pp
|
|
||||||
.Fn rc_service_stop
|
|
||||||
stops
|
|
||||||
.Fa service ,
|
|
||||||
returning the pid of new process.
|
|
||||||
.Pp
|
|
||||||
.Fn rc_service_started_daemon
|
.Fn rc_service_started_daemon
|
||||||
checks to see if
|
checks to see if
|
||||||
.Fa service
|
.Fa service
|
||||||
|
|||||||
@@ -145,6 +145,10 @@ stopping schedule.
|
|||||||
If not specified then a default value of SIGTERM/5 is
|
If not specified then a default value of SIGTERM/5 is
|
||||||
assumed.
|
assumed.
|
||||||
.El
|
.El
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
.Va SSD_NICELEVEL
|
||||||
|
can also set the scheduling priority of the daemon, but the command line
|
||||||
|
option takes precedence.
|
||||||
.Sh NOTE
|
.Sh NOTE
|
||||||
.Nm
|
.Nm
|
||||||
uses
|
uses
|
||||||
|
|||||||
11
mk/os.mk
11
mk/os.mk
@@ -10,14 +10,3 @@ include ${MK}/os-${OS}.mk
|
|||||||
|
|
||||||
RC_LIB= /$(LIBNAME)/rc
|
RC_LIB= /$(LIBNAME)/rc
|
||||||
|
|
||||||
_PREFIX_SH= if test -n "${PREFIX}" && test "${PREFIX}" != "/"; then echo "-DPREFIX=\\\"${PREFIX}\\\""; else echo ""; fi
|
|
||||||
_PREFIX!= ${_PREFIX_SH}
|
|
||||||
CFLAGS+= ${_PREFIX}$(shell ${_PREFIX_SH})
|
|
||||||
|
|
||||||
_PKG_PREFIX_SH= if test -n "${PKG_PREFIX}" && test "${PKG_PREFIX}" != "/" && test "${PKG_PREFIX}" != "${PREFIX}"; then echo "-DPKG_PREFIX=\\\"${PKG_PREFIX}\\\""; else echo ""; fi
|
|
||||||
_PKG_PREFIX!= ${_PKG_PREFIX_SH}
|
|
||||||
CFLAGS+= ${_PKG_PREFIX}$(shell ${_PKG_PREFIX_SH})
|
|
||||||
|
|
||||||
_LCL_PREFIX_SH= if test -n "${LOCAL_PREFIX}" && test "${LOCAL_PREFIX}" != "/" && test "${LOCAL_PREFIX}" != "${PREFIX}"; then echo "-DLOCAL_PREFIX=\\\"${LOCAL_PREFIX}\\\""; else echo ""; fi
|
|
||||||
_LCL_PREFIX!= ${_LCL_PREFIX_SH}
|
|
||||||
CFLAGS+= ${_LCL_PREFIX}$(shell ${_LCL_PREFIX_SH})
|
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ _system_ntp()
|
|||||||
local servers= buffer= x=
|
local servers= buffer= x=
|
||||||
|
|
||||||
eval servers=\$ntp_servers_${IFVAR}
|
eval servers=\$ntp_servers_${IFVAR}
|
||||||
[ -z ${servers} ] && servers=${ntp_servers}
|
[ -z "${servers}" ] && servers=${ntp_servers}
|
||||||
[ -z ${servers} ] && return 0
|
[ -z "${servers}" ] && return 0
|
||||||
|
|
||||||
buffer="# Generated by net-scripts for interface ${IFACE}\n"
|
buffer="# Generated by net-scripts for interface ${IFACE}\n"
|
||||||
buffer="${buffer}restrict default noquery notrust nomodify\n"
|
buffer="${buffer}restrict default noquery notrust nomodify\n"
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ vlan_pre_start()
|
|||||||
vlan_post_start()
|
vlan_post_start()
|
||||||
{
|
{
|
||||||
local vlans=
|
local vlans=
|
||||||
eval vlans=\$vlans_${IFACE}
|
eval vlans=\$vlans_${IFVAR}
|
||||||
[ -z "${vlans}" ] && return 0
|
[ -z "${vlans}" ] && return 0
|
||||||
|
|
||||||
_check_vlan || return 1
|
_check_vlan || return 1
|
||||||
@@ -86,13 +86,13 @@ vlan_post_start()
|
|||||||
yesno ${s:-yes} || continue
|
yesno ${s:-yes} || continue
|
||||||
|
|
||||||
# We need to work out the interface name of our new vlan id
|
# We need to work out the interface name of our new vlan id
|
||||||
local ifname="$( \
|
local ifname="$(sed -n -e \
|
||||||
sed -n -e 's/^\([^[:space:]]*\) *| '"${vlan}"' *| .*'"${iface}"'$/\1/p' \
|
's/^\([^[:space:]]*\) *| '"${vlan}"' *| .*'"${iface}"'$/\1/p' \
|
||||||
/proc/net/vlan/config )"
|
/proc/net/vlan/config )"
|
||||||
mark_service_started "net.${ifname}"
|
mark_service_started "net.${ifname}"
|
||||||
(
|
(
|
||||||
export RC_SVCNAME="net.${ifname}"
|
export RC_SVCNAME="net.${ifname}"
|
||||||
start
|
start
|
||||||
) || mark_service_stopped "net.${ifname}"
|
) || mark_service_stopped "net.${ifname}"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ LEVELDIR= ${DESTDIR}/${SYSCONFDIR}/runlevels
|
|||||||
BOOTDIR= ${LEVELDIR}/boot
|
BOOTDIR= ${LEVELDIR}/boot
|
||||||
DEFAULTDIR= ${LEVELDIR}/default
|
DEFAULTDIR= ${LEVELDIR}/default
|
||||||
|
|
||||||
|
INITDIR= ../init.d
|
||||||
|
|
||||||
MK= ../mk
|
MK= ../mk
|
||||||
include ${MK}/sys.mk
|
include ${MK}/sys.mk
|
||||||
include ${MK}/os.mk
|
include ${MK}/os.mk
|
||||||
@@ -19,7 +21,8 @@ install:
|
|||||||
${INSTALL} -d ${BOOTDIR} || exit $$?; \
|
${INSTALL} -d ${BOOTDIR} || exit $$?; \
|
||||||
for x in ${BOOT}; do \
|
for x in ${BOOT}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
if test -n "${PREFIX}"; then \
|
||||||
grep -q "keyword .*noprefix" ${SYSCONFDIR}/init.d/"$$x" && continue; \
|
test "$$x" = "net.lo" -o "$$x" = "net.lo0" && continue; \
|
||||||
|
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
|
||||||
done \
|
done \
|
||||||
@@ -28,7 +31,7 @@ install:
|
|||||||
${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
|
${INSTALL} -d ${DEFAULTDIR} || exit $$?; \
|
||||||
for x in ${DEFAULT}; do \
|
for x in ${DEFAULT}; do \
|
||||||
if test -n "${PREFIX}"; then \
|
if test -n "${PREFIX}"; then \
|
||||||
grep -q "keyword .*noprefix" ${SYSCONFDIR}/init.d/"$$x" && continue; \
|
grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
|
ln -snf ${PREFIX}/etc/init.d/"$$x" ${DEFAULTDIR}/"$$x" || exit $$?; done \
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
BOOT+= hwclock consolefont keymaps modules mtab net.lo procfs
|
BOOT+= hwclock consolefont keymaps modules mtab net.lo procfs \
|
||||||
DEFAULT+= hdparm
|
termencoding
|
||||||
|
|||||||
@@ -38,12 +38,17 @@ yesno()
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_runlevel() {
|
||||||
|
rc-status --runlevel
|
||||||
|
}
|
||||||
|
|
||||||
_sanitize_path()
|
_sanitize_path()
|
||||||
{
|
{
|
||||||
local IFS=":" p= path=
|
local IFS=":" p= path=
|
||||||
for p in ${PATH}; do
|
for p in ${PATH}; do
|
||||||
case "${p}" in
|
case "${p}" in
|
||||||
@PREFIX@/lib/rc/sbin|@PREFIX@/bin|@PREFIX@/sbin|/usr/bin|/usr/sbin);;
|
@PREFIX@/@LIB@/rc/bin|@PREFIX@/@LIB@/rc/sbin);;
|
||||||
|
@PREFIX@/bin|@PREFIX@/sbin|/usr/bin|/usr/sbin);;
|
||||||
@PKG_PREFIX@/bin|@PKG_PREFIX@/sbin);;
|
@PKG_PREFIX@/bin|@PKG_PREFIX@/sbin);;
|
||||||
@LOCAL_PREFIX@/bin|@LOCAL_PREFIX@/sbin);;
|
@LOCAL_PREFIX@/bin|@LOCAL_PREFIX@/sbin);;
|
||||||
*) path="${path}${path:+:}${p}";;
|
*) path="${path}${path:+:}${p}";;
|
||||||
@@ -66,7 +71,7 @@ _PREFIX=@PREFIX@
|
|||||||
_PKG_PREFIX=@PKG_PREFIX@
|
_PKG_PREFIX=@PKG_PREFIX@
|
||||||
_LOCAL_PREFIX=@LOCAL_PREFIX@
|
_LOCAL_PREFIX=@LOCAL_PREFIX@
|
||||||
_LOCAL_PREFIX=${_LOCAL_PREFIX:-/usr/local}
|
_LOCAL_PREFIX=${_LOCAL_PREFIX:-/usr/local}
|
||||||
_PATH=@PREFIX@/lib/rc/bin
|
_PATH=@PREFIX@/@LIB@/rc/bin
|
||||||
case "${_PREFIX}" in
|
case "${_PREFIX}" in
|
||||||
"${_PKG_PREFIX}"|"${_LOCAL_PREFIX}") ;;
|
"${_PKG_PREFIX}"|"${_LOCAL_PREFIX}") ;;
|
||||||
*) _PATH="${_PATH}:${_PREFIX}/bin:${_PREFIX}/sbin";;
|
*) _PATH="${_PATH}:${_PREFIX}/bin:${_PREFIX}/sbin";;
|
||||||
@@ -79,8 +84,9 @@ fi
|
|||||||
if [ -n "${_LOCAL_PREFIX}" ]; then
|
if [ -n "${_LOCAL_PREFIX}" ]; then
|
||||||
_PATH="${_PATH}:${_LOCAL_PREFIX}/bin:${_LOCAL_PREFIX}/sbin"
|
_PATH="${_PATH}:${_LOCAL_PREFIX}/bin:${_LOCAL_PREFIX}/sbin"
|
||||||
fi
|
fi
|
||||||
export PATH="${_PATH}:$(_sanitize_path "${PATH}")"
|
_path="$(_sanitize_path "${PATH}")"
|
||||||
unset _sanitize_path _PREFIX _PKG_PREFIX _LOCAL_PREFIX _PATH
|
export PATH="${_PATH}${_path:+:}${_path}"
|
||||||
|
unset _sanitize_path _PREFIX _PKG_PREFIX _LOCAL_PREFIX _PATH _path
|
||||||
|
|
||||||
for arg; do
|
for arg; do
|
||||||
case "${arg}" in
|
case "${arg}" in
|
||||||
@@ -99,7 +105,7 @@ else
|
|||||||
# the last ecmd
|
# the last ecmd
|
||||||
for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
|
for _e in ebegin eend error errorn einfo einfon ewarn ewarnn ewend \
|
||||||
vebegin veend veinfo vewarn vewend; do
|
vebegin veend veinfo vewarn vewend; do
|
||||||
eval "${_e}() { local _r; @PREFIX@/lib/rc/bin/${_e} \"\$@\"; _r=$?; \
|
eval "${_e}() { local _r; @PREFIX@/@LIB@/rc/bin/${_e} \"\$@\"; _r=$?; \
|
||||||
export EINFO_LASTCMD=${_e}; return \$_r; }"
|
export EINFO_LASTCMD=${_e}; return \$_r; }"
|
||||||
done
|
done
|
||||||
unset _e
|
unset _e
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ retval=0
|
|||||||
# the old service state data
|
# the old service state data
|
||||||
if [ "${RC_SVCDIR}" != "/" ] && mkdir "${RC_SVCDIR}/.test.$$" 2>/dev/null; then
|
if [ "${RC_SVCDIR}" != "/" ] && mkdir "${RC_SVCDIR}/.test.$$" 2>/dev/null; then
|
||||||
rmdir "${RC_SVCDIR}/.test.$$"
|
rmdir "${RC_SVCDIR}/.test.$$"
|
||||||
for x in ${RC_SVCDIR:-/lib/rc/init.d}/*; do
|
for x in ${RC_SVCDIR:-/@LIB@/rc/init.d}/*; do
|
||||||
[ -e "${x}" ] || continue
|
[ -e "${x}" ] || continue
|
||||||
case ${x##*/} in
|
case ${x##*/} in
|
||||||
depconfig|deptree|ksoftlevel|rc.log);;
|
depconfig|deptree|ksoftlevel|rc.log);;
|
||||||
|
|||||||
@@ -96,6 +96,9 @@ if ${mountproc}; then
|
|||||||
fi
|
fi
|
||||||
unset mountproc
|
unset mountproc
|
||||||
|
|
||||||
|
# Re-load RC_SYS if empty now we have /proc mounted
|
||||||
|
[ -z "${RC_SYS}" ] && export RC_SYS="$(rc --sys)"
|
||||||
|
|
||||||
# Read off the kernel commandline to see if there's any special settings
|
# Read off the kernel commandline to see if there's any special settings
|
||||||
# especially check to see if we need to set the CDBOOT environment variable
|
# especially check to see if we need to set the CDBOOT environment variable
|
||||||
# Note: /proc MUST be mounted
|
# Note: /proc MUST be mounted
|
||||||
|
|||||||
@@ -4,15 +4,15 @@
|
|||||||
|
|
||||||
has_addon()
|
has_addon()
|
||||||
{
|
{
|
||||||
[ -e "${RC_LIBDIR}/addons/$1.sh" ] || [ -e /lib/rcscripts/addons/"$1".sh ]
|
[ -e "${RC_LIBDIR}/addons/$1.sh" ] || [ -e /@LIB@/rcscripts/addons/"$1".sh ]
|
||||||
}
|
}
|
||||||
|
|
||||||
import_addon()
|
import_addon()
|
||||||
{
|
{
|
||||||
if [ -e "${RC_LIBDIR}/addons/$1.sh" ]; then
|
if [ -e "${RC_LIBDIR}/addons/$1.sh" ]; then
|
||||||
. "${RC_LIBDIR}/addons/$1.sh"
|
. "${RC_LIBDIR}/addons/$1.sh"
|
||||||
elif [ -e /lib/rcscripts/addons/"$1".sh ]; then
|
elif [ -e /@LIB@/rcscripts/addons/"$1".sh ]; then
|
||||||
. /lib/rcscripts/addons/"$1".sh
|
. /@LIB@/rcscripts/addons/"$1".sh
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
@@ -75,6 +75,6 @@ get_bootparam()
|
|||||||
|
|
||||||
# Add our sbin to $PATH
|
# Add our sbin to $PATH
|
||||||
case "${PATH}" in
|
case "${PATH}" in
|
||||||
@PREFIX@/lib/rc/sbin|@PREFIX@/lib/rc/sbin:*);;
|
"${RC_LIBDIR}"/sbin|"${RC_LIBDIR}"/sbin:*);;
|
||||||
*) export PATH="@PREFIX@/lib/rc/sbin:${PATH}";;
|
*) export PATH="${RC_LIBDIR}/sbin:${PATH}";;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -9,17 +9,17 @@ tret=0
|
|||||||
ebegin "Testing yesno()"
|
ebegin "Testing yesno()"
|
||||||
for f in yes YES Yes true TRUE True 1 ; do
|
for f in yes YES Yes true TRUE True 1 ; do
|
||||||
if ! yesno ${f} ; then
|
if ! yesno ${f} ; then
|
||||||
((tret+=1))
|
tret=$((${tret} + 1))
|
||||||
echo "!${f}!"
|
echo "!${f}!"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
for f in no NO No false FALSE False 0 ; do
|
for f in no NO No false FALSE False 0 ; do
|
||||||
if yesno ${f} ; then
|
if yesno ${f} ; then
|
||||||
((tret+=1))
|
tret=$(({$tret} + 1))
|
||||||
echo "!${f}!"
|
echo "!${f}!"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
eend ${tret}
|
eend ${tret}
|
||||||
((ret+=tret))
|
ret=$((${ret} + ${tret}))
|
||||||
|
|
||||||
exit ${ret}
|
exit ${ret}
|
||||||
|
|||||||
@@ -37,45 +37,10 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifndef LIB
|
|
||||||
# define LIB "lib"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PREFIX
|
|
||||||
# define RC_PREFIX PREFIX
|
|
||||||
#else
|
|
||||||
# define RC_PREFIX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SYSCONFDIR
|
|
||||||
# define SYSCONFDIR RC_PREFIX "/etc"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RC_LEVEL_BOOT "boot"
|
#define RC_LEVEL_BOOT "boot"
|
||||||
#define RC_LEVEL_DEFAULT "default"
|
#define RC_LEVEL_DEFAULT "default"
|
||||||
|
|
||||||
#define RC_LIBDIR RC_PREFIX "/" LIB "/rc"
|
|
||||||
#define RC_SVCDIR RC_LIBDIR "/init.d"
|
|
||||||
#define RC_DEPTREE_CACHE RC_SVCDIR "/deptree"
|
#define RC_DEPTREE_CACHE RC_SVCDIR "/deptree"
|
||||||
#define RC_RUNLEVELDIR SYSCONFDIR "/runlevels"
|
|
||||||
#define RC_INITDIR SYSCONFDIR "/init.d"
|
|
||||||
#define RC_CONFDIR SYSCONFDIR "/conf.d"
|
|
||||||
|
|
||||||
/* PKG_PREFIX is where packages are installed if different from the base OS
|
|
||||||
* On Gentoo this is normally unset, on FreeBSD /usr/local and on NetBSD
|
|
||||||
* /usr/pkg. */
|
|
||||||
#ifdef PKG_PREFIX
|
|
||||||
# define RC_PKG_INITDIR PKG_PREFIX "/etc/init.d"
|
|
||||||
# define RC_PKG_CONFDIR PKG_PREFIX "/etc/conf.d"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* LOCAL_PREFIX is for user written stuff, which the base OS and package
|
|
||||||
* manger don't touch. */
|
|
||||||
#ifdef LOCAL_PREFIX
|
|
||||||
# define RC_LOCAL_INITDIR LOCAL_PREFIX "/etc/init.d"
|
|
||||||
# define RC_LOCAL_CONFDIR LOCAL_PREFIX "/etc/conf.d"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RC_KRUNLEVEL RC_SVCDIR "/krunlevel"
|
#define RC_KRUNLEVEL RC_SVCDIR "/krunlevel"
|
||||||
#define RC_STARTING RC_SVCDIR "/rc.starting"
|
#define RC_STARTING RC_SVCDIR "/rc.starting"
|
||||||
#define RC_STOPPING RC_SVCDIR "/rc.stopping"
|
#define RC_STOPPING RC_SVCDIR "/rc.stopping"
|
||||||
@@ -85,8 +50,6 @@
|
|||||||
#define RC_SVCDIR_STARTED RC_SVCDIR "/started"
|
#define RC_SVCDIR_STARTED RC_SVCDIR "/started"
|
||||||
#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "/coldplugged"
|
#define RC_SVCDIR_COLDPLUGGED RC_SVCDIR "/coldplugged"
|
||||||
|
|
||||||
#define RC_PLUGINDIR RC_LIBDIR "/plugins"
|
|
||||||
|
|
||||||
#define ERRX fprintf (stderr, "out of memory\n"); exit (1)
|
#define ERRX fprintf (stderr, "out of memory\n"); exit (1)
|
||||||
|
|
||||||
#ifdef lint
|
#ifdef lint
|
||||||
@@ -98,7 +61,6 @@
|
|||||||
# define _unused
|
# define _unused
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Some libc implemntations don't have these */
|
/* Some libc implemntations don't have these */
|
||||||
#ifndef STAILQ_CONCAT
|
#ifndef STAILQ_CONCAT
|
||||||
#define STAILQ_CONCAT(head1, head2) do { \
|
#define STAILQ_CONCAT(head1, head2) do { \
|
||||||
@@ -196,6 +158,10 @@ void env_filter(void);
|
|||||||
void env_config(void);
|
void env_config(void);
|
||||||
bool service_plugable(const char *service);
|
bool service_plugable(const char *service);
|
||||||
int signal_setup(int sig, void (*handler)(int));
|
int signal_setup(int sig, void (*handler)(int));
|
||||||
|
pid_t exec_service(const char *, const char *);
|
||||||
|
|
||||||
|
#define service_start(service) exec_service(service, "start");
|
||||||
|
#define service_stop(service) exec_service(service, "stop");
|
||||||
|
|
||||||
/* basename_c never modifies the argument. As such, if there is a trailing
|
/* basename_c never modifies the argument. As such, if there is a trailing
|
||||||
* slash then an empty string is returned. */
|
* slash then an empty string is returned. */
|
||||||
|
|||||||
@@ -51,6 +51,8 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
/*! @brief Color types to use */
|
/*! @brief Color types to use */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -141,4 +143,5 @@ void eoutdentv(void);
|
|||||||
/*! @brief Prefix each einfo line with something */
|
/*! @brief Prefix each einfo line with something */
|
||||||
void eprefix(const char * __EINFO_RESTRICT);
|
void eprefix(const char * __EINFO_RESTRICT);
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
1
src/librc/.gitignore
vendored
1
src/librc/.gitignore
vendored
@@ -13,3 +13,4 @@ librc.a
|
|||||||
librc.so.1
|
librc.so.1
|
||||||
librc.so
|
librc.so
|
||||||
.depend
|
.depend
|
||||||
|
rc.h
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ SRCS= librc.c librc-daemon.c librc-depend.c librc-misc.c \
|
|||||||
INCS= rc.h
|
INCS= rc.h
|
||||||
VERSION_MAP= rc.map
|
VERSION_MAP= rc.map
|
||||||
|
|
||||||
CFLAGS+= -DLIB=\"${LIBNAME}\"
|
|
||||||
CFLAGS+= -DSYSCONFDIR=\"${SYSCONFDIR}\"
|
|
||||||
LDADD+= ${LIBKVM}
|
LDADD+= ${LIBKVM}
|
||||||
|
|
||||||
CFLAGS+= -I../includes
|
CFLAGS+= -I../includes
|
||||||
@@ -15,3 +13,30 @@ MK= ../../mk
|
|||||||
include ${MK}/lib.mk
|
include ${MK}/lib.mk
|
||||||
include ${MK}/cc.mk
|
include ${MK}/cc.mk
|
||||||
include ${MK}/debug.mk
|
include ${MK}/debug.mk
|
||||||
|
|
||||||
|
# Massage our header file for our dirs
|
||||||
|
SED_CMD= -e 's:@PREFIX@:${PREFIX}:g'
|
||||||
|
SED_CMD+= -e 's:@LIB@:${LIBNAME}:g'
|
||||||
|
SED_CMD+= -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g'
|
||||||
|
_PKG_PREFIX_SH= if test -n "${PKG_PREFIX}" && test "${PKG_PREFIX}" != "/" && test "${PKG_PREFIX}" != "${PREFIX}"; then \
|
||||||
|
echo "-e 's:@PKG_PREFIX@:${PKG_PREFIX}:g'"; \
|
||||||
|
else \
|
||||||
|
echo "-e 's:.*@PKG_PREFIX@.*:\#undef RC_PKG_PREFIX:g'"; \
|
||||||
|
fi
|
||||||
|
_PKG_PREFIX!= ${_PKG_PREFIX_SH}
|
||||||
|
SED_CMD+= ${_PKG_PREFIX}$(shell ${_PKG_PREFIX_SH})
|
||||||
|
|
||||||
|
_LCL_PREFIX_SH= if test -n "${LOCAL_PREFIX}" && test "${LOCAL_PREFIX}" != "/" && test "${LOCAL_PREFIX}" != "${PREFIX}"; then \
|
||||||
|
echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; \
|
||||||
|
else \
|
||||||
|
echo "-e 's:@LOCAL_PREFIX@::g'"; \
|
||||||
|
fi
|
||||||
|
_LCL_PREFIX!= ${_LCL_PREFIX_SH}
|
||||||
|
SED_CMD+= ${_LCL_PREFIX}$(shell ${_LCL_PREFIX_SH})
|
||||||
|
|
||||||
|
.SUFFIXES: .h.in .h
|
||||||
|
.h.in.h:
|
||||||
|
${SED} ${SED_CMD} $< > $@
|
||||||
|
${SRCS}: rc.h
|
||||||
|
|
||||||
|
CLEANFILES+= rc.h
|
||||||
|
|||||||
@@ -478,17 +478,17 @@ RC_STRINGLIST *rc_deptree_depend(const RC_DEPTREE *deptree,
|
|||||||
}
|
}
|
||||||
librc_hidden_def(rc_deptree_depend)
|
librc_hidden_def(rc_deptree_depend)
|
||||||
|
|
||||||
RC_STRINGLIST *rc_deptree_depends (const RC_DEPTREE *deptree,
|
RC_STRINGLIST *rc_deptree_depends(const RC_DEPTREE *deptree,
|
||||||
const RC_STRINGLIST *types,
|
const RC_STRINGLIST *types,
|
||||||
const RC_STRINGLIST *services,
|
const RC_STRINGLIST *services,
|
||||||
const char *runlevel, int options)
|
const char *runlevel, int options)
|
||||||
{
|
{
|
||||||
RC_STRINGLIST *sorted = NULL;
|
RC_STRINGLIST *sorted = NULL;
|
||||||
RC_STRINGLIST *visited = rc_stringlist_new();
|
RC_STRINGLIST *visited = rc_stringlist_new();
|
||||||
RC_DEPINFO *di;
|
RC_DEPINFO *di;
|
||||||
const RC_STRING *service;
|
const RC_STRING *service;
|
||||||
|
|
||||||
bootlevel = getenv ("RC_BOOTLEVEL");
|
bootlevel = getenv("RC_BOOTLEVEL");
|
||||||
if (! bootlevel)
|
if (! bootlevel)
|
||||||
bootlevel = RC_LEVEL_BOOT;
|
bootlevel = RC_LEVEL_BOOT;
|
||||||
|
|
||||||
@@ -515,7 +515,7 @@ RC_STRINGLIST *rc_deptree_order(const RC_DEPTREE *deptree,
|
|||||||
RC_STRINGLIST *types;
|
RC_STRINGLIST *types;
|
||||||
RC_STRINGLIST *services;
|
RC_STRINGLIST *services;
|
||||||
|
|
||||||
bootlevel = getenv ("RC_BOOTLEVEL");
|
bootlevel = getenv("RC_BOOTLEVEL");
|
||||||
if (! bootlevel)
|
if (! bootlevel)
|
||||||
bootlevel = RC_LEVEL_BOOT;
|
bootlevel = RC_LEVEL_BOOT;
|
||||||
|
|
||||||
@@ -525,8 +525,7 @@ RC_STRINGLIST *rc_deptree_order(const RC_DEPTREE *deptree,
|
|||||||
strcmp (runlevel, RC_LEVEL_REBOOT) == 0)
|
strcmp (runlevel, RC_LEVEL_REBOOT) == 0)
|
||||||
{
|
{
|
||||||
list = rc_services_in_state(RC_SERVICE_STARTED);
|
list = rc_services_in_state(RC_SERVICE_STARTED);
|
||||||
|
list2 = rc_services_in_state(RC_SERVICE_INACTIVE);
|
||||||
list2 = rc_services_in_state (RC_SERVICE_INACTIVE);
|
|
||||||
if (list2) {
|
if (list2) {
|
||||||
if (list) {
|
if (list) {
|
||||||
TAILQ_CONCAT(list, list2, entries);
|
TAILQ_CONCAT(list, list2, entries);
|
||||||
@@ -534,8 +533,7 @@ RC_STRINGLIST *rc_deptree_order(const RC_DEPTREE *deptree,
|
|||||||
} else
|
} else
|
||||||
list = list2;
|
list = list2;
|
||||||
}
|
}
|
||||||
|
list2 = rc_services_in_state(RC_SERVICE_STARTING);
|
||||||
list2 = rc_services_in_state (RC_SERVICE_STARTING);
|
|
||||||
if (list2) {
|
if (list2) {
|
||||||
if (list) {
|
if (list) {
|
||||||
TAILQ_CONCAT(list, list2, entries);
|
TAILQ_CONCAT(list, list2, entries);
|
||||||
@@ -543,20 +541,28 @@ RC_STRINGLIST *rc_deptree_order(const RC_DEPTREE *deptree,
|
|||||||
} else
|
} else
|
||||||
list = list2;
|
list = list2;
|
||||||
}
|
}
|
||||||
TAILQ_CONCAT(list, list2, entries);
|
|
||||||
} else {
|
} else {
|
||||||
list = rc_services_in_runlevel (runlevel);
|
list = rc_services_in_runlevel(runlevel);
|
||||||
|
|
||||||
/* Add coldplugged services */
|
/* Add coldplugged services */
|
||||||
list2 = rc_services_in_state (RC_SERVICE_COLDPLUGGED);
|
list2 = rc_services_in_state(RC_SERVICE_COLDPLUGGED);
|
||||||
TAILQ_CONCAT(list, list2, entries);
|
if (list2) {
|
||||||
free(list2);
|
if (list) {
|
||||||
|
TAILQ_CONCAT(list, list2, entries);
|
||||||
|
free(list2);
|
||||||
|
} else
|
||||||
|
list = list2;
|
||||||
|
}
|
||||||
|
|
||||||
/* If we're not the boot runlevel then add that too */
|
/* If we're not the boot runlevel then add that too */
|
||||||
if (strcmp (runlevel, bootlevel) != 0) {
|
if (strcmp (runlevel, bootlevel) != 0) {
|
||||||
list2 = rc_services_in_runlevel (bootlevel);
|
list2 = rc_services_in_runlevel (bootlevel);
|
||||||
TAILQ_CONCAT(list, list2, entries);
|
if (list2) {
|
||||||
free(list2);
|
if (list) {
|
||||||
|
TAILQ_CONCAT(list, list2, entries);
|
||||||
|
free(list2);
|
||||||
|
} else
|
||||||
|
list = list2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,8 +575,8 @@ RC_STRINGLIST *rc_deptree_order(const RC_DEPTREE *deptree,
|
|||||||
|
|
||||||
services = rc_deptree_depends(deptree, types, list, runlevel,
|
services = rc_deptree_depends(deptree, types, list, runlevel,
|
||||||
RC_DEP_STRICT | RC_DEP_TRACE | options);
|
RC_DEP_STRICT | RC_DEP_TRACE | options);
|
||||||
rc_stringlist_free (list);
|
rc_stringlist_free(list);
|
||||||
rc_stringlist_free (types);
|
rc_stringlist_free(types);
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,6 +214,13 @@ const char *rc_sys(void)
|
|||||||
return RC_SYS_JAIL;
|
return RC_SYS_JAIL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
if (exists("/kern/xen/privcmd"))
|
||||||
|
return RC_SYS_XEN0;
|
||||||
|
if (exists("/kern/xen"))
|
||||||
|
return RC_SYS_XENU;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (exists("/proc/xen")) {
|
if (exists("/proc/xen")) {
|
||||||
if (file_regex("/proc/xen/capabilities", "control_d"))
|
if (file_regex("/proc/xen/capabilities", "control_d"))
|
||||||
@@ -494,7 +501,7 @@ bool rc_service_mark(const char *service, const RC_SERVICE state)
|
|||||||
base = basename_c(service);
|
base = basename_c(service);
|
||||||
|
|
||||||
if (state != RC_SERVICE_STOPPED) {
|
if (state != RC_SERVICE_STOPPED) {
|
||||||
if (! exists(init)) {
|
if (!exists(init)) {
|
||||||
free(init);
|
free(init);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -540,7 +547,10 @@ bool rc_service_mark(const char *service, const RC_SERVICE state)
|
|||||||
symlink(init, was);
|
symlink(init, was);
|
||||||
skip_wasinactive = true;
|
skip_wasinactive = true;
|
||||||
}
|
}
|
||||||
unlink(file);
|
if (unlink(file) == -1) {
|
||||||
|
free(init);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -673,95 +683,6 @@ bool rc_service_value_set(const char *service, const char *option,
|
|||||||
}
|
}
|
||||||
librc_hidden_def(rc_service_value_set)
|
librc_hidden_def(rc_service_value_set)
|
||||||
|
|
||||||
static pid_t _exec_service(const char *service, const char *arg)
|
|
||||||
{
|
|
||||||
char *file;
|
|
||||||
char fifo[PATH_MAX];
|
|
||||||
pid_t pid = -1;
|
|
||||||
sigset_t full;
|
|
||||||
sigset_t old;
|
|
||||||
struct sigaction sa;
|
|
||||||
|
|
||||||
file = rc_service_resolve(service);
|
|
||||||
if (! exists(file)) {
|
|
||||||
rc_service_mark(service, RC_SERVICE_STOPPED);
|
|
||||||
free(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We create a fifo so that other services can wait until we complete */
|
|
||||||
snprintf(fifo, sizeof(fifo), RC_SVCDIR "/exclusive/%s",
|
|
||||||
basename_c(service));
|
|
||||||
if (mkfifo(fifo, 0600) != 0 && errno != EEXIST) {
|
|
||||||
free(file);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
|
|
||||||
if ((pid = fork()) == 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);
|
|
||||||
|
|
||||||
/* Safe to run now */
|
|
||||||
execl(file, file, arg, (char *) NULL);
|
|
||||||
fprintf(stderr, "unable to exec `%s': %s\n",
|
|
||||||
file, strerror(errno));
|
|
||||||
unlink(fifo);
|
|
||||||
_exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pid == -1)
|
|
||||||
fprintf(stderr, "fork: %s\n",strerror (errno));
|
|
||||||
|
|
||||||
sigprocmask(SIG_SETMASK, &old, NULL);
|
|
||||||
|
|
||||||
free(file);
|
|
||||||
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
pid_t rc_service_stop(const char *service)
|
|
||||||
{
|
|
||||||
RC_SERVICE state = rc_service_state(service);
|
|
||||||
|
|
||||||
if (state & RC_SERVICE_FAILED)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (state & RC_SERVICE_STOPPED)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return _exec_service(service, "stop");
|
|
||||||
}
|
|
||||||
librc_hidden_def(rc_service_stop)
|
|
||||||
|
|
||||||
pid_t rc_service_start(const char *service)
|
|
||||||
{
|
|
||||||
RC_SERVICE state = rc_service_state(service);
|
|
||||||
|
|
||||||
if (state & RC_SERVICE_FAILED)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (! state & RC_SERVICE_STOPPED)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return _exec_service(service, "start");
|
|
||||||
}
|
|
||||||
librc_hidden_def(rc_service_start)
|
|
||||||
|
|
||||||
bool rc_service_schedule_start(const char *service,
|
bool rc_service_schedule_start(const char *service,
|
||||||
const char *service_to_start)
|
const char *service_to_start)
|
||||||
|
|||||||
@@ -104,8 +104,6 @@ librc_hidden_proto(rc_service_mark)
|
|||||||
librc_hidden_proto(rc_service_resolve)
|
librc_hidden_proto(rc_service_resolve)
|
||||||
librc_hidden_proto(rc_service_schedule_clear)
|
librc_hidden_proto(rc_service_schedule_clear)
|
||||||
librc_hidden_proto(rc_service_schedule_start)
|
librc_hidden_proto(rc_service_schedule_start)
|
||||||
librc_hidden_proto(rc_service_start)
|
|
||||||
librc_hidden_proto(rc_service_stop)
|
|
||||||
librc_hidden_proto(rc_services_in_runlevel)
|
librc_hidden_proto(rc_services_in_runlevel)
|
||||||
librc_hidden_proto(rc_services_in_state)
|
librc_hidden_proto(rc_services_in_state)
|
||||||
librc_hidden_proto(rc_services_scheduled)
|
librc_hidden_proto(rc_services_scheduled)
|
||||||
|
|||||||
@@ -32,6 +32,33 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
#define RC_SYSCONFDIR "@SYSCONFDIR@"
|
||||||
|
#define RC_LIBDIR "@PREFIX@/@LIB@/rc"
|
||||||
|
#define RC_SVCDIR RC_LIBDIR "/init.d"
|
||||||
|
#define RC_PLUGINDIR RC_LIBDIR "/plugins"
|
||||||
|
#define RC_RUNLEVELDIR RC_SYSCONFDIR "/runlevels"
|
||||||
|
#define RC_INITDIR RC_SYSCONFDIR "/init.d"
|
||||||
|
#define RC_CONFDIR RC_SYSCONFDIR "/conf.d"
|
||||||
|
|
||||||
|
/* PKG_PREFIX is where packages are installed if different from the base OS
|
||||||
|
* On Gentoo this is normally unset, on FreeBSD /usr/local and on NetBSD
|
||||||
|
* /usr/pkg. */
|
||||||
|
#define RC_PKG_PREFIX "@PKG_PREFIX@"
|
||||||
|
#ifdef RC_PKG_PREFIX
|
||||||
|
# define RC_PKG_INITDIR RC_PKG_PREFIX "/etc/init.d"
|
||||||
|
# define RC_PKG_CONFDIR RC_PKG_PREFIX "/etc/conf.d"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* LOCAL_PREFIX is for user written stuff, which the base OS and package
|
||||||
|
* manger don't touch. */
|
||||||
|
#define RC_LOCAL_PREFIX "@LOCAL_PREFIX@"
|
||||||
|
#ifdef RC_LOCAL_PREFIX
|
||||||
|
# define RC_LOCAL_INITDIR RC_LOCAL_PREFIX "/etc/init.d"
|
||||||
|
# define RC_LOCAL_CONFDIR RC_LOCAL_PREFIX "/etc/conf.d"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A doubly linked list using queue(3) for ease of use */
|
/* A doubly linked list using queue(3) for ease of use */
|
||||||
typedef struct rc_string {
|
typedef struct rc_string {
|
||||||
char *value;
|
char *value;
|
||||||
@@ -172,16 +199,6 @@ bool rc_service_schedule_clear(const char *);
|
|||||||
* @return state of the service */
|
* @return state of the service */
|
||||||
RC_SERVICE rc_service_state(const char *);
|
RC_SERVICE rc_service_state(const char *);
|
||||||
|
|
||||||
/*! Start a service
|
|
||||||
* @param service to start
|
|
||||||
* @return pid of the service starting process */
|
|
||||||
pid_t rc_service_start(const char *);
|
|
||||||
|
|
||||||
/*! Stop a service
|
|
||||||
* @param service to stop
|
|
||||||
* @return pid of service stopping process */
|
|
||||||
pid_t rc_service_stop(const char *);
|
|
||||||
|
|
||||||
/*! Check if the service started the daemon
|
/*! Check if the service started the daemon
|
||||||
* @param service to check
|
* @param service to check
|
||||||
* @param exec to check
|
* @param exec to check
|
||||||
@@ -447,4 +464,5 @@ typedef LIST_HEAD(rc_pidlist, rc_pid) RC_PIDLIST;
|
|||||||
* @return NULL terminated list of pids */
|
* @return NULL terminated list of pids */
|
||||||
RC_PIDLIST *rc_find_pids(const char *const *, const char *, uid_t, pid_t);
|
RC_PIDLIST *rc_find_pids(const char *const *, const char *, uid_t, pid_t);
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
#endif
|
#endif
|
||||||
@@ -32,8 +32,6 @@ global:
|
|||||||
rc_service_resolve;
|
rc_service_resolve;
|
||||||
rc_service_schedule_clear;
|
rc_service_schedule_clear;
|
||||||
rc_service_schedule_start;
|
rc_service_schedule_start;
|
||||||
rc_service_start;
|
|
||||||
rc_service_stop;
|
|
||||||
rc_services_in_runlevel;
|
rc_services_in_runlevel;
|
||||||
rc_services_in_state;
|
rc_services_in_state;
|
||||||
rc_services_scheduled;
|
rc_services_scheduled;
|
||||||
|
|||||||
@@ -39,8 +39,6 @@ include ${MK}/cc.mk
|
|||||||
include ${MK}/debug.mk
|
include ${MK}/debug.mk
|
||||||
|
|
||||||
CFLAGS+= -I../includes -I../librc -I../libeinfo
|
CFLAGS+= -I../includes -I../librc -I../libeinfo
|
||||||
CFLAGS+= -DLIB=\"${LIBNAME}\"
|
|
||||||
CFLAGS+= -DSYSCONFDIR=\"${SYSCONFDIR}\"
|
|
||||||
|
|
||||||
include ${MK}/${MKTERMCAP}.mk
|
include ${MK}/${MKTERMCAP}.mk
|
||||||
LDADD+= ${LIBDL} ${LIBKVM}
|
LDADD+= ${LIBDL} ${LIBKVM}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ static int do_e(int argc, char **argv)
|
|||||||
} else if (strcmp(applet, "esyslog") == 0 ||
|
} else if (strcmp(applet, "esyslog") == 0 ||
|
||||||
strcmp(applet, "elog") == 0) {
|
strcmp(applet, "elog") == 0) {
|
||||||
p = strchr(argv[0], '.');
|
p = strchr(argv[0], '.');
|
||||||
if ((level = syslog_decode(p + 1, prioritynames)) == -1)
|
if (!p || (level = syslog_decode(p + 1, prioritynames)) == -1)
|
||||||
eerrorx("%s: invalid log level `%s'", applet, argv[0]);
|
eerrorx("%s: invalid log level `%s'", applet, argv[0]);
|
||||||
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
|
|||||||
@@ -43,16 +43,17 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "einfo.h"
|
#include "einfo.h"
|
||||||
#include "rc.h"
|
#include "rc.h"
|
||||||
#include "rc-misc.h"
|
#include "rc-misc.h"
|
||||||
|
|
||||||
#define PROFILE_ENV SYSCONFDIR "/profile.env"
|
#define PROFILE_ENV RC_SYSCONFDIR "/profile.env"
|
||||||
#define SYS_WHITELIST RC_LIBDIR "/conf.d/env_whitelist"
|
#define SYS_WHITELIST RC_LIBDIR "/conf.d/env_whitelist"
|
||||||
#define USR_WHITELIST SYSCONFDIR "/conf.d/env_whitelist"
|
#define USR_WHITELIST RC_SYSCONFDIR "/conf.d/env_whitelist"
|
||||||
#define RC_CONF SYSCONFDIR "/rc.conf"
|
#define RC_CONF RC_SYSCONFDIR "/rc.conf"
|
||||||
#define RC_CONF_OLD SYSCONFDIR "/conf.d/rc"
|
#define RC_CONF_OLD RC_SYSCONFDIR "/conf.d/rc"
|
||||||
|
|
||||||
#define PATH_PREFIX RC_LIBDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin"
|
#define PATH_PREFIX RC_LIBDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin"
|
||||||
|
|
||||||
@@ -310,3 +311,65 @@ int signal_setup(int sig, void (*handler)(int))
|
|||||||
sa.sa_handler = handler;
|
sa.sa_handler = handler;
|
||||||
return sigaction(sig, &sa, NULL);
|
return sigaction(sig, &sa, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pid_t exec_service(const char *service, const char *arg)
|
||||||
|
{
|
||||||
|
char *file;
|
||||||
|
char fifo[PATH_MAX];
|
||||||
|
pid_t pid = -1;
|
||||||
|
sigset_t full;
|
||||||
|
sigset_t old;
|
||||||
|
struct sigaction sa;
|
||||||
|
|
||||||
|
file = rc_service_resolve(service);
|
||||||
|
if (! exists(file)) {
|
||||||
|
rc_service_mark(service, RC_SERVICE_STOPPED);
|
||||||
|
free(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We create a fifo so that other services can wait until we complete */
|
||||||
|
snprintf(fifo, sizeof(fifo), RC_SVCDIR "/exclusive/%s",
|
||||||
|
basename_c(service));
|
||||||
|
if (mkfifo(fifo, 0600) != 0 && errno != EEXIST) {
|
||||||
|
free(file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
if ((pid = fork()) == 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);
|
||||||
|
|
||||||
|
/* Safe to run now */
|
||||||
|
execl(file, file, arg, (char *) NULL);
|
||||||
|
fprintf(stderr, "unable to exec `%s': %s\n",
|
||||||
|
file, strerror(errno));
|
||||||
|
unlink(fifo);
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pid == -1)
|
||||||
|
fprintf(stderr, "fork: %s\n",strerror (errno));
|
||||||
|
|
||||||
|
sigprocmask(SIG_SETMASK, &old, NULL);
|
||||||
|
|
||||||
|
free(file);
|
||||||
|
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ static const struct option longopts[] = {
|
|||||||
longopts_COMMON
|
longopts_COMMON
|
||||||
};
|
};
|
||||||
static const char * const longopts_help[] = {
|
static const char * const longopts_help[] = {
|
||||||
|
"tests if the service exists or not",
|
||||||
"list all available services",
|
"list all available services",
|
||||||
longopts_help_COMMON
|
longopts_help_COMMON
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,7 +42,8 @@
|
|||||||
|
|
||||||
extern const char *applet;
|
extern const char *applet;
|
||||||
static bool test_crashed = false;
|
static bool test_crashed = false;
|
||||||
static const char *const types_nua[] = { "ineed", "iuse", "iafter", NULL };
|
static RC_DEPTREE *deptree = NULL;
|
||||||
|
static RC_STRINGLIST *types = NULL;
|
||||||
|
|
||||||
bool _rc_can_find_pids(void)
|
bool _rc_can_find_pids(void)
|
||||||
{
|
{
|
||||||
@@ -73,7 +74,7 @@ bool _rc_can_find_pids(void)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_level(char *level)
|
static void print_level(const char *level)
|
||||||
{
|
{
|
||||||
printf ("Runlevel: ");
|
printf ("Runlevel: ");
|
||||||
if (isatty(fileno(stdout)))
|
if (isatty(fileno(stdout)))
|
||||||
@@ -120,6 +121,46 @@ static void print_service(const char *service)
|
|||||||
ebracket(cols, color, status);
|
ebracket(cols, color, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void print_services(const char *runlevel, RC_STRINGLIST *services)
|
||||||
|
{
|
||||||
|
RC_STRINGLIST *l = NULL;
|
||||||
|
RC_STRING *s, *t;
|
||||||
|
char *r = NULL;
|
||||||
|
|
||||||
|
if (! services)
|
||||||
|
return;
|
||||||
|
if (! deptree)
|
||||||
|
deptree = _rc_deptree_load(NULL);
|
||||||
|
if (! deptree) {
|
||||||
|
TAILQ_FOREACH(s, services, entries)
|
||||||
|
if (!runlevel ||
|
||||||
|
rc_service_in_runlevel(s->value, runlevel))
|
||||||
|
print_service(s->value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (! types) {
|
||||||
|
types = rc_stringlist_new();
|
||||||
|
rc_stringlist_add(types, "ineed");
|
||||||
|
rc_stringlist_add(types, "iuse");
|
||||||
|
rc_stringlist_add(types, "iafter");
|
||||||
|
}
|
||||||
|
if (!runlevel)
|
||||||
|
r = rc_runlevel_get();
|
||||||
|
l = rc_deptree_depends(deptree, types, services, r ? r : runlevel,
|
||||||
|
RC_DEP_STRICT | RC_DEP_TRACE | RC_DEP_START);
|
||||||
|
free(r);
|
||||||
|
TAILQ_FOREACH(s, l, entries) {
|
||||||
|
TAILQ_FOREACH(t, services, entries)
|
||||||
|
if (strcmp(t->value, s->value) == 0)
|
||||||
|
break;
|
||||||
|
if (!t)
|
||||||
|
continue;
|
||||||
|
if (!runlevel || rc_service_in_runlevel(s->value, runlevel))
|
||||||
|
print_service(s->value);
|
||||||
|
}
|
||||||
|
rc_stringlist_free(l);
|
||||||
|
}
|
||||||
|
|
||||||
#include "_usage.h"
|
#include "_usage.h"
|
||||||
#define extraopts "[runlevel1] [runlevel2] ..."
|
#define extraopts "[runlevel1] [runlevel2] ..."
|
||||||
#define getoptstring "alrsu" getoptstring_COMMON
|
#define getoptstring "alrsu" getoptstring_COMMON
|
||||||
@@ -143,16 +184,11 @@ static const char * const longopts_help[] = {
|
|||||||
|
|
||||||
int rc_status(int argc, char **argv)
|
int rc_status(int argc, char **argv)
|
||||||
{
|
{
|
||||||
RC_DEPTREE *deptree = NULL;
|
|
||||||
RC_STRINGLIST *levels = NULL;
|
RC_STRINGLIST *levels = NULL;
|
||||||
RC_STRINGLIST *services;
|
RC_STRINGLIST *services;
|
||||||
RC_STRINGLIST *types = NULL;
|
RC_STRING *s, *l, *t;
|
||||||
RC_STRINGLIST *ordered;
|
|
||||||
RC_STRING *s;
|
|
||||||
RC_STRING *l;
|
|
||||||
char *p;
|
char *p;
|
||||||
int opt;
|
int opt;
|
||||||
int depopts = RC_DEP_STRICT | RC_DEP_START | RC_DEP_TRACE;
|
|
||||||
|
|
||||||
test_crashed = _rc_can_find_pids();
|
test_crashed = _rc_can_find_pids();
|
||||||
|
|
||||||
@@ -166,35 +202,33 @@ int rc_status(int argc, char **argv)
|
|||||||
levels = rc_runlevel_list();
|
levels = rc_runlevel_list();
|
||||||
TAILQ_FOREACH (l, levels, entries)
|
TAILQ_FOREACH (l, levels, entries)
|
||||||
printf("%s\n", l->value);
|
printf("%s\n", l->value);
|
||||||
rc_stringlist_free(levels);
|
goto exit;
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case 'r':
|
case 'r':
|
||||||
p = rc_runlevel_get ();
|
p = rc_runlevel_get();
|
||||||
printf("%s\n", p);
|
printf("%s\n", p);
|
||||||
free(p);
|
free(p);
|
||||||
exit(EXIT_SUCCESS);
|
goto exit;
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case 's':
|
case 's':
|
||||||
services = rc_services_in_runlevel(NULL);
|
services = rc_services_in_runlevel(NULL);
|
||||||
TAILQ_FOREACH(s, services, entries)
|
print_services(NULL, services);
|
||||||
print_service(s->value);
|
goto exit;
|
||||||
rc_stringlist_free(services);
|
|
||||||
exit (EXIT_SUCCESS);
|
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case 'u':
|
case 'u':
|
||||||
services = rc_services_in_runlevel(NULL);
|
services = rc_services_in_runlevel(NULL);
|
||||||
levels = rc_runlevel_list();
|
levels = rc_runlevel_list();
|
||||||
TAILQ_FOREACH(s, services, entries) {
|
TAILQ_FOREACH_SAFE(s, services, entries, t) {
|
||||||
TAILQ_FOREACH(l, levels, entries)
|
TAILQ_FOREACH(l, levels, entries)
|
||||||
if (rc_service_in_runlevel(s->value, l->value))
|
if (rc_service_in_runlevel(s->value, l->value)) {
|
||||||
|
TAILQ_REMOVE(services, s, entries);
|
||||||
|
free(s->value);
|
||||||
|
free(s);
|
||||||
break;
|
break;
|
||||||
if (! l)
|
}
|
||||||
print_service(s->value);
|
|
||||||
}
|
}
|
||||||
rc_stringlist_free(levels);
|
print_services(NULL, services);
|
||||||
rc_stringlist_free(services);
|
goto exit;
|
||||||
exit (EXIT_SUCCESS);
|
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
|
|
||||||
case_RC_COMMON_GETOPT
|
case_RC_COMMON_GETOPT
|
||||||
@@ -216,27 +250,34 @@ int rc_status(int argc, char **argv)
|
|||||||
TAILQ_FOREACH(l, levels, entries) {
|
TAILQ_FOREACH(l, levels, entries) {
|
||||||
print_level(l->value);
|
print_level(l->value);
|
||||||
services = rc_services_in_runlevel(l->value);
|
services = rc_services_in_runlevel(l->value);
|
||||||
if (! services)
|
print_services(l->value, services);
|
||||||
continue;
|
|
||||||
if (deptree) {
|
|
||||||
if (! types) {
|
|
||||||
types = rc_stringlist_new();
|
|
||||||
rc_stringlist_add(types, "ineed");
|
|
||||||
rc_stringlist_add(types, "iuse");
|
|
||||||
rc_stringlist_add(types, "iafter");
|
|
||||||
}
|
|
||||||
ordered = rc_deptree_depends(deptree, types, services,
|
|
||||||
l->value, depopts);
|
|
||||||
rc_stringlist_free(services);
|
|
||||||
services = ordered;
|
|
||||||
ordered = NULL;
|
|
||||||
}
|
|
||||||
TAILQ_FOREACH(s, services, entries)
|
|
||||||
if (rc_service_in_runlevel(s->value, l->value))
|
|
||||||
print_service(s->value);
|
|
||||||
rc_stringlist_free(services);
|
rc_stringlist_free(services);
|
||||||
|
services = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Show unassigned running too */
|
||||||
|
if (argc < 2) {
|
||||||
|
print_level("UNASSIGNED");
|
||||||
|
services = rc_services_in_runlevel(NULL);
|
||||||
|
rc_stringlist_free(levels);
|
||||||
|
levels = rc_runlevel_list();
|
||||||
|
TAILQ_FOREACH_SAFE(s, services, entries, t) {
|
||||||
|
TAILQ_FOREACH(l, levels, entries) {
|
||||||
|
if (rc_service_in_runlevel(s->value, l->value) ||
|
||||||
|
rc_service_state(s->value) & RC_SERVICE_STOPPED)
|
||||||
|
{
|
||||||
|
TAILQ_REMOVE(services, s, entries);
|
||||||
|
free(s->value);
|
||||||
|
free(s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print_services(NULL, services);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
rc_stringlist_free(services);
|
||||||
rc_stringlist_free(types);
|
rc_stringlist_free(types);
|
||||||
rc_stringlist_free(levels);
|
rc_stringlist_free(levels);
|
||||||
rc_deptree_free(deptree);
|
rc_deptree_free(deptree);
|
||||||
|
|||||||
80
src/rc/rc.c
80
src/rc/rc.c
@@ -691,12 +691,15 @@ static void do_newlevel(const char *newlevel)
|
|||||||
run_script(INITSH);
|
run_script(INITSH);
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* If we requested a softlevel, save it now */
|
/* If we requested a runlevel, save it now */
|
||||||
set_krunlevel(NULL);
|
if ((cmd = proc_getent("rc_runlevel"))) {
|
||||||
if ((cmd = proc_getent("softlevel"))) {
|
|
||||||
set_krunlevel(cmd);
|
set_krunlevel(cmd);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
}
|
} else if ((cmd = proc_getent("softlevel"))) {
|
||||||
|
set_krunlevel(cmd);
|
||||||
|
free(cmd);
|
||||||
|
} else
|
||||||
|
set_krunlevel(NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Setup our coldplugged services now */
|
/* Setup our coldplugged services now */
|
||||||
@@ -771,6 +774,7 @@ static void do_stop_services(const char *newlevel, bool going_down, bool paralle
|
|||||||
pid_t pid;
|
pid_t pid;
|
||||||
RC_STRING *service, *svc1, *svc2;
|
RC_STRING *service, *svc1, *svc2;
|
||||||
RC_STRINGLIST *deporder, *tmplist;
|
RC_STRINGLIST *deporder, *tmplist;
|
||||||
|
RC_SERVICE state;
|
||||||
|
|
||||||
if (! types_n) {
|
if (! types_n) {
|
||||||
types_n = rc_stringlist_new();
|
types_n = rc_stringlist_new();
|
||||||
@@ -779,12 +783,13 @@ static void do_stop_services(const char *newlevel, bool going_down, bool paralle
|
|||||||
|
|
||||||
TAILQ_FOREACH_REVERSE(service, stop_services, rc_stringlist, entries)
|
TAILQ_FOREACH_REVERSE(service, stop_services, rc_stringlist, entries)
|
||||||
{
|
{
|
||||||
if (rc_service_state(service->value) & RC_SERVICE_STOPPED)
|
state = rc_service_state(service->value);
|
||||||
|
if (state & RC_SERVICE_STOPPED || state & RC_SERVICE_FAILED)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* We always stop the service when in these runlevels */
|
/* We always stop the service when in these runlevels */
|
||||||
if (going_down || ! start_services) {
|
if (going_down || ! start_services) {
|
||||||
pid = rc_service_stop(service->value);
|
pid = service_stop(service->value);
|
||||||
if (pid > 0 && ! parallel)
|
if (pid > 0 && ! parallel)
|
||||||
rc_waitpid(pid);
|
rc_waitpid(pid);
|
||||||
continue;
|
continue;
|
||||||
@@ -832,7 +837,7 @@ static void do_stop_services(const char *newlevel, bool going_down, bool paralle
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* After all that we can finally stop the blighter! */
|
/* After all that we can finally stop the blighter! */
|
||||||
pid = rc_service_stop(service->value);
|
pid = service_stop(service->value);
|
||||||
if (pid > 0) {
|
if (pid > 0) {
|
||||||
add_pid(pid);
|
add_pid(pid);
|
||||||
if (! parallel) {
|
if (! parallel) {
|
||||||
@@ -848,44 +853,47 @@ static void do_start_services(bool parallel)
|
|||||||
RC_STRING *service;
|
RC_STRING *service;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
bool interactive = false;
|
bool interactive = false;
|
||||||
|
RC_SERVICE state;
|
||||||
|
|
||||||
if (! rc_yesno(getenv("EINFO_QUIET")))
|
if (! rc_yesno(getenv("EINFO_QUIET")))
|
||||||
interactive = exists(INTERACTIVE);
|
interactive = exists(INTERACTIVE);
|
||||||
|
|
||||||
TAILQ_FOREACH(service, start_services, entries) {
|
TAILQ_FOREACH(service, start_services, entries) {
|
||||||
if (rc_service_state(service->value) & RC_SERVICE_STOPPED) {
|
state = rc_service_state(service->value);
|
||||||
if (! interactive)
|
if (!(state & RC_SERVICE_STOPPED) || state & RC_SERVICE_FAILED)
|
||||||
interactive = want_interactive();
|
continue;
|
||||||
|
|
||||||
if (interactive) {
|
if (! interactive)
|
||||||
|
interactive = want_interactive();
|
||||||
|
|
||||||
|
if (interactive) {
|
||||||
interactive_retry:
|
interactive_retry:
|
||||||
printf("\n");
|
printf("\n");
|
||||||
einfo("About to start the service %s",
|
einfo("About to start the service %s",
|
||||||
service->value);
|
service->value);
|
||||||
eindent();
|
eindent();
|
||||||
einfo("1) Start the service\t\t2) Skip the service");
|
einfo("1) Start the service\t\t2) Skip the service");
|
||||||
einfo("3) Continue boot process\t\t4) Exit to shell");
|
einfo("3) Continue boot process\t\t4) Exit to shell");
|
||||||
eoutdent();
|
eoutdent();
|
||||||
interactive_option:
|
interactive_option:
|
||||||
switch (read_key(true)) {
|
switch (read_key(true)) {
|
||||||
case '1': break;
|
case '1': break;
|
||||||
case '2': continue;
|
case '2': continue;
|
||||||
case '3': interactive = false; break;
|
case '3': interactive = false; break;
|
||||||
case '4': sulogin(true); goto interactive_retry;
|
case '4': sulogin(true); goto interactive_retry;
|
||||||
default: goto interactive_option;
|
default: goto interactive_option;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pid = rc_service_start(service->value);
|
pid = service_start(service->value);
|
||||||
|
|
||||||
/* Remember the pid if we're running in parallel */
|
|
||||||
if (pid > 0) {
|
|
||||||
add_pid(pid);
|
|
||||||
|
|
||||||
if (! parallel) {
|
/* Remember the pid if we're running in parallel */
|
||||||
rc_waitpid(pid);
|
if (pid > 0) {
|
||||||
remove_pid(pid);
|
add_pid(pid);
|
||||||
}
|
|
||||||
|
if (! parallel) {
|
||||||
|
rc_waitpid(pid);
|
||||||
|
remove_pid(pid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -930,11 +938,13 @@ static void handle_bad_signal(int sig)
|
|||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "override", 1, NULL, 'o' },
|
{ "override", 1, NULL, 'o' },
|
||||||
{ "service", 1, NULL, 's' },
|
{ "service", 1, NULL, 's' },
|
||||||
|
{ "sys", 0, NULL, 'S' },
|
||||||
longopts_COMMON
|
longopts_COMMON
|
||||||
};
|
};
|
||||||
static const char * const longopts_help[] = {
|
static const char * const longopts_help[] = {
|
||||||
"override the next runlevel to change into\nwhen leaving single user or boot runlevels",
|
"override the next runlevel to change into\nwhen leaving single user or boot runlevels",
|
||||||
"runs the service specified with the rest\nof the arguments",
|
"runs the service specified with the rest\nof the arguments",
|
||||||
|
"output the RC system type, if any",
|
||||||
longopts_help_COMMON
|
longopts_help_COMMON
|
||||||
};
|
};
|
||||||
#include "_usage.c"
|
#include "_usage.c"
|
||||||
@@ -949,7 +959,7 @@ int main(int argc, char **argv)
|
|||||||
bool going_down = false;
|
bool going_down = false;
|
||||||
int depoptions = RC_DEP_STRICT | RC_DEP_TRACE;
|
int depoptions = RC_DEP_STRICT | RC_DEP_TRACE;
|
||||||
char krunlevel [PATH_MAX];
|
char krunlevel [PATH_MAX];
|
||||||
char pidstr[6];
|
char pidstr[10];
|
||||||
int opt;
|
int opt;
|
||||||
bool parallel;
|
bool parallel;
|
||||||
int regen = 0;
|
int regen = 0;
|
||||||
@@ -1023,6 +1033,12 @@ int main(int argc, char **argv)
|
|||||||
execv(*argv, argv);
|
execv(*argv, argv);
|
||||||
eerrorx("%s: %s", applet, strerror(errno));
|
eerrorx("%s: %s", applet, strerror(errno));
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
|
case 'S':
|
||||||
|
bootlevel = rc_sys();
|
||||||
|
if (bootlevel)
|
||||||
|
printf("%s\n", bootlevel);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
/* NOTREACHED */
|
||||||
case_RC_COMMON_GETOPT
|
case_RC_COMMON_GETOPT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1036,7 +1052,7 @@ int main(int argc, char **argv)
|
|||||||
snprintf(pidstr, sizeof(pidstr), "%d", getpid());
|
snprintf(pidstr, sizeof(pidstr), "%d", getpid());
|
||||||
setenv("RC_PID", pidstr, 1);
|
setenv("RC_PID", pidstr, 1);
|
||||||
|
|
||||||
/* Load current softlevel */
|
/* Load current runlevel */
|
||||||
bootlevel = getenv("RC_BOOTLEVEL");
|
bootlevel = getenv("RC_BOOTLEVEL");
|
||||||
runlevel = rc_runlevel_get();
|
runlevel = rc_runlevel_get();
|
||||||
|
|
||||||
@@ -1186,7 +1202,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save our softlevel now */
|
/* Save our runlevel now */
|
||||||
if (going_down)
|
if (going_down)
|
||||||
rc_runlevel_set(newlevel);
|
rc_runlevel_set(newlevel);
|
||||||
|
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ static void start_services(RC_STRINGLIST *list) {
|
|||||||
" when %s has started",
|
" when %s has started",
|
||||||
svc->value, applet);
|
svc->value, applet);
|
||||||
} else
|
} else
|
||||||
rc_service_start(svc->value);
|
service_start(svc->value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -648,6 +648,19 @@ static void setup_types(void)
|
|||||||
rc_stringlist_add(types_mua, "beforeme");
|
rc_stringlist_add(types_mua, "beforeme");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool in_list(RC_STRINGLIST *list, char *string)
|
||||||
|
{
|
||||||
|
RC_STRING *s;
|
||||||
|
|
||||||
|
if (! list)
|
||||||
|
return false;
|
||||||
|
TAILQ_FOREACH(s, list, entries)
|
||||||
|
if (strcmp(s->value, string) == 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void svc_start(bool deps)
|
static void svc_start(bool deps)
|
||||||
{
|
{
|
||||||
bool started;
|
bool started;
|
||||||
@@ -727,7 +740,7 @@ static void svc_start(bool deps)
|
|||||||
if (! rc_runlevel_starting() && use_services)
|
if (! rc_runlevel_starting() && use_services)
|
||||||
TAILQ_FOREACH(svc, use_services, entries)
|
TAILQ_FOREACH(svc, use_services, entries)
|
||||||
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED) {
|
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED) {
|
||||||
pid_t pid = rc_service_start(svc->value);
|
pid_t pid = service_start(svc->value);
|
||||||
if (! rc_conf_yesno("rc_parallel"))
|
if (! rc_conf_yesno("rc_parallel"))
|
||||||
rc_waitpid(pid);
|
rc_waitpid(pid);
|
||||||
}
|
}
|
||||||
@@ -747,35 +760,29 @@ static void svc_start(bool deps)
|
|||||||
/* Don't wait for services which went inactive but are now in
|
/* Don't wait for services which went inactive but are now in
|
||||||
* starting state which we are after */
|
* starting state which we are after */
|
||||||
if (svcs & RC_SERVICE_STARTING &&
|
if (svcs & RC_SERVICE_STARTING &&
|
||||||
svcs & RC_SERVICE_WASINACTIVE) {
|
svcs & RC_SERVICE_WASINACTIVE)
|
||||||
TAILQ_FOREACH(svc2, use_services, entries) {
|
{
|
||||||
if (strcmp (svc->value, svc2->value) == 0)
|
if (!in_list(need_services, svc->value) &&
|
||||||
break;
|
!in_list(use_services, svc->value))
|
||||||
}
|
|
||||||
if (! svc2)
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! svc_wait(svc->value))
|
if (! svc_wait(svc->value))
|
||||||
eerror ("%s: timed out waiting for %s",
|
eerror ("%s: timed out waiting for %s",
|
||||||
applet, svc->value);
|
applet, svc->value);
|
||||||
if (! need_services)
|
|
||||||
continue;
|
|
||||||
if ((svcs = rc_service_state(svc->value)) & RC_SERVICE_STARTED)
|
if ((svcs = rc_service_state(svc->value)) & RC_SERVICE_STARTED)
|
||||||
continue;
|
continue;
|
||||||
TAILQ_FOREACH(svc2, need_services, entries) {
|
if (in_list(need_services, svc->value)) {
|
||||||
if (strcmp (svc->value, svc2->value) == 0) {
|
if (svcs & RC_SERVICE_INACTIVE ||
|
||||||
if (svcs & RC_SERVICE_INACTIVE ||
|
svcs & RC_SERVICE_WASINACTIVE)
|
||||||
svcs & RC_SERVICE_WASINACTIVE)
|
{
|
||||||
{
|
if (! tmplist)
|
||||||
if (! tmplist)
|
tmplist = rc_stringlist_new();
|
||||||
tmplist = rc_stringlist_new();
|
rc_stringlist_add(tmplist, svc->value);
|
||||||
rc_stringlist_add(tmplist, svc->value);
|
} else
|
||||||
} else
|
eerrorx("ERROR: cannot start %s as"
|
||||||
eerrorx("ERROR: cannot start %s as"
|
" %s would not start",
|
||||||
" %s would not start",
|
applet, svc->value);
|
||||||
applet, svc->value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -851,7 +858,7 @@ static void svc_start(bool deps)
|
|||||||
if (services) {
|
if (services) {
|
||||||
TAILQ_FOREACH(svc, services, entries)
|
TAILQ_FOREACH(svc, services, entries)
|
||||||
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
|
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
|
||||||
rc_service_start(svc->value);
|
service_start(svc->value);
|
||||||
rc_stringlist_free(services);
|
rc_stringlist_free(services);
|
||||||
services = NULL;
|
services = NULL;
|
||||||
}
|
}
|
||||||
@@ -864,7 +871,7 @@ static void svc_start(bool deps)
|
|||||||
if (services) {
|
if (services) {
|
||||||
TAILQ_FOREACH(svc2, services, entries)
|
TAILQ_FOREACH(svc2, services, entries)
|
||||||
if (rc_service_state(svc2->value) & RC_SERVICE_STOPPED)
|
if (rc_service_state(svc2->value) & RC_SERVICE_STOPPED)
|
||||||
rc_service_start(svc2->value);
|
service_start(svc2->value);
|
||||||
rc_stringlist_free(services);
|
rc_stringlist_free(services);
|
||||||
services = NULL;
|
services = NULL;
|
||||||
}
|
}
|
||||||
@@ -932,14 +939,14 @@ static void svc_stop(bool deps)
|
|||||||
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
|
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
|
||||||
RC_SERVICE svcs = rc_service_state(svc->value);
|
RC_SERVICE svcs = rc_service_state(svc->value);
|
||||||
if (svcs & RC_SERVICE_STARTED ||
|
if (svcs & RC_SERVICE_STARTED ||
|
||||||
svcs & RC_SERVICE_INACTIVE)
|
svcs & RC_SERVICE_INACTIVE)
|
||||||
{
|
{
|
||||||
svc_wait(svc->value);
|
svc_wait(svc->value);
|
||||||
svcs = rc_service_state(svc->value);
|
svcs = rc_service_state(svc->value);
|
||||||
if (svcs & RC_SERVICE_STARTED ||
|
if (svcs & RC_SERVICE_STARTED ||
|
||||||
svcs & RC_SERVICE_INACTIVE)
|
svcs & RC_SERVICE_INACTIVE)
|
||||||
{
|
{
|
||||||
pid_t pid = rc_service_stop(svc->value);
|
pid_t pid = service_stop(svc->value);
|
||||||
if (! rc_conf_yesno("rc_parallel"))
|
if (! rc_conf_yesno("rc_parallel"))
|
||||||
rc_waitpid(pid);
|
rc_waitpid(pid);
|
||||||
if (! tmplist)
|
if (! tmplist)
|
||||||
@@ -964,9 +971,9 @@ static void svc_stop(bool deps)
|
|||||||
/* If shutting down, we should stop even
|
/* If shutting down, we should stop even
|
||||||
* if a dependant failed */
|
* if a dependant failed */
|
||||||
if (runlevel &&
|
if (runlevel &&
|
||||||
(strcmp(runlevel, RC_LEVEL_SHUTDOWN) == 0 ||
|
(strcmp(runlevel, RC_LEVEL_SHUTDOWN) == 0 ||
|
||||||
strcmp(runlevel, RC_LEVEL_REBOOT) == 0 ||
|
strcmp(runlevel, RC_LEVEL_REBOOT) == 0 ||
|
||||||
strcmp(runlevel, RC_LEVEL_SINGLE) == 0))
|
strcmp(runlevel, RC_LEVEL_SINGLE) == 0))
|
||||||
continue;
|
continue;
|
||||||
rc_service_mark(service, RC_SERVICE_FAILED);
|
rc_service_mark(service, RC_SERVICE_FAILED);
|
||||||
}
|
}
|
||||||
@@ -1077,7 +1084,7 @@ int runscript(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
bool deps = true;
|
bool deps = true;
|
||||||
bool doneone = false;
|
bool doneone = false;
|
||||||
char pid[16];
|
char pidstr[10];
|
||||||
int retval;
|
int retval;
|
||||||
int opt;
|
int opt;
|
||||||
RC_STRING *svc;
|
RC_STRING *svc;
|
||||||
@@ -1136,8 +1143,8 @@ int runscript(int argc, char **argv)
|
|||||||
/* Set an env var so that we always know our pid regardless of any
|
/* Set an env var so that we always know our pid regardless of any
|
||||||
subshells the init script may create so that our mark_service_*
|
subshells the init script may create so that our mark_service_*
|
||||||
functions can always instruct us of this change */
|
functions can always instruct us of this change */
|
||||||
snprintf(pid, sizeof(pid), "%d", (int) getpid());
|
snprintf(pidstr, sizeof(pidstr), "%d", (int) getpid());
|
||||||
setenv("RC_RUNSCRIPT_PID", pid, 1);
|
setenv("RC_RUNSCRIPT_PID", pidstr, 1);
|
||||||
|
|
||||||
/* eprefix is kinda klunky, but it works for our purposes */
|
/* eprefix is kinda klunky, but it works for our purposes */
|
||||||
if (rc_conf_yesno("rc_parallel")) {
|
if (rc_conf_yesno("rc_parallel")) {
|
||||||
@@ -1299,7 +1306,8 @@ int runscript(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
} else if (strcmp(optarg, "zap") == 0) {
|
} else if (strcmp(optarg, "zap") == 0) {
|
||||||
einfo("Manually resetting %s to stopped state", applet);
|
einfo("Manually resetting %s to stopped state", applet);
|
||||||
rc_service_mark(applet, RC_SERVICE_STOPPED);
|
if (!rc_service_mark(applet, RC_SERVICE_STOPPED))
|
||||||
|
eerrorx("rc_service_mark: %s", strerror(errno));
|
||||||
uncoldplug();
|
uncoldplug();
|
||||||
} else
|
} else
|
||||||
svc_exec(optarg, NULL);
|
svc_exec(optarg, NULL);
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ all:
|
|||||||
|
|
||||||
install:
|
install:
|
||||||
|
|
||||||
|
gitignore:
|
||||||
|
|
||||||
check test::
|
check test::
|
||||||
./runtests.sh
|
./runtests.sh
|
||||||
|
|
||||||
|
|||||||
@@ -29,10 +29,8 @@ rc_service_mark
|
|||||||
rc_service_resolve
|
rc_service_resolve
|
||||||
rc_service_schedule_clear
|
rc_service_schedule_clear
|
||||||
rc_service_schedule_start
|
rc_service_schedule_start
|
||||||
rc_service_start
|
|
||||||
rc_service_started_daemon
|
rc_service_started_daemon
|
||||||
rc_service_state
|
rc_service_state
|
||||||
rc_service_stop
|
|
||||||
rc_service_value_get
|
rc_service_value_get
|
||||||
rc_service_value_set
|
rc_service_value_set
|
||||||
rc_services_in_runlevel
|
rc_services_in_runlevel
|
||||||
|
|||||||
@@ -58,14 +58,10 @@ rc_service_schedule_clear
|
|||||||
rc_service_schedule_clear@@RC_1.0
|
rc_service_schedule_clear@@RC_1.0
|
||||||
rc_service_schedule_start
|
rc_service_schedule_start
|
||||||
rc_service_schedule_start@@RC_1.0
|
rc_service_schedule_start@@RC_1.0
|
||||||
rc_service_start
|
|
||||||
rc_service_start@@RC_1.0
|
|
||||||
rc_service_started_daemon
|
rc_service_started_daemon
|
||||||
rc_service_started_daemon@@RC_1.0
|
rc_service_started_daemon@@RC_1.0
|
||||||
rc_service_state
|
rc_service_state
|
||||||
rc_service_state@@RC_1.0
|
rc_service_state@@RC_1.0
|
||||||
rc_service_stop
|
|
||||||
rc_service_stop@@RC_1.0
|
|
||||||
rc_service_value_get
|
rc_service_value_get
|
||||||
rc_service_value_get@@RC_1.0
|
rc_service_value_get@@RC_1.0
|
||||||
rc_service_value_set
|
rc_service_value_set
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ builddir=${builddir:-${srcdir}}
|
|||||||
export LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH}
|
export LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH}
|
||||||
export PATH=${top_builddir}/src/rc:${PATH}
|
export PATH=${top_builddir}/src/rc:${PATH}
|
||||||
|
|
||||||
${MAKE:-make} -s -C ${top_srcdir}/src/rc links
|
cd ${top_srcdir}/src/rc
|
||||||
|
${MAKE:-make} links >/dev/null
|
||||||
|
cd -
|
||||||
|
|
||||||
. ${top_srcdir}/sh/functions.sh
|
. ${top_srcdir}/sh/functions.sh
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user