Compare commits

..

52 Commits

Author SHA1 Message Date
William Hubbs
c2506da801 Update ChangeLog 2015-12-09 15:25:53 -06:00
William Hubbs
f45f7243c1 Complete support for rc.conf.d
- gendepends.sh needs to read this directory to allow dependencies to be
  overridden
  - init.sh for Linux and Bsd need to read it to allow config settings
    they use to be overridden.
2015-12-09 13:53:42 -06:00
William Hubbs
afe64e5e49 increment version number 2015-12-09 13:52:39 -06:00
William Hubbs
a1acdeb92e update ChangeLog 2015-12-04 13:50:21 -06:00
William Hubbs
b810473e4f man/openrc-run.8: Clarify documentation on dependencies and keywords
Provide an example of using the -containers keyword and clarify
documentation on some of the dependency functions.
2015-12-03 17:37:38 -06:00
William Hubbs
627e925463 add support for -containers keyword 2015-12-03 16:52:15 -06:00
William Hubbs
f5cf1136e7 Use systype variable for rc_sys call 2015-12-02 15:44:35 -06:00
William Hubbs
a4038e1171 rc.conf.Linux: document the rkt keyword 2015-12-02 11:11:45 -06:00
William Hubbs
a0cf8f9124 Add detection for rkt containers 2015-12-02 10:20:39 -06:00
William Hubbs
9fedb3b40b Add detection for docker containers 2015-12-02 10:20:15 -06:00
William Hubbs
635e33cdc8 librc: comsolidate rc_sys_v1 and rc_sys_v2 into rc_sys
These functions were never meant to be used outside of OpenRC, and they
were added when we thought we were going to do away with the automatic
detection of subsystems. Since the autodetection is not going away, we
can combine these functions into rc_sys.
2015-12-01 17:39:04 -06:00
William Hubbs
bd9456ff31 rc-functions.sh: add support for user-defined want dependencies 2015-12-01 12:31:28 -06:00
Ian Stakenvicius
33d3f33b3c Implement "want" dependency
The want dependency is similar to the use dependency. If a service
script, for example called service1, adds "want service2" to its depend
function, OpenRC will attempt to start service2, if it exists on the
system,  when service1 is started.

However, service1 will start regardless of the status of
service2.

X-Gentoo-Bug: 406021
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=406021
2015-11-12 12:32:45 -06:00
William Hubbs
ddb895b355 conf.d/netmount: typo fix
X-Gentoo-Bug: 564846
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=564846
2015-11-11 15:48:19 -06:00
Benda Xu
085d77f17e Standardize macro tests for gnu hurd
This also fixes breakage of GNU/hurd builds introduced by commit 3f82edbeb9.
2015-11-11 13:37:41 -06:00
William Hubbs
c831f1f994 librc: rework overriding rc.conf options from the kcl
Rename the rc_conf_override function to describe its purpose better,
drop one conditional compile by making it available everywhere, and move
the call to it after the optional rc.conf.d directory is processed.
2015-11-05 11:20:57 -06:00
William Hubbs
591aea2821 librc: Remove redundant code from rc_config_load 2015-11-05 11:20:57 -06:00
William Hubbs
c09eeca491 Add rc.conf.d support
This makes it possible to override settings in rc.conf by adding a
directory @SYSCONFDIR@/rc.conf.d and putting files in this directory.
The files will be processed in lexical order, and the last setting in
these files will be used.
2015-11-05 10:40:24 -06:00
William Hubbs
4cf6b0ecf7 consolefont: add after modules to dependencies
X-Gentoo-Bug: 559540
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=559540
2015-10-29 11:27:27 -05:00
William Hubbs
ee944553a9 bootmisc: optionally save the previous dmesg log
X-Gentoo-Bug: 561204
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=561204
2015-10-21 14:04:28 -05:00
William Hubbs
6cae41a4e6 etc/rc.conf: Clean up documentation for rc_hotplug
X-Gentoo-Bug: 554540
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=554540
2015-10-21 12:49:00 -05:00
William Hubbs
960881fcfe Add net-online service 2015-10-20 12:13:47 -05:00
William Hubbs
d26013494d mtab: typo fix 2015-10-14 17:48:32 -05:00
William Hubbs
b29b2fb3cb mtab: make /etc/mtab as a file configurable 2015-10-14 12:19:13 -05:00
William Hubbs
7da72ce487 openrc-run.sh: fix new required_* tests to exit properly 2015-10-13 17:45:05 -05:00
William Hubbs
fc777aeaf3 typo fix
X-Gentoo-Bug: 563010
X-Gentoo-Bug: https://bugs.gentoo.org/show_bug.cgi?id=563010
2015-10-13 15:51:15 -05:00
William Hubbs
9d53d436ae sysfs: consolidate cgroup processing code in a single function 2015-10-13 15:07:53 -05:00
William Hubbs
b81317bdf8 mountinfo: make sure the netdev variable is initialized on Linux
This fixes the following regression:

X-Gentoo-Bug: 562668
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562668
2015-10-13 08:27:43 -05:00
William Hubbs
29f7e33592 openrc-run.sh: allow spaces in required_{files,dirs}
X-Gentoo-Bug: 562320
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562320
2015-10-13 07:59:50 -05:00
William Hubbs
850ca03077 increment version number 2015-10-08 16:14:34 -05:00
William Hubbs
050ddfae4a Update ChangeLog 2015-10-08 13:33:27 -05:00
William Hubbs
d5116cc697 localmount: white space cleanup 2015-10-08 13:20:14 -05:00
Ian Stakenvicius
b86d170037 localmount: clean up handling of aufs branches
X-Gentoo-Bug: 560008
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=560008
2015-10-08 12:49:09 -05:00
William Hubbs
6fa0d6318b mtab: fix update logic
This advises users to remove mtab from their runlevels if /etc/mtab is a
symlink, and it creates the symlink if /etc/mtab does not exist on a
system.

X-Gentoo-Bug: 560060
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=560060
2015-10-07 11:35:31 -05:00
Austin S. Hemmelgarn
80d3928b0d cgroups: Add the hugetlb, net_cls and pids controllers
Note from WilliamH: I slightly rearranged the code and added the
settings in rc.conf.

X-Gentoo-Bug: 555488
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=555488
2015-10-06 15:05:35 -05:00
William Hubbs
17ef205bc6 sysfs: use printf instead of echo to write to cgroup files
This is needed for compatibility with musl and printf is also posix.

X-Gentoo-Bug: 562334
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562334
2015-10-06 13:31:43 -05:00
William Hubbs
b20a1951ad rc-cgroup.sh: Do not add leading spaces to cgroup values
We were starting the value we write to the cgroup setting file with
leading spaces and this was causing issues. This change makes sure that
we aren't adding leading spaces to the value.

X-Gentoo-Bug: 562354
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=562354
2015-10-06 12:11:29 -05:00
William Hubbs
bf0c0dd564 bootmisc: convert errors in clean_run function to warnings
X-Gentoo-Bug: 552418
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=552418
2015-10-05 11:22:08 -05:00
William Hubbs
1558ad2b9e bootmisc: only remove temp directory if umount is successful
Change the clean_run function to only remove the temp directory if the
umount was successful.

X-Gentoo-Bug: 561230
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=561230
2015-10-05 11:08:11 -05:00
William Hubbs
5f4f242036 mountinfo: fix --netdev and --nonetdev on Linux
On Linux, the --netdev and --nonetdev switches were not working. They
were both returning false. After this change, they operate based on the
presence or abscence of the _netdev option in mount options.
2015-10-05 10:18:00 -05:00
William Hubbs
b3f7ff901f mountinfo: read /proc/self/mounts instead of /proc/mounts on Linux 2015-10-04 15:35:33 -05:00
William Hubbs
a59365a582 start-stop-daemon.sh: complain in start if command is undefined
The default start-stop-daemon start function expects the command
variable to be defined to point to the daemon we want to start.

If the variable is undefined, this means that there will be nothing to
start, and in this case we should complain because it is possible that
the script writer made a typo in the variable name.
2015-10-02 16:34:15 -05:00
William Hubbs
dac5966ca4 Revert "local/netmount: remove uses of -O [no]_netdev"
This reverts commit 2a439c85bd.
There is another use case for -O involving iscsi, so we can't remove it.
2015-10-01 17:33:43 -05:00
William Hubbs
3b6a6df4b5 openrc-run: rename some dependency variables and a function for clarity
All of the dependency type lists had the types_ prefix in their names;
this has been changed to deptypes_ to make them more self documenting.

Along the same lines, the setup_types function was renamed
setup_deptypes.
2015-09-17 15:02:30 -05:00
William Hubbs
b047ea47e9 localmount/netmount: on Linux, fail if some file systems do not mount
The following return codes are returned by mount -a:

0:  all file systems mounted.
32: no file systems mounted.
64: some file systems mounted.

The localmount/netmount services should fail if all file systems that
should mount did not mount.
2015-09-01 14:41:07 -05:00
William Hubbs
b652752339 Make localmount and netmount always succeed on non-linux 2015-08-21 12:21:31 -05:00
William Hubbs
2a439c85bd local/netmount: remove uses of -O [no]_netdev
This was causing an incompatibility with busybox, and we do not use it
in Gentoo.
2015-08-18 18:25:48 -05:00
William Hubbs
7341cd882f allow localmount and netmount to fail 2015-08-17 18:21:39 -05:00
Mike Frysinger
279f1e5d10 binfmt: fix indent on return 2015-08-10 18:50:10 -05:00
Doug Freed
c256a7aa80 savecache: clean up implementation
X-Gentoo-Bug: 557222
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=557222
2015-08-10 14:51:15 +00:00
Jason Zaman
6a42298257 tmpfiles: run restorecon on the entire path
The tmpfiles "d" entry will create a full path and only the last dir in
the path will have its SELinux label set correctly. This patch will
restorecon the parents as well so that the selinux labels are correct.

eg, "d /run/libvirt/lxc", then "lxc" would have the correct SELinux
label but "libvirt" would not.

Signed-off-by: Jason Zaman <jason@perfinion.com>
2015-08-03 12:51:16 -07:00
William Hubbs
f69833a1e1 mountinfo: fix -e and -E options
Add the -e and -E options to getoptstring so they are recognized.
2015-08-02 07:39:58 -05:00
78 changed files with 1161 additions and 1426 deletions

1398
ChangeLog

File diff suppressed because it is too large Load Diff

View File

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

46
NEWS.md
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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
View 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

View File

@@ -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"
#

View File

@@ -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

View File

@@ -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

View File

@@ -10,6 +10,6 @@ name="Avahi DNS Configuration Daemon"
depend()
{
use dns
need mount.usr mount.var dbus
need localmount dbus
after bootmisc
}

View File

@@ -10,6 +10,6 @@ name="Avahi Service Advertisement Daemon"
depend()
{
use dns
need mount.usr mount.var dbus
need localmount dbus
after bootmisc
}

View File

@@ -9,7 +9,7 @@ name="Message Bus Daemon"
depend()
{
need mount.usr mount.var net
need localmount net
after bootmisc
}

View File

@@ -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

View File

@@ -12,7 +12,7 @@ extra_started_commands="reload"
depend()
{
provide dns
need mount.usr mount.var net
need localmount net
after bootmisc
}

View File

@@ -24,7 +24,7 @@ esac
depend()
{
provide dns
need mount.usr mount.var
need localmount
after bootmisc
}

View File

@@ -14,7 +14,7 @@ name="Network Time Protocol Daemon"
depend()
{
use dns
need mount.usr mount.var
need localmount
after bootmisc ntp-client
}

View File

@@ -31,7 +31,7 @@ fi
depend()
{
need mount.usr mount.var net
need localmount net
use dns
after bootmisc
}

View File

@@ -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
View File

@@ -4,7 +4,6 @@ hostname
local
localmount
loopback
mount
moused
netmount
network

View File

@@ -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 \

View File

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

View File

@@ -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
;;

View File

@@ -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
}

View File

@@ -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

View File

@@ -6,7 +6,7 @@ description="Creates the dev database"
depend()
{
need mount.usr mount.var
need localmount
}
start()

View File

@@ -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
}

View File

@@ -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

View File

@@ -6,7 +6,7 @@ extra_commands="restore"
depend()
{
need mount.usr mount.var
need localmount
keyword -jail -prefix
}

View File

@@ -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
}

View File

@@ -14,7 +14,7 @@ name="Console Mouse Daemon"
depend()
{
need mount.usr mount.var
need localmount
after bootmisc
keyword -jail -prefix
}

View File

@@ -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
View 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"
}

View File

@@ -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()

View File

@@ -10,7 +10,7 @@ __nl="
depend()
{
need mount.usr mount.var
need localmount
after bootmisc
if [ -n "$(interfaces)" ]; then
provide net

View File

@@ -6,7 +6,7 @@ required_files="/etc/newsyslog.conf"
depend()
{
need mount.usr mount.var
need localmount
keyword -prefix
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -10,7 +10,7 @@ extra_commands="checkconfig showstatus"
extra_started_commands="reload"
depend() {
need mount.usr mount.var
need localmount
keyword -jail -prefix
}

View File

@@ -9,7 +9,7 @@ name="Power Control Daemon"
depend()
{
need mount.usr mount.var
need localmount
use logger
after bootmisc
keyword -jail -prefix

View File

@@ -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
}

View File

@@ -17,7 +17,7 @@ command_background=YES
depend()
{
need mount.usr mount.var
need localmount
after bootmisc
need net
}

View File

@@ -4,7 +4,7 @@
depend()
{
need mount.usr mount.var net
need localmount net
after *
before local
keyword -prefix

View File

@@ -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
}

View File

@@ -9,7 +9,7 @@ pidfile=/var/run/s6-svscan.pid
depend()
{
need mount.usr mount.var
need localmount
}
start_pre()

View File

@@ -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"
}

View File

@@ -6,7 +6,7 @@ description="Saves a kernel dump."
depend()
{
need dumpon mount.usr mount.var
need dumpon localmount
before encswap
keyword -jail -prefix
}

View File

@@ -4,7 +4,7 @@
depend()
{
before mount.usr mount.var
before localmount
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
}

View File

@@ -4,7 +4,7 @@
depend()
{
need mount.usr mount.var
need localmount
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc
}

View File

@@ -3,7 +3,7 @@
# Released under the 2-clause BSD license.
depend() {
need mount.usr mount.var
need localmount
keyword -jail -prefix
}

View File

@@ -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

View File

@@ -14,7 +14,7 @@ depend()
{
provide logger
use net newsyslog
need mount.usr mount.var
need localmount
after bootmisc
keyword -prefix
}

View File

@@ -6,7 +6,7 @@ description="Set up tmpfiles.d entries"
depend()
{
need mount.usr mount.var
need localmount
}
start()

View File

@@ -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
}

View File

@@ -4,7 +4,7 @@
depend()
{
need mount.usr mount.var
need localmount
keyword -prefix
}

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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=:

View File

@@ -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}"

View File

@@ -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
}

View File

@@ -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)
{

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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)

View File

@@ -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

View File

@@ -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. */

View File

@@ -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'},

View File

@@ -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)

View File

@@ -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>

View File

@@ -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);

View File

@@ -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);

View File

@@ -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