Compare commits

..

3 Commits

Author SHA1 Message Date
William Hubbs
454e09d1d6 Update ChangeLog 2015-05-06 09:28:34 -05:00
Jakob Drexel
1969be04e5 librc: Fix crash if the service name is the same as the including runlevel
If a service has the same name as the runlevel it is in, openrc will
crash on changing to such runlevel. It goes in a recursive madness and
eventually gets a SEGV while in snprintf (don't know why).

This fixes two errors:
1. ls_dir stats files not with full path -> stat always returns != 0
2. ls_dir adds files to list if stat failed

This fixes #53.

X-Gentoo-Bug: 537304
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=537304
2015-05-06 09:18:09 -05:00
William Hubbs
ae60393561 Start work on 0.15.1 2015-05-06 09:16:11 -05:00
51 changed files with 1267 additions and 1742 deletions

1542
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
NAME= openrc NAME= openrc
VERSION= 0.19.1 VERSION= 0.15.1
PKG= ${NAME}-${VERSION} PKG= ${NAME}-${VERSION}

46
NEWS.md
View File

@@ -3,52 +3,6 @@
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.19
This version adds a net-online service. By default, this
service will check all known network interfaces for a configured
interface or a carrier. It will register as started only when all
interfaces are configured and there is at least a carrier on one
interface. The behaviour of this service can be modified in
/etc/conf.d/net-online.
Currently, this only works on Linux, but if anyone wants to port to
*bsd, that would be welcomed.
## OpenRC-0.18.3
Modern Linux systems expect /etc/mtab to be a symbolic link to
/proc/self/mounts. Reasons for this change include support for mount
namespaces, which will not work if /etc/mtab is a file.
By default, the mtab service enforces this on each reboot.
If you find that this breaks your system in some way, please do the
following:
- Set mtab_is_file=yes in /etc/conf.d/mtab.
- Restart mtab. This will recreate the /etc/mtab file.
- Check for an issue on https://github.com/openrc/openrc/issues
explaining why you need /etc/mtab to be a file. If there isn't one,
please open one and explain in detail why you need this to be a file.
If there is one, please add your comments to it. Please give concrete
examples of why it is important that /etc/mtab be a file instead of a
symbolic link. Those comments will be taken into consideration for how
long to keep supporting mtab as a file or when the support can be
removed.
## OpenRC-0.18
The behaviour of localmount and netmount in this version is changing. In
the past, these services always started successfully. In this version,
they will be able to fail if file systems they mount fail to mount. If
you have file systems listed in fstab which should not be mounted at
boot time, make sure to add noauto to the mount options. If you have
file systems that you want to attempt to mount at boot time but failure
should be allowed, add nofail to the mount options for these file
systems in fstab.
## OpenRC-0.14 ## OpenRC-0.14
The binfmt service, which registers misc binary formats with the Linux The binfmt service, which registers misc binary formats with the Linux

View File

@@ -15,8 +15,7 @@ include ${MK}/os.mk
CONF-FreeBSD= ipfw moused powerd rarpd savecore syscons CONF-FreeBSD= ipfw moused powerd rarpd savecore syscons
CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules mtab \ CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules
net-online
CONF-NetBSD= moused rarpd savecore CONF-NetBSD= moused rarpd savecore

View File

@@ -8,8 +8,3 @@ wipe_tmp="YES"
# Write the initial dmesg log into /var/log/dmesg after boot # Write the initial dmesg log into /var/log/dmesg after boot
# This may be useful if you need the kernel boot log afterwards # This may be useful if you need the kernel boot log afterwards
log_dmesg="YES" log_dmesg="YES"
# Save the previous dmesg log to dmesc.old
# This may be useful if you need to compare the current boot to the
# previous one.
#previous_dmesg=no

View File

@@ -1,5 +0,0 @@
# This setting controls whether /etc/mtab is a file or symbolic link.
# Most of the time, you shouldn't touch this. However, if the default
# breaks your system in some way, please see the NEWS.md file that comes
# with OpenRC for the actions to take.
# mtab_is_file=no

View File

@@ -1,15 +0,0 @@
# The interfaces setting controls which interfaces the net-online
# service considers in deciding whether the network is active. By
# default, it is all ethernet or wireless LAN interfaces.
#interfaces=""
# This setting controls whether a ping to the default gateway is
# included in the test for network connectivity after all interfaces
# are active.
#ping_default_gateway=no
# The timeout setting controls how long the net-online service waits
# for the network to be configured.
# The default is 120 seconds.
# if this is set to 0, the wait is infinite.
#timeout=120

View File

@@ -25,11 +25,11 @@
#rc_need="net.eth1 net.eth2" #rc_need="net.eth1 net.eth2"
# #
# If you are using a dynamic network management tool like # If you are using a dynamic network management tool like
# NetworkManager, dhcpcd in standalone mode, wicd, badvpn-ncd, etc, to # networkmanager, dhcpcd in standalone mode, wicd, badvpn-ncd, etc, to
# manage the network interfaces with the routes to your netmounts, you # manage the network interfaces with the routes to your netmounts, you
# should list that tool. # should list that tool.
# #
#rc_need="NetworkManager" #rc_need="networkmanager"
#rc_need="dhcpcd" #rc_need="dhcpcd"
#rc_need="wicd" #rc_need="wicd"
# #

View File

@@ -3,11 +3,9 @@
# This is the subsystem type. Valid options on Linux: # This is the subsystem type. Valid options on Linux:
# "" - nothing special # "" - nothing special
# "docker" - Docker container manager
# "lxc" - Linux Containers # "lxc" - Linux Containers
# "openvz" - Linux OpenVZ # "openvz" - Linux OpenVZ
# "prefix" - Prefix # "prefix" - Prefix
# "rkt" - CoreOS container management system
# "uml" - Usermode Linux # "uml" - Usermode Linux
# "vserver" - Linux vserver # "vserver" - Linux vserver
# "systemd-nspawn" - Container created by the systemd-nspawn utility # "systemd-nspawn" - Container created by the systemd-nspawn utility
@@ -64,21 +62,12 @@ rc_tty_number=12
# Set the devices controller settings for this service. # Set the devices controller settings for this service.
#rc_cgroup_devices="" #rc_cgroup_devices=""
# Set the hugetlb controller settings for this service.
#rc_cgroup_hugetlb=""
# Set the memory controller settings for this service. # Set the memory controller settings for this service.
#rc_cgroup_memory="" #rc_cgroup_memory=""
# Set the net_cls controller settings for this service.
#rc_cgroup_net_cls=""
# Set the net_prio controller settings for this service. # Set the net_prio controller settings for this service.
#rc_cgroup_net_prio="" #rc_cgroup_net_prio=""
# Set the pids controller settings for this service.
#rc_cgroup_pids=""
# Set this to YES if yu want all of the processes in a service's cgroup # Set this to YES if yu want all of the processes in a service's cgroup
# killed when the service is stopped or restarted. # killed when the service is stopped or restarted.
# This should not be set globally because it kills all of the service's # This should not be set globally because it kills all of the service's

View File

@@ -29,20 +29,17 @@
# come up. # come up.
#rc_depend_strict="YES" #rc_depend_strict="YES"
# rc_hotplug controls which services we allow to be hotplugged. # rc_hotplug is a list of services that we allow to be hotplugged.
# By default we do not allow hotplugging.
# A hotplugged service is one started by a dynamic dev manager when a matching # A hotplugged service is one started by a dynamic dev manager when a matching
# hardware device is found. # hardware device is found.
# Hotplugged services appear in the "hotplugged" runlevel. # This service is intrinsically included in the boot runlevel.
# If rc_hotplug is set to any value, we compare the name of this service # To disable services, prefix with a !
# to every pattern in the value, from left to right, and we allow the
# service to be hotplugged if it matches a pattern, or if it matches no
# patterns. Patterns can include shell wildcards.
# To disable services from being hotplugged, prefix patterns with "!".
#If rc_hotplug is not set or is empty, all hotplugging is disabled.
# Example - rc_hotplug="net.wlan !net.*" # Example - rc_hotplug="net.wlan !net.*"
# This allows net.wlan and any service not matching net.* to be hotplugged. # This allows net.wlan and any service not matching net.* to be plugged.
# Example - rc_hotplug="!net.*" # Example - rc_hotplug="*"
# This allows services that do not match "net.*" to be hotplugged. # This allows all services to be hotplugged
#rc_hotplug="*"
# rc_logger launches a logging daemon to log the entire rc process to # rc_logger launches a logging daemon to log the entire rc process to
# /var/log/rc.log # /var/log/rc.log
@@ -119,9 +116,6 @@
#SSD_NICELEVEL="-19" #SSD_NICELEVEL="-19"
# Pass ulimit parameters # Pass ulimit parameters
# If you are using bash in POSIX mode for your shell, note that the
# ulimit command uses a block size of 512 bytes for the -c and -f
# options
#rc_ulimit="-u 30" #rc_ulimit="-u 30"
# It's possible to define extra dependencies for services like so # It's possible to define extra dependencies for services like so

View File

@@ -3,7 +3,7 @@ include ../mk/net.mk
DIR= ${INITDIR} DIR= ${INITDIR}
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \ SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \
netmount.in osclock.in root.in savecache.in swap.in swapfiles.in \ netmount.in osclock.in root.in savecache.in swap.in swapfiles.in \
tmpfiles.setup.in swclock.in sysctl.in urandom.in s6-svscan.in ${SRCS-${OS}} tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
BIN= ${OBJS} BIN= ${OBJS}
# Are we installing our network scripts? # Are we installing our network scripts?
@@ -23,7 +23,7 @@ SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
SRCS-Linux= binfmt.in devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \ SRCS-Linux= binfmt.in devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
killprocs.in modules.in mount-ro.in mtab.in numlock.in \ killprocs.in modules.in mount-ro.in mtab.in numlock.in \
procfs.in net-online.in sysfs.in termencoding.in tmpfiles.dev.in procfs.in sysfs.in termencoding.in tmpfiles.dev.in
# Generic BSD scripts # Generic BSD scripts
SRCS-NetBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \ SRCS-NetBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \

View File

@@ -16,5 +16,5 @@ start()
ebegin "Loading custom binary format handlers" ebegin "Loading custom binary format handlers"
"$RC_LIBEXECDIR"/sh/binfmt.sh "$RC_LIBEXECDIR"/sh/binfmt.sh
eend $? eend $?
return 0 return 0
} }

View File

@@ -121,11 +121,11 @@ clean_run()
local dir local dir
# If / is still read-only due to a problem, this will fail! # If / is still read-only due to a problem, this will fail!
if ! checkpath -W /; then if ! checkpath -W /; then
ewarn "/ is not writable; unable to clean up underlying /run" eerror "/ is not writable; unable to clean up underlying /run"
return 1 return 1
fi fi
if ! checkpath -W /tmp; then if ! checkpath -W /tmp; then
ewarn "/tmp is not writable; unable to clean up underlying /run" eerror "/tmp is not writable; unable to clean up underlying /run"
return 1 return 1
fi fi
# Now we know that we can modify /tmp and / # Now we know that we can modify /tmp and /
@@ -136,12 +136,13 @@ clean_run()
dir=$(mktemp -d) dir=$(mktemp -d)
if [ -n "$dir" -a -d $dir -a -w $dir ]; then if [ -n "$dir" -a -d $dir -a -w $dir ]; then
mount --bind / $dir && rm -rf $dir/run/* || rc=1 mount --bind / $dir && rm -rf $dir/run/* || rc=1
umount $dir && rmdir $dir umount $dir
rm -rf $dir
else else
rc=1 rc=1
fi fi
if [ $rc -ne 0 ]; then if [ $rc -ne 0 ]; then
ewarn "Could not clean up underlying /run on /" eerror "Could not clean up underlying /run on /"
return 1 return 1
fi fi
} }
@@ -213,16 +214,10 @@ start()
if yesno $log_dmesg; then if yesno $log_dmesg; then
if $logw || checkpath -W /var/log; then if $logw || checkpath -W /var/log; then
# Create an 'after-boot' dmesg log # Create an 'after-boot' dmesg log
case "$RC_SYS" in if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ -a "$RC_SYS" != LXC ]; then
VSERVER|OPENVZ|LXC|SYSTEMD-NSPAWN) ;; dmesg > /var/log/dmesg
*) chmod 640 /var/log/dmesg
if yesno ${previous_dmesg:-no}; then fi
mv /var/log/dmesg /var/log/dmesg.old
fi
dmesg > /var/log/dmesg
chmod 640 /var/log/dmesg
;;
esac
fi fi
fi fi

View File

@@ -7,7 +7,7 @@ description="Sets a font for the consoles."
depend() depend()
{ {
need localmount termencoding need localmount termencoding
after hotplug bootmisc modules after hotplug bootmisc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
} }

View File

@@ -15,7 +15,7 @@ depend()
start() start()
{ {
# Mount local filesystems in /etc/fstab. # Mount local filesystems in /etc/fstab.
local types="noproc" x= no_netdev= rc= local types="noproc" x= no_netdev=
for x in $net_fs_list $extra_net_fs_list; do for x in $net_fs_list $extra_net_fs_list; do
types="${types},no${x}" types="${types},no${x}"
done done
@@ -29,11 +29,9 @@ start()
ebegin "Mounting local filesystems" ebegin "Mounting local filesystems"
mount -at "$types" $no_netdev mount -at "$types" $no_netdev
eend $? "Some local filesystem failed to mount" eend $? "Some local filesystem failed to mount"
rc=$?
if [ "$RC_UNAME" != Linux ]; then # Always return 0 - some local mounts may not be critical for boot
rc=0 return 0
fi
return $rc
} }
stop() stop()
@@ -72,19 +70,17 @@ stop()
sync sync
fi fi
local aufs_branch aufs_mount_point aufs_si_id aufs_br_id branches local aufs_branch aufs_mount_dir aufs_mount_point aufs_si_dir aufs_si_id
for aufs_si_dir in /sys/fs/aufs/si*; do for aufs_si_dir in /sys/fs/aufs/*; do
[ -d "${aufs_si_dir}" ] || continue aufs_mount_dir=${aufs_si_dir#/sys/fs/aufs/}
aufs_si_id="si=${aufs_si_dir#/sys/fs/aufs/si_}" aufs_si_id="$(printf "%s" $aufs_mount_dir | sed 's/_/=/g')"
aufs_mount_point="$(mountinfo -o ${aufs_si_id})" aufs_mount_point="$(mountinfo -o ${aufs_si_id})"
branches="$aufs_si_dir/br[0-9] $aufs_si_dir/br[0-9][0-9] $aufs_si_dir/br[0-9][0-9][0-9]" for x in $aufs_si_dir/br[0-9][0-9][0-9]; do
for x in $branches; do
[ -e "${x}" ] || continue
aufs_branch=$(sed 's/=.*//g' $x) aufs_branch=$(sed 's/=.*//g' $x)
eindent eindent
if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then
ewarn "Failed to remove branch $aufs_branch from aufs \ ewarn "Failed to remove branch $aufs_branch from aufs \
$aufs_mount_point" $aufs_mount_point"
fi fi
eoutdent eoutdent
sync sync

View File

@@ -12,19 +12,21 @@ depend()
start() start()
{ {
[ -L /etc/mtab ] && return 0
local rc=0 local rc=0
ebegin "Updating /etc/mtab" ebegin "Updating /etc/mtab"
if ! checkpath -W /etc; then if ! checkpath -W /etc; then
rc=1 rc=1
elif ! yesno ${mtab_is_file:-no}; then elif [ ! -e /etc/mtab ]; then
[ ! -L /etc/mtab ] && [ -f /etc/mtab ] &&
ewarn "Removing /etc/mtab file"
einfo "Creating mtab symbolic link"
ln -snf /proc/self/mounts /etc/mtab ln -snf /proc/self/mounts /etc/mtab
else else
[ -L /etc/mtab ] && ewarn "Removing /etc/mtab symbolic link" ewarn "The support for updating /etc/mtab as a file is"
rm -f /etc/mtab ewarn "deprecated and will be removed in the future."
einfo "Creating mtab file" ewarn "Please run the following command as root on your system."
ewarn
ewarn "ln -snf /proc/self/mounts /etc/mtab"
ewarn
# With / as tmpfs we cannot umount -at tmpfs in localmount as that # With / as tmpfs we cannot umount -at tmpfs in localmount as that
# makes / readonly and dismounts all tmpfs even if in use which is # makes / readonly and dismounts all tmpfs even if in use which is
# not good. Luckily, umount uses /etc/mtab instead of /proc/mounts # not good. Luckily, umount uses /etc/mtab instead of /proc/mounts

View File

@@ -1,69 +0,0 @@
#!@SBINDIR@/openrc-run
# Copyright (C) 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
description="Delays until the network is online or a specific timeout"
depend()
{
after modules
need sysfs
keyword -jail -lxc -openvz -prefix -systemd-nspawn -uml -vserver
}
get_interfaces()
{
local ifname iftype
for ifname in /sys/class/net/*; do
read iftype < ${ifname}/type
[ "$iftype" = "1" ] && printf "%s " ${ifname##*/}
done
}
get_default_gateway()
{
local cmd gateway
if command -v ip > /dev/null 2>&1; then
cmd="ip route show"
else
cmd=route
fi
set -- $($cmd | grep default)
[ "$2" != via ] && gateway="$2" || gateway="$3"
printf "%s" $gateway
}
start ()
{
local carriers configured dev gateway ifcount infinite interfaces
local rc state timeout x
ebegin "Checking to see if the network is online"
rc=0
interfaces=${interfaces:-$(get_interfaces)}
timeout=${timeout:-120}
[ $timeout -eq 0 ] && infinite=true || infinite=false
while $infinite || [ $timeout -gt 0 ]; do
carriers=0
configured=0
ifcount=0
for dev in ${interfaces}; do
: $((ifcount += 1))
read x < /sys/class/net/$dev/carrier
[ $x -eq 1 ] && : $((carriers += 1))
read x < /sys/class/net/$dev/operstate
[ "$x" = up ] && : $((configured += 1))
done
[ $configured -eq $ifcount ] && [ $carriers -ge 1 ] && break
sleep 1
: $((timeout -= 1))
done
! $infinite && [ $timeout -eq 0 ] && rc=1
if [ $rc -eq 0 ] && yesno ${ping_default_gateway:-no}; then
gateway="$(get_default_gateway)"
if [ -n "$gateway" ] && ! ping -c 1 $gateway > /dev/null 2>&1; then
rc=1
fi
fi
eend $rc "The network is offline"
}

View File

@@ -27,10 +27,7 @@ start()
rc=$? rc=$?
fi fi
ewend $rc "Could not mount all network filesystems" ewend $rc "Could not mount all network filesystems"
if [ "$RC_UNAME" != Linux ]; then return 0
rc=0
fi
return $rc
} }
stop() stop()

View File

@@ -1,31 +0,0 @@
#!@SBINDIR@/openrc-run
# Copyright (C) 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
command=/bin/s6-svscan
command_args="${RC_SVCDIR}"/s6-scan
command_background=yes
pidfile=/var/run/s6-svscan.pid
depend()
{
need localmount
}
start_pre()
{
einfo "Creating s6 scan directory"
checkpath -d -m 0755 "$RC_SVCDIR"/s6-scan
return $?
}
stop_post()
{
ebegin "Stopping any remaining s6 services"
s6-svc -dx "${RC_SVCDIR}"/s6-scan/* 2>/dev/null || true
eend $?
ebegin "Stopping any remaining s6 service loggers"
s6-svc -dx "${RC_SVCDIR}"/s6-scan/*/log 2>/dev/null || true
eend $?
}

View File

@@ -7,53 +7,43 @@ description="Saves the caches OpenRC uses to non volatile storage"
start() start()
{ {
if [ -e "$RC_SVCDIR"/clock-skewed ]; then if [ -e "$RC_SVCDIR"/clock-skewed ]; then
ewarn "Clock skew detected!" ewarn "WARNING: clock skew detected!"
if ! yesno "${RC_GOINGDOWN}"; then if ! yesno "${RC_GOINGDOWN}"; then
eerror "Not saving deptree cache" eerror "Not saving deptree cache"
return 1 return 1
fi fi
fi fi
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then if ! checkpath -W "$RC_LIBEXECDIR"; then
if ! checkpath -W "$RC_LIBEXECDIR"; then ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
eerror "${RC_LIBEXECDIR} is not writable!" if ! yesno "${RC_GOINGDOWN}"; then
eerror "Unable to save dependency cache" ewarn "Unable to save deptree cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1 return 1
fi fi
rm -rf "$RC_LIBEXECDIR"/cache return 0
if ! mkdir -p "$RC_LIBEXECDIR"/cache; then
eerror "Unable to create $RC_LIBEXECDIR/cache"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1
fi
fi
if ! checkpath -W "$RC_LIBEXECDIR"/cache; then
eerror "${RC_LIBEXECDIR}/cache is not writable!"
eerror "Unable to save dependency cache"
if yesno "${RC_GOINGDOWN}"; then
return 0
fi
return 1
fi fi
ebegin "Saving dependency cache" ebegin "Saving dependency cache"
local rc=0 save= local rc=
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
rm -rf "$RC_LIBEXECDIR"/cache
if ! mkdir -p "$RC_LIBEXECDIR"/cache; then
rc=$?
if yesno "${RC_GOINGDOWN}"; then
rc=0
fi
eend $rc "Unable to create $RC_SVCDIR/cache"
return $rc
fi
fi
local save=
for x in deptree depconfig shutdowntime softlevel nettree rc.log; do for x in deptree depconfig shutdowntime softlevel nettree rc.log; do
[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x" [ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x"
done done
if [ -n "$save" ]; then if [ -n "$save" ]; then
cp -p $save "$RC_LIBEXECDIR"/cache cp -p $save "$RC_LIBEXECDIR"/cache 2>/dev/null
rc=$?
fi fi
rc=$?
if yesno "${RC_GOINGDOWN}"; then if yesno "${RC_GOINGDOWN}"; then
if [ $rc -ne 0 ]; then rc=0
eerror "Unable to save dependency cache"
fi
eend 0
fi fi
eend $rc "Unable to save dependency cache" eend $rc
} }

View File

@@ -61,6 +61,16 @@ mount_misc()
fi fi
fi fi
# set up kernel support for cgroups
if [ -d /sys/fs/cgroup ] && ! mountinfo -q /sys/fs/cgroup; then
if grep -qs cgroup /proc/filesystems; then
ebegin "Mounting cgroup filesystem"
local opts="${sysfs_opts},mode=755,size=${rc_cgroupsize:-10m}"
mount -n -t tmpfs -o ${opts} cgroup_root /sys/fs/cgroup
eend $?
fi
fi
# set up kernel support for fusectl # set up kernel support for fusectl
if [ -d /sys/fs/fuse/connections ] \ if [ -d /sys/fs/fuse/connections ] \
&& ! mountinfo -q /sys/fs/fuse/connections; then && ! mountinfo -q /sys/fs/fuse/connections; then
@@ -98,16 +108,6 @@ mount_misc()
mount_cgroups() mount_cgroups()
{ {
# set up kernel support for cgroups
if [ -d /sys/fs/cgroup ] && ! mountinfo -q /sys/fs/cgroup; then
if grep -qs cgroup /proc/filesystems; then
ebegin "Mounting cgroup filesystem"
local opts="${sysfs_opts},mode=755,size=${rc_cgroupsize:-10m}"
mount -n -t tmpfs -o ${opts} cgroup_root /sys/fs/cgroup
eend $?
fi
fi
mountinfo -q /sys/fs/cgroup || return 0 mountinfo -q /sys/fs/cgroup || return 0
if ! mountinfo -q /sys/fs/cgroup/openrc; then if ! mountinfo -q /sys/fs/cgroup/openrc; then
@@ -116,7 +116,7 @@ mount_cgroups()
mount -n -t cgroup \ mount -n -t cgroup \
-o none,${sysfs_opts},name=openrc,release_agent="$agent" \ -o none,${sysfs_opts},name=openrc,release_agent="$agent" \
openrc /sys/fs/cgroup/openrc openrc /sys/fs/cgroup/openrc
printf 1 > /sys/fs/cgroup/openrc/notify_on_release echo 1 > /sys/fs/cgroup/openrc/notify_on_release
fi fi
yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0 yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0

View File

@@ -1,17 +1,9 @@
MK= ../mk
include ${MK}/sys.mk
include ${MK}/os.mk
MAN3= einfo.3 \ MAN3= einfo.3 \
rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \ rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \
rc_runlevel.3 rc_service.3 rc_stringlist.3 rc_runlevel.3 rc_service.3 rc_stringlist.3
MAN8= rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \ MAN8= rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \
service.8 start-stop-daemon.8 service.8 start-stop-daemon.8
ifeq (${OS},Linux)
MAN8 += rc-sstat.8
endif
# Handy macro to create symlinks # Handy macro to create symlinks
# This does rely on correctly formatting our manpages! # This does rely on correctly formatting our manpages!
MAKE_LINKS= suffix=$${man\#*.}; \ MAKE_LINKS= suffix=$${man\#*.}; \
@@ -24,6 +16,8 @@ MAKE_LINKS= suffix=$${man\#*.}; \
fi; \ fi; \
done; done;
MK= ../mk
include ${MK}/sys.mk
include ${MK}/gitignore.mk include ${MK}/gitignore.mk
all: all:

View File

@@ -107,19 +107,6 @@ the service has already been stopped.
String describing the service. String describing the service.
.It Ar description_$command .It Ar description_$command
String describing the extra command. String describing the extra command.
.It Ar supervisor
Supervisor to use to monitor this daemon. If this is unset,
start-stop-daemon will be used. The only alternate supervisor we support
in this release is S6 from Skarnet software. To use this, set
supervisor=s6.
.It Ar s6_service_path
The path to the s6 service directory if you are monitoring this service
with S6. The default is /var/svc.d/${RC_SVCNAME}.
.It Ar s6_svwait_options_start
The options to pass to s6-svwait when starting the service via s6.
.It Ar s6_service_timeout_stop
The amount of time, in milliseconds, s6-svc should wait for the service
to go down when stopping the service. The default is 10000.
.It Ar start_stop_daemon_args .It Ar start_stop_daemon_args
List of arguments passed to start-stop-daemon when starting the daemon. List of arguments passed to start-stop-daemon when starting the daemon.
.It Ar command .It Ar command
@@ -127,8 +114,7 @@ Daemon to start or stop via
.Nm start-stop-daemon .Nm start-stop-daemon
if no start or stop function is defined by the service. if no start or stop function is defined by the service.
.It Ar command_args .It Ar command_args
List of arguments to pass to the daemon when starting via List of arguments to pass to the daemon when starting.
.Nm start-stop-daemon .
.It Ar command_background .It Ar command_background
Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into
the background. This implies the "--make-pidfile" and "--pidfile" option of the background. This implies the "--make-pidfile" and "--pidfile" option of
@@ -141,8 +127,6 @@ will chroot into this path before writing the pid file or starting the daemon.
Pidfile to use for the above defined command. Pidfile to use for the above defined command.
.It Ar name .It Ar name
Display name used for the above defined command. Display name used for the above defined command.
.It Ar stopsig
Signal to send when stopping the daemon.
.It Ar retry .It Ar retry
Retry schedule to use when stopping the daemon. It can either be a Retry schedule to use when stopping the daemon. It can either be a
timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5). timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
@@ -166,25 +150,21 @@ will start and stop it in the right order in relation to other services.
As it's a function it can be very flexible, see the example below. As it's a function it can be very flexible, see the example below.
Here is a list of the functions you can use in a Here is a list of the functions you can use in a
.Ic depend .Ic depend
function. You simply pass the names of the services you want to add to function. You simply pass the names of the services to it to add to that
that dependency type to the function, or prefix the names with ! to dependency type, or prefix it with ! to remove it.
remove them from the dependencies.
.Bl -tag -width "RC_DEFAULTLEVEL" .Bl -tag -width "RC_DEFAULTLEVEL"
.It Ic need .It Ic need
The service will refuse to start until needed services have started and it The service will refuse to start until needed services have started and it
will refuse to stop until any services that need it have stopped. will refuse to stop until any services that need it have stopped.
.It Ic use .It Ic use
The service will attempt to start any services it uses that have been added The service will attempt to start any services we use that have been added
to the runlevel. to the runlevel.
.It Ic want
The service will attempt to start any services it wants, regardless of
whether they have been added to the runlevel.
.It Ic after .It Ic after
The service will start after these services and stop before these services. The service will start after these services and stop before these services.
.It Ic before .It Ic before
The service will start before these services and stop after these services. The service will start before these services and stop after these services.
.It Ic provide .It Ic provide
The service provides this virtual service. For example, named provides dns. We provide this virtual service. For example, named provides dns.
Virtual services take precedence over real services, so it is highly Virtual services take precedence over real services, so it is highly
recommended that you do not have a real service that has the same name recommended that you do not have a real service that has the same name
as a virtual service. as a virtual service.
@@ -217,8 +197,6 @@ Same as -jail, but for Linux Resource Containers (LXC).
Same as -jail, but for OpenVZ systems. Same as -jail, but for OpenVZ systems.
.It Dv -prefix .It Dv -prefix
Same as -jail, but for Prefix systems. Same as -jail, but for Prefix systems.
.It Dv -rkt
Same as -jail, but for RKT systems.
.It Dv -uml .It Dv -uml
Same as -jail, but for UML systems. Same as -jail, but for UML systems.
.It Dv -vserver .It Dv -vserver
@@ -227,11 +205,6 @@ Same as -jail, but for VServer systems.
Same as -jail, but for Xen DOM0 systems. Same as -jail, but for Xen DOM0 systems.
.It Dv -xenu .It Dv -xenu
Same as -jail, but for Xen DOMU systems. Same as -jail, but for Xen DOMU systems.
.It Dv -docker
Same as -jail, but for docker systems.
.It Dv -containers
Same as -jail, but for all relevant container types on the operating
system.
.El .El
.El .El
.Pp .Pp
@@ -473,9 +446,6 @@ rc_net_tap1_provide="!net"
# It's also possible to negate keywords. This is mainly useful for prefix # It's also possible to negate keywords. This is mainly useful for prefix
# users testing OpenRC. # users testing OpenRC.
rc_keyword="!-prefix" rc_keyword="!-prefix"
# This can also be used to block a script from runining in all
# containers except one or two
rc_keyword="!-containers !-docker"
.Ed .Ed
.Sh EXAMPLES .Sh EXAMPLES
.Pp .Pp

View File

@@ -1,46 +0,0 @@
.\" Copyright (c) 2015 William Hubbs
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd April 24, 2008
.Dt RC-sstat 8 SMM
.Os OpenRC
.Sh NAME
.Nm rc-sstat
.Nd show status info about services supervised by s6 then rc-status
info
.Sh SYNOPSIS
.Nm
.Sh DESCRIPTION
.Nm
gathers and displays information about the status of services supervised
by s6 then runs rc-status to show info about nnormal OpenRC services.
.Pp
.Sh EXIT STATUS
.Nm
exits 1 if there is an internal error or exits with the same exit codes
as rc-status.
.Sh SEE ALSO
.Xr rc-status 8 ,
.Xr rc-update 8
.Sh AUTHORS
.An William Hubbs <w.d.hubbs@gmail.com>

View File

@@ -1,48 +0,0 @@
# Using S6 with OpenRC
Beginning with OpenRC-0.16, we support using the s6 supervision suite
from Skarmet Software in place of start-stop-daemon for monitoring
daemons [1].
## Setup
Documenting s6 in detail is beyond the scope of this guide. It will
document how to set up OpenRC services to communicate with s6.
### Use Default start, stop and status functions
If you write your own start, stop and status functions in your service
script, none of this will work. You must allow OpenRC to use the default
functions.
### Dependencies
All OpenRC service scripts that want their daemons monitored by s6
should have the following line added to their dependencies to make sure
the s6 scan directory is being monitored.
need s6-svscan
### Variable Settings
The most important setting is the supervisor variable. At the top of
your service script, you should set this variable as follows:
supervisor=s6
Several other variables affect s6 services. They are documented on the
openrc-run man page, but I will list them here for convenience:
s6_service_path - the path to the s6 service directory. The default is
/var/svc.d/$RC_SVCNAME.
s6_svwait_options_start - the options to pass to s6-svwait when starting
the service. If this is not set, s6-svwait will not be called.
s6_service_timeout_stop - the amount of time, in milliseconds, s6-svc
should wait for a service to go down when stopping.
This is very early support, so feel free to file bugs if you have
issues.
[1] http://www.skarnet.org/software/s6

1
scripts/.gitignore vendored
View File

@@ -1 +0,0 @@
rc-sstat

View File

@@ -1,19 +1,5 @@
MK= ../mk
include ${MK}/os.mk
DIR= ${LIBEXECDIR}/bin DIR= ${LIBEXECDIR}/bin
BIN= on_ac_power BIN= on_ac_power
INSTALLAFTER = _installafter
ifeq (${OS},Linux)
SRCS+= rc-sstat.in
BIN+= rc-sstat
endif
_installafter:
ifeq (${OS},Linux)
${INSTALL} -d ${DESTDIR}${SBINDIR}
ln -s ${DIR}/rc-sstat ${DESTDIR}/${SBINDIR}/rc-sstat
endif
MK= ../mk
include ${MK}/scripts.mk include ${MK}/scripts.mk

View File

@@ -1,140 +0,0 @@
#!@SHELL@
# Define variables
scandir="/run/openrc/s6-scan"
statfile=/dev/shm/s6-svstat.${USER}
color_red='\E[01;31m'
color_green='\E[32m'
color_yellow='\E[01;33m'
# Time Modules
uptimeModules() {
# Given a single integer argument representing seconds of uptime...
# convert uptime to a friendly human readable string: '2d 16h 58m 46s'
# define a variable to keep track of the longest length uptime string
uSec=${1:-0}
uDay=$(( $uSec / 86400 ))
uSec=$(( $uSec % 86400 ))
uHour=$(( $uSec / 3600 ))
uSec=$(( $uSec % 3600 ))
uMin=$(( $uSec / 60 ))
uSec=$(( $uSec % 60 ))
[ $uDay -ne 0 ] && pDay="${uDay}d " || pDay=""
[ $uHour -ne 0 ] && pHour="${uHour}h " || pHour=""
[ $uMin -ne 0 ] && pMin="${uMin}m " || pMin=""
[ $uSec -ne 0 ] && pSec="${uSec}s " || pSec=""
parsedUptime="$( echo ${pDay}${pHour}${pMin}${pSec} | sed 's#[ \t]*$##' )"
uCharCount=${#parsedUptime}
}
# Make sure we are running as root
if [ $(id -u) != 0 ]; then
printf "This command must be run as root\n"
exit 1
fi
# Make sure scandir exists
if [ ! -d $scandir ]; then
printf "%s\n" "$scandir does not exist"
exit 1
fi
# Make sure s6-svscan is running
if ! pgrep s6-svscan >/dev/null ; then
printf "s6-svscan is not running\n"
exit 1
fi
# If TERM is undefined (launching sstat through an ssh command) then make it vt100
if [ -z $TERM -o $TERM = "dumb" ]; then
export TERM=vt100
fi
# Gather list of candidate services s6-supervise may be supervising
# filter for folders and symlinks at /run/openrc/s6-scan/* ommiting output starting with '.'
services="$(find $scandir -maxdepth 1 -mindepth 1 \( -type d -or -type l \) | awk -F'/' '{ if ( $NF !~ "^\\." ) print $NF}')"
if [ -z "$services" ]; then
printf "s6 found no services configured for supervision\n"
exit 1
fi
# Gather status for each service from s6-svstat
# write to tmp file in memory for non I/O bound repeatative access
rm -f $statfile 2>/dev/null
for service in $services ; do
echo "$service $(s6-svstat ${scandir}/${service})" >> $statfile
done
# Define longest string from parsed uptime (default to 7 to match string length of 'Up Time')
timeStringLength=7
for uptime in $(awk '$2 == "up" {print $5}' $statfile | sort -run)
do
uptimeModules $uptime
[ ${uCharCount} -gt $timeStringLength ] && timeStringLength=$uCharCount
done
# Print the status header like so...
# Service Name State PID Up Time Start Time
#---------------------------- ----- ----- -------------- -------------------
printf "\n"
printf "%28s %5s %5s %${timeStringLength}s %19s\n" "Service Name" "State" "PID" "Up Time" "Start Time"
for dashes in 28 5 5 $timeStringLength 19 ; do
printf "%0.s-" $(seq 1 $dashes) ; echo -n ' '
done && printf "\n"
# sshd up (pid 26300) 80373 seconds
cat $statfile | \
while read line
do
set $line
service=$1
state=$2
pid=${4/)/}
time=$5
# call function to convert time in seconds and define additional variables
uptimeModules $time
if [ "$state" = up ]; then
if [ $time -lt 30 ]; then
# uptime < 30 seconds, color the whole line yellow
echo -en "$color_yellow"
# 1st 4 columns are printed with printf for space padding
printf "%28s %5s %5s %${timeStringLength}s" $service $state $pid "$parsedUptime"
# 4th column is output from date -d
echo -e " $(date -d "${time} seconds ago" "+%F %T")"
# reset terminal colors
tput sgr0
else
printf "%28s" $service
# uptime > 30 seconds, color just the "state" value green
echo -en "$color_green"
printf " %5s" $state
# reset terminal colors
tput sgr0
printf " %5s" $pid
printf " %${timeStringLength}s" "$parsedUptime"
echo -e " $(date -d "${time} seconds ago" "+%F %T")"
fi
else
printf "%28s" $service
echo -en "$color_red"
printf " %5s" $state
tput sgr0
echo ""
fi
done
# Cleanup
rm -f $statfile 2>/dev/null
printf "\n\n"
rc-status

View File

@@ -1,7 +1,7 @@
DIR= ${LIBEXECDIR}/sh DIR= ${LIBEXECDIR}/sh
SRCS= init.sh.in functions.sh.in gendepends.sh.in \ SRCS= init.sh.in functions.sh.in gendepends.sh.in \
openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}} openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}}
INC= rc-mount.sh functions.sh rc-functions.sh s6.sh start-stop-daemon.sh INC= rc-mount.sh functions.sh rc-functions.sh
BIN= gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}} BIN= gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}}
INSTALLAFTER= _installafter INSTALLAFTER= _installafter

View File

@@ -16,9 +16,6 @@ need() {
use() { use() {
[ -n "$*" ] && echo "$RC_SVCNAME iuse $*" >&3 [ -n "$*" ] && echo "$RC_SVCNAME iuse $*" >&3
} }
want() {
[ -n "$*" ] && echo "$RC_SVCNAME iwant $*" >&3
}
before() { before() {
[ -n "$*" ] && echo "$RC_SVCNAME ibefore $*" >&3 [ -n "$*" ] && echo "$RC_SVCNAME ibefore $*" >&3
} }
@@ -29,18 +26,7 @@ provide() {
[ -n "$*" ] && echo "$RC_SVCNAME iprovide $*" >&3 [ -n "$*" ] && echo "$RC_SVCNAME iprovide $*" >&3
} }
keyword() { keyword() {
local c x [ -n "$*" ] && echo "$RC_SVCNAME keyword $*" >&3
set -- $*
while [ -n "$*" ]; do
case "$1" in
-containers) x="$(_get_containers)" ;;
!-containers) x="$(_get_containers_remove)" ;;
*) x=$1 ;;
esac
c="${c}${x} "
shift
done
[ -n "$c" ] && echo "$RC_SVCNAME keyword $c" >&3
} }
depend() { depend() {
: :
@@ -96,11 +82,6 @@ do
fi fi
[ -e @SYSCONFDIR@/rc.conf ] && . @SYSCONFDIR@/rc.conf [ -e @SYSCONFDIR@/rc.conf ] && . @SYSCONFDIR@/rc.conf
if [ -d "@SYSCONFDIR@/rc.conf.d" ]; then
for _f in "@SYSCONFDIR@"/rc.conf.d/*.conf; do
[ -e "$_f" ] && . "$_f"
done
fi
if . "$_dir/$RC_SVCNAME"; then if . "$_dir/$RC_SVCNAME"; then
echo "$RC_SVCNAME" >&3 echo "$RC_SVCNAME" >&3

View File

@@ -23,11 +23,6 @@ mount_svcdir()
. "$RC_LIBEXECDIR"/sh/functions.sh . "$RC_LIBEXECDIR"/sh/functions.sh
[ -r "@SYSCONFDIR@/rc.conf" ] && . "@SYSCONFDIR@/rc.conf" [ -r "@SYSCONFDIR@/rc.conf" ] && . "@SYSCONFDIR@/rc.conf"
if [ -d "@SYSCONFDIR@/rc.conf.d" ]; then
for _f in "@SYSCONFDIR@"/rc.conf.d/*.conf; do
[ -r "$_f" ] && . "$_f"
done
fi
# Disable devd until we need it # Disable devd until we need it
if [ -z "$RC_SYS" -a "$RC_UNAME" = "FreeBSD" ]; then if [ -z "$RC_SYS" -a "$RC_UNAME" = "FreeBSD" ]; then

View File

@@ -5,11 +5,6 @@
. "$RC_LIBEXECDIR"/sh/functions.sh . "$RC_LIBEXECDIR"/sh/functions.sh
[ -r "@SYSCONFDIR@/rc.conf" ] && . "@SYSCONFDIR@/rc.conf" [ -r "@SYSCONFDIR@/rc.conf" ] && . "@SYSCONFDIR@/rc.conf"
if [ -d "@SYSCONFDIR@/rc.conf.d" ]; then
for _f in "@SYSCONFDIR@"/rc.conf.d/*.conf; do
[ -e "$_f" ] && . "$_f"
done
fi
# By default VServer already has /proc mounted, but OpenVZ does not! # By default VServer already has /proc mounted, but OpenVZ does not!
# However, some of our users have an old proc image in /proc # However, some of our users have an old proc image in /proc

View File

@@ -66,9 +66,6 @@ need() {
use() { use() {
[ -n "$*" ] && echo "use $*" [ -n "$*" ] && echo "use $*"
} }
want() {
[ -n "$*" ] && echo "want $*"
}
before() { before() {
[ -n "$*" ] && echo "before $*" [ -n "$*" ] && echo "before $*"
} }
@@ -79,18 +76,7 @@ provide() {
[ -n "$*" ] && echo "provide $*" [ -n "$*" ] && echo "provide $*"
} }
keyword() { keyword() {
local c x [ -n "$*" ] && echo "keyword $*"
set -- $*
while [ -n "$*" ]; do
case "$1" in
-containers) x="$(_get_containers)" ;;
!-containers) x="$(_get_containers_remove)" ;;
*) x=$1 ;;
esac
c="${c}${x} "
shift
done
[ -n "$c" ] && echo "keyword $c"
} }
# Describe the init script to the user # Describe the init script to the user
@@ -140,42 +126,69 @@ _status()
} }
# Template start / stop / status functions # Template start / stop / status functions
# These functions select the appropriate function to call from the
# supervisor modules
start() start()
{ {
local func=ssd_start [ -n "$command" ] || return 0
case "$supervisor" in local _background=
s6) func=s6_start ;; ebegin "Starting ${name:-$RC_SVCNAME}"
?*) if yesno "${command_background}"; then
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" if [ -z "${pidfile}" ]; then
;; eend 1 "command_background option used but no pidfile specified"
esac return 1
$func fi
_background="--background --make-pidfile"
fi
if yesno "$start_inactive"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
eval start-stop-daemon --start \
--exec $command \
${chroot:+--chroot} $chroot \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
$_background $start_stop_daemon_args \
-- $command_args
if eend $? "Failed to start $RC_SVCNAME"; then
service_set_value "command" "${command}"
[ -n "${chroot}" ] && service_set_value "chroot" "${chroot}"
[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
[ -n "${procname}" ] && service_set_value "procname" "${procname}"
return 0
fi
if yesno "$start_inactive"; then
if ! $_inactive; then
mark_service_stopped
fi
fi
return 1
} }
stop() stop()
{ {
local func=ssd_stop local startcommand="$(service_get_value "command")"
case "$supervisor" in local startchroot="$(service_get_value "chroot")"
s6) func=s6_stop ;; local startpidfile="$(service_get_value "pidfile")"
?*) local startprocname="$(service_get_value "procname")"
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" command="${startcommand:-$command}"
;; chroot="${startchroot:-$chroot}"
esac pidfile="${startpidfile:-$pidfile}"
$func procname="${startprocname:-$procname}"
[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
ebegin "Stopping ${name:-$RC_SVCNAME}"
start-stop-daemon --stop \
${retry:+--retry} $retry \
${command:+--exec} $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $chroot$pidfile \
${stopsig:+--signal} $stopsig
eend $? "Failed to stop $RC_SVCNAME"
} }
status() status()
{ {
local func=ssd_status _status
case "$supervisor" in
s6) func=s6_status ;;
?*)
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
;;
esac
$func
} }
yesno $RC_DEBUG && set -x yesno $RC_DEBUG && set -x
@@ -198,16 +211,6 @@ unset _conf_d
# Load any system overrides # Load any system overrides
sourcex -e "@SYSCONFDIR@/rc.conf" sourcex -e "@SYSCONFDIR@/rc.conf"
if [ -d "@SYSCONFDIR@/rc.conf.d" ]; then
for _f in "@SYSCONFDIR@"/rc.conf.d/*.conf; do
sourcex -e "$_f"
done
fi
# load service supervisor functions
sourcex "@LIBEXECDIR@/sh/s6.sh"
sourcex "@LIBEXECDIR@/sh/start-stop-daemon.sh"
# Set verbose mode # Set verbose mode
if yesno "${rc_verbose:-$RC_VERBOSE}"; then if yesno "${rc_verbose:-$RC_VERBOSE}"; then
@@ -241,22 +244,20 @@ done
# Load our script # Load our script
sourcex "$RC_SERVICE" sourcex "$RC_SERVICE"
eval "printf '%s\n' $required_dirs" | while read _d; do for _d in $required_dirs; do
if [ -n "$_d" ] && [ ! -d "$_d" ]; then if [ ! -d $_d ]; then
eerror "$RC_SVCNAME: \`$_d' is not a directory" eerror "$RC_SVCNAME: \`$_d' is not a directory"
exit 1 exit 1
fi fi
done done
[ $? -ne 0 ] && exit 1
unset _d unset _d
eval "printf '%s\n' $required_files" | while read _f; do for _f in $required_files; do
if [ -n "$_f" ] && [ ! -r "$_f" ]; then if [ ! -r $_f ]; then
eerror "$RC_SVCNAME: \`$_f' is not readable" eerror "$RC_SVCNAME: \`$_f' is not readable"
exit 1 exit 1
fi fi
done done
[ $? -ne 0 ] && exit 1
unset _f unset _f
if [ -n "$opts" ]; then if [ -n "$opts" ]; then

View File

@@ -54,9 +54,7 @@ cgroup_set_values()
val= val=
;; ;;
*) *)
[ -n "$val" ] && val="$val $1"
val="$val $1" ||
val="$1"
;; ;;
esac esac
shift shift
@@ -109,21 +107,12 @@ cgroup_set_limits()
local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}"
[ -n "$devices" ] && cgroup_set_values devices "$devices" [ -n "$devices" ] && cgroup_set_values devices "$devices"
local hugetlb="${rc_cgroup_hugetlb:-$RC_CGROUP_HUGETLB}"
[ -n "$hugetlb" ] && cgroup_set_values hugetlb "$hugetlb"
local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}"
[ -n "$memory" ] && cgroup_set_values memory "$memory" [ -n "$memory" ] && cgroup_set_values memory "$memory"
local net_cls="${rc_cgroup_net_cls:-$RC_CGROUP_NET_CLS}"
[ -n "$net_cls" ] && cgroup_set_values net_cls "$net_cls"
local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}"
[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" [ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio"
local pids="${rc_cgroup_pids:-$RC_CGROUP_PIDS}"
[ -n "$pids" ] && cgroup_set_values pids "$pids"
return 0 return 0
} }

View File

@@ -86,33 +86,12 @@ get_bootparam()
} }
# Called from openrc-run.sh or gendepends.sh # Called from openrc-run.sh or gendepends.sh
_get_containers() {
local c
case "${RC_UNAME}" in
FreeBSD)
c="-jail"
;;
Linux)
c="-docker -lxc -openvz -rkt -systemd-nspawn -uml -vserver"
;;
esac
echo $c
}
_get_containers_remove() {
local c
for x in $(_get_containers); do
c="${c}!${x} "
done
echo $c
}
_depend() { _depend() {
depend depend
local _rc_svcname=$(shell_var "$RC_SVCNAME") _deptype= _depends= local _rc_svcname=$(shell_var "$RC_SVCNAME") _deptype= _depends=
# Add any user defined depends # Add any user defined depends
for _deptype in config:CONFIG need:NEED use:USE want:WANT \ for _deptype in config:CONFIG need:NEED use:USE \
after:AFTER before:BEFORE \ after:AFTER before:BEFORE \
provide:PROVIDE keyword:KEYWORD; do provide:PROVIDE keyword:KEYWORD; do
IFS=: IFS=:

View File

@@ -1,50 +0,0 @@
# Start / stop / status functions for s6 support
# Copyright (c) 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
[ -z "${s6_service_path}" ] && s6_service_path="/var/svc.d/${RC_SVCNAME}"
s6_start()
{
if [ ! -d "${s6_service_path}" ]; then
eerror "${s6_service_path} does not exist."
return 1
fi
s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
ebegin "Starting ${name:-$RC_SVCNAME}"
ln -sf "${s6_service_path}" "${s6_service_link}"
s6-svscanctl -na "${RC_SVCDIR}"/s6-scan
sleep 1.5
s6-svc -u "${s6_service_link}"
if [ -n "$s6_svwait_options_start" ]; then
s6-svwait ${s6_svwait_options_start} "${s6_service_link}"
fi
sleep 1.5
set -- $(s6-svstat "${s6_service_link}")
[ "$1" = "up" ]
eend $? "Failed to start $RC_SVCNAME"
}
s6_stop()
{
if [ ! -d "${s6_service_path}" ]; then
eerror "${s6_service_path} does not exist."
return 1
fi
s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
ebegin "Stopping ${name:-$RC_SVCNAME}"
s6-svc -Dd -T ${s6_service_timeout_stop:-10000} "${s6_service_link}"
set -- $(s6-svstat "${s6_service_link}")
[ "$1" = "down" ]
eend $? "Failed to stop $RC_SVCNAME"
}
s6_status()
{
s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
if [ -L "${s6_service_link}" ]; then
s6-svstat "${s6_service_link}"
else
_status
fi
}

View File

@@ -1,77 +0,0 @@
# start / stop / status functions for start-stop-daemon
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
ssd_start()
{
if [ -z "$command" ]; then
ewarn "The command variable is undefined."
ewarn "There is nothing for ${name:-$RC_SVCNAME} to start."
ewarn "If this is what you intend, please write a start function."
ewarn "This will become a failure in a future release."
return 0
fi
local _background=
ebegin "Starting ${name:-$RC_SVCNAME}"
if yesno "${command_background}"; then
if [ -z "${pidfile}" ]; then
eend 1 "command_background option used but no pidfile specified"
return 1
fi
if [ -n "${command_args_background}" ]; then
eend 1 "command_background used with command_args_background"
return 1
fi
_background="--background --make-pidfile"
fi
if yesno "$start_inactive"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
eval start-stop-daemon --start \
--exec $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
${command_user+--user} $command_user \
$_background $start_stop_daemon_args \
-- $command_args $command_args_background
if eend $? "Failed to start $RC_SVCNAME"; then
service_set_value "command" "${command}"
[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
[ -n "${procname}" ] && service_set_value "procname" "${procname}"
return 0
fi
if yesno "$start_inactive"; then
if ! $_inactive; then
mark_service_stopped
fi
fi
return 1
}
ssd_stop()
{
local startcommand="$(service_get_value "command")"
local startpidfile="$(service_get_value "pidfile")"
local startprocname="$(service_get_value "procname")"
command="${startcommand:-$command}"
pidfile="${startpidfile:-$pidfile}"
procname="${startprocname:-$procname}"
[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
ebegin "Stopping ${name:-$RC_SVCNAME}"
start-stop-daemon --stop \
${retry:+--retry} $retry \
${command:+--exec} $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
${stopsig:+--signal} $stopsig
eend $? "Failed to stop $RC_SVCNAME"
}
ssd_status()
{
_status
}

23
sh/tmpfiles.sh.in Normal file → Executable file
View File

@@ -53,18 +53,10 @@ relabel() {
done done
} }
splitpath() {
local path=$1
while [ -n "$path" ]; do
echo $path
path=${path%/*}
done
}
_restorecon() { _restorecon() {
local path=$1 local path=$1
if [ -x /sbin/restorecon ]; then if [ -x /sbin/restorecon ]; then
dryrun_or_real restorecon -F $(splitpath "$path") dryrun_or_real restorecon -F "$path"
fi fi
} }
@@ -130,7 +122,6 @@ _d() {
if [ ! -d "$path" ]; then if [ ! -d "$path" ]; then
dryrun_or_real mkdir -p "$path" 2>/dev/null dryrun_or_real mkdir -p "$path" 2>/dev/null
_restorecon "$path"
dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path" dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path"
fi fi
} }
@@ -146,18 +137,10 @@ _D() {
if [ $CREATE -gt 0 ]; then if [ $CREATE -gt 0 ]; then
dryrun_or_real mkdir -p "$path" 2>/dev/null dryrun_or_real mkdir -p "$path" 2>/dev/null
_restorecon "$path"
dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path" dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path"
fi fi
} }
_v() {
# Create a subvolume if the path does not exist yet and the file system
# supports this (btrfs). Otherwise create a normal directory.
# TODO: Implement btrfs subvol creation.
_d "$@"
}
_L() { _L() {
# Create a symlink if it doesn't exist yet # Create a symlink if it doesn't exist yet
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
@@ -353,7 +336,7 @@ for FILE in $tmpfiles_d ; do
# whine about invalid entries # whine about invalid entries
case $cmd in case $cmd in
f|F|w|d|D|v|p|L|c|C|b|x|X|r|R|z|Z) ;; f|F|w|d|D|p|L|c|C|b|x|X|r|R|z|Z) ;;
*) warninvalid ; continue ;; *) warninvalid ; continue ;;
esac esac
@@ -361,7 +344,7 @@ for FILE in $tmpfiles_d ; do
if [ "$mode" = '-' -o "$mode" = '' ]; then if [ "$mode" = '-' -o "$mode" = '' ]; then
case "$cmd" in case "$cmd" in
p|f|F) mode=0644 ;; p|f|F) mode=0644 ;;
d|D|v) mode=0755 ;; d|D) mode=0755 ;;
C|z|Z|x|r|R|L) ;; C|z|Z|x|r|R|L) ;;
esac esac
fi fi

View File

@@ -31,8 +31,7 @@
#include "queue.h" #include "queue.h"
#include "librc.h" #include "librc.h"
#if defined(__linux__) || (defined (__FreeBSD_kernel__) && defined(__GLIBC__)) \ #if defined(__linux__) || (defined (__FreeBSD_kernel__) && defined(__GLIBC__))
|| defined(__GNU__)
static bool static bool
pid_is_exec(pid_t pid, const char *exec) pid_is_exec(pid_t pid, const char *exec)
{ {

View File

@@ -192,9 +192,7 @@ valid_service(const char *runlevel, const char *service, const char *type)
if (!runlevel || if (!runlevel ||
strcmp(type, "ineed") == 0 || strcmp(type, "ineed") == 0 ||
strcmp(type, "needsme") == 0 || strcmp(type, "needsme") == 0)
strcmp(type, "iwant") == 0 ||
strcmp(type, "wantsme") == 0)
return true; return true;
if (rc_service_in_runlevel(service, runlevel)) if (rc_service_in_runlevel(service, runlevel))
@@ -545,7 +543,6 @@ rc_deptree_order(const RC_DEPTREE *deptree, const char *runlevel, int options)
types = rc_stringlist_new(); types = rc_stringlist_new();
rc_stringlist_add(types, "ineed"); rc_stringlist_add(types, "ineed");
rc_stringlist_add(types, "iuse"); rc_stringlist_add(types, "iuse");
rc_stringlist_add(types, "iwant");
rc_stringlist_add(types, "iafter"); rc_stringlist_add(types, "iafter");
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);
@@ -651,7 +648,6 @@ typedef struct deppair
static const DEPPAIR deppairs[] = { static const DEPPAIR deppairs[] = {
{ "ineed", "needsme" }, { "ineed", "needsme" },
{ "iuse", "usesme" }, { "iuse", "usesme" },
{ "iwant", "wantsme" },
{ "iafter", "ibefore" }, { "iafter", "ibefore" },
{ "ibefore", "iafter" }, { "ibefore", "iafter" },
{ "iprovide", "providedby" }, { "iprovide", "providedby" },
@@ -848,7 +844,6 @@ rc_deptree_update(void)
/* If we're after something, remove us from the before list */ /* If we're after something, remove us from the before list */
if (strcmp(type, "iafter") == 0 || if (strcmp(type, "iafter") == 0 ||
strcmp(type, "ineed") == 0 || strcmp(type, "ineed") == 0 ||
strcmp(type, "iwant") == 0 ||
strcmp(type, "iuse") == 0) { strcmp(type, "iuse") == 0) {
if ((dt = get_deptype(depinfo, "ibefore"))) if ((dt = get_deptype(depinfo, "ibefore")))
rc_stringlist_delete(dt->services, depend); rc_stringlist_delete(dt->services, depend);
@@ -962,7 +957,6 @@ rc_deptree_update(void)
/* Phase 5 - Remove broken before directives */ /* Phase 5 - Remove broken before directives */
types = rc_stringlist_new(); types = rc_stringlist_new();
rc_stringlist_add(types, "ineed"); rc_stringlist_add(types, "ineed");
rc_stringlist_add(types, "iwant");
rc_stringlist_add(types, "iuse"); rc_stringlist_add(types, "iuse");
rc_stringlist_add(types, "iafter"); rc_stringlist_add(types, "iafter");
TAILQ_FOREACH(depinfo, deptree, entries) { TAILQ_FOREACH(depinfo, deptree, entries) {

View File

@@ -28,8 +28,6 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <fnmatch.h>
#include "queue.h" #include "queue.h"
#include "librc.h" #include "librc.h"
@@ -216,78 +214,12 @@ rc_config_list(const char *file)
} }
librc_hidden_def(rc_config_list) librc_hidden_def(rc_config_list)
static void rc_config_set_value(RC_STRINGLIST *config, char *value)
{
RC_STRING *cline;
char *entry;
size_t i = 0;
char *newline;
char *p = value;
bool replaced;
char *token;
if (! p)
return;
if (strncmp(p, "export ", 7) == 0)
p += 7;
if (! (token = strsep(&p, "=")))
return;
entry = xstrdup(token);
/* Preserve shell coloring */
if (*p == '$')
token = value;
else
do {
/* Bash variables are usually quoted */
token = strsep(&p, "\"\'");
} while (token && *token == '\0');
/* Drop a newline if that's all we have */
if (token) {
i = strlen(token) - 1;
if (token[i] == '\n')
token[i] = 0;
i = strlen(entry) + strlen(token) + 2;
newline = xmalloc(sizeof(char) * i);
snprintf(newline, i, "%s=%s", entry, token);
} else {
i = strlen(entry) + 2;
newline = xmalloc(sizeof(char) * i);
snprintf(newline, i, "%s=", entry);
}
replaced = false;
/* In shells the last item takes precedence, so we need to remove
any prior values we may already have */
TAILQ_FOREACH(cline, config, entries) {
i = strlen(entry);
if (strncmp(entry, cline->value, i) == 0 && cline->value[i] == '=') {
/* We have a match now - to save time we directly replace it */
free(cline->value);
cline->value = newline;
replaced = true;
break;
}
}
if (!replaced) {
rc_stringlist_add(config, newline);
free(newline);
}
free(entry);
}
/* /*
* Override some specific rc.conf options on the kernel command line. * Override some specific rc.conf options on the kernel command line
* I only know how to do this in Linux, so if someone wants to supply
* a patch for this on *BSD or tell me how to write the code to do this,
* any suggestions are welcome.
*/ */
static RC_STRINGLIST *rc_config_kcl(RC_STRINGLIST *config)
{
#ifdef __linux__ #ifdef __linux__
static RC_STRINGLIST *rc_config_override(RC_STRINGLIST *config)
{
RC_STRINGLIST *overrides; RC_STRINGLIST *overrides;
RC_STRING *cline, *override, *config_np; RC_STRING *cline, *override, *config_np;
char *tmp = NULL; char *tmp = NULL;
@@ -336,60 +268,90 @@ static RC_STRINGLIST *rc_config_kcl(RC_STRINGLIST *config)
} }
rc_stringlist_free(overrides); rc_stringlist_free(overrides);
return config;
}
#endif #endif
return config;
}
static RC_STRINGLIST * rc_config_directory(RC_STRINGLIST *config)
{
DIR *dp;
struct dirent *d;
RC_STRINGLIST *rc_conf_d_files = rc_stringlist_new();
RC_STRING *fname;
RC_STRINGLIST *rc_conf_d_list;
char path[PATH_MAX];
RC_STRING *line;
if ((dp = opendir(RC_CONF_D)) != NULL) {
while ((d = readdir(dp)) != NULL) {
if (fnmatch("*.conf", d->d_name, FNM_PATHNAME) == 0) {
rc_stringlist_addu(rc_conf_d_files, d->d_name);
}
}
closedir(dp);
if (rc_conf_d_files) {
rc_stringlist_sort(&rc_conf_d_files);
TAILQ_FOREACH(fname, rc_conf_d_files, entries) {
if (! fname->value)
continue;
sprintf(path, "%s/%s", RC_CONF_D, fname->value);
rc_conf_d_list = rc_config_list(path);
TAILQ_FOREACH(line, rc_conf_d_list, entries)
if (line->value)
rc_config_set_value(config, line->value);
rc_stringlist_free(rc_conf_d_list);
}
rc_stringlist_free(rc_conf_d_files);
}
}
return config;
}
RC_STRINGLIST * RC_STRINGLIST *
rc_config_load(const char *file) rc_config_load(const char *file)
{ {
RC_STRINGLIST *list; RC_STRINGLIST *list;
RC_STRINGLIST *config; RC_STRINGLIST *config;
char *token;
RC_STRING *line; RC_STRING *line;
RC_STRING *cline;
size_t i = 0;
bool replaced;
char *entry;
char *newline;
char *p;
list = rc_config_list(file); list = rc_config_list(file);
config = rc_stringlist_new(); config = rc_stringlist_new();
TAILQ_FOREACH(line, list, entries) { TAILQ_FOREACH(line, list, entries) {
rc_config_set_value(config, line->value); /* Get entry */
p = line->value;
if (! p)
continue;
if (strncmp(p, "export ", 7) == 0)
p += 7;
if (! (token = strsep(&p, "=")))
continue;
entry = xstrdup(token);
/* Preserve shell coloring */
if (*p == '$')
token = line->value;
else
do {
/* Bash variables are usually quoted */
token = strsep(&p, "\"\'");
} while (token && *token == '\0');
/* Drop a newline if that's all we have */
if (token) {
i = strlen(token) - 1;
if (token[i] == '\n')
token[i] = 0;
i = strlen(entry) + strlen(token) + 2;
newline = xmalloc(sizeof(char) * i);
snprintf(newline, i, "%s=%s", entry, token);
} else {
i = strlen(entry) + 2;
newline = xmalloc(sizeof(char) * i);
snprintf(newline, i, "%s=", entry);
}
replaced = false;
/* In shells the last item takes precedence, so we need to remove
any prior values we may already have */
TAILQ_FOREACH(cline, config, entries) {
i = strlen(entry);
if (strncmp(entry, cline->value, i) == 0 && cline->value[i] == '=') {
/* We have a match now - to save time we directly replace it */
free(cline->value);
cline->value = newline;
replaced = true;
break;
}
}
if (!replaced) {
rc_stringlist_add(config, newline);
free(newline);
}
free(entry);
} }
rc_stringlist_free(list); rc_stringlist_free(list);
#ifdef __linux__
/* Only override rc.conf settings */
if (strcmp(file, RC_CONF) == 0) {
config = rc_config_override(config);
}
#endif
return config; return config;
} }
librc_hidden_def(rc_config_load) librc_hidden_def(rc_config_load)
@@ -439,9 +401,6 @@ rc_conf_value(const char *setting)
#endif #endif
} }
rc_conf = rc_config_directory(rc_conf);
rc_conf = rc_config_kcl(rc_conf);
/* Convert old uppercase to lowercase */ /* Convert old uppercase to lowercase */
TAILQ_FOREACH(s, rc_conf, entries) { TAILQ_FOREACH(s, rc_conf, entries) {
p = s->value; p = s->value;

View File

@@ -210,14 +210,14 @@ found:
} }
#endif #endif
/* New sys identification code
* Not to be used for any binaries outside of openrc. */
const char * const char *
rc_sys(void) rc_sys_v2(void)
{ {
#ifdef PREFIX #define __STRING_SWITCH(x) { char *__string_switch = x; if (false) {}
return RC_SYS_PREFIX; #define __STRING_CASE(y) else if (strcmp(__string_switch,y) == 0)
#endif #define __STRING_SWITCH_END() }
char *systype = rc_conf_value("rc_sys"); char *systype = rc_conf_value("rc_sys");
if (systype) { if (systype) {
char *s = systype; char *s = systype;
@@ -227,11 +227,43 @@ rc_sys(void)
*s = toupper((unsigned char) *s); *s = toupper((unsigned char) *s);
s++; s++;
} }
/* Now do detection */
__STRING_SWITCH(systype)
__STRING_CASE(RC_SYS_PREFIX) { return RC_SYS_PREFIX; }
#ifdef __FreeBSD__
__STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; }
#endif /* __FreeBSD__ */
#ifdef __NetBSD__
__STRING_CASE(RC_SYS_XEN0) { return RC_SYS_XEN0; }
__STRING_CASE(RC_SYS_XENU) { return RC_SYS_XENU; }
#endif /* __NetBSD__ */
#ifdef __linux__
__STRING_CASE(RC_SYS_XEN0) { return RC_SYS_XEN0; }
__STRING_CASE(RC_SYS_XENU) { return RC_SYS_XENU; }
__STRING_CASE(RC_SYS_UML) { return RC_SYS_UML; }
__STRING_CASE(RC_SYS_VSERVER) { return RC_SYS_VSERVER; }
__STRING_CASE(RC_SYS_OPENVZ) { return RC_SYS_OPENVZ; }
__STRING_CASE(RC_SYS_LXC) { return RC_SYS_LXC; }
#endif /* __linux__ */
__STRING_SWITCH_END()
} }
#undef __STRING_SWITCH
#undef __STRING_CASE
#undef __STRING_SWITCH_END
return NULL;
}
librc_hidden_def(rc_sys_v2)
/* Old sys identification code.
* Not to be used for any binaries outside of openrc. */
const char *
rc_sys_v1(void)
{
#ifdef PREFIX
return RC_SYS_PREFIX;
#else
#ifdef __FreeBSD__ #ifdef __FreeBSD__
if (systype && strcmp(systype, RC_SYS_JAIL) == 0)
return RC_SYS_JAIL;
int jailed = 0; int jailed = 0;
size_t len = sizeof(jailed); size_t len = sizeof(jailed);
@@ -241,12 +273,6 @@ rc_sys(void)
#endif #endif
#ifdef __NetBSD__ #ifdef __NetBSD__
if (systype) {
if(strcmp(systype, RC_SYS_XEN0) == 0)
return RC_SYS_XEN0;
if (strcmp(systype, RC_SYS_XENU) == 0)
return RC_SYS_XENU;
}
if (exists("/kern/xen/privcmd")) if (exists("/kern/xen/privcmd"))
return RC_SYS_XEN0; return RC_SYS_XEN0;
if (exists("/kern/xen")) if (exists("/kern/xen"))
@@ -254,26 +280,6 @@ rc_sys(void)
#endif #endif
#ifdef __linux__ #ifdef __linux__
if (systype) {
if (strcmp(systype, RC_SYS_XEN0) == 0)
return RC_SYS_XEN0;
if (strcmp(systype, RC_SYS_XENU) == 0)
return RC_SYS_XENU;
if (strcmp(systype, RC_SYS_UML) == 0)
return RC_SYS_UML;
if (strcmp(systype, RC_SYS_VSERVER) == 0)
return RC_SYS_VSERVER;
if (strcmp(systype, RC_SYS_OPENVZ) == 0)
return RC_SYS_OPENVZ;
if (strcmp(systype, RC_SYS_LXC) == 0)
return RC_SYS_LXC;
if (strcmp(systype, RC_SYS_RKT) == 0)
return RC_SYS_RKT;
if (strcmp(systype, RC_SYS_SYSTEMD_NSPAWN) == 0)
return RC_SYS_SYSTEMD_NSPAWN;
if (strcmp(systype, RC_SYS_DOCKER) == 0)
return RC_SYS_DOCKER;
}
if (exists("/proc/xen")) { if (exists("/proc/xen")) {
if (file_regex("/proc/xen/capabilities", "control_d")) if (file_regex("/proc/xen/capabilities", "control_d"))
return RC_SYS_XEN0; return RC_SYS_XEN0;
@@ -290,15 +296,23 @@ rc_sys(void)
return RC_SYS_OPENVZ; /* old test */ return RC_SYS_OPENVZ; /* old test */
else if (file_regex("/proc/1/environ", "container=lxc")) else if (file_regex("/proc/1/environ", "container=lxc"))
return RC_SYS_LXC; return RC_SYS_LXC;
else if (file_regex("/proc/1/environ", "container=rkt"))
return RC_SYS_RKT;
else if (file_regex("/proc/1/environ", "container=systemd-nspawn")) else if (file_regex("/proc/1/environ", "container=systemd-nspawn"))
return RC_SYS_SYSTEMD_NSPAWN; return RC_SYS_SYSTEMD_NSPAWN;
else if (file_regex("/proc/1/environ", "container=docker"))
return RC_SYS_DOCKER;
#endif #endif
return NULL; return NULL;
#endif /* PREFIX */
}
librc_hidden_def(rc_sys_v1)
const char *
rc_sys(void)
{
if (rc_conf_value("rc_sys")) {
return rc_sys_v2();
} else {
return rc_sys_v1();
}
} }
librc_hidden_def(rc_sys) librc_hidden_def(rc_sys)

View File

@@ -130,6 +130,8 @@ librc_hidden_proto(rc_stringlist_new)
librc_hidden_proto(rc_stringlist_split) librc_hidden_proto(rc_stringlist_split)
librc_hidden_proto(rc_stringlist_sort) librc_hidden_proto(rc_stringlist_sort)
librc_hidden_proto(rc_sys) librc_hidden_proto(rc_sys)
librc_hidden_proto(rc_sys_v1)
librc_hidden_proto(rc_sys_v2)
librc_hidden_proto(rc_yesno) librc_hidden_proto(rc_yesno)
#endif #endif

View File

@@ -56,7 +56,6 @@ extern "C" {
#define RC_SYS_WHITELIST RC_LIBEXECDIR "/conf.d/env_whitelist" #define RC_SYS_WHITELIST RC_LIBEXECDIR "/conf.d/env_whitelist"
#define RC_USR_WHITELIST RC_SYSCONFDIR "/conf.d/env_whitelist" #define RC_USR_WHITELIST RC_SYSCONFDIR "/conf.d/env_whitelist"
#define RC_CONF RC_SYSCONFDIR "/rc.conf" #define RC_CONF RC_SYSCONFDIR "/rc.conf"
#define RC_CONF_D RC_SYSCONFDIR "/rc.conf.d"
#define RC_CONF_OLD RC_SYSCONFDIR "/conf.d/rc" #define RC_CONF_OLD RC_SYSCONFDIR "/conf.d/rc"
#define RC_PATH_PREFIX RC_LIBEXECDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin" #define RC_PATH_PREFIX RC_LIBEXECDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin"
@@ -329,12 +328,10 @@ bool rc_service_daemons_crashed(const char *);
/*! @name System types /*! @name System types
* OpenRC can support some special sub system types, normally virtualization. * OpenRC can support some special sub system types, normally virtualization.
* Some services cannot work in these systems, or we do something else. */ * Some services cannot work in these systems, or we do something else. */
#define RC_SYS_DOCKER "DOCKER"
#define RC_SYS_JAIL "JAIL" #define RC_SYS_JAIL "JAIL"
#define RC_SYS_OPENVZ "OPENVZ" #define RC_SYS_OPENVZ "OPENVZ"
#define RC_SYS_LXC "LXC" #define RC_SYS_LXC "LXC"
#define RC_SYS_PREFIX "PREFIX" #define RC_SYS_PREFIX "PREFIX"
#define RC_SYS_RKT "RKT"
#define RC_SYS_SYSTEMD_NSPAWN "SYSTEMD-NSPAWN" #define RC_SYS_SYSTEMD_NSPAWN "SYSTEMD-NSPAWN"
#define RC_SYS_UML "UML" #define RC_SYS_UML "UML"
#define RC_SYS_VSERVER "VSERVER" #define RC_SYS_VSERVER "VSERVER"
@@ -345,6 +342,14 @@ bool rc_service_daemons_crashed(const char *);
* @return string from RC_SYS_* types or NULL if none detected */ * @return string from RC_SYS_* types or NULL if none detected */
const char *rc_sys(void); const char *rc_sys(void);
/*! Returns the type of subsystem using old automatic code
* @return string from RC_SYS_* types or NULL if none detected */
const char *rc_sys_v1(void);
/*! Returns the type of subsystem using new rc.conf rc_sys value
* @return string from RC_SYS_* types or NULL if none detected */
const char *rc_sys_v2(void);
/*! @name Dependency options /*! @name Dependency options
* These options can change the services found by the rc_get_depinfo and * These options can change the services found by the rc_get_depinfo and
* rc_get_depends functions. */ * rc_get_depends functions. */

View File

@@ -39,8 +39,8 @@
# include <sys/statvfs.h> # include <sys/statvfs.h>
# define statfs statvfs # define statfs statvfs
# define F_FLAGS f_flag # define F_FLAGS f_flag
#elif defined(__linux__) || (defined(__FreeBSD_kernel__) && \ #elif defined (__linux__) || (defined(__FreeBSD_kernel__) && \
defined(__GLIBC__)) || defined(__GNU__) defined(__GLIBC__)) || defined(__GNU__)
# include <mntent.h> # include <mntent.h>
#endif #endif
@@ -267,8 +267,8 @@ find_mounts(struct args *args)
return list; return list;
} }
#elif defined(__linux__) || (defined(__FreeBSD_kernel__) && \ #elif defined (__linux__) || (defined (__FreeBSD_kernel__) && \
defined(__GLIBC__)) || defined(__GNU__) defined(__GLIBC__))
static struct mntent * static struct mntent *
getmntfile(const char *file) getmntfile(const char *file)
{ {
@@ -298,7 +298,7 @@ find_mounts(struct args *args)
int netdev; int netdev;
RC_STRINGLIST *list; RC_STRINGLIST *list;
if ((fp = fopen("/proc/self/mounts", "r")) == NULL) if ((fp = fopen("/proc/mounts", "r")) == NULL)
eerrorx("getmntinfo: %s", strerror(errno)); eerrorx("getmntinfo: %s", strerror(errno));
list = rc_stringlist_new(); list = rc_stringlist_new();
@@ -315,8 +315,6 @@ find_mounts(struct args *args)
if ((ent = getmntfile(to))) { if ((ent = getmntfile(to))) {
if (strstr(ent->mnt_opts, "_netdev")) if (strstr(ent->mnt_opts, "_netdev"))
netdev = 0; netdev = 0;
else
netdev = 1;
} }
process_mount(list, args, from, to, fst, opts, netdev); process_mount(list, args, from, to, fst, opts, netdev);
@@ -349,7 +347,7 @@ get_regex(const char *string)
#include "_usage.h" #include "_usage.h"
#define extraopts "[mount1] [mount2] ..." #define extraopts "[mount1] [mount2] ..."
#define getoptstring "f:F:n:N:o:O:p:P:iste:E:" getoptstring_COMMON #define getoptstring "f:F:n:N:o:O:p:P:ist" getoptstring_COMMON
static const struct option longopts[] = { static const struct option longopts[] = {
{ "fstype-regex", 1, NULL, 'f'}, { "fstype-regex", 1, NULL, 'f'},
{ "skip-fstype-regex", 1, NULL, 'F'}, { "skip-fstype-regex", 1, NULL, 'F'},

View File

@@ -51,8 +51,8 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#if defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) \ #if defined(__linux__) || (defined(__FreeBSD_kernel__) && \
|| defined(__GNU__) defined(__GLIBC__))
# include <pty.h> # include <pty.h>
#elif defined(__NetBSD__) || defined(__OpenBSD__) #elif defined(__NetBSD__) || defined(__OpenBSD__)
# include <util.h> # include <util.h>
@@ -78,23 +78,15 @@ static const char *applet;
static char *service, *runlevel, *ibsave, *prefix; static char *service, *runlevel, *ibsave, *prefix;
static RC_DEPTREE *deptree; static RC_DEPTREE *deptree;
static RC_STRINGLIST *applet_list, *services, *tmplist; static RC_STRINGLIST *applet_list, *services, *tmplist;
static RC_STRINGLIST *restart_services; static RC_STRINGLIST *restart_services, *need_services, *use_services;
static RC_STRINGLIST *need_services;
static RC_STRINGLIST *use_services;
static RC_STRINGLIST *want_services;
static RC_HOOK hook_out; static RC_HOOK hook_out;
static int exclusive_fd = -1, master_tty = -1; static int exclusive_fd = -1, master_tty = -1;
static bool sighup, in_background, deps, dry_run; static bool sighup, in_background, deps, dry_run;
static pid_t service_pid; static pid_t service_pid;
static int signal_pipe[2] = { -1, -1 }; static int signal_pipe[2] = { -1, -1 };
static RC_STRINGLIST *deptypes_b; /* broken deps */ static RC_STRINGLIST *types_b, *types_n, *types_nu, *types_nua, *types_m;
static RC_STRINGLIST *deptypes_n; /* needed deps */ static RC_STRINGLIST *types_mua = NULL;
static RC_STRINGLIST *deptypes_nw; /* need+want deps */
static RC_STRINGLIST *deptypes_nwu; /* need+want+use deps */
static RC_STRINGLIST *deptypes_nwua; /* need+want+use+after deps */
static RC_STRINGLIST *deptypes_m; /* needed deps for stopping */
static RC_STRINGLIST *deptypes_mwua; /* need+want+use+after deps for stopping */
static void static void
handle_signal(int sig) handle_signal(int sig)
@@ -239,18 +231,16 @@ cleanup(void)
rc_plugin_unload(); rc_plugin_unload();
#ifdef DEBUG_MEMORY #ifdef DEBUG_MEMORY
rc_stringlist_free(deptypes_b); rc_stringlist_free(types_b);
rc_stringlist_free(deptypes_n); rc_stringlist_free(types_n);
rc_stringlist_free(deptypes_nw); rc_stringlist_free(types_nu);
rc_stringlist_free(deptypes_nwu); rc_stringlist_free(types_nua);
rc_stringlist_free(deptypes_nwua); rc_stringlist_free(types_m);
rc_stringlist_free(deptypes_m); rc_stringlist_free(types_mua);
rc_stringlist_free(deptypes_mwua);
rc_deptree_free(deptree); rc_deptree_free(deptree);
rc_stringlist_free(restart_services); rc_stringlist_free(restart_services);
rc_stringlist_free(need_services); rc_stringlist_free(need_services);
rc_stringlist_free(use_services); rc_stringlist_free(use_services);
rc_stringlist_free(want_services);
rc_stringlist_free(services); rc_stringlist_free(services);
rc_stringlist_free(applet_list); rc_stringlist_free(applet_list);
rc_stringlist_free(tmplist); rc_stringlist_free(tmplist);
@@ -528,37 +518,30 @@ get_started_services(void)
} }
static void static void
setup_deptypes(void) setup_types(void)
{ {
deptypes_b = rc_stringlist_new(); types_b = rc_stringlist_new();
rc_stringlist_add(deptypes_b, "broken"); rc_stringlist_add(types_b, "broken");
deptypes_n = rc_stringlist_new(); types_n = rc_stringlist_new();
rc_stringlist_add(deptypes_n, "ineed"); rc_stringlist_add(types_n, "ineed");
deptypes_nw = rc_stringlist_new(); types_nu = rc_stringlist_new();
rc_stringlist_add(deptypes_nw, "ineed"); rc_stringlist_add(types_nu, "ineed");
rc_stringlist_add(deptypes_nw, "iwant"); rc_stringlist_add(types_nu, "iuse");
deptypes_nwu = rc_stringlist_new(); types_nua = rc_stringlist_new();
rc_stringlist_add(deptypes_nwu, "ineed"); rc_stringlist_add(types_nua, "ineed");
rc_stringlist_add(deptypes_nwu, "iwant"); rc_stringlist_add(types_nua, "iuse");
rc_stringlist_add(deptypes_nwu, "iuse"); rc_stringlist_add(types_nua, "iafter");
deptypes_nwua = rc_stringlist_new(); types_m = rc_stringlist_new();
rc_stringlist_add(deptypes_nwua, "ineed"); rc_stringlist_add(types_m, "needsme");
rc_stringlist_add(deptypes_nwua, "iwant");
rc_stringlist_add(deptypes_nwua, "iuse");
rc_stringlist_add(deptypes_nwua, "iafter");
deptypes_m = rc_stringlist_new(); types_mua = rc_stringlist_new();
rc_stringlist_add(deptypes_m, "needsme"); rc_stringlist_add(types_mua, "needsme");
rc_stringlist_add(types_mua, "usesme");
deptypes_mwua = rc_stringlist_new(); rc_stringlist_add(types_mua, "beforeme");
rc_stringlist_add(deptypes_mwua, "needsme");
rc_stringlist_add(deptypes_mwua, "wantsme");
rc_stringlist_add(deptypes_mwua, "usesme");
rc_stringlist_add(deptypes_mwua, "beforeme");
} }
static void static void
@@ -621,10 +604,10 @@ svc_start_deps(void)
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
eerrorx("failed to load deptree"); eerrorx("failed to load deptree");
if (!deptypes_b) if (!types_b)
setup_deptypes(); setup_types();
services = rc_deptree_depends(deptree, deptypes_b, applet_list, services = rc_deptree_depends(deptree, types_b, applet_list,
runlevel, 0); runlevel, 0);
if (TAILQ_FIRST(services)) { if (TAILQ_FIRST(services)) {
eerrorn("ERROR: %s needs service(s) ", applet); eerrorn("ERROR: %s needs service(s) ", applet);
@@ -642,11 +625,9 @@ svc_start_deps(void)
rc_stringlist_free(services); rc_stringlist_free(services);
services = NULL; services = NULL;
need_services = rc_deptree_depends(deptree, deptypes_n, need_services = rc_deptree_depends(deptree, types_n,
applet_list, runlevel, depoptions); applet_list, runlevel, depoptions);
want_services = rc_deptree_depends(deptree, deptypes_nw, use_services = rc_deptree_depends(deptree, types_nu,
applet_list, runlevel, depoptions);
use_services = rc_deptree_depends(deptree, deptypes_nwu,
applet_list, runlevel, depoptions); applet_list, runlevel, depoptions);
if (!rc_runlevel_starting()) { if (!rc_runlevel_starting()) {
@@ -674,7 +655,7 @@ svc_start_deps(void)
return; return;
/* Now wait for them to start */ /* Now wait for them to start */
services = rc_deptree_depends(deptree, deptypes_nwua, applet_list, services = rc_deptree_depends(deptree, types_nua, applet_list,
runlevel, depoptions); runlevel, depoptions);
/* We use tmplist to hold our scheduled by list */ /* We use tmplist to hold our scheduled by list */
tmplist = rc_stringlist_new(); tmplist = rc_stringlist_new();
@@ -689,7 +670,6 @@ svc_start_deps(void)
state & RC_SERVICE_WASINACTIVE) state & RC_SERVICE_WASINACTIVE)
{ {
if (!rc_stringlist_find(need_services, svc->value) && if (!rc_stringlist_find(need_services, svc->value) &&
!rc_stringlist_find(want_services, svc->value) &&
!rc_stringlist_find(use_services, svc->value)) !rc_stringlist_find(use_services, svc->value))
continue; continue;
} }
@@ -880,10 +860,10 @@ svc_stop_deps(RC_SERVICE state)
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
eerrorx("failed to load deptree"); eerrorx("failed to load deptree");
if (!deptypes_m) if (!types_m)
setup_deptypes(); setup_types();
services = rc_deptree_depends(deptree, deptypes_m, applet_list, services = rc_deptree_depends(deptree, types_m, applet_list,
runlevel, depoptions); runlevel, depoptions);
tmplist = rc_stringlist_new(); tmplist = rc_stringlist_new();
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) { TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
@@ -943,7 +923,7 @@ svc_stop_deps(RC_SERVICE state)
/* We now wait for other services that may use us and are /* We now wait for other services that may use us and are
* stopping. This is important when a runlevel stops */ * stopping. This is important when a runlevel stops */
services = rc_deptree_depends(deptree, deptypes_mwua, applet_list, services = rc_deptree_depends(deptree, types_mua, applet_list,
runlevel, depoptions); runlevel, depoptions);
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)
@@ -1314,10 +1294,8 @@ openrc_run(int argc, char **argv)
prefix = save; prefix = save;
} else if (strcmp(optarg, "ineed") == 0 || } else if (strcmp(optarg, "ineed") == 0 ||
strcmp(optarg, "iuse") == 0 || strcmp(optarg, "iuse") == 0 ||
strcmp(optarg, "iwant") == 0 ||
strcmp(optarg, "needsme") == 0 || strcmp(optarg, "needsme") == 0 ||
strcmp(optarg, "usesme") == 0 || strcmp(optarg, "usesme") == 0 ||
strcmp(optarg, "wantsme") == 0 ||
strcmp(optarg, "iafter") == 0 || strcmp(optarg, "iafter") == 0 ||
strcmp(optarg, "ibefore") == 0 || strcmp(optarg, "ibefore") == 0 ||
strcmp(optarg, "iprovide") == 0) strcmp(optarg, "iprovide") == 0)

View File

@@ -44,8 +44,7 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#if defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) \ #if defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
|| defined(__GNU__)
# include <pty.h> # include <pty.h>
#elif defined(__NetBSD__) || defined(__OpenBSD__) #elif defined(__NetBSD__) || defined(__OpenBSD__)
# include <util.h> # include <util.h>

View File

@@ -66,7 +66,6 @@ static const char *const env_whitelist[] = {
"LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", "LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS",
"LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION", "LC_ALL", "LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION", "LC_ALL",
"IN_HOTPLUG", "IN_BACKGROUND", "RC_INTERFACE_KEEP_CONFIG", "IN_HOTPLUG", "IN_BACKGROUND", "RC_INTERFACE_KEEP_CONFIG",
"EERROR_QUIET", "EINFO_QUIET",
NULL NULL
}; };

View File

@@ -343,7 +343,6 @@ rc_status(int argc, char **argv)
} }
needsme = rc_stringlist_new(); needsme = rc_stringlist_new();
rc_stringlist_add(needsme, "needsme"); rc_stringlist_add(needsme, "needsme");
rc_stringlist_add(needsme, "wantsme");
nservices = rc_stringlist_new(); nservices = rc_stringlist_new();
alist = rc_stringlist_new(); alist = rc_stringlist_new();
l = rc_stringlist_add(alist, ""); l = rc_stringlist_add(alist, "");
@@ -366,7 +365,7 @@ rc_status(int argc, char **argv)
* be added to the list * be added to the list
*/ */
unsetenv("RC_SVCNAME"); unsetenv("RC_SVCNAME");
print_level("Dynamic", "needed/wanted"); print_level("Dynamic", "needed");
print_services(NULL, nservices); print_services(NULL, nservices);
print_level("Dynamic", "manual"); print_level("Dynamic", "manual");
print_services(NULL, services); print_services(NULL, services);

View File

@@ -155,8 +155,8 @@ cleanup(void)
rc_stringlist_free(hotplugged_services); rc_stringlist_free(hotplugged_services);
rc_stringlist_free(stop_services); rc_stringlist_free(stop_services);
rc_stringlist_free(start_services); rc_stringlist_free(start_services);
rc_stringlist_free(types_nw); rc_stringlist_free(types_n);
rc_stringlist_free(types_nwua); rc_stringlist_free(types_nua);
rc_deptree_free(deptree); rc_deptree_free(deptree);
free(runlevel); free(runlevel);
#endif #endif
@@ -519,7 +519,7 @@ runlevel_config(const char *service, const char *level)
} }
static void static void
do_stop_services(RC_STRINGLIST *types_nw, RC_STRINGLIST *start_services, do_stop_services(RC_STRINGLIST *types_n, RC_STRINGLIST *start_services,
const RC_STRINGLIST *stop_services, const RC_DEPTREE *deptree, const RC_STRINGLIST *stop_services, const RC_DEPTREE *deptree,
const char *newlevel, bool parallel, bool going_down) const char *newlevel, bool parallel, bool going_down)
{ {
@@ -530,10 +530,9 @@ do_stop_services(RC_STRINGLIST *types_nw, RC_STRINGLIST *start_services,
RC_STRINGLIST *nostop; RC_STRINGLIST *nostop;
bool crashed, nstop; bool crashed, nstop;
if (!types_nw) { if (!types_n) {
types_nw = rc_stringlist_new(); types_n = rc_stringlist_new();
rc_stringlist_add(types_nw, "needsme"); rc_stringlist_add(types_n, "needsme");
rc_stringlist_add(types_nw, "wantsme");
} }
crashed = rc_conf_yesno("rc_crashed_stop"); crashed = rc_conf_yesno("rc_crashed_stop");
@@ -592,7 +591,7 @@ do_stop_services(RC_STRINGLIST *types_nw, RC_STRINGLIST *start_services,
if (!svc1) { if (!svc1) {
tmplist = rc_stringlist_new(); tmplist = rc_stringlist_new();
rc_stringlist_add(tmplist, service->value); rc_stringlist_add(tmplist, service->value);
deporder = rc_deptree_depends(deptree, types_nw, deporder = rc_deptree_depends(deptree, types_n,
tmplist, newlevel ? newlevel : runlevel, tmplist, newlevel ? newlevel : runlevel,
RC_DEP_STRICT | RC_DEP_TRACE); RC_DEP_STRICT | RC_DEP_TRACE);
rc_stringlist_free(tmplist); rc_stringlist_free(tmplist);
@@ -752,12 +751,11 @@ main(int argc, char **argv)
{ {
const char *bootlevel = NULL; const char *bootlevel = NULL;
char *newlevel = NULL; char *newlevel = NULL;
const char *systype = NULL;
static RC_STRINGLIST *hotplugged_services; static RC_STRINGLIST *hotplugged_services;
static RC_STRINGLIST *stop_services; static RC_STRINGLIST *stop_services;
static RC_STRINGLIST *start_services; static RC_STRINGLIST *start_services;
static RC_STRINGLIST *types_nw; static RC_STRINGLIST *types_n;
static RC_STRINGLIST *types_nwua; static RC_STRINGLIST *types_nua;
static RC_DEPTREE *deptree; static RC_DEPTREE *deptree;
RC_STRINGLIST *deporder = NULL; RC_STRINGLIST *deporder = NULL;
RC_STRINGLIST *tmplist; RC_STRINGLIST *tmplist;
@@ -846,9 +844,9 @@ main(int argc, char **argv)
eerrorx("%s: %s", applet, strerror(errno)); eerrorx("%s: %s", applet, strerror(errno));
/* NOTREACHED */ /* NOTREACHED */
case 'S': case 'S':
systype = rc_sys(); bootlevel = rc_sys();
if (systype) if (bootlevel)
printf("%s\n", systype); printf("%s\n", bootlevel);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
/* NOTREACHED */ /* NOTREACHED */
case_RC_COMMON_GETOPT case_RC_COMMON_GETOPT
@@ -998,14 +996,13 @@ main(int argc, char **argv)
if (stop_services) if (stop_services)
rc_stringlist_sort(&stop_services); rc_stringlist_sort(&stop_services);
types_nwua = rc_stringlist_new(); types_nua = rc_stringlist_new();
rc_stringlist_add(types_nwua, "ineed"); rc_stringlist_add(types_nua, "ineed");
rc_stringlist_add(types_nwua, "iwant"); rc_stringlist_add(types_nua, "iuse");
rc_stringlist_add(types_nwua, "iuse"); rc_stringlist_add(types_nua, "iafter");
rc_stringlist_add(types_nwua, "iafter");
if (stop_services) { if (stop_services) {
tmplist = rc_deptree_depends(deptree, types_nwua, stop_services, tmplist = rc_deptree_depends(deptree, types_nua, stop_services,
runlevel, depoptions | RC_DEP_STOP); runlevel, depoptions | RC_DEP_STOP);
rc_stringlist_free(stop_services); rc_stringlist_free(stop_services);
stop_services = tmplist; stop_services = tmplist;
@@ -1050,7 +1047,7 @@ main(int argc, char **argv)
/* Now stop the services that shouldn't be running */ /* Now stop the services that shouldn't be running */
if (stop_services && !nostop) if (stop_services && !nostop)
do_stop_services(types_nw, start_services, stop_services, deptree, newlevel, parallel, going_down); do_stop_services(types_n, start_services, stop_services, deptree, newlevel, parallel, going_down);
/* Wait for our services to finish */ /* Wait for our services to finish */
wait_for_services(); wait_for_services();
@@ -1112,7 +1109,7 @@ main(int argc, char **argv)
/* Start those services. */ /* Start those services. */
rc_stringlist_sort(&run_services); rc_stringlist_sort(&run_services);
deporder = rc_deptree_depends(deptree, types_nwua, run_services, rlevel->value, depoptions | RC_DEP_START); deporder = rc_deptree_depends(deptree, types_nua, run_services, rlevel->value, depoptions | RC_DEP_START);
rc_stringlist_free(run_services); rc_stringlist_free(run_services);
run_services = deporder; run_services = deporder;
do_start_services(run_services, parallel); do_start_services(run_services, parallel);

View File

@@ -112,5 +112,9 @@ rc_stringlist_split
rc_stringlist_split@@RC_1.0 rc_stringlist_split@@RC_1.0
rc_sys rc_sys
rc_sys@@RC_1.0 rc_sys@@RC_1.0
rc_sys_v1
rc_sys_v1@@RC_1.0
rc_sys_v2
rc_sys_v2@@RC_1.0
rc_yesno rc_yesno
rc_yesno@@RC_1.0 rc_yesno@@RC_1.0