Compare commits

..

3 Commits

Author SHA1 Message Date
William Hubbs
d8e4da5e5d version 0.42.1 2019-08-20 16:23:37 -05:00
William Hubbs
b7b7d6990e Update ChangeLog 2019-08-20 16:18:33 -05:00
William Hubbs
a31008d197 fix clang build 2019-08-20 16:13:50 -05:00
41 changed files with 1098 additions and 988 deletions

View File

@@ -4,8 +4,8 @@
test_task: test_task:
freebsd_instance: freebsd_instance:
matrix: matrix:
image: freebsd-12-1-release-amd64 image: freebsd-12-0-release-amd64
image: freebsd-11-4-release-amd64 image: freebsd-11-2-release-amd64
env: env:
OS: FreeBSD OS: FreeBSD
procfs_script: > procfs_script: >

View File

@@ -19,14 +19,10 @@ addons:
notifications: notifications:
irc: irc:
channels: channels:
- "irc.libera.chat#openrc" - "irc.freenode.org#openrc"
on_success: always # options: [always|never|change] default: always on_success: change # options: [always|never|change] default: always
on_failure: always # options: [always|never|change] default: always on_failure: always # options: [always|never|change] default: always
on_start: false # default: false on_start: false # default: false
before_install:
- sudo apt-get update
- sudo apt-get install -y shellcheck
script: script:
- ./ci/travis.sh - ./ci/travis.sh

1555
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
NAME= openrc NAME= openrc
VERSION= 0.43.4 VERSION= 0.42.1
PKG= ${NAME}-${VERSION} PKG= ${NAME}-${VERSION}

15
NEWS.md
View File

@@ -4,21 +4,6 @@ OpenRC NEWS
This file will contain a list of notable changes for each release. Note This file will contain a list of notable changes for each release. Note
the information in this file is in reverse order. the information in this file is in reverse order.
## OpenRC 0.43
This version changes the behavior of the checkpath helper to address
CVE-2018-21269. on Linux systems, We require non-terminal symbolic links
to be owned by root. Since we can't do this on non-linux xystems, we do
not dereference non-terminal symbolic links by default. If you need them
dereferenced, you should add the "-s" switch to the appropriate
checkpath calls.
For more information, see http://github.com/openrc/openrc/issues/201.
The SHLIBDIR variable has been removed from the makefiles to make them
more consistent with most common makefiles. All libraries are now in
LIBDIR, so if you need to put them in /, override the LIBDIR variable
when you run make.
## OpenRC 0.42 ## OpenRC 0.42
openrc-shutdown now has the ability to shut down sysvinit-based systems. openrc-shutdown now has the ability to shut down sysvinit-based systems.

View File

@@ -2,7 +2,8 @@ OpenRC README
============= =============
OpenRC is a dependency-based init system that works with the OpenRC is a dependency-based init system that works with the
system-provided init program, normally `/sbin/init`. system-provided init program, normally `/sbin/init`. Currently, it does
not have an init program of its own.
## Installation ## Installation
@@ -11,7 +12,7 @@ OpenRC requires GNU make.
Once you have GNU Make installed, the default OpenRC installation can be Once you have GNU Make installed, the default OpenRC installation can be
executed using this command: executed using this command:
`make install` make install
## Configuration ## Configuration
@@ -50,7 +51,7 @@ If you are building OpenRC for a Gentoo Prefix installation, add `MKPREFIX=yes`.
`PKG_PREFIX` should be set to where packages install to by default. `PKG_PREFIX` should be set to where packages install to by default.
`LOCAL_PREFIX` should be set to where user maintained packages are. `LOCAL_PREFIX` should be set when to where user maintained packages are.
Only set `LOCAL_PREFIX` if different from `PKG_PREFIX`. Only set `LOCAL_PREFIX` if different from `PKG_PREFIX`.
`PREFIX` should be set when OpenRC is not installed to /. `PREFIX` should be set when OpenRC is not installed to /.
@@ -78,14 +79,18 @@ remove them and then install so that the OS hooks into OpenRC.
## Reporting Bugs ## Reporting Bugs
Please report bugs on our [bug tracker](http://github.com/OpenRC/openrc/issues). If you are using Gentoo Linux, bugs can be filed on their bugzilla under
the `gentoo hosted projects` product and the `openrc` component [1].
Otherwise, you can report issues on our github [2].
If you can contribute code , please feel free to do so by opening Better yet, if you can contribute code, please feel free to submit pull
[pull requests](https://github.com/OpenRC/openrc/pulls). requests [3].
## IRC Channel ## IRC Channel
We have an official irc channel, #openrc on the libera network. We have an official irc channel, #openrc on freenode, feel free to join
Please connect your irc client to irc.libera.chat and join #openrc on us there.
that network.
[1] https://bugs.gentoo.org/
[2] https://github.com/openrc/openrc/issues
[3] https://github.com/openrc/openrc/pulls

View File

@@ -16,23 +16,6 @@ set -x
# These are steps to run on TravisCI under a containerized Ubuntu system. # These are steps to run on TravisCI under a containerized Ubuntu system.
# See $TOP/.travis.yml for more info about the TravisCI setup. # See $TOP/.travis.yml for more info about the TravisCI setup.
# Run shellcheck, but don't fail (yet):
shellcheck --version
for shellscript in $(git ls-files); do
case $shellscript in
init.d/*.in) ;;
sh/*.in) ;;
sh/*.sh) ;;
support/init.d.examples/*.in) ;;
support/openvpn/*.sh) ;;
support/sysvinit/halt.sh) ;;
test/*.sh) ;;
*) continue ;;
esac
echo "Checking ${shellscript} with shellcheck:"
shellcheck -s sh "${shellscript}" || true
done
cpus=$(getconf _NPROCESSORS_CONF || echo 1) cpus=$(getconf _NPROCESSORS_CONF || echo 1)
# make on TravisCI doesn't support -O yet # make on TravisCI doesn't support -O yet
make -j"${cpus}" make -j"${cpus}"

View File

@@ -1,2 +1,2 @@
# Hostname fallback if /etc/hostname does not exist # Set to the hostname of this machine
hostname="localhost" hostname="localhost"

View File

@@ -198,9 +198,10 @@ rc_tty_number=12
# "unified" mounts cgroups version 2 on /sys/fs/cgroup # "unified" mounts cgroups version 2 on /sys/fs/cgroup
#rc_cgroup_mode="hybrid" #rc_cgroup_mode="hybrid"
# This is a list of controllers which should be enabled for cgroups version 2 # This is a list of controllers which should be enabled for cgroups version 2.
# when hybrid mode is being used. # If hybrid mode is being used, controllers listed here will not be
# Controllers listed here will not be available for cgroups version 1. # available for cgroups version 1.
# This is a global setting.
#rc_cgroup_controllers="" #rc_cgroup_controllers=""
# This variable contains the cgroups version 2 settings for your services. # This variable contains the cgroups version 2 settings for your services.

View File

@@ -45,3 +45,6 @@ If you want this functionality on a live system, you should first
migrate the system to openrc-init, remove sysvinit, then rebuild and migrate the system to openrc-init, remove sysvinit, then rebuild and
install this package with MKSYSVINIT=yes. install this package with MKSYSVINIT=yes.
package.
migrating your system to openrc-init.

View File

@@ -241,13 +241,7 @@ stop()
{ {
# Write a halt record if we're shutting down # Write a halt record if we're shutting down
if [ "$RC_RUNLEVEL" = shutdown ]; then if [ "$RC_RUNLEVEL" = shutdown ]; then
if [ "$RC_UNAME" = Linux ]; then [ "$RC_UNAME" = Linux ] && openrc-shutdown -w
if [ -x /sbin/halt ]; then
halt -w
else
openrc-shutdown -w
fi
fi
if [ "$RC_SYS" = OPENVZ ]; then if [ "$RC_SYS" = OPENVZ ]; then
yesno $RC_REBOOT && printf "" >/reboot yesno $RC_REBOOT && printf "" >/reboot
fi fi

View File

@@ -83,22 +83,14 @@ cgroup2_controllers()
local active cgroup_path x y local active cgroup_path x y
cgroup_path="$(cgroup2_find_path)" cgroup_path="$(cgroup2_find_path)"
[ -z "${cgroup_path}" ] && return 0 [ -z "${cgroup_path}" ] && return 0
[ ! -e "${cgroup_path}/cgroup.controllers" ] && return 0 [ -e "${cgroup_path}/cgroup.controllers" ] &&
[ ! -e "${cgroup_path}/cgroup.subtree_control" ]&& return 0
read -r active < "${cgroup_path}/cgroup.controllers" read -r active < "${cgroup_path}/cgroup.controllers"
for x in ${active}; do for x in ${rc_cgroup_controllers}; do
case "$rc_cgroup_mode" in for y in ${active}; do
unified) [ "$x" = "$y" ] &&
[ -e "${cgroup_path}/cgroup.subtree_control" ]&&
echo "+${x}" > "${cgroup_path}/cgroup.subtree_control" echo "+${x}" > "${cgroup_path}/cgroup.subtree_control"
;; done
hybrid)
for y in ${rc_cgroup_controllers}; do
if [ "$x" = "$y" ]; then
echo "+${x}" > "${cgroup_path}/cgroup.subtree_control"
fi
done
;;
esac
done done
return 0 return 0
} }

View File

@@ -15,7 +15,7 @@ depend()
{ {
provide dev-mount provide dev-mount
before dev before dev
keyword -docker -prefix -systemd-nspawn -vserver keyword -docker -lxc -prefix -systemd-nspawn -vserver
} }
mount_dev() mount_dev()
@@ -66,20 +66,18 @@ seed_dev()
{ {
# Seed /dev with some things that we know we need # Seed /dev with some things that we know we need
if [ "${RC_SYS}" != LXC ]; then # creating /dev/console, /dev/tty and /dev/tty1 to be able to write
# creating /dev/console, /dev/tty and /dev/tty1 to be able to write # to $CONSOLE with/without bootsplash before udevd creates it
# to $CONSOLE with/without bootsplash before udevd creates it [ -c /dev/console ] || mknod -m 600 /dev/console c 5 1
[ -c /dev/console ] || mknod -m 600 /dev/console c 5 1 [ -c /dev/tty1 ] || mknod -m 620 /dev/tty1 c 4 1
[ -c /dev/tty1 ] || mknod -m 620 /dev/tty1 c 4 1 [ -c /dev/tty ] || mknod -m 666 /dev/tty c 5 0
[ -c /dev/tty ] || mknod -m 666 /dev/tty c 5 0
# udevd will dup its stdin/stdout/stderr to /dev/null # udevd will dup its stdin/stdout/stderr to /dev/null
# and we do not want a file which gets buffered in ram # and we do not want a file which gets buffered in ram
[ -c /dev/null ] || mknod -m 666 /dev/null c 1 3 [ -c /dev/null ] || mknod -m 666 /dev/null c 1 3
# so udev can add its start-message to dmesg # so udev can add its start-message to dmesg
[ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11 [ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11
fi
# extra symbolic links not provided by default # extra symbolic links not provided by default
[ -e /dev/fd ] || ln -snf /proc/self/fd /dev/fd [ -e /dev/fd ] || ln -snf /proc/self/fd /dev/fd

View File

@@ -41,18 +41,18 @@ find_modfiles()
load_modules() load_modules()
{ {
local file m _modules rc x local file m modules rc x
file=$1 file=$1
[ -z "$file" ] && return 0 [ -z "$file" ] && return 0
while read m x; do while read m x; do
case $m in case $m in
\;*) continue ;; \;*) continue ;;
\#*) continue ;; \#*) continue ;;
*) _modules="$_modules $m" *) modules="$modules $m"
;; ;;
esac esac
done < $file done < $file
for x in $_modules; do for x in $modules; do
ebegin "Loading module $x" ebegin "Loading module $x"
case "$RC_UNAME" in case "$RC_UNAME" in
FreeBSD) kldload "$x"; rc=$? ;; FreeBSD) kldload "$x"; rc=$? ;;

View File

@@ -23,7 +23,7 @@ get_interfaces()
{ {
local ifname iftype local ifname iftype
for ifname in /sys/class/net/*; do for ifname in /sys/class/net/*; do
[ -h "${ifname}" ] || continue [ -h "${ifname}" ] && continue
read iftype < ${ifname}/type read iftype < ${ifname}/type
[ "$iftype" = "1" ] && printf "%s " ${ifname##*/} [ "$iftype" = "1" ] && printf "%s " ${ifname##*/}
done done

View File

@@ -42,8 +42,6 @@ start()
stop() stop()
{ {
yesno $RC_GOINGDOWN && return 0
ebegin "Disabling numlock on ttys" ebegin "Disabling numlock on ttys"
_setleds - _setleds -
eend $? "Failed to disable numlock" eend $? "Failed to disable numlock"

View File

@@ -17,15 +17,3 @@ depend()
{ {
provide clock provide clock
} }
start()
{
# This stub function is required to avoid OpenRC warning at boot:
#
# * The command variable is undefined.
# * There is nothing for osclock to start.
# * If this is what you intend, please write a start function.
# * This will become a failure in a future release.
#
return 0
}

View File

@@ -332,7 +332,7 @@ section below.
.Sh _pre AND _post FUNCTIONS .Sh _pre AND _post FUNCTIONS
Any command defined in extra_commands, extra_started_commands or Any command defined in extra_commands, extra_started_commands or
extra_stopped_commands can have _pre and _post functions in the service extra_stopped_commands can have _pre and _post functions in the service
script. If the command function is called foo, the _pre and _post script. If the command function is called foo, the_pre and _post
functions for it should be called foo_pre and foo_post. functions for it should be called foo_pre and foo_post.
.Pp .Pp
These functions should be used to perform preparation before the These functions should be used to perform preparation before the
@@ -461,7 +461,6 @@ Mark the service as inactive.
.Op Fl p , -pipe .Op Fl p , -pipe
.Op Fl m , -mode Ar mode .Op Fl m , -mode Ar mode
.Op Fl o , -owner Ar owner .Op Fl o , -owner Ar owner
.Op Fl s , -symlinks
.Op Fl W , -writable .Op Fl W , -writable
.Op Fl q , -quiet .Op Fl q , -quiet
.Ar path ... .Ar path ...
@@ -482,11 +481,6 @@ or with names, and are separated by a colon.
The truncate options (-D and -F) cause the directory or file to be The truncate options (-D and -F) cause the directory or file to be
cleared of all contents. cleared of all contents.
.Pp .Pp
If -s is not specified on a non-linux platform, checkpath will refuse to
allow non-terminal symbolic links to exist in the path. This is for
security reasons so that a non-root user can't create a symbolic link to
a root-owned file and take ownership of that file.
.Pp
If -W is specified, checkpath checks to see if the first path given on If -W is specified, checkpath checks to see if the first path given on
the command line is writable. This is different from how the test the command line is writable. This is different from how the test
command in the shell works, because it also checks to make sure the file command in the shell works, because it also checks to make sure the file

View File

@@ -65,29 +65,6 @@ Instead you should use
and and
.Xr shutdown 8 .Xr shutdown 8
and let them call these special runlevels. and let them call these special runlevels.
.Sh OPTIONS
.Pp
.Bl -tag -width "-o , --override"
.It Fl n , -no-stop
Do not stop any services.
.It Fl o , -override
Override the next runlevel to change into when leaving single user or boot
runlevels
.It Fl s , -service
Run the service specified with the rest of the arguments.
.It Fl S , -sys
Output the RC system type, if any.
.It Fl h , -help
Display usage information and exit.
.It Fl C , -nocolor
Disable color output.
.It Fl V , -version
Display software version.
.It Fl v , -verbose
Run verbosely.
.It Fl q , -quiet
Run quietly (repeat to suppress errors).
.El
.Sh SEE ALSO .Sh SEE ALSO
.Xr openrc-run 8 , .Xr openrc-run 8 ,
.Xr rc-status 8 , .Xr rc-status 8 ,

View File

@@ -120,7 +120,7 @@ Saves the pid of the daemon in the file specified by the
.Fl p , -pidfile .Fl p , -pidfile
option. Only useful when used with daemons that run in the foreground and option. Only useful when used with daemons that run in the foreground and
forced into the background with the forced into the background with the
.Fl b , -background .Fl -b , -background
option. option.
.It Fl I , -ionice Ar class Ns Op : Ns Ar data .It Fl I , -ionice Ar class Ns Op : Ns Ar data
Modifies the IO scheduling priority of the daemon. Modifies the IO scheduling priority of the daemon.

View File

@@ -37,8 +37,6 @@ servicename
.Ar count .Ar count
.Fl N , -nicelevel .Fl N , -nicelevel
.Ar level .Ar level
.Fl p , -pidfile
.Ar supervisorpidfile
.Fl P , -respawn-period .Fl P , -respawn-period
.Ar seconds .Ar seconds
.Fl R , -retry .Fl R , -retry
@@ -124,9 +122,6 @@ If respawn-period is also set, more than respawn-max crashes must occur
during respawn-period seconds to cause during respawn-period seconds to cause
.Nm .Nm
to give up and exit. to give up and exit.
.It Fl p , -pidfile Ar supervisorpidfile
Sets a path for the supervisor's pid file. Note that this is not the pid
file of the process that is being supervised.
.It Fl N , -nicelevel Ar level .It Fl N , -nicelevel Ar level
Modifies the scheduling priority of the daemon. Modifies the scheduling priority of the daemon.
.It Fl P , -respawn-period Ar seconds .It Fl P , -respawn-period Ar seconds

View File

@@ -52,12 +52,13 @@ ${SHLIB_NAME}: ${SOBJS}
${SOBJS} ${LDADD} ${SOBJS} ${LDADD}
install: all install: all
${INSTALL} -d ${DESTDIR}${LIBDIR}
ifeq (${MKSTATICLIBS},yes) ifeq (${MKSTATICLIBS},yes)
${INSTALL} -d ${DESTDIR}${LIBDIR}
${INSTALL} -m ${LIBMODE} lib${LIB}.a ${DESTDIR}${LIBDIR} ${INSTALL} -m ${LIBMODE} lib${LIB}.a ${DESTDIR}${LIBDIR}
endif endif
${INSTALL} -m ${LIBMODE} ${SHLIB_NAME} ${DESTDIR}${LIBDIR} ${INSTALL} -d ${DESTDIR}${SHLIBDIR}
ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK} ${INSTALL} -m ${LIBMODE} ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
ln -fs ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}/${SHLIB_LINK}
${INSTALL} -d ${DESTDIR}${INCDIR} ${INSTALL} -d ${DESTDIR}${INCDIR}
for x in ${INCS}; do ${INSTALL} -m ${INCMODE} $$x ${DESTDIR}${INCDIR}; done for x in ${INCS}; do ${INSTALL} -m ${INCMODE} $$x ${DESTDIR}${INCDIR}; done

View File

@@ -52,9 +52,9 @@ _LIBNAME:= $(shell ${_LIBNAME_SH})
LIBNAME?= ${_LIBNAME} LIBNAME?= ${_LIBNAME}
LIBDIR?= ${UPREFIX}/${LIBNAME} LIBDIR?= ${UPREFIX}/${LIBNAME}
LIBMODE?= 0644 LIBMODE?= 0644
SHLIBDIR?= ${PREFIX}/${LIBNAME}
LIBEXECDIR?= ${PREFIX}/libexec/rc LIBEXECDIR?= ${PREFIX}/libexec/rc
PKGCONFIGDIR?= ${UPREFIX}/${LIBNAME}/pkgconfig
MANPREFIX?= ${UPREFIX}/share MANPREFIX?= ${UPREFIX}/share
MANDIR?= ${MANPREFIX}/man MANDIR?= ${MANPREFIX}/man

View File

@@ -1,4 +1,4 @@
DIR= ${PKGCONFIGDIR} DIR= ${LIBDIR}/pkgconfig
SRCS= einfo.pc.in openrc.pc.in SRCS= einfo.pc.in openrc.pc.in
INC= einfo.pc openrc.pc INC= einfo.pc openrc.pc

View File

@@ -18,10 +18,9 @@ if [ -f /proc/acpi/ac_adapter/*/state ]; then
"state:"*"off-line") exit 128;; "state:"*"off-line") exit 128;;
esac esac
done done
elif [ -d /sys/class/power_supply ]; then elif [ -f /sys/class/power_supply/*/online ]; then
for dir in /sys/class/power_supply/*/; do cat /sys/class/power_supply/*/online | while read line; do
[ "$(cat "${dir}/type")" != "Mains" ] && continue [ "${line}" = 0 ] && exit 128
[ "$(cat "${dir}/online")" = 0 ] && exit 128
done done
elif [ -f /proc/pmu/info ]; then elif [ -f /proc/pmu/info ]; then
cat /proc/pmu/info | while read line; do cat /proc/pmu/info | while read line; do

View File

@@ -1,31 +1,14 @@
#!/bin/sh #!/bin/sh
do_halt=false shutdown_arg=
while getopts :akrhPHfFnct: opt; do while getopts :akrhPHfFnct: opt; do
case "$opt" in case "$opt" in
a) ;; a) ;;
k) ;; k) ;;
r) r) shutdown_arg=--reboot ;;
shutdown_arg=--reboot h) shutdown_arg=--halt ;;
;; P) shutdown_arg=--poweroff ;;
h) H) shutdown_arg=--halt ;;
do_halt=true
shutdown_arg=--poweroff
;;
P)
if ! ${do_halt}; then
printf "%s\n" "The -P flag requires the -h flag" >&2
exit 1
fi
shutdown_arg=--poweroff
;;
H)
if ! ${do_halt}; then
printf "%s\n" "The -H flag requires the -h flag" >&2
exit 1
fi
shutdown_arg=--halt
;;
f) ;; f) ;;
F) ;; F) ;;
n) ;; n) ;;
@@ -42,5 +25,5 @@ if [ -z "${shutdown_arg}" ]; then
shutdown_arg=--single shutdown_arg=--single
fi fi
printf "%s %s\n" "@SBINDIR@/openrc-shutdown ${shutdown_arg}" "$@" echo @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@"
exec @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@" exec @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@"

View File

@@ -29,9 +29,6 @@ apply_file() {
\;*) continue ;; \;*) continue ;;
esac esac
local reg=${line#*:}
[ -e /proc/sys/fs/binfmt_misc/${reg%%:*} ] && echo -1 > /proc/sys/fs/binfmt_misc/${reg%%:*}
echo "${line}" > /proc/sys/fs/binfmt_misc/register echo "${line}" > /proc/sys/fs/binfmt_misc/register
rc=$? rc=$?
if [ $rc -ne 0 ]; then if [ $rc -ne 0 ]; then

View File

@@ -20,7 +20,7 @@ service_present()
# succeed if $RC_SYS empty, can't check further, assume script will run # succeed if $RC_SYS empty, can't check further, assume script will run
[ -z "$RC_SYS" ] && return 0 [ -z "$RC_SYS" ] && return 0
# fail if file contains "-$RC_SYS", because then it won't run # fail if file contains "-$RC_SYS", because then it won't run
grep -Eqi "^[[:space:]]*keyword[[:space:]].*-$RC_SYS([[:space:]]|$)" "$p" && return 1 egrep -qi "^[[:space:]]*keyword[[:space:]].*-$RC_SYS\>" "$p" && return 1
# succeed otherwise # succeed otherwise
return 0 return 0
} }

View File

@@ -71,17 +71,20 @@ if [ "$sys" = VSERVER ]; then
rm -rf /run/* rm -rf /run/*
elif ! mountinfo -q /run; then elif ! mountinfo -q /run; then
ebegin "Mounting /run" ebegin "Mounting /run"
run_mount_opts="mode=0755,nosuid,nodev,nr_inodes=800k,size=20%,strictatime" rc=0
if ! fstabinfo --mount /run; then if ! fstabinfo --mount /run; then
if ! mount -t tmpfs -o ${run_mount_opts} tmpfs /run; then mount -t tmpfs -o mode=0755,nodev,size=10% tmpfs /run
eerror "Unable to mount tmpfs on /run." rc=$?
eerror "Can't continue." fi
exit 1 if [ $rc != 0 ]; then
fi eerror "Unable to mount tmpfs on /run."
eerror "Can't continue."
exit 1
fi fi
fi fi
checkpath -d "$RC_SVCDIR" [ -x /sbin/restorecon ] && /sbin/restorecon -rF /run
checkpath -d $RC_SVCDIR
checkpath -d -m 0775 -o root:uucp /run/lock checkpath -d -m 0775 -o root:uucp /run/lock
# Try to mount xenfs as early as possible, otherwise rc_sys() will always # Try to mount xenfs as early as possible, otherwise rc_sys() will always
@@ -99,5 +102,4 @@ if [ -e "$RC_LIBEXECDIR"/cache/softlevel ]; then
fi fi
echo sysinit >"$RC_SVCDIR"/softlevel echo sysinit >"$RC_SVCDIR"/softlevel
[ -x /sbin/restorecon ] && /sbin/restorecon -rF /run
exit 0 exit 0

View File

@@ -254,11 +254,8 @@ fi
for _cmd; do for _cmd; do
if [ "$_cmd" != status -a "$_cmd" != describe ]; then if [ "$_cmd" != status -a "$_cmd" != describe ]; then
# Apply any ulimit defined # Apply any ulimit defined
if [ -n "${rc_ulimit:-$RC_ULIMIT}" ]; then [ -n "${rc_ulimit:-$RC_ULIMIT}" ] && \
if ! ulimit ${rc_ulimit:-$RC_ULIMIT}; then ulimit ${rc_ulimit:-$RC_ULIMIT}
eerror "${RC_SVCNAME}: unable to apply RC_ULIMIT settings"
fi
fi
# Apply cgroups settings if defined # Apply cgroups settings if defined
if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ] if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ]
then then

View File

@@ -24,26 +24,18 @@ cgroup_find_path()
printf "%s" "${result}" printf "%s" "${result}"
} }
# This extracts all pids in a cgroup and puts them in the cgroup_pids
# variable.
# It is done this way to avoid subshells so we don't have to worry about
# locating the pid of the subshell in the cgroup.
# https://github.com/openrc/openrc/issues/396
cgroup_get_pids() cgroup_get_pids()
{ {
local cgroup_procs p local cgroup_procs p pids
cgroup_pids=
cgroup_procs="$(cgroup2_find_path)" cgroup_procs="$(cgroup2_find_path)"
if [ -n "${cgroup_procs}" ]; then [ -n "${cgroup_procs}" ] &&
cgroup_procs="${cgroup_procs}/${RC_SVCNAME}/cgroup.procs" cgroup_procs="${cgroup_procs}/${RC_SVCNAME}/cgroup.procs" ||
else
cgroup_procs="/sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks" cgroup_procs="/sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks"
fi
[ -f "${cgroup_procs}" ] || return 0 [ -f "${cgroup_procs}" ] || return 0
while read -r p; do while read -r p; do
[ "$p" -eq $$ ] && continue [ "$p" -eq $$ ] || pids="${pids} ${p}"
cgroup_pids="${cgroup_pids} ${p}"
done < "${cgroup_procs}" done < "${cgroup_procs}"
printf "%s" "${pids}"
return 0 return 0
} }
@@ -189,8 +181,7 @@ cgroup2_set_limits()
{ {
local cgroup_path local cgroup_path
cgroup_path="$(cgroup2_find_path)" cgroup_path="$(cgroup2_find_path)"
[ -z "${cgroup_path}" ] && return 0 [ -d "${cgroup_path}" ] || return 0
mountinfo -q "${cgroup_path}"|| return 0
rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}" rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}"
[ ! -d "${rc_cgroup_path}" ] && mkdir "${rc_cgroup_path}" [ ! -d "${rc_cgroup_path}" ] && mkdir "${rc_cgroup_path}"
[ -f "${rc_cgroup_path}"/cgroup.procs ] && [ -f "${rc_cgroup_path}"/cgroup.procs ] &&
@@ -201,7 +192,7 @@ cgroup2_set_limits()
[ -z "${value}" ] && continue [ -z "${value}" ] && continue
[ ! -f "${rc_cgroup_path}/${key}" ] && continue [ ! -f "${rc_cgroup_path}/${key}" ] && continue
veinfo "${RC_SVCNAME}: cgroups: setting ${key} to ${value}" veinfo "${RC_SVCNAME}: cgroups: setting ${key} to ${value}"
printf "%s" "${value}" > "${rc_cgroup_path}/${key}" printf "%s\n" "${value}" > "${rc_cgroup_path}/${key}"
done done
return 0 return 0
} }
@@ -209,29 +200,26 @@ cgroup2_set_limits()
cgroup_cleanup() cgroup_cleanup()
{ {
cgroup_running || return 0 cgroup_running || return 0
ebegin "Starting cgroups cleanup" ebegin "starting cgroups cleanup"
local loops=0 local pids loops=0
cgroup_get_pids pids="$(cgroup_get_pids)"
if [ -n "${cgroup_pids}" ]; then if [ -n "${pids}" ]; then
kill -s CONT ${cgroup_pids} 2> /dev/null kill -s CONT ${pids} 2> /dev/null
kill -s "${stopsig:-TERM}" ${cgroup_pids} 2> /dev/null kill -s "${stopsig:-TERM}" ${pids} 2> /dev/null
yesno "${rc_send_sighup:-no}" && yesno "${rc_send_sighup:-no}" &&
kill -s HUP ${cgroup_pids} 2> /dev/null kill -s HUP ${pids} 2> /dev/null
kill -s "${stopsig:-TERM}" ${cgroup_pids} 2> /dev/null kill -s "${stopsig:-TERM}" ${pids} 2> /dev/null
cgroup_get_pids while [ -n "$(cgroup_get_pids)" ] &&
while [ -n "${cgroup_pids}" ] &&
[ "${loops}" -lt "${rc_timeout_stopsec:-90}" ]; do [ "${loops}" -lt "${rc_timeout_stopsec:-90}" ]; do
loops=$((loops+1)) loops=$((loops+1))
sleep 1 sleep 1
cgroup_get_pids
done done
if [ -n "${cgroup_pids}" ] && yesno "${rc_send_sigkill:-yes}"; then pids="$(cgroup_get_pids)"
kill -s KILL ${cgroup_pids} 2> /dev/null [ -n "${pids}" ] && yesno "${rc_send_sigkill:-yes}" &&
fi kill -s KILL ${pids} 2> /dev/null
fi fi
cgroup2_remove cgroup2_remove
cgroup_get_pids [ -z "$(cgroup_get_pids)" ]
[ -z "${cgroup_pids}" ]
eend $? "Unable to stop all processes" eend $? "Unable to stop all processes"
return 0 return 0
} }

View File

@@ -160,7 +160,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
proc_ns[0] = '\0'; proc_ns[0] = '\0';
} }
free(buffer); free(buffer);
if (pid == 0 && strlen(my_ns) && strlen (proc_ns) && strcmp(my_ns, proc_ns)) if (strlen(my_ns) && strlen (proc_ns) && strcmp(my_ns, proc_ns))
continue; continue;
if (uid) { if (uid) {
xasprintf(&buffer, "/proc/%d", p); xasprintf(&buffer, "/proc/%d", p);

View File

@@ -481,8 +481,7 @@ rc_runlevel_exists(const char *runlevel)
char path[PATH_MAX]; char path[PATH_MAX];
struct stat buf; struct stat buf;
if (!runlevel || strcmp(runlevel, "") == 0 || strcmp(runlevel, ".") == 0 || if (!runlevel || strcmp(runlevel, ".") == 0 || strcmp(runlevel, "..") == 0)
strcmp(runlevel, "..") == 0)
return false; return false;
snprintf(path, sizeof(path), "%s/%s", RC_RUNLEVELDIR, runlevel); snprintf(path, sizeof(path), "%s/%s", RC_RUNLEVELDIR, runlevel);
if (stat(path, &buf) == 0 && S_ISDIR(buf.st_mode)) if (stat(path, &buf) == 0 && S_ISDIR(buf.st_mode))

View File

@@ -16,7 +16,6 @@
* except according to the terms contained in the LICENSE file. * except according to the terms contained in the LICENSE file.
*/ */
#define _GNU_SOURCE
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@@ -24,7 +23,6 @@
#include <fcntl.h> #include <fcntl.h>
#include <getopt.h> #include <getopt.h>
#include <grp.h> #include <grp.h>
#include <libgen.h>
#include <pwd.h> #include <pwd.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -46,7 +44,7 @@ typedef enum {
const char *applet = NULL; const char *applet = NULL;
const char *extraopts ="path1 [path2] [...]"; const char *extraopts ="path1 [path2] [...]";
const char *getoptstring = "dDfFpm:o:sW" getoptstring_COMMON; const char *getoptstring = "dDfFpm:o:W" getoptstring_COMMON;
const struct option longopts[] = { const struct option longopts[] = {
{ "directory", 0, NULL, 'd'}, { "directory", 0, NULL, 'd'},
{ "directory-truncate", 0, NULL, 'D'}, { "directory-truncate", 0, NULL, 'D'},
@@ -55,7 +53,6 @@ const struct option longopts[] = {
{ "pipe", 0, NULL, 'p'}, { "pipe", 0, NULL, 'p'},
{ "mode", 1, NULL, 'm'}, { "mode", 1, NULL, 'm'},
{ "owner", 1, NULL, 'o'}, { "owner", 1, NULL, 'o'},
{ "symlinks", 0, NULL, 's'},
{ "writable", 0, NULL, 'W'}, { "writable", 0, NULL, 'W'},
longopts_COMMON longopts_COMMON
}; };
@@ -67,119 +64,15 @@ const char * const longopts_help[] = {
"Create a named pipe (FIFO) if not exists", "Create a named pipe (FIFO) if not exists",
"Mode to check", "Mode to check",
"Owner to check (user:group)", "Owner to check (user:group)",
"follow symbolic links (irrelivent on linux)",
"Check whether the path is writable or not", "Check whether the path is writable or not",
longopts_help_COMMON longopts_help_COMMON
}; };
const char *usagestring = NULL; const char *usagestring = NULL;
static int get_dirfd(char *path, bool symlinks) {
char *ch;
char *item;
char *linkpath = NULL;
char *path_dupe;
char *str;
int components = 0;
int dirfd;
int flags = 0;
int new_dirfd;
struct stat st;
ssize_t linksize;
if (!path || *path != '/')
eerrorx("%s: empty or relative path", applet);
dirfd = openat(dirfd, "/", O_RDONLY);
if (dirfd == -1)
eerrorx("%s: unable to open the root directory: %s",
applet, strerror(errno));
ch = path;
while (*ch) {
if (*ch == '/')
components++;
ch++;
}
path_dupe = xstrdup(path);
item = strtok(path_dupe, "/");
#ifdef O_PATH
flags |= O_PATH;
#endif
if (!symlinks)
flags |= O_NOFOLLOW;
flags |= O_RDONLY;
while (dirfd > 0 && item && components > 1) {
str = xstrdup(linkpath ? linkpath : item);
new_dirfd = openat(dirfd, str, flags);
if (new_dirfd == -1)
eerrorx("%s: %s: could not open %s: %s", applet, path, str,
strerror(errno));
if (fstat(new_dirfd, &st) == -1)
eerrorx("%s: %s: unable to stat %s: %s", applet, path, item,
strerror(errno));
if (S_ISLNK(st.st_mode) ) {
if (st.st_uid != 0)
eerrorx("%s: %s: symbolic link %s not owned by root",
applet, path, str);
linksize = st.st_size+1;
if (linkpath)
free(linkpath);
linkpath = xmalloc(linksize);
memset(linkpath, 0, linksize);
if (readlinkat(new_dirfd, "", linkpath, linksize) != st.st_size)
eerrorx("%s: symbolic link destination changed", applet);
/*
* now follow the symlink.
*/
close(new_dirfd);
} else {
/* now walk down the directory path */
close(dirfd);
dirfd = new_dirfd;
free(linkpath);
linkpath = NULL;
item = strtok(NULL, "/");
components--;
}
}
free(path_dupe);
free(linkpath);
return dirfd;
}
static char *clean_path(char *path)
{
char *ch;
char *ch2;
char *str;
str = xmalloc(strlen(path));
ch = path;
ch2 = str;
while (true) {
*ch2 = *ch;
ch++;
ch2++;
if (!*(ch-1))
break;
while (*(ch - 1) == '/' && *ch == '/')
ch++;
}
/* get rid of trailing / characters */
while ((ch = strrchr(str, '/'))) {
if (ch == str)
break;
if (!*(ch+1))
*ch = 0;
else
break;
}
return str;
}
static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode, static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
inode_t type, bool trunc, bool chowner, bool symlinks, bool selinux_on) inode_t type, bool trunc, bool chowner, bool selinux_on)
{ {
struct stat st; struct stat st;
char *name = NULL;
int dirfd;
int fd; int fd;
int flags; int flags;
int r; int r;
@@ -200,16 +93,14 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
#endif #endif
if (trunc) if (trunc)
flags |= O_TRUNC; flags |= O_TRUNC;
xasprintf(&name, "%s", basename_c(path)); readfd = open(path, readflags);
dirfd = get_dirfd(path, symlinks);
readfd = openat(dirfd, name, readflags);
if (readfd == -1 || (type == inode_file && trunc)) { if (readfd == -1 || (type == inode_file && trunc)) {
if (type == inode_file) { if (type == inode_file) {
einfo("%s: creating file", path); einfo("%s: creating file", path);
if (!mode) /* 664 */ if (!mode) /* 664 */
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
u = umask(0); u = umask(0);
fd = openat(dirfd, name, flags, mode); fd = open(path, flags, mode);
umask(u); umask(u);
if (fd == -1) { if (fd == -1) {
eerror("%s: open: %s", applet, strerror(errno)); eerror("%s: open: %s", applet, strerror(errno));
@@ -224,14 +115,14 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH; mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
u = umask(0); u = umask(0);
/* We do not recursively create parents */ /* We do not recursively create parents */
r = mkdirat(dirfd, name, mode); r = mkdir(path, mode);
umask(u); umask(u);
if (r == -1 && errno != EEXIST) { if (r == -1 && errno != EEXIST) {
eerror("%s: mkdirat: %s", applet, eerror("%s: mkdir: %s", applet,
strerror (errno)); strerror (errno));
return -1; return -1;
} }
readfd = openat(dirfd, name, readflags); readfd = open(path, readflags);
if (readfd == -1) { if (readfd == -1) {
eerror("%s: unable to open directory: %s", applet, eerror("%s: unable to open directory: %s", applet,
strerror(errno)); strerror(errno));
@@ -249,7 +140,7 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
strerror (errno)); strerror (errno));
return -1; return -1;
} }
readfd = openat(dirfd, name, readflags); readfd = open(path, readflags);
if (readfd == -1) { if (readfd == -1) {
eerror("%s: unable to open fifo: %s", applet, eerror("%s: unable to open fifo: %s", applet,
strerror(errno)); strerror(errno));
@@ -368,10 +259,8 @@ int main(int argc, char **argv)
int retval = EXIT_SUCCESS; int retval = EXIT_SUCCESS;
bool trunc = false; bool trunc = false;
bool chowner = false; bool chowner = false;
bool symlinks = false;
bool writable = false; bool writable = false;
bool selinux_on = false; bool selinux_on = false;
char *path = NULL;
applet = basename_c(argv[0]); applet = basename_c(argv[0]);
while ((opt = getopt_long(argc, argv, getoptstring, while ((opt = getopt_long(argc, argv, getoptstring,
@@ -404,11 +293,6 @@ int main(int argc, char **argv)
eerrorx("%s: owner `%s' not found", eerrorx("%s: owner `%s' not found",
applet, optarg); applet, optarg);
break; break;
case 's':
#ifndef O_PATH
symlinks = true;
#endif
break;
case 'W': case 'W':
writable = true; writable = true;
break; break;
@@ -434,14 +318,11 @@ int main(int argc, char **argv)
selinux_on = true; selinux_on = true;
while (optind < argc) { while (optind < argc) {
path = clean_path(argv[optind]);
if (writable) if (writable)
exit(!is_writable(path)); exit(!is_writable(argv[optind]));
if (do_check(path, uid, gid, mode, type, trunc, chowner, if (do_check(argv[optind], uid, gid, mode, type, trunc, chowner, selinux_on))
symlinks, selinux_on))
retval = EXIT_FAILURE; retval = EXIT_FAILURE;
optind++; optind++;
free(path);
} }
if (selinux_on) if (selinux_on)

View File

@@ -207,12 +207,6 @@ static void signal_handler(int sig)
case SIGINT: case SIGINT:
handle_shutdown("reboot", RB_AUTOBOOT); handle_shutdown("reboot", RB_AUTOBOOT);
break; break;
case SIGTERM:
#ifdef SIGPWR
case SIGPWR:
#endif
handle_shutdown("shutdown", RB_HALT_SYSTEM);
break;
case SIGCHLD: case SIGCHLD:
reap_zombies(); reap_zombies();
break; break;
@@ -275,10 +269,6 @@ int main(int argc, char **argv)
sigfillset(&signals); sigfillset(&signals);
sigdelset(&signals, SIGCHLD); sigdelset(&signals, SIGCHLD);
sigdelset(&signals, SIGINT); sigdelset(&signals, SIGINT);
sigdelset(&signals, SIGTERM);
#ifdef SIGPWR
sigdelset(&signals, SIGPWR);
#endif
sigprocmask(SIG_SETMASK, &signals, NULL); sigprocmask(SIG_SETMASK, &signals, NULL);
/* install signal handler */ /* install signal handler */
@@ -286,10 +276,6 @@ int main(int argc, char **argv)
sa.sa_handler = signal_handler; sa.sa_handler = signal_handler;
sigaction(SIGCHLD, &sa, NULL); sigaction(SIGCHLD, &sa, NULL);
sigaction(SIGINT, &sa, NULL); sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
#ifdef SIGPWR
sigaction(SIGPWR, &sa, NULL);
#endif
reboot(RB_DISABLE_CAD); reboot(RB_DISABLE_CAD);
/* set default path */ /* set default path */

View File

@@ -72,7 +72,7 @@ const char *usagestring = "" \
"Usage: openrc-shutdown -c | --cancel\n" \ "Usage: openrc-shutdown -c | --cancel\n" \
" or: openrc-shutdown -R | --reexec\n" \ " or: openrc-shutdown -R | --reexec\n" \
" or: openrc-shutdown -w | --write-only\n" \ " or: openrc-shutdown -w | --write-only\n" \
" or: openrc-shutdown -H | --halt time\n" \ " or: openmrc-shutdown -H | --halt time\n" \
" or: openrc-shutdown -K | --kexec time\n" \ " or: openrc-shutdown -K | --kexec time\n" \
" or: openrc-shutdown -p | --poweroff time\n" \ " or: openrc-shutdown -p | --poweroff time\n" \
" or: openrc-shutdown -r | --reboot time\n" \ " or: openrc-shutdown -r | --reboot time\n" \

View File

@@ -13,8 +13,8 @@
#ifndef RC_LOGGER_H #ifndef RC_LOGGER_H
#define RC_LOGGER_H #define RC_LOGGER_H
extern pid_t rc_logger_pid; pid_t rc_logger_pid;
extern int rc_logger_tty; int rc_logger_tty;
extern bool rc_in_logger; extern bool rc_in_logger;
void rc_logger_open(const char *runlevel); void rc_logger_open(const char *runlevel);

View File

@@ -291,10 +291,9 @@ int main(int argc, char **argv)
goto exit; goto exit;
/* NOTREACHED */ /* NOTREACHED */
case 'f': case 'f':
if (strcasecmp(optarg, "ini") == 0) { if (strcasecmp(optarg, "ini") == 0)
format = FORMAT_INI; format = FORMAT_INI;
setenv("EINFO_QUIET", "YES", 1); else
} else
eerrorx("%s: invalid argument to --format switch\n", applet); eerrorx("%s: invalid argument to --format switch\n", applet);
break; break;
case 'l': case 'l':

View File

@@ -389,11 +389,10 @@ int main(int argc, char **argv)
/* falls through */ /* falls through */
case 'u': /* --user <username>|<uid> */ case 'u': /* --user <username>|<uid> */
{ {
char dummy[2];
p = optarg; p = optarg;
tmp = strsep(&p, ":"); tmp = strsep(&p, ":");
changeuser = xstrdup(tmp); changeuser = xstrdup(tmp);
if (sscanf(tmp, "%d%1s", &tid, dummy) != 1) if (sscanf(tmp, "%d", &tid) != 1)
pw = getpwnam(tmp); pw = getpwnam(tmp);
else else
pw = getpwuid((uid_t)tid); pw = getpwuid((uid_t)tid);
@@ -414,7 +413,7 @@ int main(int argc, char **argv)
if (p) { if (p) {
tmp = strsep (&p, ":"); tmp = strsep (&p, ":");
if (sscanf(tmp, "%d%1s", &tid, dummy) != 1) if (sscanf(tmp, "%d", &tid) != 1)
gr = getgrnam(tmp); gr = getgrnam(tmp);
else else
gr = getgrgid((gid_t) tid); gr = getgrgid((gid_t) tid);
@@ -629,7 +628,7 @@ int main(int argc, char **argv)
} }
if (start && !exists(exec_file)) { if (start && !exists(exec_file)) {
eerror("%s: %s does not exist", applet, eerror("%s: %s does not exist", applet,
exec_file ? exec_file : exec); *exec_file ? exec_file : exec);
free(exec_file); free(exec_file);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -864,8 +863,8 @@ int main(int argc, char **argv)
TAILQ_FOREACH(env, env_list, entries) { TAILQ_FOREACH(env, env_list, entries) {
if ((strncmp(env->value, "RC_", 3) == 0 && if ((strncmp(env->value, "RC_", 3) == 0 &&
strncmp(env->value, "RC_SERVICE=", 11) != 0 && strncmp(env->value, "RC_SERVICE=", 10) != 0 &&
strncmp(env->value, "RC_SVCNAME=", 11) != 0) || strncmp(env->value, "RC_SVCNAME=", 10) != 0) ||
strncmp(env->value, "SSD_NICELEVEL=", 14) == 0 || strncmp(env->value, "SSD_NICELEVEL=", 14) == 0 ||
strncmp(env->value, "SSD_IONICELEVEL=", 16) == 0) strncmp(env->value, "SSD_IONICELEVEL=", 16) == 0)
{ {

View File

@@ -148,7 +148,6 @@ static char *fifopath = NULL;
static int fifo_fd = 0; static int fifo_fd = 0;
static char *pidfile = NULL; static char *pidfile = NULL;
static char *svcname = NULL; static char *svcname = NULL;
static bool verbose = false;
extern char **environ; extern char **environ;
@@ -421,8 +420,8 @@ static void child_process(char *exec, char **argv)
TAILQ_FOREACH(env, env_list, entries) { TAILQ_FOREACH(env, env_list, entries) {
if ((strncmp(env->value, "RC_", 3) == 0 && if ((strncmp(env->value, "RC_", 3) == 0 &&
strncmp(env->value, "RC_SERVICE=", 11) != 0 && strncmp(env->value, "RC_SERVICE=", 10) != 0 &&
strncmp(env->value, "RC_SVCNAME=", 11) != 0) || strncmp(env->value, "RC_SVCNAME=", 10) != 0) ||
strncmp(env->value, "SSD_NICELEVEL=", 14) == 0) strncmp(env->value, "SSD_NICELEVEL=", 14) == 0)
{ {
p = strchr(env->value, '='); p = strchr(env->value, '=');
@@ -570,8 +569,7 @@ static void supervisor(char *exec, char **argv)
buf[count] = 0; buf[count] = 0;
if (count == 0) if (count == 0)
continue; continue;
if (verbose) syslog(LOG_DEBUG, "Received %s from fifo", buf);
syslog(LOG_DEBUG, "Received %s from fifo", buf);
if (strncasecmp(buf, "sig", 3) == 0) { if (strncasecmp(buf, "sig", 3) == 0) {
if ((sscanf(buf, "%s %d", cmd, &sig_send) == 2) if ((sscanf(buf, "%s %d", cmd, &sig_send) == 2)
&& (sig_send >= 0 && sig_send < NSIG)) { && (sig_send >= 0 && sig_send < NSIG)) {
@@ -587,8 +585,7 @@ static void supervisor(char *exec, char **argv)
if (do_healthcheck) { if (do_healthcheck) {
do_healthcheck = 0; do_healthcheck = 0;
alarm(0); alarm(0);
if (verbose) syslog(LOG_DEBUG, "running health check for %s", svcname);
syslog(LOG_DEBUG, "running health check for %s", svcname);
health_pid = exec_command("healthcheck"); health_pid = exec_command("healthcheck");
health_status = rc_waitpid(health_pid); health_status = rc_waitpid(health_pid);
if (WIFEXITED(health_status) && WEXITSTATUS(health_status) == 0) if (WIFEXITED(health_status) && WEXITSTATUS(health_status) == 0)
@@ -648,8 +645,6 @@ static void supervisor(char *exec, char **argv)
ts.tv_sec = respawn_delay; ts.tv_sec = respawn_delay;
ts.tv_nsec = 0; ts.tv_nsec = 0;
nanosleep(&ts, NULL); nanosleep(&ts, NULL);
if (exiting)
continue;
child_pid = fork(); child_pid = fork();
if (child_pid == -1) { if (child_pid == -1) {
syslog(LOG_ERR, "%s: fork: %s", applet, strerror(errno)); syslog(LOG_ERR, "%s: fork: %s", applet, strerror(errno));
@@ -857,11 +852,10 @@ int main(int argc, char **argv)
case 'u': /* --user <username>|<uid> */ case 'u': /* --user <username>|<uid> */
{ {
char dummy[2];
p = optarg; p = optarg;
tmp = strsep(&p, ":"); tmp = strsep(&p, ":");
changeuser = xstrdup(tmp); changeuser = xstrdup(tmp);
if (sscanf(tmp, "%d%1s", &tid, dummy) != 1) if (sscanf(tmp, "%d", &tid) != 1)
pw = getpwnam(tmp); pw = getpwnam(tmp);
else else
pw = getpwuid((uid_t)tid); pw = getpwuid((uid_t)tid);
@@ -882,7 +876,7 @@ int main(int argc, char **argv)
if (p) { if (p) {
tmp = strsep (&p, ":"); tmp = strsep (&p, ":");
if (sscanf(tmp, "%d%1s", &tid, dummy) != 1) if (sscanf(tmp, "%d", &tid) != 1)
gr = getgrnam(tmp); gr = getgrnam(tmp);
else else
gr = getgrgid((gid_t) tid); gr = getgrgid((gid_t) tid);
@@ -910,7 +904,6 @@ int main(int argc, char **argv)
case_RC_COMMON_GETOPT case_RC_COMMON_GETOPT
} }
verbose = rc_yesno(getenv ("EINFO_VERBOSE"));
endpwent(); endpwent();
argc -= optind; argc -= optind;
argv += optind; argv += optind;
@@ -990,7 +983,7 @@ int main(int argc, char **argv)
} }
if (!exists(exec_file)) { if (!exists(exec_file)) {
eerror("%s: %s does not exist", applet, eerror("%s: %s does not exist", applet,
exec_file ? exec_file : exec); *exec_file ? exec_file : exec);
free(exec_file); free(exec_file);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -85,8 +85,8 @@ runlevel; this will start and stop services as needed.
Managing runlevels is usually done through the `rc-update` helper, but could of Managing runlevels is usually done through the `rc-update` helper, but could of
course be done by hand if desired. course be done by hand if desired.
e.g. `rc-update add nginx default` - add nginx to the default runlevel e.g. `rc-update add nginx default` - add nginx to the default runlevel
Note: `rc-update` will not start nginx! You'd still have to trigger `rc`, or run Note: This will not auto-start nginx! You'd still have to trigger `rc` or run
the service script by hand, or start it with `rc-service nginx start`. the service script by hand.
FIXME: Document stacked runlevels FIXME: Document stacked runlevels
@@ -107,7 +107,7 @@ START_OPTS="--extraparameter sausage"
init.d/foo: init.d/foo:
start() { start() {
/usr/sbin/foo-daemon ${START_OPTS} /usr/sbin/foo-daemon ${STARTOPTS}
} }
``` ```
@@ -137,7 +137,7 @@ Setting `ulimit` and `nice` values per service can be done through the
Under Linux, OpenRC can use cgroups for process management as well. Once Under Linux, OpenRC can use cgroups for process management as well. Once
the kernel is configured appropriately, the `rc_cgroup_mode` setting in the kernel is configured appropriately, the `rc_cgroup_mode` setting in
/etc/rc.conf should be used to control whether cgroups version one, /etc/rc.conf should be used to control whether cgroups version one,,
two, or both are used. The default is to use both if they are available. two, or both are used. The default is to use both if they are available.
By changing certain settings in the service's `conf.d` file limits can be By changing certain settings in the service's `conf.d` file limits can be