Compare commits
52 Commits
mount-serv
...
0.19.x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2506da801 | ||
|
|
f45f7243c1 | ||
|
|
afe64e5e49 | ||
|
|
a1acdeb92e | ||
|
|
b810473e4f | ||
|
|
627e925463 | ||
|
|
f5cf1136e7 | ||
|
|
a4038e1171 | ||
|
|
a0cf8f9124 | ||
|
|
9fedb3b40b | ||
|
|
635e33cdc8 | ||
|
|
bd9456ff31 | ||
|
|
33d3f33b3c | ||
|
|
ddb895b355 | ||
|
|
085d77f17e | ||
|
|
c831f1f994 | ||
|
|
591aea2821 | ||
|
|
c09eeca491 | ||
|
|
4cf6b0ecf7 | ||
|
|
ee944553a9 | ||
|
|
6cae41a4e6 | ||
|
|
960881fcfe | ||
|
|
d26013494d | ||
|
|
b29b2fb3cb | ||
|
|
7da72ce487 | ||
|
|
fc777aeaf3 | ||
|
|
9d53d436ae | ||
|
|
b81317bdf8 | ||
|
|
29f7e33592 | ||
|
|
850ca03077 | ||
|
|
050ddfae4a | ||
|
|
d5116cc697 | ||
|
|
b86d170037 | ||
|
|
6fa0d6318b | ||
|
|
80d3928b0d | ||
|
|
17ef205bc6 | ||
|
|
b20a1951ad | ||
|
|
bf0c0dd564 | ||
|
|
1558ad2b9e | ||
|
|
5f4f242036 | ||
|
|
b3f7ff901f | ||
|
|
a59365a582 | ||
|
|
dac5966ca4 | ||
|
|
3b6a6df4b5 | ||
|
|
b047ea47e9 | ||
|
|
b652752339 | ||
|
|
2a439c85bd | ||
|
|
7341cd882f | ||
|
|
279f1e5d10 | ||
|
|
c256a7aa80 | ||
|
|
6a42298257 | ||
|
|
f69833a1e1 |
@@ -1,3 +1,3 @@
|
||||
NAME= openrc
|
||||
VERSION= 0.18
|
||||
VERSION= 0.19.1
|
||||
PKG= ${NAME}-${VERSION}
|
||||
|
||||
46
NEWS.md
46
NEWS.md
@@ -3,6 +3,52 @@
|
||||
This file will contain a list of notable changes for each release. Note
|
||||
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
|
||||
|
||||
The binfmt service, which registers misc binary formats with the Linux
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
include ../mk/net.mk
|
||||
|
||||
DIR= ${CONFDIR}
|
||||
CONF= bootmisc fsck hostname localmount mount netmount urandom tmpfiles \
|
||||
CONF= bootmisc fsck hostname localmount netmount urandom tmpfiles \
|
||||
${CONF-${OS}}
|
||||
|
||||
ifeq (${MKNET},yes)
|
||||
@@ -15,7 +15,8 @@ include ${MK}/os.mk
|
||||
|
||||
CONF-FreeBSD= ipfw moused powerd rarpd savecore syscons
|
||||
|
||||
CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules
|
||||
CONF-Linux= consolefont devfs dmesg hwclock keymaps killprocs modules mtab \
|
||||
net-online
|
||||
|
||||
CONF-NetBSD= moused rarpd savecore
|
||||
|
||||
|
||||
@@ -8,3 +8,8 @@ wipe_tmp="YES"
|
||||
# Write the initial dmesg log into /var/log/dmesg after boot
|
||||
# This may be useful if you need the kernel boot log afterwards
|
||||
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
|
||||
|
||||
23
conf.d/mount
23
conf.d/mount
@@ -1,23 +0,0 @@
|
||||
# The mount service is a multiplexed service. This means you must have
|
||||
# symbolic links to it in your init.d directory for each file system you
|
||||
# want to mount. I recommend naming those symbolic links the same as the
|
||||
# paths to the file systems they mount, removing the leading slash and
|
||||
# substituting _ for the remaining slashes, for example:
|
||||
#
|
||||
# cd /etc/init.d
|
||||
# ln -s mount mount.usr
|
||||
# ln -s mount mount.usr_local
|
||||
#
|
||||
# Set up a symbolic link like this for each file system you wish to
|
||||
# mount, then add the symbolic link to the appropriate runlevel. Once
|
||||
# that is done, add the appropriate definitions for the file system to
|
||||
# this file.
|
||||
#
|
||||
#You will need to define the mountpoint and any dependencies for each
|
||||
#filesystem as shown here.
|
||||
#
|
||||
#If the mountpoint does not match an entry in fstab, the mount will be
|
||||
#ignored.
|
||||
#
|
||||
#mount_usr_mountpoint="/usr"
|
||||
#
|
||||
5
conf.d/mtab
Normal file
5
conf.d/mtab
Normal file
@@ -0,0 +1,5 @@
|
||||
# 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
|
||||
15
conf.d/net-online
Normal file
15
conf.d/net-online
Normal file
@@ -0,0 +1,15 @@
|
||||
# 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
|
||||
@@ -25,11 +25,11 @@
|
||||
#rc_need="net.eth1 net.eth2"
|
||||
#
|
||||
# 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
|
||||
# should list that tool.
|
||||
#
|
||||
#rc_need="networkmanager"
|
||||
#rc_need="NetworkManager"
|
||||
#rc_need="dhcpcd"
|
||||
#rc_need="wicd"
|
||||
#
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
|
||||
# This is the subsystem type. Valid options on Linux:
|
||||
# "" - nothing special
|
||||
# "docker" - Docker container manager
|
||||
# "lxc" - Linux Containers
|
||||
# "openvz" - Linux OpenVZ
|
||||
# "prefix" - Prefix
|
||||
# "rkt" - CoreOS container management system
|
||||
# "uml" - Usermode Linux
|
||||
# "vserver" - Linux vserver
|
||||
# "systemd-nspawn" - Container created by the systemd-nspawn utility
|
||||
@@ -62,12 +64,21 @@ rc_tty_number=12
|
||||
# Set the devices controller settings for this service.
|
||||
#rc_cgroup_devices=""
|
||||
|
||||
# Set the hugetlb controller settings for this service.
|
||||
#rc_cgroup_hugetlb=""
|
||||
|
||||
# Set the memory controller settings for this service.
|
||||
#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.
|
||||
#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
|
||||
# killed when the service is stopped or restarted.
|
||||
# This should not be set globally because it kills all of the service's
|
||||
|
||||
@@ -29,17 +29,20 @@
|
||||
# come up.
|
||||
#rc_depend_strict="YES"
|
||||
|
||||
# rc_hotplug is a list of services that we allow to be hotplugged.
|
||||
# By default we do not allow hotplugging.
|
||||
# rc_hotplug controls which services we allow to be hotplugged.
|
||||
# A hotplugged service is one started by a dynamic dev manager when a matching
|
||||
# hardware device is found.
|
||||
# This service is intrinsically included in the boot runlevel.
|
||||
# To disable services, prefix with a !
|
||||
# Hotplugged services appear in the "hotplugged" runlevel.
|
||||
# If rc_hotplug is set to any value, we compare the name of this service
|
||||
# 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.*"
|
||||
# This allows net.wlan and any service not matching net.* to be plugged.
|
||||
# Example - rc_hotplug="*"
|
||||
# This allows all services to be hotplugged
|
||||
#rc_hotplug="*"
|
||||
# This allows net.wlan and any service not matching net.* to be hotplugged.
|
||||
# Example - rc_hotplug="!net.*"
|
||||
# This allows services that do not match "net.*" to be hotplugged.
|
||||
|
||||
# rc_logger launches a logging daemon to log the entire rc process to
|
||||
# /var/log/rc.log
|
||||
|
||||
@@ -10,6 +10,6 @@ name="Avahi DNS Configuration Daemon"
|
||||
depend()
|
||||
{
|
||||
use dns
|
||||
need mount.usr mount.var dbus
|
||||
need localmount dbus
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
@@ -10,6 +10,6 @@ name="Avahi Service Advertisement Daemon"
|
||||
depend()
|
||||
{
|
||||
use dns
|
||||
need mount.usr mount.var dbus
|
||||
need localmount dbus
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ name="Message Bus Daemon"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var net
|
||||
need localmount net
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ name="DHCP Client Daemon"
|
||||
depend()
|
||||
{
|
||||
provide net
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
use logger
|
||||
after bootmisc modules
|
||||
before dns
|
||||
|
||||
@@ -12,7 +12,7 @@ extra_started_commands="reload"
|
||||
depend()
|
||||
{
|
||||
provide dns
|
||||
need mount.usr mount.var net
|
||||
need localmount net
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ esac
|
||||
depend()
|
||||
{
|
||||
provide dns
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ name="Network Time Protocol Daemon"
|
||||
depend()
|
||||
{
|
||||
use dns
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc ntp-client
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ fi
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var net
|
||||
need localmount net
|
||||
use dns
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ name="WPA Supplicant Daemon"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
use logger
|
||||
after bootmisc modules
|
||||
before dns dhcpcd net
|
||||
|
||||
1
init.d/.gitignore
vendored
1
init.d/.gitignore
vendored
@@ -4,7 +4,6 @@ hostname
|
||||
local
|
||||
localmount
|
||||
loopback
|
||||
mount
|
||||
moused
|
||||
netmount
|
||||
network
|
||||
|
||||
@@ -2,7 +2,7 @@ include ../mk/net.mk
|
||||
|
||||
DIR= ${INITDIR}
|
||||
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \
|
||||
mount.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}}
|
||||
BIN= ${OBJS}
|
||||
|
||||
@@ -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 \
|
||||
killprocs.in modules.in mount-ro.in mtab.in numlock.in \
|
||||
procfs.in sysfs.in termencoding.in tmpfiles.dev.in
|
||||
procfs.in net-online.in sysfs.in termencoding.in tmpfiles.dev.in
|
||||
|
||||
# Generic BSD scripts
|
||||
SRCS-NetBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
|
||||
|
||||
@@ -16,5 +16,5 @@ start()
|
||||
ebegin "Loading custom binary format handlers"
|
||||
"$RC_LIBEXECDIR"/sh/binfmt.sh
|
||||
eend $?
|
||||
return 0
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
before logger
|
||||
after clock root sysctl
|
||||
keyword -prefix -timeout
|
||||
@@ -121,11 +121,11 @@ clean_run()
|
||||
local dir
|
||||
# If / is still read-only due to a problem, this will fail!
|
||||
if ! checkpath -W /; then
|
||||
eerror "/ is not writable; unable to clean up underlying /run"
|
||||
ewarn "/ is not writable; unable to clean up underlying /run"
|
||||
return 1
|
||||
fi
|
||||
if ! checkpath -W /tmp; then
|
||||
eerror "/tmp is not writable; unable to clean up underlying /run"
|
||||
ewarn "/tmp is not writable; unable to clean up underlying /run"
|
||||
return 1
|
||||
fi
|
||||
# Now we know that we can modify /tmp and /
|
||||
@@ -136,13 +136,12 @@ clean_run()
|
||||
dir=$(mktemp -d)
|
||||
if [ -n "$dir" -a -d $dir -a -w $dir ]; then
|
||||
mount --bind / $dir && rm -rf $dir/run/* || rc=1
|
||||
umount $dir
|
||||
rm -rf $dir
|
||||
umount $dir && rmdir $dir
|
||||
else
|
||||
rc=1
|
||||
fi
|
||||
if [ $rc -ne 0 ]; then
|
||||
eerror "Could not clean up underlying /run on /"
|
||||
ewarn "Could not clean up underlying /run on /"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -217,6 +216,9 @@ start()
|
||||
case "$RC_SYS" in
|
||||
VSERVER|OPENVZ|LXC|SYSTEMD-NSPAWN) ;;
|
||||
*)
|
||||
if yesno ${previous_dmesg:-no}; then
|
||||
mv /var/log/dmesg /var/log/dmesg.old
|
||||
fi
|
||||
dmesg > /var/log/dmesg
|
||||
chmod 640 /var/log/dmesg
|
||||
;;
|
||||
|
||||
@@ -6,8 +6,8 @@ description="Sets a font for the consoles."
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var termencoding
|
||||
after hotplug bootmisc
|
||||
need localmount termencoding
|
||||
after hotplug bootmisc modules
|
||||
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ command_args=$devd_args
|
||||
name="Device State Change Daemon"
|
||||
|
||||
depend() {
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc
|
||||
before net.lo0
|
||||
keyword -jail -prefix
|
||||
|
||||
@@ -6,7 +6,7 @@ description="Creates the dev database"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
}
|
||||
|
||||
start()
|
||||
|
||||
@@ -6,7 +6,7 @@ description="Applies a keymap for the consoles."
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var termencoding
|
||||
need localmount termencoding
|
||||
after bootmisc
|
||||
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ depend()
|
||||
start()
|
||||
{
|
||||
# Mount local filesystems in /etc/fstab.
|
||||
local types="noproc" x= no_netdev=
|
||||
local types="noproc" x= no_netdev= rc=
|
||||
for x in $net_fs_list $extra_net_fs_list; do
|
||||
types="${types},no${x}"
|
||||
done
|
||||
@@ -29,9 +29,11 @@ start()
|
||||
ebegin "Mounting local filesystems"
|
||||
mount -at "$types" $no_netdev
|
||||
eend $? "Some local filesystem failed to mount"
|
||||
|
||||
# Always return 0 - some local mounts may not be critical for boot
|
||||
return 0
|
||||
rc=$?
|
||||
if [ "$RC_UNAME" != Linux ]; then
|
||||
rc=0
|
||||
fi
|
||||
return $rc
|
||||
}
|
||||
|
||||
stop()
|
||||
@@ -70,17 +72,19 @@ stop()
|
||||
sync
|
||||
fi
|
||||
|
||||
local aufs_branch aufs_mount_dir aufs_mount_point aufs_si_dir aufs_si_id
|
||||
for aufs_si_dir in /sys/fs/aufs/*; do
|
||||
aufs_mount_dir=${aufs_si_dir#/sys/fs/aufs/}
|
||||
aufs_si_id="$(printf "%s" $aufs_mount_dir | sed 's/_/=/g')"
|
||||
local aufs_branch aufs_mount_point aufs_si_id aufs_br_id branches
|
||||
for aufs_si_dir in /sys/fs/aufs/si*; do
|
||||
[ -d "${aufs_si_dir}" ] || continue
|
||||
aufs_si_id="si=${aufs_si_dir#/sys/fs/aufs/si_}"
|
||||
aufs_mount_point="$(mountinfo -o ${aufs_si_id})"
|
||||
for x in $aufs_si_dir/br[0-9][0-9][0-9]; do
|
||||
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 $branches; do
|
||||
[ -e "${x}" ] || continue
|
||||
aufs_branch=$(sed 's/=.*//g' $x)
|
||||
eindent
|
||||
if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then
|
||||
ewarn "Failed to remove branch $aufs_branch from aufs \
|
||||
$aufs_mount_point"
|
||||
$aufs_mount_point"
|
||||
fi
|
||||
eoutdent
|
||||
sync
|
||||
|
||||
@@ -6,7 +6,7 @@ extra_commands="restore"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -jail -prefix
|
||||
}
|
||||
|
||||
|
||||
118
init.d/mount.in
118
init.d/mount.in
@@ -1,118 +0,0 @@
|
||||
#!@SBINDIR@/openrc-run
|
||||
# Copyright (c) 2015 William Hubbs <w.d.hubbs@gmail.com>
|
||||
# Released under the 2-clause BSD license.
|
||||
|
||||
description="Mount a file system defined in @SYSCONFDIR@/fstab"
|
||||
extra_commands="generate"
|
||||
|
||||
depend()
|
||||
{
|
||||
need fsck
|
||||
use modules mtab
|
||||
after modules
|
||||
keyword -jail -prefix -vserver -lxc
|
||||
}
|
||||
|
||||
. "$RC_LIBEXECDIR"/sh/rc-mount.sh
|
||||
|
||||
start_pre()
|
||||
{
|
||||
# Do not start this service as "mount"
|
||||
if [ "$rc_svcname" = mount ]; then
|
||||
eerror "The mount service should not be started directly"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
start()
|
||||
{
|
||||
if [ "$rc_svcname" = mount-generate-symlinks ]; then
|
||||
generate
|
||||
return $?
|
||||
fi
|
||||
|
||||
local mountname=${rc_svcname#*.}
|
||||
local fspath=${mount_${mountname}_mountpoint}
|
||||
|
||||
# for now, make sure fspath is in fstab
|
||||
if [ ! fstabinfo -q $fspath ]; then
|
||||
einfo "$rc_svcname: $fspath is not in @SYSCONFDIR@/fstab"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Is the file system mounted?
|
||||
if mountinfo -q $fspath; then
|
||||
action=remount
|
||||
msg=Remounting
|
||||
else
|
||||
action=mount
|
||||
msg=Mounting
|
||||
fi
|
||||
|
||||
ebegin "$msg $fspath according to @SYSCONFDIR@/fstab"
|
||||
fstabinfo --$action $fspath
|
||||
eend $? "$fspath failed to $action"
|
||||
}
|
||||
|
||||
stop_pre()
|
||||
{
|
||||
# Do not stop this service as "mount"
|
||||
if [ "$rc_svcname" = mount ]; then
|
||||
eerror "The mount service should not be stopped directly"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
stop()
|
||||
{
|
||||
yesno $RC_GOINGDOWN || return 0
|
||||
local mountname=${rc_svcname#*.}
|
||||
local fspath=${mount_${mountname}_mountpoint}
|
||||
|
||||
# make sure fspath is in fstab
|
||||
if ! fstabinfo -q $fspath; then
|
||||
einfo "$rc_svcname: $fspath is not in @SYSCONFDIR@/fstab"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Is the file system mounted?
|
||||
mountinfo -q $fspath || return 0
|
||||
|
||||
# Flush all pending disk writes now
|
||||
sync
|
||||
|
||||
ebegin "Unmounting $fspath"
|
||||
do_unmount umount $fspath
|
||||
eend $? "Unable to umount $fspath"
|
||||
return 0
|
||||
}
|
||||
|
||||
generate()
|
||||
{
|
||||
local fslist="$(fstabinfo)"
|
||||
local fs fsopts rc=0
|
||||
local svcpath=${RC_SVCNAME%/*}
|
||||
ebegin "Generating mount symlinks"
|
||||
for fs in $fslist; do
|
||||
case $fs in
|
||||
/) ;;
|
||||
/*)
|
||||
fsopts="$(fstabinfo -o $fs)"
|
||||
case "$fsopts" in
|
||||
*noauto*) ;;
|
||||
*)
|
||||
local name="${fs#/}"
|
||||
name="$(echo $name | sed 's#/#.#g')"
|
||||
einfo ln -snf mount "${svcpath}/${name}"
|
||||
rc=$?
|
||||
[ $rc -ne 0 ] && break
|
||||
*) ;;
|
||||
esac
|
||||
*) ;;
|
||||
esac
|
||||
done
|
||||
eend $rc "Failed to generate symlinks for all mounts"
|
||||
return $rc
|
||||
}
|
||||
@@ -14,7 +14,7 @@ name="Console Mouse Daemon"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc
|
||||
keyword -jail -prefix
|
||||
}
|
||||
|
||||
@@ -12,21 +12,19 @@ depend()
|
||||
|
||||
start()
|
||||
{
|
||||
[ -L /etc/mtab ] && return 0
|
||||
local rc=0
|
||||
ebegin "Updating /etc/mtab"
|
||||
if ! checkpath -W /etc; then
|
||||
rc=1
|
||||
elif [ ! -e /etc/mtab ]; then
|
||||
elif ! yesno ${mtab_is_file:-no}; then
|
||||
[ ! -L /etc/mtab ] && [ -f /etc/mtab ] &&
|
||||
ewarn "Removing /etc/mtab file"
|
||||
einfo "Creating mtab symbolic link"
|
||||
ln -snf /proc/self/mounts /etc/mtab
|
||||
else
|
||||
ewarn "The support for updating /etc/mtab as a file is"
|
||||
ewarn "deprecated and will be removed in the future."
|
||||
ewarn "Please run the following command as root on your system."
|
||||
ewarn
|
||||
ewarn "ln -snf /proc/self/mounts /etc/mtab"
|
||||
ewarn
|
||||
|
||||
[ -L /etc/mtab ] && ewarn "Removing /etc/mtab symbolic link"
|
||||
rm -f /etc/mtab
|
||||
einfo "Creating mtab file"
|
||||
# With / as tmpfs we cannot umount -at tmpfs in localmount as that
|
||||
# makes / readonly and dismounts all tmpfs even if in use which is
|
||||
# not good. Luckily, umount uses /etc/mtab instead of /proc/mounts
|
||||
|
||||
69
init.d/net-online.in
Normal file
69
init.d/net-online.in
Normal file
@@ -0,0 +1,69 @@
|
||||
#!@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"
|
||||
}
|
||||
@@ -27,7 +27,10 @@ start()
|
||||
rc=$?
|
||||
fi
|
||||
ewend $rc "Could not mount all network filesystems"
|
||||
return 0
|
||||
if [ "$RC_UNAME" != Linux ]; then
|
||||
rc=0
|
||||
fi
|
||||
return $rc
|
||||
}
|
||||
|
||||
stop()
|
||||
|
||||
@@ -10,7 +10,7 @@ __nl="
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc
|
||||
if [ -n "$(interfaces)" ]; then
|
||||
provide net
|
||||
|
||||
@@ -6,7 +6,7 @@ required_files="/etc/newsyslog.conf"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -prefix
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ name="Name Service Cache Daemon"
|
||||
extra_started_commands="flush"
|
||||
|
||||
depend() {
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
use net dns ldap ypbind
|
||||
after bootmisc
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ extra_commands="checkconfig showstatus"
|
||||
extra_started_commands="reload"
|
||||
|
||||
depend() {
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -jail -prefix
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ name="Power Control Daemon"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
use logger
|
||||
after bootmisc
|
||||
keyword -jail -prefix
|
||||
|
||||
@@ -7,7 +7,7 @@ description="Mounts misc filesystems in /proc."
|
||||
depend()
|
||||
{
|
||||
use modules devfs
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ command_background=YES
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc
|
||||
need net
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var net
|
||||
need localmount net
|
||||
after *
|
||||
before local
|
||||
keyword -prefix
|
||||
|
||||
@@ -9,7 +9,7 @@ name="RPC program number mapper"
|
||||
depend()
|
||||
{
|
||||
provide rpc
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
use net logger dns
|
||||
before inetd xinetd ntpd ntp-client
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ pidfile=/var/run/s6-svscan.pid
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
}
|
||||
|
||||
start_pre()
|
||||
|
||||
@@ -7,43 +7,53 @@ description="Saves the caches OpenRC uses to non volatile storage"
|
||||
start()
|
||||
{
|
||||
if [ -e "$RC_SVCDIR"/clock-skewed ]; then
|
||||
ewarn "WARNING: clock skew detected!"
|
||||
ewarn "Clock skew detected!"
|
||||
if ! yesno "${RC_GOINGDOWN}"; then
|
||||
eerror "Not saving deptree cache"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
if ! checkpath -W "$RC_LIBEXECDIR"; then
|
||||
ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
|
||||
if ! yesno "${RC_GOINGDOWN}"; then
|
||||
ewarn "Unable to save deptree cache"
|
||||
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
|
||||
if ! checkpath -W "$RC_LIBEXECDIR"; then
|
||||
eerror "${RC_LIBEXECDIR} is not writable!"
|
||||
eerror "Unable to save dependency cache"
|
||||
if yesno "${RC_GOINGDOWN}"; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
ebegin "Saving dependency cache"
|
||||
local rc=
|
||||
if [ ! -d "$RC_LIBEXECDIR"/cache ]; then
|
||||
rm -rf "$RC_LIBEXECDIR"/cache
|
||||
if ! mkdir -p "$RC_LIBEXECDIR"/cache; then
|
||||
rc=$?
|
||||
eerror "Unable to create $RC_LIBEXECDIR/cache"
|
||||
eerror "Unable to save dependency cache"
|
||||
if yesno "${RC_GOINGDOWN}"; then
|
||||
rc=0
|
||||
return 0
|
||||
fi
|
||||
eend $rc "Unable to create $RC_LIBEXECDIR/cache"
|
||||
return $rc
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
local save=
|
||||
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
|
||||
ebegin "Saving dependency cache"
|
||||
local rc=0 save=
|
||||
for x in deptree depconfig shutdowntime softlevel nettree rc.log; do
|
||||
[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x"
|
||||
done
|
||||
if [ -n "$save" ]; then
|
||||
cp -p $save "$RC_LIBEXECDIR"/cache 2>/dev/null
|
||||
cp -p $save "$RC_LIBEXECDIR"/cache
|
||||
rc=$?
|
||||
fi
|
||||
rc=$?
|
||||
if yesno "${RC_GOINGDOWN}"; then
|
||||
rc=0
|
||||
if [ $rc -ne 0 ]; then
|
||||
eerror "Unable to save dependency cache"
|
||||
fi
|
||||
eend 0
|
||||
fi
|
||||
eend $rc
|
||||
eend $rc "Unable to save dependency cache"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ description="Saves a kernel dump."
|
||||
|
||||
depend()
|
||||
{
|
||||
need dumpon mount.usr mount.var
|
||||
need dumpon localmount
|
||||
before encswap
|
||||
keyword -jail -prefix
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
depend()
|
||||
{
|
||||
before mount.usr mount.var
|
||||
before localmount
|
||||
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Released under the 2-clause BSD license.
|
||||
|
||||
depend() {
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -jail -prefix
|
||||
}
|
||||
|
||||
|
||||
@@ -61,16 +61,6 @@ mount_misc()
|
||||
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
|
||||
if [ -d /sys/fs/fuse/connections ] \
|
||||
&& ! mountinfo -q /sys/fs/fuse/connections; then
|
||||
@@ -108,6 +98,16 @@ mount_misc()
|
||||
|
||||
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
|
||||
|
||||
if ! mountinfo -q /sys/fs/cgroup/openrc; then
|
||||
@@ -116,7 +116,7 @@ mount_cgroups()
|
||||
mount -n -t cgroup \
|
||||
-o none,${sysfs_opts},name=openrc,release_agent="$agent" \
|
||||
openrc /sys/fs/cgroup/openrc
|
||||
echo 1 > /sys/fs/cgroup/openrc/notify_on_release
|
||||
printf 1 > /sys/fs/cgroup/openrc/notify_on_release
|
||||
fi
|
||||
|
||||
yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
|
||||
|
||||
@@ -14,7 +14,7 @@ depend()
|
||||
{
|
||||
provide logger
|
||||
use net newsyslog
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
after bootmisc
|
||||
keyword -prefix
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ description="Set up tmpfiles.d entries"
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
}
|
||||
|
||||
start()
|
||||
|
||||
@@ -7,7 +7,7 @@ description="Initializes the random number generator."
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -jail -lxc -openvz -prefix -systemd-nspawn
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
depend()
|
||||
{
|
||||
need mount.usr mount.var
|
||||
need localmount
|
||||
keyword -prefix
|
||||
}
|
||||
|
||||
|
||||
@@ -166,21 +166,25 @@ 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.
|
||||
Here is a list of the functions you can use in a
|
||||
.Ic depend
|
||||
function. You simply pass the names of the services to it to add to that
|
||||
dependency type, or prefix it with ! to remove it.
|
||||
function. You simply pass the names of the services you want to add to
|
||||
that dependency type to the function, or prefix the names with ! to
|
||||
remove them from the dependencies.
|
||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||
.It Ic need
|
||||
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.
|
||||
.It Ic use
|
||||
The service will attempt to start any services we use that have been added
|
||||
The service will attempt to start any services it uses that have been added
|
||||
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
|
||||
The service will start after these services and stop before these services.
|
||||
.It Ic before
|
||||
The service will start before these services and stop after these services.
|
||||
.It Ic provide
|
||||
We provide this virtual service. For example, named provides dns.
|
||||
The service provides this virtual service. For example, named provides dns.
|
||||
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
|
||||
as a virtual service.
|
||||
@@ -213,6 +217,8 @@ Same as -jail, but for Linux Resource Containers (LXC).
|
||||
Same as -jail, but for OpenVZ systems.
|
||||
.It Dv -prefix
|
||||
Same as -jail, but for Prefix systems.
|
||||
.It Dv -rkt
|
||||
Same as -jail, but for RKT systems.
|
||||
.It Dv -uml
|
||||
Same as -jail, but for UML systems.
|
||||
.It Dv -vserver
|
||||
@@ -221,6 +227,11 @@ Same as -jail, but for VServer systems.
|
||||
Same as -jail, but for Xen DOM0 systems.
|
||||
.It Dv -xenu
|
||||
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
|
||||
.Pp
|
||||
@@ -462,6 +473,9 @@ rc_net_tap1_provide="!net"
|
||||
# It's also possible to negate keywords. This is mainly useful for prefix
|
||||
# users testing OpenRC.
|
||||
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
|
||||
.Sh EXAMPLES
|
||||
.Pp
|
||||
@@ -487,8 +501,8 @@ _need_dbus()
|
||||
|
||||
depend()
|
||||
{
|
||||
# We write a pidfile and to /var/cache, so we need mount.var.
|
||||
need mount.var
|
||||
# We write a pidfile and to /var/cache, so we need localmount.
|
||||
need localmount
|
||||
# We can optionally use the network, but it's not essential.
|
||||
use net
|
||||
# We should be after bootmisc so that /var/run is cleaned before
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
# New Mount Service
|
||||
|
||||
This is definitely considered testing code, so if you use it on your
|
||||
system and it breaks, you have been warned.
|
||||
|
||||
This document will evolve as the testing proceeds and will be removed
|
||||
once the script goes mainline.
|
||||
|
||||
Since this is on a topic branch, this branch will be subject to
|
||||
rebasing, merging commits, etc. When it goes to master, everything here
|
||||
will be in one commit.
|
||||
|
||||
The goal of this is to replace the localmount and metmount services with
|
||||
a single mount service which will be multiplexed so that there is one
|
||||
service for each file system that will be mounted.
|
||||
|
||||
- rc-service mount generate
|
||||
|
||||
scans your fstab and attempts to generate symbolic links in /etc/init.d
|
||||
for each file system you want to mount.
|
||||
|
||||
Then you must edit /etc/conf.d/mount to list all of your file systems
|
||||
and the dependencies they have by using
|
||||
rc_mount_foo_before/after/need/use settings.
|
||||
|
||||
rc-service mount.foo start
|
||||
|
||||
tries to mount a file system and
|
||||
|
||||
rc-service mount.foo stop
|
||||
|
||||
tries to unmount it if your system is going down.
|
||||
|
||||
I'm considering automating the generation of symlinks into the boot
|
||||
process, but I'm not sure yet whether this is a good idea.
|
||||
|
||||
I haven't decided yet exactly how I want to handle the transition from
|
||||
localmount/netmount to this new mount service yet, so you will
|
||||
definitely not have a clean boot if you try to boot with this.
|
||||
|
||||
Another question is whether I want to try automating adding the mount
|
||||
services to runlevels; I think no, but let me know if you feel
|
||||
differently.
|
||||
|
||||
Any suggestions would be helpful.
|
||||
|
||||
@@ -16,6 +16,9 @@ need() {
|
||||
use() {
|
||||
[ -n "$*" ] && echo "$RC_SVCNAME iuse $*" >&3
|
||||
}
|
||||
want() {
|
||||
[ -n "$*" ] && echo "$RC_SVCNAME iwant $*" >&3
|
||||
}
|
||||
before() {
|
||||
[ -n "$*" ] && echo "$RC_SVCNAME ibefore $*" >&3
|
||||
}
|
||||
@@ -26,7 +29,18 @@ provide() {
|
||||
[ -n "$*" ] && echo "$RC_SVCNAME iprovide $*" >&3
|
||||
}
|
||||
keyword() {
|
||||
[ -n "$*" ] && echo "$RC_SVCNAME keyword $*" >&3
|
||||
local c x
|
||||
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() {
|
||||
:
|
||||
@@ -82,6 +96,11 @@ do
|
||||
fi
|
||||
|
||||
[ -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
|
||||
echo "$RC_SVCNAME" >&3
|
||||
|
||||
@@ -23,6 +23,11 @@ mount_svcdir()
|
||||
|
||||
. "$RC_LIBEXECDIR"/sh/functions.sh
|
||||
[ -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
|
||||
if [ -z "$RC_SYS" -a "$RC_UNAME" = "FreeBSD" ]; then
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
|
||||
. "$RC_LIBEXECDIR"/sh/functions.sh
|
||||
[ -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!
|
||||
# However, some of our users have an old proc image in /proc
|
||||
|
||||
@@ -66,6 +66,9 @@ need() {
|
||||
use() {
|
||||
[ -n "$*" ] && echo "use $*"
|
||||
}
|
||||
want() {
|
||||
[ -n "$*" ] && echo "want $*"
|
||||
}
|
||||
before() {
|
||||
[ -n "$*" ] && echo "before $*"
|
||||
}
|
||||
@@ -76,7 +79,18 @@ provide() {
|
||||
[ -n "$*" ] && echo "provide $*"
|
||||
}
|
||||
keyword() {
|
||||
[ -n "$*" ] && echo "keyword $*"
|
||||
local c x
|
||||
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
|
||||
@@ -184,6 +198,12 @@ unset _conf_d
|
||||
|
||||
# Load any system overrides
|
||||
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"
|
||||
@@ -221,20 +241,22 @@ done
|
||||
# Load our script
|
||||
sourcex "$RC_SERVICE"
|
||||
|
||||
for _d in $required_dirs; do
|
||||
if [ ! -d $_d ]; then
|
||||
eval "printf '%s\n' $required_dirs" | while read _d; do
|
||||
if [ -n "$_d" ] && [ ! -d "$_d" ]; then
|
||||
eerror "$RC_SVCNAME: \`$_d' is not a directory"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
[ $? -ne 0 ] && exit 1
|
||||
unset _d
|
||||
|
||||
for _f in $required_files; do
|
||||
if [ ! -r $_f ]; then
|
||||
eval "printf '%s\n' $required_files" | while read _f; do
|
||||
if [ -n "$_f" ] && [ ! -r "$_f" ]; then
|
||||
eerror "$RC_SVCNAME: \`$_f' is not readable"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
[ $? -ne 0 ] && exit 1
|
||||
unset _f
|
||||
|
||||
if [ -n "$opts" ]; then
|
||||
|
||||
@@ -54,7 +54,9 @@ cgroup_set_values()
|
||||
val=
|
||||
;;
|
||||
*)
|
||||
val="$val $1"
|
||||
[ -n "$val" ] &&
|
||||
val="$val $1" ||
|
||||
val="$1"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
@@ -107,12 +109,21 @@ cgroup_set_limits()
|
||||
local devices="${rc_cgroup_devices:-$RC_CGROUP_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}"
|
||||
[ -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}"
|
||||
[ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -86,12 +86,33 @@ get_bootparam()
|
||||
}
|
||||
|
||||
# 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
|
||||
local _rc_svcname=$(shell_var "$RC_SVCNAME") _deptype= _depends=
|
||||
|
||||
# Add any user defined depends
|
||||
for _deptype in config:CONFIG need:NEED use:USE \
|
||||
for _deptype in config:CONFIG need:NEED use:USE want:WANT \
|
||||
after:AFTER before:BEFORE \
|
||||
provide:PROVIDE keyword:KEYWORD; do
|
||||
IFS=:
|
||||
|
||||
@@ -4,7 +4,13 @@
|
||||
|
||||
ssd_start()
|
||||
{
|
||||
[ -n "$command" ] || return 0
|
||||
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}"
|
||||
|
||||
@@ -53,10 +53,18 @@ relabel() {
|
||||
done
|
||||
}
|
||||
|
||||
splitpath() {
|
||||
local path=$1
|
||||
while [ -n "$path" ]; do
|
||||
echo $path
|
||||
path=${path%/*}
|
||||
done
|
||||
}
|
||||
|
||||
_restorecon() {
|
||||
local path=$1
|
||||
if [ -x /sbin/restorecon ]; then
|
||||
dryrun_or_real restorecon -F "$path"
|
||||
dryrun_or_real restorecon -F $(splitpath "$path")
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -122,6 +130,7 @@ _d() {
|
||||
|
||||
if [ ! -d "$path" ]; then
|
||||
dryrun_or_real mkdir -p "$path" 2>/dev/null
|
||||
_restorecon "$path"
|
||||
dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path"
|
||||
fi
|
||||
}
|
||||
@@ -137,6 +146,7 @@ _D() {
|
||||
|
||||
if [ $CREATE -gt 0 ]; then
|
||||
dryrun_or_real mkdir -p "$path" 2>/dev/null
|
||||
_restorecon "$path"
|
||||
dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -31,7 +31,8 @@
|
||||
#include "queue.h"
|
||||
#include "librc.h"
|
||||
|
||||
#if defined(__linux__) || (defined (__FreeBSD_kernel__) && defined(__GLIBC__))
|
||||
#if defined(__linux__) || (defined (__FreeBSD_kernel__) && defined(__GLIBC__)) \
|
||||
|| defined(__GNU__)
|
||||
static bool
|
||||
pid_is_exec(pid_t pid, const char *exec)
|
||||
{
|
||||
|
||||
@@ -192,7 +192,9 @@ valid_service(const char *runlevel, const char *service, const char *type)
|
||||
|
||||
if (!runlevel ||
|
||||
strcmp(type, "ineed") == 0 ||
|
||||
strcmp(type, "needsme") == 0)
|
||||
strcmp(type, "needsme") == 0 ||
|
||||
strcmp(type, "iwant") == 0 ||
|
||||
strcmp(type, "wantsme") == 0)
|
||||
return true;
|
||||
|
||||
if (rc_service_in_runlevel(service, runlevel))
|
||||
@@ -543,6 +545,7 @@ rc_deptree_order(const RC_DEPTREE *deptree, const char *runlevel, int options)
|
||||
types = rc_stringlist_new();
|
||||
rc_stringlist_add(types, "ineed");
|
||||
rc_stringlist_add(types, "iuse");
|
||||
rc_stringlist_add(types, "iwant");
|
||||
rc_stringlist_add(types, "iafter");
|
||||
services = rc_deptree_depends(deptree, types, list, runlevel,
|
||||
RC_DEP_STRICT | RC_DEP_TRACE | options);
|
||||
@@ -648,6 +651,7 @@ typedef struct deppair
|
||||
static const DEPPAIR deppairs[] = {
|
||||
{ "ineed", "needsme" },
|
||||
{ "iuse", "usesme" },
|
||||
{ "iwant", "wantsme" },
|
||||
{ "iafter", "ibefore" },
|
||||
{ "ibefore", "iafter" },
|
||||
{ "iprovide", "providedby" },
|
||||
@@ -844,6 +848,7 @@ rc_deptree_update(void)
|
||||
/* If we're after something, remove us from the before list */
|
||||
if (strcmp(type, "iafter") == 0 ||
|
||||
strcmp(type, "ineed") == 0 ||
|
||||
strcmp(type, "iwant") == 0 ||
|
||||
strcmp(type, "iuse") == 0) {
|
||||
if ((dt = get_deptype(depinfo, "ibefore")))
|
||||
rc_stringlist_delete(dt->services, depend);
|
||||
@@ -957,6 +962,7 @@ rc_deptree_update(void)
|
||||
/* Phase 5 - Remove broken before directives */
|
||||
types = rc_stringlist_new();
|
||||
rc_stringlist_add(types, "ineed");
|
||||
rc_stringlist_add(types, "iwant");
|
||||
rc_stringlist_add(types, "iuse");
|
||||
rc_stringlist_add(types, "iafter");
|
||||
TAILQ_FOREACH(depinfo, deptree, entries) {
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <fnmatch.h>
|
||||
|
||||
#include "queue.h"
|
||||
#include "librc.h"
|
||||
|
||||
@@ -214,12 +216,78 @@ rc_config_list(const char *file)
|
||||
}
|
||||
librc_hidden_def(rc_config_list)
|
||||
|
||||
/*
|
||||
* Override some specific rc.conf options on the kernel command line
|
||||
*/
|
||||
#ifdef __linux__
|
||||
static RC_STRINGLIST *rc_config_override(RC_STRINGLIST *config)
|
||||
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.
|
||||
* 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__
|
||||
RC_STRINGLIST *overrides;
|
||||
RC_STRING *cline, *override, *config_np;
|
||||
char *tmp = NULL;
|
||||
@@ -268,90 +336,60 @@ static RC_STRINGLIST *rc_config_override(RC_STRINGLIST *config)
|
||||
}
|
||||
|
||||
rc_stringlist_free(overrides);
|
||||
#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;
|
||||
}
|
||||
#endif
|
||||
|
||||
RC_STRINGLIST *
|
||||
rc_config_load(const char *file)
|
||||
{
|
||||
RC_STRINGLIST *list;
|
||||
RC_STRINGLIST *config;
|
||||
char *token;
|
||||
RC_STRING *line;
|
||||
RC_STRING *cline;
|
||||
size_t i = 0;
|
||||
bool replaced;
|
||||
char *entry;
|
||||
char *newline;
|
||||
char *p;
|
||||
|
||||
list = rc_config_list(file);
|
||||
config = rc_stringlist_new();
|
||||
TAILQ_FOREACH(line, list, entries) {
|
||||
/* 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_config_set_value(config, line->value);
|
||||
}
|
||||
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;
|
||||
}
|
||||
librc_hidden_def(rc_config_load)
|
||||
@@ -401,6 +439,9 @@ rc_conf_value(const char *setting)
|
||||
#endif
|
||||
}
|
||||
|
||||
rc_conf = rc_config_directory(rc_conf);
|
||||
rc_conf = rc_config_kcl(rc_conf);
|
||||
|
||||
/* Convert old uppercase to lowercase */
|
||||
TAILQ_FOREACH(s, rc_conf, entries) {
|
||||
p = s->value;
|
||||
|
||||
@@ -210,14 +210,14 @@ found:
|
||||
}
|
||||
#endif
|
||||
|
||||
/* New sys identification code
|
||||
* Not to be used for any binaries outside of openrc. */
|
||||
|
||||
const char *
|
||||
rc_sys_v2(void)
|
||||
rc_sys(void)
|
||||
{
|
||||
#define __STRING_SWITCH(x) { char *__string_switch = x; if (false) {}
|
||||
#define __STRING_CASE(y) else if (strcmp(__string_switch,y) == 0)
|
||||
#define __STRING_SWITCH_END() }
|
||||
#ifdef PREFIX
|
||||
return RC_SYS_PREFIX;
|
||||
#endif
|
||||
|
||||
char *systype = rc_conf_value("rc_sys");
|
||||
if (systype) {
|
||||
char *s = systype;
|
||||
@@ -227,43 +227,11 @@ rc_sys_v2(void)
|
||||
*s = toupper((unsigned char) *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__
|
||||
if (systype && strcmp(systype, RC_SYS_JAIL) == 0)
|
||||
return RC_SYS_JAIL;
|
||||
int jailed = 0;
|
||||
size_t len = sizeof(jailed);
|
||||
|
||||
@@ -273,6 +241,12 @@ rc_sys_v1(void)
|
||||
#endif
|
||||
|
||||
#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"))
|
||||
return RC_SYS_XEN0;
|
||||
if (exists("/kern/xen"))
|
||||
@@ -280,6 +254,26 @@ rc_sys_v1(void)
|
||||
#endif
|
||||
|
||||
#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 (file_regex("/proc/xen/capabilities", "control_d"))
|
||||
return RC_SYS_XEN0;
|
||||
@@ -296,23 +290,15 @@ rc_sys_v1(void)
|
||||
return RC_SYS_OPENVZ; /* old test */
|
||||
else if (file_regex("/proc/1/environ", "container=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"))
|
||||
return RC_SYS_SYSTEMD_NSPAWN;
|
||||
else if (file_regex("/proc/1/environ", "container=docker"))
|
||||
return RC_SYS_DOCKER;
|
||||
#endif
|
||||
|
||||
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)
|
||||
|
||||
|
||||
@@ -130,8 +130,6 @@ librc_hidden_proto(rc_stringlist_new)
|
||||
librc_hidden_proto(rc_stringlist_split)
|
||||
librc_hidden_proto(rc_stringlist_sort)
|
||||
librc_hidden_proto(rc_sys)
|
||||
librc_hidden_proto(rc_sys_v1)
|
||||
librc_hidden_proto(rc_sys_v2)
|
||||
librc_hidden_proto(rc_yesno)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -56,6 +56,7 @@ extern "C" {
|
||||
#define RC_SYS_WHITELIST RC_LIBEXECDIR "/conf.d/env_whitelist"
|
||||
#define RC_USR_WHITELIST RC_SYSCONFDIR "/conf.d/env_whitelist"
|
||||
#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_PATH_PREFIX RC_LIBEXECDIR "/bin:/bin:/sbin:/usr/bin:/usr/sbin"
|
||||
@@ -328,10 +329,12 @@ bool rc_service_daemons_crashed(const char *);
|
||||
/*! @name System types
|
||||
* OpenRC can support some special sub system types, normally virtualization.
|
||||
* 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_OPENVZ "OPENVZ"
|
||||
#define RC_SYS_LXC "LXC"
|
||||
#define RC_SYS_PREFIX "PREFIX"
|
||||
#define RC_SYS_RKT "RKT"
|
||||
#define RC_SYS_SYSTEMD_NSPAWN "SYSTEMD-NSPAWN"
|
||||
#define RC_SYS_UML "UML"
|
||||
#define RC_SYS_VSERVER "VSERVER"
|
||||
@@ -342,14 +345,6 @@ bool rc_service_daemons_crashed(const char *);
|
||||
* @return string from RC_SYS_* types or NULL if none detected */
|
||||
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
|
||||
* These options can change the services found by the rc_get_depinfo and
|
||||
* rc_get_depends functions. */
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
# include <sys/statvfs.h>
|
||||
# define statfs statvfs
|
||||
# define F_FLAGS f_flag
|
||||
#elif defined (__linux__) || (defined(__FreeBSD_kernel__) && \
|
||||
defined(__GLIBC__)) || defined(__GNU__)
|
||||
#elif defined(__linux__) || (defined(__FreeBSD_kernel__) && \
|
||||
defined(__GLIBC__)) || defined(__GNU__)
|
||||
# include <mntent.h>
|
||||
#endif
|
||||
|
||||
@@ -267,8 +267,8 @@ find_mounts(struct args *args)
|
||||
return list;
|
||||
}
|
||||
|
||||
#elif defined (__linux__) || (defined (__FreeBSD_kernel__) && \
|
||||
defined(__GLIBC__))
|
||||
#elif defined(__linux__) || (defined(__FreeBSD_kernel__) && \
|
||||
defined(__GLIBC__)) || defined(__GNU__)
|
||||
static struct mntent *
|
||||
getmntfile(const char *file)
|
||||
{
|
||||
@@ -298,7 +298,7 @@ find_mounts(struct args *args)
|
||||
int netdev;
|
||||
RC_STRINGLIST *list;
|
||||
|
||||
if ((fp = fopen("/proc/mounts", "r")) == NULL)
|
||||
if ((fp = fopen("/proc/self/mounts", "r")) == NULL)
|
||||
eerrorx("getmntinfo: %s", strerror(errno));
|
||||
|
||||
list = rc_stringlist_new();
|
||||
@@ -315,6 +315,8 @@ find_mounts(struct args *args)
|
||||
if ((ent = getmntfile(to))) {
|
||||
if (strstr(ent->mnt_opts, "_netdev"))
|
||||
netdev = 0;
|
||||
else
|
||||
netdev = 1;
|
||||
}
|
||||
|
||||
process_mount(list, args, from, to, fst, opts, netdev);
|
||||
@@ -347,7 +349,7 @@ get_regex(const char *string)
|
||||
|
||||
#include "_usage.h"
|
||||
#define extraopts "[mount1] [mount2] ..."
|
||||
#define getoptstring "f:F:n:N:o:O:p:P:ist" getoptstring_COMMON
|
||||
#define getoptstring "f:F:n:N:o:O:p:P:iste:E:" getoptstring_COMMON
|
||||
static const struct option longopts[] = {
|
||||
{ "fstype-regex", 1, NULL, 'f'},
|
||||
{ "skip-fstype-regex", 1, NULL, 'F'},
|
||||
|
||||
@@ -51,8 +51,8 @@
|
||||
#include <time.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>
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# include <util.h>
|
||||
@@ -78,15 +78,23 @@ static const char *applet;
|
||||
static char *service, *runlevel, *ibsave, *prefix;
|
||||
static RC_DEPTREE *deptree;
|
||||
static RC_STRINGLIST *applet_list, *services, *tmplist;
|
||||
static RC_STRINGLIST *restart_services, *need_services, *use_services;
|
||||
static RC_STRINGLIST *restart_services;
|
||||
static RC_STRINGLIST *need_services;
|
||||
static RC_STRINGLIST *use_services;
|
||||
static RC_STRINGLIST *want_services;
|
||||
static RC_HOOK hook_out;
|
||||
static int exclusive_fd = -1, master_tty = -1;
|
||||
static bool sighup, in_background, deps, dry_run;
|
||||
static pid_t service_pid;
|
||||
static int signal_pipe[2] = { -1, -1 };
|
||||
|
||||
static RC_STRINGLIST *types_b, *types_n, *types_nu, *types_nua, *types_m;
|
||||
static RC_STRINGLIST *types_mua = NULL;
|
||||
static RC_STRINGLIST *deptypes_b; /* broken deps */
|
||||
static RC_STRINGLIST *deptypes_n; /* needed deps */
|
||||
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
|
||||
handle_signal(int sig)
|
||||
@@ -231,16 +239,18 @@ cleanup(void)
|
||||
rc_plugin_unload();
|
||||
|
||||
#ifdef DEBUG_MEMORY
|
||||
rc_stringlist_free(types_b);
|
||||
rc_stringlist_free(types_n);
|
||||
rc_stringlist_free(types_nu);
|
||||
rc_stringlist_free(types_nua);
|
||||
rc_stringlist_free(types_m);
|
||||
rc_stringlist_free(types_mua);
|
||||
rc_stringlist_free(deptypes_b);
|
||||
rc_stringlist_free(deptypes_n);
|
||||
rc_stringlist_free(deptypes_nw);
|
||||
rc_stringlist_free(deptypes_nwu);
|
||||
rc_stringlist_free(deptypes_nwua);
|
||||
rc_stringlist_free(deptypes_m);
|
||||
rc_stringlist_free(deptypes_mwua);
|
||||
rc_deptree_free(deptree);
|
||||
rc_stringlist_free(restart_services);
|
||||
rc_stringlist_free(need_services);
|
||||
rc_stringlist_free(use_services);
|
||||
rc_stringlist_free(want_services);
|
||||
rc_stringlist_free(services);
|
||||
rc_stringlist_free(applet_list);
|
||||
rc_stringlist_free(tmplist);
|
||||
@@ -518,30 +528,37 @@ get_started_services(void)
|
||||
}
|
||||
|
||||
static void
|
||||
setup_types(void)
|
||||
setup_deptypes(void)
|
||||
{
|
||||
types_b = rc_stringlist_new();
|
||||
rc_stringlist_add(types_b, "broken");
|
||||
deptypes_b = rc_stringlist_new();
|
||||
rc_stringlist_add(deptypes_b, "broken");
|
||||
|
||||
types_n = rc_stringlist_new();
|
||||
rc_stringlist_add(types_n, "ineed");
|
||||
deptypes_n = rc_stringlist_new();
|
||||
rc_stringlist_add(deptypes_n, "ineed");
|
||||
|
||||
types_nu = rc_stringlist_new();
|
||||
rc_stringlist_add(types_nu, "ineed");
|
||||
rc_stringlist_add(types_nu, "iuse");
|
||||
deptypes_nw = rc_stringlist_new();
|
||||
rc_stringlist_add(deptypes_nw, "ineed");
|
||||
rc_stringlist_add(deptypes_nw, "iwant");
|
||||
|
||||
types_nua = rc_stringlist_new();
|
||||
rc_stringlist_add(types_nua, "ineed");
|
||||
rc_stringlist_add(types_nua, "iuse");
|
||||
rc_stringlist_add(types_nua, "iafter");
|
||||
deptypes_nwu = rc_stringlist_new();
|
||||
rc_stringlist_add(deptypes_nwu, "ineed");
|
||||
rc_stringlist_add(deptypes_nwu, "iwant");
|
||||
rc_stringlist_add(deptypes_nwu, "iuse");
|
||||
|
||||
types_m = rc_stringlist_new();
|
||||
rc_stringlist_add(types_m, "needsme");
|
||||
deptypes_nwua = rc_stringlist_new();
|
||||
rc_stringlist_add(deptypes_nwua, "ineed");
|
||||
rc_stringlist_add(deptypes_nwua, "iwant");
|
||||
rc_stringlist_add(deptypes_nwua, "iuse");
|
||||
rc_stringlist_add(deptypes_nwua, "iafter");
|
||||
|
||||
types_mua = rc_stringlist_new();
|
||||
rc_stringlist_add(types_mua, "needsme");
|
||||
rc_stringlist_add(types_mua, "usesme");
|
||||
rc_stringlist_add(types_mua, "beforeme");
|
||||
deptypes_m = rc_stringlist_new();
|
||||
rc_stringlist_add(deptypes_m, "needsme");
|
||||
|
||||
deptypes_mwua = rc_stringlist_new();
|
||||
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
|
||||
@@ -604,10 +621,10 @@ svc_start_deps(void)
|
||||
|
||||
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
|
||||
eerrorx("failed to load deptree");
|
||||
if (!types_b)
|
||||
setup_types();
|
||||
if (!deptypes_b)
|
||||
setup_deptypes();
|
||||
|
||||
services = rc_deptree_depends(deptree, types_b, applet_list,
|
||||
services = rc_deptree_depends(deptree, deptypes_b, applet_list,
|
||||
runlevel, 0);
|
||||
if (TAILQ_FIRST(services)) {
|
||||
eerrorn("ERROR: %s needs service(s) ", applet);
|
||||
@@ -625,9 +642,11 @@ svc_start_deps(void)
|
||||
rc_stringlist_free(services);
|
||||
services = NULL;
|
||||
|
||||
need_services = rc_deptree_depends(deptree, types_n,
|
||||
need_services = rc_deptree_depends(deptree, deptypes_n,
|
||||
applet_list, runlevel, depoptions);
|
||||
use_services = rc_deptree_depends(deptree, types_nu,
|
||||
want_services = rc_deptree_depends(deptree, deptypes_nw,
|
||||
applet_list, runlevel, depoptions);
|
||||
use_services = rc_deptree_depends(deptree, deptypes_nwu,
|
||||
applet_list, runlevel, depoptions);
|
||||
|
||||
if (!rc_runlevel_starting()) {
|
||||
@@ -655,7 +674,7 @@ svc_start_deps(void)
|
||||
return;
|
||||
|
||||
/* Now wait for them to start */
|
||||
services = rc_deptree_depends(deptree, types_nua, applet_list,
|
||||
services = rc_deptree_depends(deptree, deptypes_nwua, applet_list,
|
||||
runlevel, depoptions);
|
||||
/* We use tmplist to hold our scheduled by list */
|
||||
tmplist = rc_stringlist_new();
|
||||
@@ -670,6 +689,7 @@ svc_start_deps(void)
|
||||
state & RC_SERVICE_WASINACTIVE)
|
||||
{
|
||||
if (!rc_stringlist_find(need_services, svc->value) &&
|
||||
!rc_stringlist_find(want_services, svc->value) &&
|
||||
!rc_stringlist_find(use_services, svc->value))
|
||||
continue;
|
||||
}
|
||||
@@ -860,10 +880,10 @@ svc_stop_deps(RC_SERVICE state)
|
||||
if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL))
|
||||
eerrorx("failed to load deptree");
|
||||
|
||||
if (!types_m)
|
||||
setup_types();
|
||||
if (!deptypes_m)
|
||||
setup_deptypes();
|
||||
|
||||
services = rc_deptree_depends(deptree, types_m, applet_list,
|
||||
services = rc_deptree_depends(deptree, deptypes_m, applet_list,
|
||||
runlevel, depoptions);
|
||||
tmplist = rc_stringlist_new();
|
||||
TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) {
|
||||
@@ -923,7 +943,7 @@ svc_stop_deps(RC_SERVICE state)
|
||||
|
||||
/* We now wait for other services that may use us and are
|
||||
* stopping. This is important when a runlevel stops */
|
||||
services = rc_deptree_depends(deptree, types_mua, applet_list,
|
||||
services = rc_deptree_depends(deptree, deptypes_mwua, applet_list,
|
||||
runlevel, depoptions);
|
||||
TAILQ_FOREACH(svc, services, entries) {
|
||||
if (rc_service_state(svc->value) & RC_SERVICE_STOPPED)
|
||||
@@ -939,9 +959,9 @@ svc_stop_real(void)
|
||||
{
|
||||
bool stopped;
|
||||
|
||||
/* If we're stopping mount.*, set LC_ALL=C so that
|
||||
/* If we're stopping localmount, set LC_ALL=C so that
|
||||
* bash doesn't load anything blocking the unmounting of /usr */
|
||||
if (strncmp(applet, "mount.", 6) == 0)
|
||||
if (strcmp(applet, "localmount") == 0)
|
||||
setenv("LC_ALL", "C", 1);
|
||||
|
||||
if (ibsave)
|
||||
@@ -1294,8 +1314,10 @@ openrc_run(int argc, char **argv)
|
||||
prefix = save;
|
||||
} else if (strcmp(optarg, "ineed") == 0 ||
|
||||
strcmp(optarg, "iuse") == 0 ||
|
||||
strcmp(optarg, "iwant") == 0 ||
|
||||
strcmp(optarg, "needsme") == 0 ||
|
||||
strcmp(optarg, "usesme") == 0 ||
|
||||
strcmp(optarg, "wantsme") == 0 ||
|
||||
strcmp(optarg, "iafter") == 0 ||
|
||||
strcmp(optarg, "ibefore") == 0 ||
|
||||
strcmp(optarg, "iprovide") == 0)
|
||||
|
||||
@@ -44,7 +44,8 @@
|
||||
#include <time.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>
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# include <util.h>
|
||||
|
||||
@@ -343,6 +343,7 @@ rc_status(int argc, char **argv)
|
||||
}
|
||||
needsme = rc_stringlist_new();
|
||||
rc_stringlist_add(needsme, "needsme");
|
||||
rc_stringlist_add(needsme, "wantsme");
|
||||
nservices = rc_stringlist_new();
|
||||
alist = rc_stringlist_new();
|
||||
l = rc_stringlist_add(alist, "");
|
||||
@@ -365,7 +366,7 @@ rc_status(int argc, char **argv)
|
||||
* be added to the list
|
||||
*/
|
||||
unsetenv("RC_SVCNAME");
|
||||
print_level("Dynamic", "needed");
|
||||
print_level("Dynamic", "needed/wanted");
|
||||
print_services(NULL, nservices);
|
||||
print_level("Dynamic", "manual");
|
||||
print_services(NULL, services);
|
||||
|
||||
41
src/rc/rc.c
41
src/rc/rc.c
@@ -155,8 +155,8 @@ cleanup(void)
|
||||
rc_stringlist_free(hotplugged_services);
|
||||
rc_stringlist_free(stop_services);
|
||||
rc_stringlist_free(start_services);
|
||||
rc_stringlist_free(types_n);
|
||||
rc_stringlist_free(types_nua);
|
||||
rc_stringlist_free(types_nw);
|
||||
rc_stringlist_free(types_nwua);
|
||||
rc_deptree_free(deptree);
|
||||
free(runlevel);
|
||||
#endif
|
||||
@@ -519,7 +519,7 @@ runlevel_config(const char *service, const char *level)
|
||||
}
|
||||
|
||||
static void
|
||||
do_stop_services(RC_STRINGLIST *types_n, RC_STRINGLIST *start_services,
|
||||
do_stop_services(RC_STRINGLIST *types_nw, RC_STRINGLIST *start_services,
|
||||
const RC_STRINGLIST *stop_services, const RC_DEPTREE *deptree,
|
||||
const char *newlevel, bool parallel, bool going_down)
|
||||
{
|
||||
@@ -530,9 +530,10 @@ do_stop_services(RC_STRINGLIST *types_n, RC_STRINGLIST *start_services,
|
||||
RC_STRINGLIST *nostop;
|
||||
bool crashed, nstop;
|
||||
|
||||
if (!types_n) {
|
||||
types_n = rc_stringlist_new();
|
||||
rc_stringlist_add(types_n, "needsme");
|
||||
if (!types_nw) {
|
||||
types_nw = rc_stringlist_new();
|
||||
rc_stringlist_add(types_nw, "needsme");
|
||||
rc_stringlist_add(types_nw, "wantsme");
|
||||
}
|
||||
|
||||
crashed = rc_conf_yesno("rc_crashed_stop");
|
||||
@@ -591,7 +592,7 @@ do_stop_services(RC_STRINGLIST *types_n, RC_STRINGLIST *start_services,
|
||||
if (!svc1) {
|
||||
tmplist = rc_stringlist_new();
|
||||
rc_stringlist_add(tmplist, service->value);
|
||||
deporder = rc_deptree_depends(deptree, types_n,
|
||||
deporder = rc_deptree_depends(deptree, types_nw,
|
||||
tmplist, newlevel ? newlevel : runlevel,
|
||||
RC_DEP_STRICT | RC_DEP_TRACE);
|
||||
rc_stringlist_free(tmplist);
|
||||
@@ -751,11 +752,12 @@ main(int argc, char **argv)
|
||||
{
|
||||
const char *bootlevel = NULL;
|
||||
char *newlevel = NULL;
|
||||
const char *systype = NULL;
|
||||
static RC_STRINGLIST *hotplugged_services;
|
||||
static RC_STRINGLIST *stop_services;
|
||||
static RC_STRINGLIST *start_services;
|
||||
static RC_STRINGLIST *types_n;
|
||||
static RC_STRINGLIST *types_nua;
|
||||
static RC_STRINGLIST *types_nw;
|
||||
static RC_STRINGLIST *types_nwua;
|
||||
static RC_DEPTREE *deptree;
|
||||
RC_STRINGLIST *deporder = NULL;
|
||||
RC_STRINGLIST *tmplist;
|
||||
@@ -844,9 +846,9 @@ main(int argc, char **argv)
|
||||
eerrorx("%s: %s", applet, strerror(errno));
|
||||
/* NOTREACHED */
|
||||
case 'S':
|
||||
bootlevel = rc_sys();
|
||||
if (bootlevel)
|
||||
printf("%s\n", bootlevel);
|
||||
systype = rc_sys();
|
||||
if (systype)
|
||||
printf("%s\n", systype);
|
||||
exit(EXIT_SUCCESS);
|
||||
/* NOTREACHED */
|
||||
case_RC_COMMON_GETOPT
|
||||
@@ -996,13 +998,14 @@ main(int argc, char **argv)
|
||||
if (stop_services)
|
||||
rc_stringlist_sort(&stop_services);
|
||||
|
||||
types_nua = rc_stringlist_new();
|
||||
rc_stringlist_add(types_nua, "ineed");
|
||||
rc_stringlist_add(types_nua, "iuse");
|
||||
rc_stringlist_add(types_nua, "iafter");
|
||||
types_nwua = rc_stringlist_new();
|
||||
rc_stringlist_add(types_nwua, "ineed");
|
||||
rc_stringlist_add(types_nwua, "iwant");
|
||||
rc_stringlist_add(types_nwua, "iuse");
|
||||
rc_stringlist_add(types_nwua, "iafter");
|
||||
|
||||
if (stop_services) {
|
||||
tmplist = rc_deptree_depends(deptree, types_nua, stop_services,
|
||||
tmplist = rc_deptree_depends(deptree, types_nwua, stop_services,
|
||||
runlevel, depoptions | RC_DEP_STOP);
|
||||
rc_stringlist_free(stop_services);
|
||||
stop_services = tmplist;
|
||||
@@ -1047,7 +1050,7 @@ main(int argc, char **argv)
|
||||
|
||||
/* Now stop the services that shouldn't be running */
|
||||
if (stop_services && !nostop)
|
||||
do_stop_services(types_n, start_services, stop_services, deptree, newlevel, parallel, going_down);
|
||||
do_stop_services(types_nw, start_services, stop_services, deptree, newlevel, parallel, going_down);
|
||||
|
||||
/* Wait for our services to finish */
|
||||
wait_for_services();
|
||||
@@ -1109,7 +1112,7 @@ main(int argc, char **argv)
|
||||
|
||||
/* Start those services. */
|
||||
rc_stringlist_sort(&run_services);
|
||||
deporder = rc_deptree_depends(deptree, types_nua, run_services, rlevel->value, depoptions | RC_DEP_START);
|
||||
deporder = rc_deptree_depends(deptree, types_nwua, run_services, rlevel->value, depoptions | RC_DEP_START);
|
||||
rc_stringlist_free(run_services);
|
||||
run_services = deporder;
|
||||
do_start_services(run_services, parallel);
|
||||
|
||||
@@ -112,9 +112,5 @@ rc_stringlist_split
|
||||
rc_stringlist_split@@RC_1.0
|
||||
rc_sys
|
||||
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_1.0
|
||||
|
||||
Reference in New Issue
Block a user