Compare commits

..

2 Commits

Author SHA1 Message Date
William Hubbs
785b61e872 cgroups: fix cgroup subsystem mounting
Originally, we aborted all of the cgroup setup if /sys/fs/cgroup/openrc
was already mounted. This  caused an issue in lxc containers, so we
should always allow the subsystems to be mounted.

X-Gentoo-Bug: 520606
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=520606
2014-08-22 14:19:03 -05:00
William Hubbs
54ed42503f start work on 0.13.1 2014-08-22 14:18:33 -05:00
117 changed files with 613 additions and 4056 deletions

1322
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +1,34 @@
# Features Scheduled for Removal
The following is a list of files and features that are going to be removed in The following is a list of files and features that are going to be removed in
the source tree. Every entry should contain what exactly is going away, why it the source tree. Every entry should contain what exactly is going away, why it
is happening, and who is going to be doing the work. When the feature is is happening, and who is going to be doing the work. When the feature is
removed, it should also be removed from this file. removed, it should also be removed from this file.
## Service pause action ---------------------------
What: Service pause action
When: 1.0 When: 1.0
Why: The same affect can be obtained with the --nodeps option to stop. Why: ...
Who: Who:
## start-stop-daemon options --startas, --chuid , --oknodo ---------------------------
What: start-stop-daemon options --startas, --chuid , --oknodo
When: 1.0 When: 1.0
Why: Obsolete or replaced by other options. Why: Obsolete or replaced by other options.
--startas => use --name or --exec
* --startas => use --name or --exec --chuid => use --user
* --chuid => use --user --oknodo => ignore return code instead
* --oknodo => ignore return code instead
Who: Who:
## runscript and rc symbolic links ---------------------------
What: runscript and rc symbolic links
When: 1.0 When: 1.0
@@ -34,7 +37,9 @@ Why: Deprecated in favor of openrc-run and openrc due to naming
Who: Who:
## support for the opts variable in service scripts ---------------------------
What: support for the opts variable in service scripts
When: 1.0 When: 1.0
@@ -43,7 +48,9 @@ Why: Depprecated in favor of extra_commands, extra_started_commands
Who: Who:
## support for local_start and local_stop ---------------------------
What: support for local_start and local_stop
When: 1.0 When: 1.0
@@ -51,7 +58,9 @@ Why: Depprecated in favor of executable scripts in @SYSCONFDIR@/local.d
Who: Who:
## the mtab service script ---------------------------
What: the mtab service script
When: make warnings more visible in 1.0, remove in 2.0 When: make warnings more visible in 1.0, remove in 2.0
@@ -59,3 +68,5 @@ Why: /etc/mtab should be a symbolic link to /proc/self/mounts on modern
Linux systems Linux systems
Who: Who:
---------------------------

View File

@@ -2,10 +2,7 @@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name> # Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
TOP:= ${dir ${realpath ${firstword ${MAKEFILE_LIST}}}} include Makefile.inc
MK= ${TOP}/mk
include ${TOP}/Makefile.inc
SUBDIR= conf.d etc init.d local.d man scripts sh src sysctl.d SUBDIR= conf.d etc init.d local.d man scripts sh src sysctl.d
@@ -20,11 +17,12 @@ SUBDIR+= runlevels
INSTALLAFTER= _installafter INSTALLAFTER= _installafter
MK= mk
include ${MK}/sys.mk include ${MK}/sys.mk
include ${MK}/os.mk include ${MK}/os.mk
include ${MK}/subdir.mk include ${MK}/subdir.mk
include ${MK}/dist.mk include ${MK}/dist.mk
include ${MK}/gitver.mk include ${MK}/git.mk
_installafter: _installafter:
ifeq (${MKPREFIX},yes) ifeq (${MKPREFIX},yes)

View File

@@ -1,3 +1,3 @@
NAME= openrc NAME= openrc
VERSION= 0.18.3 VERSION= 0.13.1
PKG= ${NAME}-${VERSION} PKG= ${NAME}-${VERSION}

97
NEWS.md
View File

@@ -1,97 +0,0 @@
# OpenRC NEWS
This file will contain a list of notable changes for each release. Note
the information in this file is in reverse order.
## 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
kernel, has been separated from the procfs service. This service will be
automatically added to the boot runlevel for new Linux installs. When
you upgrade, you will need to use rc-update to add it to your boot
runlevel.
The procfs service no longer automounts the deprecated usbfs and
usbdevfs file systems. Nothing should be using usbdevfs any longer, and
if you still need usbfs it can be added to fstab.
Related to the above change, the procfs service no longer attempts to
modprobe the usbcore module. If your device manager does not load it,
you will need to configure the modules service to do so.
The override order of binfmt.d and tmpfiles.d directories has been
changed to match systemd. Files in /run/binfmt.d and /run/tmpfiles.d
override their /usr/lib counterparts, and files in the /etc counterparts
override both /usr/lib and /run.
## OpenRC-0.13.2
A chroot variable has been added to the service script variables.
This fixes the support for running a service in a chroot.
This is documented in man 8 openrc-run.
The netmount service now mounts nfs file systems.
This change was made to correct a fix for an earlier bug.
## OpenRC-0.13
/sbin/rc was renamed to /sbin/openrc and /sbin/runscript was renamed to
/sbin/openrc-run due to naming conflicts with other software.
Backward compatible symbolic links are currently in place so your
system will keep working if you are using the old names; however, it is
strongly advised that you migrate to the new names because the symbolic
links will be removed in the future.
Warnings have been added to assist with this migration; however, due to the
level of noise they produce, they only appear in verbose mode in this release.
The devfs script now handles the initial mounting and setup of the
/dev directory. If /dev has already been mounted by the kernel or an
initramfs, devfs will remount /dev with the correct mount options
instead of mounting a second /dev over the existing mount point.
It attempts to mount /dev from fstab first if an entry exists there. If
it doesn't it attempts to mount devtmpfs if it is configured in the
kernel. If not, it attempts to mount tmpfs.
If none of these is available, an error message is displayed and static
/dev is assumed.
## OpenRC-0.12
The net.* scripts, originally from Gentoo Linux, have
been removed. If you need these scripts, look for a package called
netifrc, which is maintained by them.

94
README Normal file
View File

@@ -0,0 +1,94 @@
OpenRC README
Installation
------------
make install
Yup, that simple. Works with GNU make.
You may wish to tweak the installation with the below arguments
PROGLDFLAGS=-static
LIBNAME=lib64
DESTDIR=/tmp/openrc-image
MKNET=no
MKPAM=pam
MKPREFIX=yes
MKPKGCONFIG=no
MKSELINUX=yes
MKSTATICLIBS=no
MKTERMCAP=ncurses
MKTERMCAP=termcap
MKTOOLS=yes
PKG_PREFIX=/usr/pkg
LOCAL_PREFIX=/usr/local
PREFIX=/usr/local
We don't support building a static OpenRC with PAM.
You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static.
If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
so that all malloc memory should be freed at exit.
If you are building OpenRC for a Gentoo Prefix installation, add
MKPREFIX=yes.
You can also brand OpenRC if you so wish like so
BRANDING=\"Gentoo/$(uname -s)\"
PKG_PREFIX should be set to where packages install to by default.
LOCAL_PREFIX should be set when to where user maintained packages are.
Only set LOCAL_PREFIX if different from PKG_PREFIX.
PREFIX should be set when OpenRC is not installed to /.
If any of the following files exist then we do not overwrite them
/etc/devd.conf
/etc/rc
/etc/rc.shutdown
/etc/conf.d/*
rc and rc.shutdown are the hooks from the BSD init into OpenRC.
devd.conf is modified from FreeBSD to call /etc/rc.devd which is a generic
hook into OpenRC.
inittab is the same, but for SysVInit as used by most Linux distributions.
This can be found in the support folder.
Obviously, if you're installing this onto a system that does not use OpenRC
by default then you may wish to backup the above listed files, remove them
and then install so that the OS hooks into OpenRC.
init.d.misc is not installed by default as the scripts will need
tweaking on a per distro basis. They are also non essential to the operation
of the system.
As of OpenRC-0.12, the net.* scripts, originally from Gentoo Linux, have
been removed. If you need these scripts, look for a package called
netifrc, which is maintained by them.
As of OpenRC-0.13, two binaries have been renamed due to naming
conflicts with other software. The /sbin/rc binary was renamed to
/sbin/openrc, and /sbin/runscript was renamed to /sbin/openrc-run.
Backward compatible symbolic links are currently in place so your
system will keep working if you are using the old names; however, it is
strongly advised that you migrate to the new names because the symbolic
links will be removed in the future.
Warnings have been added to assist with this migration; however, they
only show in verbose mode in this release due to the level of noise they
produce.
Also, the devfs script now handles the initial mounting and setup of the
/dev directory. If /dev has already been mounted by the kernel or an
initramfs, devfs will remount /dev with the correct mount options
instead of mounting a second /dev over the existing mount point.
It attempts to mount /dev from fstab first if an entry exists there. If
it doesn't it attempts to mount devtmpfs if it is configured in the
kernel. If not, it attempts to mount tmpfs.
If none of these is available, an error message is displayed and static
/dev is assumed.
Reporting Bugs
--------------
Since Gentoo Linux is hosting OpenRC development, Bugs should go to
the Gentoo Bugzilla:
http://bugs.gentoo.org/
They should be filed under the "Gentoo Hosted Projects" product and
the "openrc" component.

View File

@@ -1,4 +1,6 @@
# Using Busybox as your Default Shell with OpenRC Using Busybox as your Default Shell
-----------------------------------
If you have/bin/sh linked to busybox, you need to be aware of several If you have/bin/sh linked to busybox, you need to be aware of several
incompatibilities between busybox's applets and the standalone incompatibilities between busybox's applets and the standalone
@@ -25,8 +27,5 @@ CONFIG_SETFONT -- The setfont applet does not support the -u option from kbd.
CONFIG_IP -- The ip applet doesn't support the "scope" modifier for CONFIG_IP -- The ip applet doesn't support the "scope" modifier for
"ip route add" and "ip address add". "ip route add" and "ip address add".
CONFIG_BB_SYSCTL -- The sysctl applet does not support the --system command
line switch.
There is work to get most of these supported by busybox, so this file There is work to get most of these supported by busybox, so this file
will be updated as things change. will be updated as things change.

View File

@@ -1,5 +1,3 @@
# OpenRC History
This history of OpenRC was written by Daniel Robbins, Roy Marples, William This history of OpenRC was written by Daniel Robbins, Roy Marples, William
Hubbs and others. Hubbs and others.

View File

@@ -1,99 +0,0 @@
# OpenRC README
OpenRC is a dependency-based init system that works with the
system-provided init program, normally `/sbin/init`. Currently, it does
not have an init program of its own.
## Installation
OpenRC requires GNU make.
Once you have GNU Make installed, the default OpenRC installation can be
executed using this command:
make install
## Configuration
You may wish to configure the installation by passing one or more of the
below arguments to the make command
```
PROGLDFLAGS=-static
LIBNAME=lib64
DESTDIR=/tmp/openrc-image
MKNET=no
MKPAM=pam
MKPREFIX=yes
MKPKGCONFIG=no
MKSELINUX=yes
MKSTATICLIBS=no
MKTERMCAP=ncurses
MKTERMCAP=termcap
MKTOOLS=yes
PKG_PREFIX=/usr/pkg
LOCAL_PREFIX=/usr/local
PREFIX=/usr/local
BRANDING=\"Gentoo/$(uname -s)\"
```
## Notes
We don't support building a static OpenRC with PAM.
You may need to use `PROGLDFLAGS=-Wl,-Bstatic` on glibc instead of just `-static`.
If you debug memory under valgrind, add `-DDEBUG_MEMORY`
to your `CPPFLAGS` so that all malloc memory should be freed at exit.
If you are building OpenRC for a Gentoo Prefix installation, add `MKPREFIX=yes`.
`PKG_PREFIX` should be set to where packages install to by default.
`LOCAL_PREFIX` should be set when to where user maintained packages are.
Only set `LOCAL_PREFIX` if different from `PKG_PREFIX`.
`PREFIX` should be set when OpenRC is not installed to /.
If any of the following files exist then we do not overwrite them
```
/etc/devd.conf
/etc/rc
/etc/rc.shutdown
/etc/conf.d/*
```
`rc` and `rc.shutdown` are the hooks from the BSD init into OpenRC.
`devd.conf` is modified from FreeBSD to call `/etc/rc.devd` which is a
generic hook into OpenRC.
`inittab` is the same, but for SysVInit as used by most Linux distributions.
This can be found in the support folder.
Obviously, if you're installing this onto a system that does not use
OpenRC by default then you may wish to backup the above listed files,
remove them and then install so that the OS hooks into OpenRC.
`init.d.misc` is not installed by default as the scripts will need
tweaking on a per distro basis. They are also non essential to the
operation of the system.
## Reporting Bugs
If you are using Gentoo Linux, bugs can be filed on their bugzilla under
the `gentoo hosted projects` product and the `openrc` component [1].
Otherwise, you can report issues on our github [2].
Better yet, if you can contribute code, please feel free to submit pull
requests [3].
## IRC Channel
We have an official irc channel, #openrc on freenode, feel free to join
us there.
[1] https://bugs.gentoo.org/
[2] https://github.com/openrc/openrc/issues
[3] https://github.com/openrc/openrc/pulls

View File

@@ -1,23 +1,23 @@
# OpenRC Style Guide
This is the openrc style manual. It governs the coding style of all code This is the openrc style manual. It governs the coding style of all code
in this repository. Follow it. Contact openrc@gentoo.org for any questions in this repository. Follow it. Contact openrc@gentoo.org for any questions
or fixes you might notice. or fixes you might notice.
## C CODE ##########
# C CODE #
##########
The BSD Kernel Normal Form (KNF) style is used [1]. Basically, it is like The BSD Kernel Normal Form (KNF) style is used:
K&R/LKML, but wrapped lines that are indented use 4 spaces. Here are the http://en.wikipedia.org/wiki/Indent_style#BSD_KNF_style
highlights. Basically, it's like K&R/LKML, but wrapped lines that are indented use 4 spaces.
- no trailing whitespace Highlights:
- indented code use tabs (not line wrapped) - no trailing whitespace
- cuddle the braces (except for functions) - indented code use tabs (not line wrapped)
- space after native statements and before paren (for/if/while/...) - cuddle the braces (except for functions)
- no space between function and paren - space after native statements and before paren (for/if/while/...)
- pointer asterisk cuddles the variable, not the type - no space between function and paren
- pointer asterisk cuddles the variable, not the type
```
void foo(int c) void foo(int c)
{ {
int ret = 0; int ret = 0;
@@ -32,15 +32,16 @@ void foo(int c)
return ret; return ret;
} }
```
## COMMIT MESSAGES ##################
# COMMIT MESSAGES #
##################
The following is an example of a correctly formatted git commit message The following is an example of a correctly formatted git commit message
for this repository. Most of this information came from this blog post for this repository. Most of this information came from this blog post
[2], so I would like to thank the author. [1], so I would like to thank the author.
``` ### cut here ###
Capitalized, short (50 chars or less) summary Capitalized, short (50 chars or less) summary
More detailed explanatory text, if necessary. Wrap it to about 72 More detailed explanatory text, if necessary. Wrap it to about 72
@@ -66,7 +67,7 @@ Further paragraphs come after blank lines.
Reported-by: User Name <email> Reported-by: User Name <email>
X-[Distro]-Bug: BugID X-[Distro]-Bug: BugID
X-[Distro]-Bug-URL: URL for the bug (on the distribution's web site typically) X-[Distro]-Bug-URL: URL for the bug (on the distribution's web site typically)
``` ### cut here ###
If you did not write the code and the patch does not include authorship If you did not write the code and the patch does not include authorship
information in a format git can use, please use the --author option of the information in a format git can use, please use the --author option of the
@@ -80,5 +81,5 @@ different from the author and committer.
*BSD. Also, [Distro] should be replaced with the name of the *BSD. Also, [Distro] should be replaced with the name of the
distribution, e.g. X-Gentoo-Bug. distribution, e.g. X-Gentoo-Bug.
[1] http://en.wikipedia.org/wiki/Indent_style#BSD_KNF_style [1] http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
[2] http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html

View File

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

View File

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

View File

@@ -1,4 +0,0 @@
# You can assign a default route
#defaultroute="192.168.0.1"
#defaultroute6="2001:a:b:c"

View File

@@ -1,4 +0,0 @@
# You can assign a default route
#defaultroute="gw 192.168.0.1"
#defaultroute6="gw 2001:a:b:c"

View File

@@ -1,5 +0,0 @@
# Separate multiple routes using ; or new lines.
# Example static routes. See route(8) for syntax.
#staticroute="net 192.168.0.0 10.73.1.1 netmask 255.255.255.0
#net 192.168.1.0 10.73.1.1 netmask 255.255.255.0"

View File

@@ -1,7 +0,0 @@
# Separate multiple routes using ; or new lines.
# /etc/route.conf(5) takes precedence over this configuration.
# Example static routes. See route(8) for syntax.
# FIXME: "net ..." not supported
#staticroute="net 192.168.0.0 -netmask 255.255.255.0 --address 10.73.1.1
#net 192.168.1.0 -netmask 255.255.255.0 --address 10.73.1.1"

View File

@@ -1,14 +0,0 @@
##############################################################################
# GNU/Hurd SPECIFIC OPTIONS
# This is the subsystem type. Valid options on GNU/Hurd:
# "" - nothing special
# "subhurd" - Hurd subhurds (to be checked)
# If this is commented out, automatic detection will be used.
#
# This should be set to the value representing the environment this file is
# PRESENTLY in, not the virtualization the environment is capable of.
#rc_sys=""
# This is the number of tty's used in most of the rc-scripts (like
# consolefont, numlock, etc ...)
#rc_tty_number=6?

View File

@@ -2,15 +2,14 @@
# LINUX SPECIFIC OPTIONS # LINUX SPECIFIC OPTIONS
# This is the subsystem type. Valid options on Linux: # This is the subsystem type. Valid options on Linux:
# "" - nothing special # "" - nothing special
# "lxc" - Linux Containers # "lxc" - Linux Containers
# "openvz" - Linux OpenVZ # "openvz" - Linux OpenVZ
# "prefix" - Prefix # "prefix" - Prefix
# "uml" - Usermode Linux # "uml" - Usermode Linux
# "vserver" - Linux vserver # "vserver" - Linux vserver
# "systemd-nspawn" - Container created by the systemd-nspawn utility # "xen0" - Xen0 Domain
# "xen0" - Xen0 Domain # "xenU" - XenU Domain
# "xenU" - XenU Domain
# If this is commented out, automatic detection will be used. # If this is commented out, automatic detection will be used.
# #
# This should be set to the value representing the environment this file is # This should be set to the value representing the environment this file is
@@ -62,21 +61,12 @@ rc_tty_number=12
# Set the devices controller settings for this service. # Set the devices controller settings for this service.
#rc_cgroup_devices="" #rc_cgroup_devices=""
# Set the hugetlb controller settings for this service.
#rc_cgroup_hugetlb=""
# Set the memory controller settings for this service. # Set the memory controller settings for this service.
#rc_cgroup_memory="" #rc_cgroup_memory=""
# Set the net_cls controller settings for this service.
#rc_cgroup_net_cls=""
# Set the net_prio controller settings for this service. # Set the net_prio controller settings for this service.
#rc_cgroup_net_prio="" #rc_cgroup_net_prio=""
# Set the pids controller settings for this service.
#rc_cgroup_pids=""
# Set this to YES if yu want all of the processes in a service's cgroup # Set this to YES if yu want all of the processes in a service's cgroup
# killed when the service is stopped or restarted. # killed when the service is stopped or restarted.
# This should not be set globally because it kills all of the service's # This should not be set globally because it kills all of the service's

View File

@@ -116,9 +116,6 @@
#SSD_NICELEVEL="-19" #SSD_NICELEVEL="-19"
# Pass ulimit parameters # Pass ulimit parameters
# If you are using bash in POSIX mode for your shell, note that the
# ulimit command uses a block size of 512 bytes for the -c and -f
# options
#rc_ulimit="-u 30" #rc_ulimit="-u 30"
# It's possible to define extra dependencies for services like so # It's possible to define extra dependencies for services like so

View File

@@ -10,9 +10,9 @@
trap : SIGINT trap : SIGINT
trap "echo 'Boot interrupted'; exit 1" SIGQUIT trap "echo 'Boot interrupted'; exit 1" SIGQUIT
/sbin/openrc sysinit || exit 1 /sbin/rc sysinit || exit 1
/sbin/openrc boot || exit 1 /sbin/rc boot || exit 1
/sbin/openrc default /sbin/rc default
# We don't actually care if rc default worked or not, we should exit 0 # We don't actually care if rc default worked or not, we should exit 0
# to allow logins # to allow logins

View File

@@ -14,4 +14,4 @@ LD_LIBRARY_PATH="/lib${LD_LIBRARY_PATH:+:}${LDLIBRARY_PATH}" ; export LD_LIBRARY
[ -z "$TERM" -o "$TERM" = "dumb" ] && TERM="@TERM@" && export TERM [ -z "$TERM" -o "$TERM" = "dumb" ] && TERM="@TERM@" && export TERM
action=${1:-shutdown} action=${1:-shutdown}
exec /sbin/openrc "${action}" exec /sbin/rc "${action}"

1
init.d/.gitignore vendored
View File

@@ -23,7 +23,6 @@ modules
mount-ro mount-ro
mtab mtab
numlock numlock
osclock
procfs procfs
staticroute staticroute
sysfs sysfs

View File

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

View File

@@ -1,20 +0,0 @@
#!@SBINDIR@/openrc-run
# Copyright 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
description="Register misc binary format handlers"
depend()
{
after procfs
use modules devfs
keyword -openvz -prefix -systemd-nspawn -vserver -lxc
}
start()
{
ebegin "Loading custom binary format handlers"
"$RC_LIBEXECDIR"/sh/binfmt.sh
eend $?
return 0
}

View File

@@ -119,31 +119,11 @@ clean_run()
{ {
[ "$RC_SYS" = VSERVER -o "$RC_SYS" = LXC ] && return 0 [ "$RC_SYS" = VSERVER -o "$RC_SYS" = LXC ] && return 0
local dir local dir
# If / is still read-only due to a problem, this will fail!
if ! checkpath -W /; then
ewarn "/ is not writable; unable to clean up underlying /run"
return 1
fi
if ! checkpath -W /tmp; then
ewarn "/tmp is not writable; unable to clean up underlying /run"
return 1
fi
# Now we know that we can modify /tmp and /
# if mktemp -d fails, it returns an EMPTY string
# STDERR: mktemp: failed to create directory via template /tmp/tmp.XXXXXXXXXX: Read-only file system
# STDOUT: ''
rc=0
dir=$(mktemp -d) dir=$(mktemp -d)
if [ -n "$dir" -a -d $dir -a -w $dir ]; then mount --bind / $dir
mount --bind / $dir && rm -rf $dir/run/* || rc=1 rm -rf $dir/run/*
umount $dir && rmdir $dir umount $dir
else rm -rf $dir
rc=1
fi
if [ $rc -ne 0 ]; then
ewarn "Could not clean up underlying /run on /"
return 1
fi
} }
start() start()
@@ -213,13 +193,10 @@ start()
if yesno $log_dmesg; then if yesno $log_dmesg; then
if $logw || checkpath -W /var/log; then if $logw || checkpath -W /var/log; then
# Create an 'after-boot' dmesg log # Create an 'after-boot' dmesg log
case "$RC_SYS" in if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ -a "$RC_SYS" != LXC ]; then
VSERVER|OPENVZ|LXC|SYSTEMD-NSPAWN) ;; dmesg > /var/log/dmesg
*) chmod 640 /var/log/dmesg
dmesg > /var/log/dmesg fi
chmod 640 /var/log/dmesg
;;
esac
fi fi
fi fi

View File

@@ -8,7 +8,7 @@ depend()
{ {
need localmount termencoding need localmount termencoding
after hotplug bootmisc after hotplug bootmisc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc keyword -openvz -prefix -uml -vserver -xenu -lxc
} }
start() start()

View File

@@ -8,7 +8,7 @@ depend()
{ {
provide dev-mount provide dev-mount
before dev before dev
keyword -prefix -systemd-nspawn -vserver -lxc keyword -prefix -vserver -lxc
} }
mount_dev() mount_dev()
@@ -69,14 +69,7 @@ seed_dev()
# so udev can add its start-message to dmesg # so udev can add its start-message to dmesg
[ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11 [ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11
# extra symbolic links not provided by default # Mount required stuff as user may not have then in /etc/fstab
[ -e /dev/fd ] || ln -snf /proc/self/fd /dev/fd
[ -e /dev/stdin ] || ln -snf /proc/self/fd/0 /dev/stdin
[ -e /dev/stdout ] || ln -snf /proc/self/fd/1 /dev/stdout
[ -e /dev/stderr ] || ln -snf /proc/self/fd/2 /dev/stderr
[ -e /proc/kcore ] && ln -snf /proc/kcore /dev/core
# Mount required directories as user may not have them in /etc/fstab
for x in \ for x in \
"mqueue /dev/mqueue 1777 ,nodev mqueue" \ "mqueue /dev/mqueue 1777 ,nodev mqueue" \
"devpts /dev/pts 0755 ,gid=5,mode=0620 devpts" \ "devpts /dev/pts 0755 ,gid=5,mode=0620 devpts" \

View File

@@ -7,7 +7,7 @@ description="Set the dmesg level for a cleaner boot"
depend() depend()
{ {
before dev modules before dev modules
keyword -lxc -prefix -systemd-nspawn -vserver keyword -lxc -prefix -vserver
} }
start() start()

View File

@@ -9,7 +9,7 @@ _IFS="
depend() depend()
{ {
use dev clock modules use dev clock modules
keyword -jail -openvz -prefix -systemd-nspawn -timeout -vserver -lxc -uml keyword -jail -openvz -prefix -timeout -vserver -lxc -uml
} }
_abort() { _abort() {

View File

@@ -5,7 +5,7 @@
description="Sets the hostname of the machine." description="Sets the hostname of the machine."
depend() { depend() {
keyword -prefix -systemd-nspawn -lxc keyword -prefix -lxc
} }
start() start()

View File

@@ -28,7 +28,7 @@ depend()
else else
before * before *
fi fi
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc keyword -openvz -prefix -uml -vserver -xenu -lxc
} }
setupopts() setupopts()

View File

@@ -8,7 +8,7 @@ depend()
{ {
need localmount termencoding need localmount termencoding
after bootmisc after bootmisc
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc keyword -openvz -prefix -uml -vserver -xenu -lxc
} }
start() start()

View File

@@ -14,13 +14,12 @@ start()
{ {
ebegin "Starting local" ebegin "Starting local"
local file has_errors=0 redirect retval local file has_errors=0 retval
yesno $rc_verbose || redirect='> /dev/null 2>&1'
eindent eindent
for file in @SYSCONFDIR@/local.d/*.start; do for file in @SYSCONFDIR@/local.d/*.start; do
if [ -x "${file}" ]; then if [ -x "${file}" ]; then
vebegin "Executing \"${file}\"" vebegin "Executing \"${file}\""
eval "${file}" $redirect "${file}" 2>&1 >/dev/null
retval=$? retval=$?
if [ ${retval} -ne 0 ]; then if [ ${retval} -ne 0 ]; then
has_errors=1 has_errors=1
@@ -53,13 +52,12 @@ stop()
{ {
ebegin "Stopping local" ebegin "Stopping local"
local file has_errors=0 redirect retval local file has_errors=0 retval
yesno $rc_verbose || redirect='> /dev/null 2>&1'
eindent eindent
for file in @SYSCONFDIR@/local.d/*.stop; do for file in @SYSCONFDIR@/local.d/*.stop; do
if [ -x "${file}" ]; then if [ -x "${file}" ]; then
vebegin "Executing \"${file}\"" vebegin "Executing \"${file}\""
eval "${file}" $redirect "${file}" 2>&1 >/dev/null
retval=$? retval=$?
if [ ${retval} -ne 0 ]; then if [ ${retval} -ne 0 ]; then
has_errors=1 has_errors=1

View File

@@ -9,13 +9,13 @@ depend()
need fsck need fsck
use lvm modules mtab use lvm modules mtab
after lvm modules after lvm modules
keyword -jail -prefix -systemd-nspawn -vserver -lxc keyword -jail -prefix -vserver -lxc
} }
start() start()
{ {
# Mount local filesystems in /etc/fstab. # Mount local filesystems in /etc/fstab.
local types="noproc" x= no_netdev= rc= local types="noproc" x= no_netdev=
for x in $net_fs_list $extra_net_fs_list; do for x in $net_fs_list $extra_net_fs_list; do
types="${types},no${x}" types="${types},no${x}"
done done
@@ -29,11 +29,9 @@ start()
ebegin "Mounting local filesystems" ebegin "Mounting local filesystems"
mount -at "$types" $no_netdev mount -at "$types" $no_netdev
eend $? "Some local filesystem failed to mount" eend $? "Some local filesystem failed to mount"
rc=$?
if [ "$RC_UNAME" != Linux ]; then # Always return 0 - some local mounts may not be critical for boot
rc=0 return 0
fi
return $rc
} }
stop() stop()
@@ -65,33 +63,6 @@ stop()
. "$RC_LIBEXECDIR"/sh/rc-mount.sh . "$RC_LIBEXECDIR"/sh/rc-mount.sh
if [ "$RC_UNAME" = Linux ] && [ -d /sys/fs/aufs ] ; then
#if / is aufs we remount it noxino during shutdown
if mountinfo -q -f '^aufs$' / ; then
mount -o remount,noxino,rw /
sync
fi
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})"
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"
fi
eoutdent
sync
done
done
fi
# Umount loop devices # Umount loop devices
einfo "Unmounting loop devices" einfo "Unmounting loop devices"
eindent eindent

View File

@@ -6,7 +6,7 @@ description="Configures the loopback interface."
depend() depend()
{ {
keyword -jail -prefix -systemd-nspawn -vserver keyword -jail -prefix -vserver
} }
start() start()

View File

@@ -7,7 +7,7 @@ description="Loads a user defined list of kernel modules."
depend() depend()
{ {
use isapnp use isapnp
keyword -openvz -prefix -systemd-nspawn -vserver -lxc keyword -openvz -prefix -vserver -lxc
} }
start() start()

View File

@@ -7,7 +7,7 @@ description="Re-mount filesytems read-only for a clean reboot."
depend() depend()
{ {
need killprocs savecache need killprocs savecache
keyword -openvz -prefix -systemd-nspawn -vserver -lxc keyword -openvz -prefix -vserver -lxc
} }
start() start()

View File

@@ -7,33 +7,33 @@ description="Update /etc/mtab to match what the kernel knows about"
depend() depend()
{ {
need root need root
keyword -prefix -systemd-nspawn keyword -prefix
} }
start() start()
{ {
local rc=0 if [ -L /etc/mtab ]; then
ebegin "Updating /etc/mtab" return 0
if ! checkpath -W /etc; then
rc=1
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
[ -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
# which allows this hack to work.
grep -v "^[! ]* / tmpfs " /proc/mounts > /etc/mtab
# Remove stale backups
rm -f /etc/mtab~ /etc/mtab~~
fi fi
eend $rc "/etc is not writable; unable to create /etc/mtab"
return 0 ebegin "Updating /etc/mtab"
vewarn "The support for updating /etc/mtab as a file is"
vewarn "deprecated and will be removed in the future."
vewarn "Please run the following command as root on your system."
vewarn
vewarn "ln -snf /proc/self/mounts /etc/mtab"
if ! echo 2>/dev/null >/etc/mtab; then
ewend 1 "/etc/mtab is not updateable"
return 0
fi
# 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
# which allows this hack to work.
grep -v "^[! ]* / tmpfs " /proc/mounts > /etc/mtab
# Remove stale backups
rm -f /etc/mtab~ /etc/mtab~~
eend 0
} }

View File

@@ -2,20 +2,28 @@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name> # Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
description="Mounts network shares according to /etc/fstab." description="Mounts network shares, other than NFS, according to /etc/fstab."
# We skip all NFS shares in this script because they require extra
# daemons to be running on the client in order to work correctly.
# It is best to allow nfs-utils to handle all nfs shares.
depend() depend()
{ {
config /etc/fstab config /etc/fstab
use afc-client amd nfsclient autofs openvpn use afc-client amd autofs openvpn
use dns use dns
keyword -jail -prefix -systemd-nspawn -vserver -lxc keyword -jail -prefix -vserver -lxc
} }
start() start()
{ {
local x= fs= rc= local x= fs= rc=
for x in $net_fs_list $extra_net_fs_list; do for x in $net_fs_list $extra_net_fs_list; do
case "$x" in
nfs|nfs4)
continue
;;
esac
fs="$fs${fs:+,}$x" fs="$fs${fs:+,}$x"
done done
@@ -27,10 +35,7 @@ start()
rc=$? rc=$?
fi fi
ewend $rc "Could not mount all network filesystems" ewend $rc "Could not mount all network filesystems"
if [ "$RC_UNAME" != Linux ]; then return 0
rc=0
fi
return $rc
} }
stop() stop()
@@ -41,7 +46,14 @@ stop()
. "$RC_LIBEXECDIR"/sh/rc-mount.sh . "$RC_LIBEXECDIR"/sh/rc-mount.sh
for x in $net_fs_list $extra_net_fs_list; do for x in $net_fs_list $extra_net_fs_list; do
fs="$fs${fs:+,}$x" case "$x" in
nfs|nfs4)
continue
;;
*)
fs="$fs${fs:+,}$x"
;;
esac
done done
if [ -n "$fs" ]; then if [ -n "$fs" ]; then
umount -at $fs || eerror "Failed to simply unmount filesystems" umount -at $fs || eerror "Failed to simply unmount filesystems"
@@ -50,7 +62,14 @@ stop()
eindent eindent
fs= fs=
for x in $net_fs_list $extra_net_fs_list; do for x in $net_fs_list $extra_net_fs_list; do
fs="$fs${fs:+|}$x" case "$x" in
nfs|nfs4)
continue
;;
*)
fs="$fs${fs:+|}$x"
;;
esac
done done
[ -n "$fs" ] && fs="^($fs)$" [ -n "$fs" ] && fs="^($fs)$"
do_unmount umount ${fs:+--fstype-regex} $fs --netdev do_unmount umount ${fs:+--fstype-regex} $fs --netdev

View File

@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
depend() depend()
{ {
need localmount need localmount
keyword -openvz -prefix -systemd-nspawn -vserver -lxc keyword -openvz -prefix -vserver -lxc
} }
_setleds() _setleds()

View File

@@ -1,12 +0,0 @@
#!@SBINDIR@/openrc-run
# Copyright (c) 2014 Ralph Sennhauser <sera@igentoo.org>
# Released under the 2-clause BSD license.
# Can be used on OSs that take care of the clock.
description="Provides clock"
depend()
{
provide clock
}

View File

@@ -8,20 +8,66 @@ depend()
{ {
use modules devfs use modules devfs
need localmount need localmount
keyword -openvz -prefix -systemd-nspawn -vserver -lxc keyword -openvz -prefix -vserver -lxc
} }
start() start()
{ {
# Make sure we insert usbcore if it's a module
if [ -f /proc/modules -a ! -d /sys/module/usbcore -a ! -d /proc/bus/usb ]; then
modprobe -q usbcore
fi
[ -e /proc/filesystems ] || return 0
# Setup Kernel Support for miscellaneous Binary Formats # Setup Kernel Support for miscellaneous Binary Formats
if [ -d /proc/sys/fs/binfmt_misc -a ! -e /proc/sys/fs/binfmt_misc/register ]; then if [ -d /proc/sys/fs/binfmt_misc -a ! -e /proc/sys/fs/binfmt_misc/register ]; then
modprobe -q binfmt-misc
if grep -qs binfmt_misc /proc/filesystems; then if grep -qs binfmt_misc /proc/filesystems; then
ebegin "Mounting misc binary format filesystem" ebegin "Mounting misc binary format filesystem"
mount -t binfmt_misc -o nodev,noexec,nosuid \ mount -t binfmt_misc -o nodev,noexec,nosuid \
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
if eend $? ; then
local fmts
ebegin "Loading custom binary format handlers"
fmts=$(grep -hsv -e '^[#;]' -e '^[[:space:]]*$' \
/run/binfmt.d/*.conf \
/etc/binfmt.d/*.conf \
""/usr/lib/binfmt.d/*.conf)
if [ -n "${fmts}" ]; then
echo "${fmts}" > /proc/sys/fs/binfmt_misc/register
fi
eend $? eend $?
fi
fi fi
fi fi
[ "$RC_SYS" = "OPENVZ" ] && return 0
# Check what USB fs the kernel support. Currently
# 2.5+ kernels, and later 2.4 kernels have 'usbfs',
# while older kernels have 'usbdevfs'.
if [ -d /proc/bus/usb -a ! -e /proc/bus/usb/devices ]; then
local usbfs=$(grep -Fow usbfs /proc/filesystems ||
grep -Fow usbdevfs /proc/filesystems)
if [ -n "$usbfs" ]; then
ebegin "Mounting USB device filesystem [$usbfs]"
local usbgid="$(getent group usb | \
sed -e 's/.*:.*:\(.*\):.*/\1/')"
mount -t $usbfs \
-o ${usbgid:+devmode=0664,devgid=$usbgid,}noexec,nosuid \
usbfs /proc/bus/usb
eend $?
fi
fi
# Setup Kernel Support for SELinux
if [ -d /sys/fs/selinux ] && ! mountinfo -q /sys/fs/selinux; then
if grep -qs selinuxfs /proc/filesystems; then
ebegin "Mounting SELinux filesystem"
mount -t selinuxfs selinuxfs /sys/fs/selinux
eend $?
fi
fi
return 0 return 0
} }

View File

@@ -7,7 +7,7 @@ description="Mount the root fs read/write"
depend() depend()
{ {
need fsck need fsck
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc keyword -jail -openvz -prefix -vserver -lxc
} }
start() start()

View File

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

View File

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

View File

@@ -23,7 +23,7 @@ start()
# Don't quote ${dump_device}, so that if it's unset, # Don't quote ${dump_device}, so that if it's unset,
# savecore will check on the partitions listed in fstab # savecore will check on the partitions listed in fstab
# without errors in the output # without errors in the output
savecore -C $dump_device >/dev/null savecore -C "$dump_dir" $dump_device >/dev/null
else else
ls "$dump_dir"/bsd* > /dev/null 2>&1 ls "$dump_dir"/bsd* > /dev/null 2>&1
fi fi

View File

@@ -5,7 +5,7 @@
depend() depend()
{ {
before localmount before localmount
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc keyword -jail -openvz -prefix -vserver -lxc
} }
start() start()

View File

@@ -5,7 +5,7 @@
depend() depend()
{ {
need localmount need localmount
keyword -jail -openvz -prefix -systemd-nspawn -vserver -lxc keyword -jail -openvz -prefix -vserver -lxc
} }
start() start()

View File

@@ -8,7 +8,7 @@ depend()
{ {
before * before *
provide clock provide clock
keyword -openvz -prefix -systemd-nspawn -uml -vserver -xenu -lxc keyword -openvz -prefix -uml -vserver -xenu -lxc
} }
# swclock is an OpenRC built in # swclock is an OpenRC built in

View File

@@ -1,31 +0,0 @@
#!@SBINDIR@/openrc-run
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
depend()
{
before bootmisc logger
keyword -prefix
}
start()
{
[ -e /etc/sysctl.conf ] || return 0
local retval=0 var= comments= conf=
ebegin "Configuring kernel parameters"
eindent
for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
if [ -r "$conf" ]; then
vebegin "applying $conf"
while read var comments; do
case "$var" in
""|"#"*) continue;;
esac
sysctl -w "$var" >/dev/null || retval=1
done < "$conf"
veend $retval
fi
done
eoutdent
eend $retval "Some errors were encountered"
}

View File

@@ -1,32 +0,0 @@
#!@PREFIX@/sbin/openrc-run
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
#FIXME: Modify for GNU/Hurd
depend()
{
before bootmisc logger
keyword -prefix
}
start()
{
[ -e /etc/sysctl.conf ] || return 0
local retval=0 var= comments= conf=
ebegin "Configuring kernel parameters"
eindent
for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
if [ -r "$conf" ]; then
vebegin "applying $conf"
while read var comments; do
case "$var" in
""|"#"*) continue;;
esac
sysctl -w "$var" >/dev/null || retval=1
done < "$conf"
veend $retval
fi
done
eoutdent
eend $retval "Some errors were encountered"
}

View File

@@ -5,15 +5,12 @@
depend() depend()
{ {
before bootmisc logger before bootmisc logger
keyword -prefix -systemd-nspawn -vserver keyword -prefix -vserver
} }
start() start()
{ {
local quiet
yesno $rc_verbose || quiet=-q
ebegin "Configuring kernel parameters" ebegin "Configuring kernel parameters"
sysctl ${quiet} --system sysctl --system
eend $? "Unable to configure some kernel parameters" eend $? "Unable to configure some kernel parameters"
} }

View File

@@ -8,7 +8,7 @@ sysfs_opts=nodev,noexec,nosuid
depend() depend()
{ {
keyword -lxc -prefix -systemd-nspawn -vserver keyword -lxc -prefix -vserver
} }
mount_sys() mount_sys()
@@ -82,15 +82,6 @@ mount_misc()
fi fi
fi fi
# Setup Kernel Support for SELinux
if [ -d /sys/fs/selinux ] && ! mountinfo -q /sys/fs/selinux; then
if grep -qs selinuxfs /proc/filesystems; then
ebegin "Mounting SELinux filesystem"
mount -t selinuxfs selinuxfs /sys/fs/selinux
eend $?
fi
fi
# setup up kernel support for efivarfs # setup up kernel support for efivarfs
# slightly complicated, as if it's build as a module but NOT yet loaded, # slightly complicated, as if it's build as a module but NOT yet loaded,
# it will NOT appear in /proc/filesystems yet # it will NOT appear in /proc/filesystems yet
@@ -116,14 +107,13 @@ mount_cgroups()
mount -n -t cgroup \ mount -n -t cgroup \
-o none,${sysfs_opts},name=openrc,release_agent="$agent" \ -o none,${sysfs_opts},name=openrc,release_agent="$agent" \
openrc /sys/fs/cgroup/openrc openrc /sys/fs/cgroup/openrc
printf 1 > /sys/fs/cgroup/openrc/notify_on_release echo 1 > /sys/fs/cgroup/openrc/notify_on_release
fi fi
yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0 yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
while read name hier groups enabled rest; do while read name hier groups enabled rest; do
case "${enabled}" in case "${enabled}" in
1) mountinfo -q /sys/fs/cgroup/${name} && continue 1) mkdir /sys/fs/cgroup/${name}
mkdir /sys/fs/cgroup/${name}
mount -n -t cgroup -o ${sysfs_opts},${name} \ mount -n -t cgroup -o ${sysfs_opts},${name} \
${name} /sys/fs/cgroup/${name} ${name} /sys/fs/cgroup/${name}
;; ;;
@@ -139,13 +129,25 @@ restorecon_sys()
restorecon -rF /sys/fs/cgroup >/dev/null 2>&1 restorecon -rF /sys/fs/cgroup >/dev/null 2>&1
eend $? eend $?
fi fi
return 0
} }
start() start()
{ {
local retval
mount_sys mount_sys
mount_misc retval=$?
mount_cgroups if [ $retval -eq 0 ]; then
mount_misc
retval=$?
fi
if [ $retval -eq 0 ]; then
mount_cgroups
retval=$?
fi
restorecon_sys restorecon_sys
return 0
return $retval
} }

View File

@@ -9,7 +9,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
depend() depend()
{ {
keyword -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu keyword -lxc -openvz -prefix -uml -vserver -xenu
use root use root
after bootmisc after bootmisc
} }

View File

@@ -2,7 +2,7 @@
# Copyright 1999-2012 Gentoo Foundation # Copyright 1999-2012 Gentoo Foundation
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
description="Set up tmpfiles.d entries" description="set up tmpfiles.d entries"
depend() depend()
{ {
@@ -13,8 +13,8 @@ depend()
start() start()
{ {
ebegin "Setting up tmpfiles.d entries for /dev" ebegin "setting up tmpfiles.d entries for /dev"
@LIBEXECDIR@/sh/tmpfiles.sh --prefix=/dev --create --boot ${tmpfiles_opts} @LIBEXECDIR@/sh/tmpfiles.sh --prefix=/dev --create ${tmpfiles_opts}
eend $? eend $?
return 0 return 0
} }

View File

@@ -2,7 +2,7 @@
# Copyright 1999-2012 Gentoo Foundation # Copyright 1999-2012 Gentoo Foundation
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
description="Set up tmpfiles.d entries" description="set up tmpfiles.d entries"
depend() depend()
{ {
@@ -11,7 +11,7 @@ depend()
start() start()
{ {
ebegin "Setting up tmpfiles.d entries" ebegin "setting up tmpfiles.d entries"
@LIBEXECDIR@/sh/tmpfiles.sh --exclude-prefix=/dev --create --remove --boot \ @LIBEXECDIR@/sh/tmpfiles.sh --exclude-prefix=/dev --create --remove --boot \
${tmpfiles_opts} ${tmpfiles_opts}
eend $? eend $?

View File

@@ -8,7 +8,7 @@ description="Initializes the random number generator."
depend() depend()
{ {
need localmount need localmount
keyword -jail -lxc -openvz -prefix -systemd-nspawn keyword -jail -lxc -openvz -prefix
} }
save_seed() save_seed()

View File

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

View File

@@ -107,19 +107,6 @@ the service has already been stopped.
String describing the service. String describing the service.
.It Ar description_$command .It Ar description_$command
String describing the extra command. String describing the extra command.
.It Ar supervisor
Supervisor to use to monitor this daemon. If this is unset,
start-stop-daemon will be used. The only alternate supervisor we support
in this release is S6 from Skarnet software. To use this, set
supervisor=s6.
.It Ar s6_service_path
The path to the s6 service directory if you are monitoring this service
with S6. The default is /var/svc.d/${RC_SVCNAME}.
.It Ar s6_svwait_options_start
The options to pass to s6-svwait when starting the service via s6.
.It Ar s6_service_timeout_stop
The amount of time, in milliseconds, s6-svc should wait for the service
to go down when stopping the service. The default is 10000.
.It Ar start_stop_daemon_args .It Ar start_stop_daemon_args
List of arguments passed to start-stop-daemon when starting the daemon. List of arguments passed to start-stop-daemon when starting the daemon.
.It Ar command .It Ar command
@@ -127,22 +114,16 @@ Daemon to start or stop via
.Nm start-stop-daemon .Nm start-stop-daemon
if no start or stop function is defined by the service. if no start or stop function is defined by the service.
.It Ar command_args .It Ar command_args
List of arguments to pass to the daemon when starting via List of arguments to pass to the daemon when starting.
.Nm start-stop-daemon .
.It Ar command_background .It Ar command_background
Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into
the background. This implies the "--make-pidfile" and "--pidfile" option of the background. This implies the "--make-pidfile" and "--pidfile" option of
.Xr start-stop-daemon 8 .Xr start-stop-daemon 8
so the pidfile variable must be set. so the pidfile variable must be set.
.It Ar chroot
.Xr start-stop-daemon 8
will chroot into this path before writing the pid file or starting the daemon.
.It Ar pidfile .It Ar pidfile
Pidfile to use for the above defined command. Pidfile to use for the above defined command.
.It Ar name .It Ar name
Display name used for the above defined command. Display name used for the above defined command.
.It Ar stopsig
Signal to send when stopping the daemon.
.It Ar retry .It Ar retry
Retry schedule to use when stopping the daemon. It can either be a Retry schedule to use when stopping the daemon. It can either be a
timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5). timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
@@ -150,12 +131,6 @@ timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
A list of directories which must exist for the service to start. A list of directories which must exist for the service to start.
.It Ar required_files .It Ar required_files
A list of files which must exist for the service to start. A list of files which must exist for the service to start.
.It Ar start_inactive
Set to yes to have the service marked inactive when it starts. This is
used along with in_background_fake to support re-entrant services.
.It Ar in_background_fake
Space separated list of commands which should always succeed when
in_background is yes.
.El .El
.Sh DEPENDENCIES .Sh DEPENDENCIES
You should define a You should define a

View File

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

View File

@@ -87,7 +87,7 @@ If the
.Fl s , -stack .Fl s , -stack
option is given then we either add or remove the runlevel from the runlevel. option is given then we either add or remove the runlevel from the runlevel.
This allows inheritance of runlevels. This allows inheritance of runlevels.
.Pp
If the If the
.Fl a, -all .Fl a, -all
option is given, we remove the service from all runlevels. This is option is given, we remove the service from all runlevels. This is

View File

@@ -6,7 +6,7 @@ IGNOREFILES+= .depend
.depend: ${SRCS} .depend: ${SRCS}
rm -f .depend rm -f .depend
${CC} ${LOCAL_CPPFLAGS} ${CPPFLAGS} -MM ${SRCS} > .depend ${CC} ${CPPFLAGS} -MM ${SRCS} > .depend
depend: .depend extra_depend depend: .depend extra_depend

View File

@@ -2,23 +2,18 @@
# Copyright (c) 2008 Roy Marples <roy@marples.name> # Copyright (c) 2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
GITREF?= ${VERSION} GITREF?= HEAD
DISTPREFIX?= ${NAME}-${VERSION} DISTPREFIX?= ${NAME}-${VERSION}
DISTFILE?= ${DISTPREFIX}.tar.bz2 DISTFILE?= ${DISTPREFIX}.tar.bz2
CLEANFILES+= ${NAME}-*.tar.bz2 CLEANFILES+= ${NAME}-*.tar.bz2
CHANGELOG_LIMIT?= --after="1 year ago"
_SNAP_SH= date -u +%Y%m%d%H%M _SNAP_SH= date -u +%Y%m%d%H%M
_SNAP:= $(shell ${_SNAP_SH}) _SNAP:= $(shell ${_SNAP_SH})
SNAP= ${_SNAP} SNAP= ${_SNAP}
SNAPDIR= ${DISTPREFIX}-${SNAP} SNAPDIR= ${DISTPREFIX}-${SNAP}
SNAPFILE= ${SNAPDIR}.tar.bz2 SNAPFILE= ${SNAPDIR}.tar.bz2
changelog:
git log ${CHANGELOG_LIMIT} --format=full > ChangeLog
dist: dist:
git archive --prefix=${DISTPREFIX}/ ${GITREF} | bzip2 > ${DISTFILE} git archive --prefix=${DISTPREFIX}/ ${GITREF} | bzip2 > ${DISTFILE}
@@ -34,7 +29,7 @@ snapshot:
mkdir /tmp/${SNAPDIR} mkdir /tmp/${SNAPDIR}
cp -RPp * /tmp/${SNAPDIR} cp -RPp * /tmp/${SNAPDIR}
(cd /tmp/${SNAPDIR}; make clean) (cd /tmp/${SNAPDIR}; make clean)
rm -rf /tmp/${SNAPDIR}/.git 2>/dev/null || true find /tmp/${SNAPDIR} -name .svn -exec rm -rf -- {} \; 2>/dev/null || true
tar -cvjpf ${SNAPFILE} -C /tmp ${SNAPDIR} tar -cvjpf ${SNAPFILE} -C /tmp ${SNAPDIR}
rm -rf /tmp/${SNAPDIR} rm -rf /tmp/${SNAPDIR}
ls -l ${SNAPFILE} ls -l ${SNAPFILE}

View File

@@ -21,10 +21,10 @@ _LIBS+= ${SHLIB_NAME}
CLEANFILES+= ${OBJS} ${SOBJS} ${_LIBS} ${SHLIB_LINK} CLEANFILES+= ${OBJS} ${SOBJS} ${_LIBS} ${SHLIB_LINK}
%.o: %.c %.o: %.c
${CC} ${LOCAL_CFLAGS} ${LOCAL_CPPFLAGS} ${CFLAGS} ${CPPFLAGS} -c $< -o $@ ${CC} ${CFLAGS} ${CPPFLAGS} -c $< -o $@
%.So: %.c %.So: %.c
${CC} ${PICFLAG} -DPIC ${LOCAL_CFLAGS} ${LOCAL_CPPFLAGS} ${CPPFLAGS} ${CFLAGS} -c $< -o $@ ${CC} ${PICFLAG} -DPIC ${CPPFLAGS} ${CFLAGS} -c $< -o $@
all: depend ${_LIBS} all: depend ${_LIBS}
@@ -40,7 +40,7 @@ ${SHLIB_NAME}: ${SOBJS}
@${ECHO} building shared library $@ @${ECHO} building shared library $@
@rm -f $@ ${SHLIB_LINK} @rm -f $@ ${SHLIB_LINK}
@ln -fs $@ ${SHLIB_LINK} @ln -fs $@ ${SHLIB_LINK}
${CC} ${LOCAL_CFLAGS} ${CFLAGS} ${LOCAL_LDFLAGS} ${LDFLAGS} -shared -Wl,-x \ ${CC} ${CFLAGS} ${LDFLAGS} -shared -Wl,-x \
-o $@ -Wl,-soname,${SONAME} \ -o $@ -Wl,-soname,${SONAME} \
${SOBJS} ${LDADD} ${SOBJS} ${LDADD}

View File

@@ -3,9 +3,7 @@
# Generic definitions # Generic definitions
SFX= .GNU-kFreeBSD.in
PKG_PREFIX?= /usr
CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700 CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700
LIBDL= -Wl,-Bdynamic -ldl LIBDL= -Wl,-Bdynamic -ldl
LIBKVM?= LIBKVM?=
include ${MK}/os-BSD.mk

View File

@@ -1,8 +0,0 @@
# Copyright (c) 2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
SFX= .GNU.in
PKG_PREFIX?= /usr
CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -DMAXPATHLEN=4096 -DPATH_MAX=4096
LIBDL= -Wl,-Bdynamic -ldl

View File

@@ -4,24 +4,11 @@
SFX= .Linux.in SFX= .Linux.in
PKG_PREFIX?= /usr PKG_PREFIX?= /usr
CPPFLAGS+= -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=700
LIBDL= -Wl,-Bdynamic -ldl LIBDL= -Wl,-Bdynamic -ldl
ifeq (${MKSELINUX},yes) ifeq (${MKSELINUX},yes)
CPPFLAGS+= -DHAVE_SELINUX CPPFLAGS+= -DHAVE_SELINUX
LIBSELINUX?= -lselinux LIBSELINUX= -lselinux
LDADD += $(LIBSELINUX) LDADD += $(LIBSELINUX)
ifneq (${MKPAM},pam)
# if using selinux but not pam then we need crypt
LIBCRYPT?= -lcrypt
LDADD += $(LIBCRYPT)
endif
endif
ifeq (${MKAUDIT},yes)
LIBAUDIT?= -laudit
CPPFLAGS+= -DHAVE_AUDIT
LDADD+= ${LIBAUDIT}
endif endif

View File

@@ -3,12 +3,6 @@ LIBPAM?= -lpam
CPPFLAGS+= -DHAVE_PAM CPPFLAGS+= -DHAVE_PAM
LDADD+= ${LIBPAM} LDADD+= ${LIBPAM}
ifeq (${MKSELINUX},yes)
# with selinux, pam_misc is needed too
LIBPAM_MISC?= -lpam_misc
LDADD+= ${LIBPAM_MISC}
endif
PAMDIR?= /etc/pam.d PAMDIR?= /etc/pam.d
PAMMODE?= 0644 PAMMODE?= 0644
else ifneq (${MKPAM},) else ifneq (${MKPAM},)

View File

@@ -1,4 +1,4 @@
# rules to build a program # rules to build a library
# based on FreeBSD's bsd.prog.mk # based on FreeBSD's bsd.prog.mk
# Copyright (c) 2008 Roy Marples <roy@marples.name> # Copyright (c) 2008 Roy Marples <roy@marples.name>
@@ -25,10 +25,10 @@ CLEANFILES+= ${OBJS} ${PROG}
all: depend ${PROG} all: depend ${PROG}
%.o: %.c %.o: %.c
${CC} ${LOCAL_CFLAGS} ${LOCAL_CPPFLAGS} ${CFLAGS} ${CPPFLAGS} -c $< -o $@ ${CC} ${CFLAGS} ${CPPFLAGS} -c $< -o $@
${PROG}: ${SCRIPTS} ${OBJS} ${PROG}: ${SCRIPTS} ${OBJS}
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS} ${LDADD} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS} ${LDADD}
clean: clean:
rm -f ${CLEANFILES} rm -f ${CLEANFILES}

View File

@@ -1,12 +1,11 @@
ifeq (${MKTERMCAP},ncurses) ifeq (${MKTERMCAP},ncurses)
TERMCAP_CFLAGS:= $(shell pkg-config ncurses --cflags 2> /dev/null) LTERMCAP:= $(shell pkg-config ncurses --libs 2> /dev/null)
LTERMCAP:= $(shell pkg-config ncurses --libs 2> /dev/null)
ifeq ($(LTERMCAP),) ifeq ($(LTERMCAP),)
LIBTERMCAP?= -lncurses LIBTERMCAP?= -lncurses
else else
LIBTERMCAP?= $(LTERMCAP) LIBTERMCAP?= $(LTERMCAP)
endif endif
CPPFLAGS+= -DHAVE_TERMCAP ${TERMCAP_CFLAGS} CPPFLAGS+= -DHAVE_TERMCAP
LDADD+= ${LIBTERMCAP} LDADD+= ${LIBTERMCAP}
else ifeq (${MKTERMCAP},termcap) else ifeq (${MKTERMCAP},termcap)
LIBTERMCAP?= -ltermcap LIBTERMCAP?= -ltermcap

View File

@@ -34,8 +34,7 @@ BOOT-FreeBSD+= hostid newsyslog savecore syslogd
# FreeBSD specific stuff # FreeBSD specific stuff
BOOT-FreeBSD+= adjkerntz dumpon syscons BOOT-FreeBSD+= adjkerntz dumpon syscons
BOOT-Linux+= binfmt hwclock keymaps modules mtab procfs termencoding \ BOOT-Linux+= hwclock keymaps modules mtab procfs termencoding tmpfiles.setup
tmpfiles.setup
SHUTDOWN-Linux= killprocs mount-ro SHUTDOWN-Linux= killprocs mount-ro
SYSINIT-Linux= devfs dmesg sysfs tmpfiles.dev SYSINIT-Linux= devfs dmesg sysfs tmpfiles.dev

View File

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

1
scripts/.gitignore vendored
View File

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

View File

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

View File

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

3
sh/.gitignore vendored
View File

@@ -1,11 +1,10 @@
functions.sh functions.sh
gendepends.sh gendepends.sh
rc-functions.sh rc-functions.sh
openrc-run.sh runscript.sh
cgroup-release-agent.sh cgroup-release-agent.sh
init.sh init.sh
init-early.sh init-early.sh
rc-cgroup.sh rc-cgroup.sh
tmpfiles.sh tmpfiles.sh
migrate-to-run.sh migrate-to-run.sh
binfmt.sh

View File

@@ -1,8 +1,8 @@
DIR= ${LIBEXECDIR}/sh DIR= ${LIBEXECDIR}/sh
SRCS= init.sh.in functions.sh.in gendepends.sh.in \ SRCS= init.sh.in functions.sh.in gendepends.sh.in \
openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}} rc-functions.sh.in runscript.sh.in tmpfiles.sh.in ${SRCS-${OS}}
INC= rc-mount.sh functions.sh rc-functions.sh s6.sh start-stop-daemon.sh INC= rc-mount.sh functions.sh rc-functions.sh
BIN= gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}} BIN= gendepends.sh init.sh runscript.sh tmpfiles.sh ${BIN-${OS}}
INSTALLAFTER= _installafter INSTALLAFTER= _installafter
@@ -12,9 +12,9 @@ include ${MK}/os.mk
SRCS-FreeBSD= SRCS-FreeBSD=
BIN-FreeBSD= BIN-FreeBSD=
SRCS-Linux= binfmt.sh.in cgroup-release-agent.sh.in init-early.sh.in \ SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
migrate-to-run.sh.in rc-cgroup.sh.in rc-cgroup.sh.in
BIN-Linux= binfmt.sh cgroup-release-agent.sh init-early.sh migrate-to-run.sh \ BIN-Linux= cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
rc-cgroup.sh rc-cgroup.sh
SRCS-NetBSD= SRCS-NetBSD=

View File

@@ -1,85 +0,0 @@
#!@SHELL@
# This is a reimplementation of the systemd binfmt.d code to register
# misc binary formats with the kernel.
#
# Copyright (c) 2015 William Hubbs <w.d.hubbs@gmail.com>
# Released under the 2-clause BSD license.
#
# See the binfmt.d manpage as well:
# http://0pointer.de/public/systemd-man/binfmt.d.html
# This script should match the manpage as of 2015/03/31
#
apply_file() {
[ $# -lt 1 ] && return 0
FILE="$1"
LINENUM=0
### FILE FORMAT ###
# See https://www.kernel.org/doc/Documentation/binfmt_misc.txt
while read line; do
LINENUM=$(( LINENUM+1 ))
case $line in
\#*) continue ;;
\;*) continue ;;
esac
echo "${line}" > /proc/sys/fs/binfmt_misc/register
rc=$?
if [ $rc -ne 0 ]; then
printf "binfmt: invalid entry on line %d of \`%s'\n" \
"$LINENUM" "$FILE" >&2
error=1
fi
done <$FILE
return $rc
}
[ -e /proc/sys/fs/binfmt_misc/register ] || exit 0
error=0
if [ $# -gt 0 ]; then
while [ $# -gt 0 ]; do
apply_file "$1"
shift
done
else
# The hardcoding of these paths is intentional; we are following the
# systemd spec.
binfmt_dirs='/usr/lib/binfmt.d/ /run/binfmt.d/ /etc/binfmt.d/'
binfmt_basenames=''
binfmt_d=''
# Build a list of sorted unique basenames
# directories declared later in the binfmt_d list will override earlier
# directories, on a per file basename basis.
# `/run/binfmt.d/foo.conf' supersedes `/usr/lib/binfmt.d/foo.conf'.
# `/run/binfmt.d/foo.conf' will always be read after `/etc/binfmt.d/bar.conf'
for d in ${binfmt_dirs} ; do
[ -d $d ] && for f in ${d}/*.conf ; do
case "${f##*/}" in
systemd.conf|systemd-*.conf) continue;;
esac
[ -e $f ] && binfmt_basenames="${binfmt_basenames}\n${f##*/}"
done # for f in ${d}
done # for d in ${binfmt_dirs}
binfmt_basenames="$(printf "${binfmt_basenames}\n" | sort -u )"
for b in $binfmt_basenames ; do
real_f=''
for d in $binfmt_dirs ; do
f=${d}/${b}
[ -e "${f}" ] && real_f=$f
done
[ -e "${real_f}" ] && binfmt_d="${binfmt_d} ${real_f}"
done
# loop through the gathered fragments, sorted globally by filename.
# `/run/binfmt.d/foo.conf' will always be read after `/etc/binfmt.d/bar.conf'
for FILE in $binfmt_d ; do
apply_file "$FILE"
done
fi
exit $error
# vim: set ts=2 sw=2 sts=2 noet ft=sh:

View File

@@ -1,35 +0,0 @@
#!@SHELL@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
if [ ! -d /run ]; then
ebegin "Creating /run"
mkdir -p /run
eend $?
fi
if [ -L $RC_SVCDIR ]; then
rm $RC_SVCDIR
fi
ebegin "Mounting /run"
if ! fstabinfo --mount /run; then
mount -t tmpfs -o mode=0755,noexec,nosuid,size=10% tmpfs /run
if [ $? != 0 ]; then
eerror "Unable to mount tmpfs on /run."
eerror "Can't continue."
exit 1
fi
fi
eend
ebegin "Creating $RC_SVCDIR"
mkdir -p $RC_SVCDIR
eend $?
if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
fi
echo sysinit >"$RC_SVCDIR"/softlevel
exit 0

View File

@@ -1,38 +0,0 @@
#!@SHELL@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Copyright (c) 2014 Svante Signell <svante.signell@gmail.com>
# Released under the 2-clause BSD license.
if [ ! -d /run ]; then
ebegin "Creating /run"
mkdir -p /run
eend $?
fi
if [ -L $RC_SVCDIR ]; then
rm $RC_SVCDIR
fi
if ! mountinfo -q /run; then
ebegin "Mounting /run"
if ! fstabinfo --mount /run; then
mount -t tmpfs -o mode=0755,no-suid,size=10% tmpfs /run
if [ $? != 0 ]; then
eerror "Unable to mount tmpfs on /run."
eerror "Can't continue."
exit 1
fi
fi
eend
fi
ebegin "Creating $RC_SVCDIR"
mkdir -p $RC_SVCDIR
eend $?
if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
fi
echo sysinit >"$RC_SVCDIR"/softlevel
exit 0

View File

@@ -1,9 +1,7 @@
#!@SHELL@ #!@SHELL@
# Copyright (c) 2012 Alexander Vershilov <qnikst@gentoo.org> # Copyright (c) 2012 Alexander Vershilov <qnikst@gentoo.org>
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
extra_stopped_commands="${extra_stopped_commands} cgroup_cleanup" extra_stopped_commands="${extra_stopped_commands} cgroup_cleanup"
description_cgroup_cleanup="Kill all processes in the cgroup"
cgroup_find_path() cgroup_find_path()
{ {
@@ -48,27 +46,25 @@ cgroup_set_values()
$controller.*) $controller.*)
if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then
veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
printf "%s" "$val" > "$cgroup/$name" echo $val > "$cgroup/$name"
fi fi
name=$1 name=$1
val= val=
;; ;;
*) *)
[ -n "$val" ] && val="$val $1"
val="$val $1" ||
val="$1"
;; ;;
esac esac
shift shift
done done
if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then
veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
printf "%s" "$val" > "$cgroup/$name" echo $val > "$cgroup/$name"
fi fi
if [ -f "$cgroup/tasks" ]; then if [ -f "$cgroup/tasks" ]; then
veinfo "$RC_SVCNAME: adding to $cgroup/tasks" veinfo "$RC_SVCNAME: adding to $cgroup/tasks"
printf "%d" 0 > "$cgroup/tasks" echo 0 > "$cgroup/tasks"
fi fi
return 0 return 0
@@ -81,14 +77,14 @@ cgroup_add_service()
# cgroups. But may lead to a problems where that inheriting # cgroups. But may lead to a problems where that inheriting
# is needed. # is needed.
for d in /sys/fs/cgroup/* ; do for d in /sys/fs/cgroup/* ; do
[ -f "${d}"/tasks ] && printf "%d" 0 > "${d}"/tasks [ -f "${d}"/tasks ] && echo 0 > "${d}"/tasks
done done
openrc_cgroup=/sys/fs/cgroup/openrc openrc_cgroup=/sys/fs/cgroup/openrc
if [ -d "$openrc_cgroup" ]; then if [ -d "$openrc_cgroup" ]; then
cgroup="$openrc_cgroup/$RC_SVCNAME" cgroup="$openrc_cgroup/$RC_SVCNAME"
mkdir -p "$cgroup" mkdir -p "$cgroup"
[ -f "$cgroup/tasks" ] && printf "%d" 0 > "$cgroup/tasks" [ -f "$cgroup/tasks" ] && echo 0 > "$cgroup/tasks"
fi fi
} }
@@ -109,21 +105,12 @@ cgroup_set_limits()
local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}"
[ -n "$devices" ] && cgroup_set_values devices "$devices" [ -n "$devices" ] && cgroup_set_values devices "$devices"
local hugetlb="${rc_cgroup_hugetlb:-$RC_CGROUP_HUGETLB}"
[ -n "$hugetlb" ] && cgroup_set_values hugetlb "$hugetlb"
local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}"
[ -n "$memory" ] && cgroup_set_values memory "$memory" [ -n "$memory" ] && cgroup_set_values memory "$memory"
local net_cls="${rc_cgroup_net_cls:-$RC_CGROUP_NET_CLS}"
[ -n "$net_cls" ] && cgroup_set_values net_cls "$net_cls"
local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}"
[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" [ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio"
local pids="${rc_cgroup_pids:-$RC_CGROUP_PIDS}"
[ -n "$pids" ] && cgroup_set_values pids "$pids"
return 0 return 0
} }

View File

@@ -85,7 +85,7 @@ get_bootparam()
return 1 return 1
} }
# Called from openrc-run.sh or gendepends.sh # Called from runscript.sh or gendepends.sh
_depend() { _depend() {
depend depend
local _rc_svcname=$(shell_var "$RC_SVCNAME") _deptype= _depends= local _rc_svcname=$(shell_var "$RC_SVCNAME") _deptype= _depends=

View File

@@ -1,5 +1,5 @@
#!@SHELL@ #!@SHELL@
# Shell wrapper for openrc-run # Shell wrapper for runscript
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name> # Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license. # Released under the 2-clause BSD license.
@@ -34,10 +34,7 @@ sourcex()
sourcex "@LIBEXECDIR@/sh/functions.sh" sourcex "@LIBEXECDIR@/sh/functions.sh"
sourcex "@LIBEXECDIR@/sh/rc-functions.sh" sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
case $RC_SYS in [ "$RC_SYS" != "PREFIX" ] && sourcex -e "@LIBEXECDIR@/sh/rc-cgroup.sh"
PREFIX|SYSTEMD-NSPAWN) ;;
*) sourcex -e "@LIBEXECDIR@/sh/rc-cgroup.sh";;
esac
# Support LiveCD foo # Support LiveCD foo
if sourcex -e "/sbin/livecd-functions.sh"; then if sourcex -e "/sbin/livecd-functions.sh"; then
@@ -126,42 +123,65 @@ _status()
} }
# Template start / stop / status functions # Template start / stop / status functions
# These functions select the appropriate function to call from the
# supervisor modules
start() start()
{ {
local func=ssd_start [ -n "$command" ] || return 0
case "$supervisor" in local _background=
s6) func=s6_start ;; ebegin "Starting ${name:-$RC_SVCNAME}"
?*) if yesno "${command_background}"; then
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" if [ -z "${pidfile}" ]; then
;; eend 1 "command_background option used but no pidfile specified"
esac return 1
$func fi
_background="--background --make-pidfile"
fi
if yesno "$start_inactive"; then
local _inactive=false
service_inactive && _inactive=true
mark_service_inactive
fi
eval start-stop-daemon --start \
--exec $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
$_background $start_stop_daemon_args \
-- $command_args
if eend $? "Failed to start $RC_SVCNAME"; then
service_set_value "command" "${command}"
[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
[ -n "${procname}" ] && service_set_value "procname" "${procname}"
return 0
fi
if yesno "$start_inactive"; then
if ! $_inactive; then
mark_service_stopped
fi
fi
return 1
} }
stop() stop()
{ {
local func=ssd_stop local startcommand="$(service_get_value "command")"
case "$supervisor" in local startpidfile="$(service_get_value "pidfile")"
s6) func=s6_stop ;; local startprocname="$(service_get_value "procname")"
?*) command="${startcommand:-$command}"
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" pidfile="${startpidfile:-$pidfile}"
;; procname="${startprocname:-$procname}"
esac [ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
$func ebegin "Stopping ${name:-$RC_SVCNAME}"
start-stop-daemon --stop \
${retry:+--retry} $retry \
${command:+--exec} $command \
${procname:+--name} $procname \
${pidfile:+--pidfile} $pidfile \
${stopsig:+--signal} $stopsig
eend $? "Failed to stop $RC_SVCNAME"
} }
status() status()
{ {
local func=ssd_status _status
case "$supervisor" in
s6) func=s6_status ;;
?*)
ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
;;
esac
$func
} }
yesno $RC_DEBUG && set -x yesno $RC_DEBUG && set -x
@@ -185,9 +205,8 @@ unset _conf_d
# Load any system overrides # Load any system overrides
sourcex -e "@SYSCONFDIR@/rc.conf" sourcex -e "@SYSCONFDIR@/rc.conf"
# load service supervisor functions # Apply any ulimit defined
sourcex "@LIBEXECDIR@/sh/s6.sh" [ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
sourcex "@LIBEXECDIR@/sh/start-stop-daemon.sh"
# Set verbose mode # Set verbose mode
if yesno "${rc_verbose:-$RC_VERBOSE}"; then if yesno "${rc_verbose:-$RC_VERBOSE}"; then
@@ -195,48 +214,33 @@ if yesno "${rc_verbose:-$RC_VERBOSE}"; then
export EINFO_VERBOSE export EINFO_VERBOSE
fi fi
for _cmd; do # Apply cgroups settings if defined
if [ "$_cmd" != status -a "$_cmd" != describe ]; then if [ "$1" = "start" ] ; then
# Apply any ulimit defined if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ]; then
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && \ cgroup_add_service /sys/fs/cgroup/openrc
ulimit ${rc_ulimit:-$RC_ULIMIT} cgroup_add_service /sys/fs/cgroup/systemd/system
# Apply cgroups settings if defined
if [ "$(command -v cgroup_add_service)" = \
"cgroup_add_service" ]
then
if [ -d /sys/fs/cgroup -a ! -w /sys/fs/cgroup ]; then
eerror "No permission to apply cgroup settings"
break
fi
cgroup_add_service /sys/fs/cgroup/openrc
cgroup_add_service /sys/fs/cgroup/systemd/system
fi
[ "$(command -v cgroup_set_limits)" = \
"cgroup_set_limits" ] && \
cgroup_set_limits
break
fi fi
done [ "$(command -v cgroup_set_limits)" = "cgroup_set_limits" ] && \
cgroup_set_limits
fi
# Load our script # Load our script
sourcex "$RC_SERVICE" sourcex "$RC_SERVICE"
eval "printf '%s\n' $required_dirs" | while read _d; do for _d in $required_dirs; do
if [ -n "$_d" ] && [ ! -d "$_d" ]; then if [ ! -d $_d ]; then
eerror "$RC_SVCNAME: \`$_d' is not a directory" eerror "$RC_SVCNAME: \`$_d' is not a directory"
exit 1 exit 1
fi fi
done done
[ $? -ne 0 ] && exit 1
unset _d unset _d
eval "printf '%s\n' $required_files" | while read _f; do for _f in $required_files; do
if [ -n "$_f" ] && [ ! -r "$_f" ]; then if [ ! -r $_f ]; then
eerror "$RC_SVCNAME: \`$_f' is not readable" eerror "$RC_SVCNAME: \`$_f' is not readable"
exit 1 exit 1
fi fi
done done
[ $? -ne 0 ] && exit 1
unset _f unset _f
if [ -n "$opts" ]; then if [ -n "$opts" ]; then

View File

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

View File

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

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

@@ -53,18 +53,10 @@ relabel() {
done done
} }
splitpath() {
local path=$1
while [ -n "$path" ]; do
echo $path
path=${path%/*}
done
}
_restorecon() { _restorecon() {
local path=$1 local path=$1
if [ -x /sbin/restorecon ]; then if [ -x /sbin/restorecon ]; then
dryrun_or_real restorecon -F $(splitpath "$path") dryrun_or_real restorecon -F "$path"
fi fi
} }
@@ -88,17 +80,6 @@ _c() {
fi fi
} }
_C() {
# recursively copy a file or directory
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
if [ ! -e "$path" ]; then
dryrun_or_real cp -r "$arg" "$path"
_restorecon "$path"
[ $uid != '-' ] && dryrun_or_real chown "$uid" "$path"
[ $gid != '-' ] && dryrun_or_real chgrp "$gid" "$path"
[ $mode != '-' ] && dryrun_or_real chmod "$mode" "$path"
fi
}
_f() { _f() {
# Create a file if it doesn't exist yet # Create a file if it doesn't exist yet
@@ -130,7 +111,6 @@ _d() {
if [ ! -d "$path" ]; then if [ ! -d "$path" ]; then
dryrun_or_real mkdir -p "$path" 2>/dev/null dryrun_or_real mkdir -p "$path" 2>/dev/null
_restorecon "$path"
dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path" dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path"
fi fi
} }
@@ -146,18 +126,10 @@ _D() {
if [ $CREATE -gt 0 ]; then if [ $CREATE -gt 0 ]; then
dryrun_or_real mkdir -p "$path" 2>/dev/null dryrun_or_real mkdir -p "$path" 2>/dev/null
_restorecon "$path"
dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path" dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path"
fi fi
} }
_v() {
# Create a subvolume if the path does not exist yet and the file system
# supports this (btrfs). Otherwise create a normal directory.
# TODO: Implement btrfs subvol creation.
_d "$@"
}
_L() { _L() {
# Create a symlink if it doesn't exist yet # Create a symlink if it doesn't exist yet
local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
@@ -262,7 +234,7 @@ PREFIX=
FILE= FILE=
fragments= fragments=
# XXX: The harcoding of /usr/lib/ is an explicit choice by upstream # XXX: The harcoding of /usr/lib/ is an explicit choice by upstream
tmpfiles_dirs='/usr/lib/tmpfiles.d/ /run/tmpfiles.d/ /etc/tmpfiles.d/' tmpfiles_dirs='/usr/lib/tmpfiles.d/ /etc/tmpfiles.d/ /run/tmpfiles.d/'
tmpfiles_basenames='' tmpfiles_basenames=''
tmpfiles_d='' tmpfiles_d=''
# Build a list of sorted unique basenames # Build a list of sorted unique basenames
@@ -332,7 +304,6 @@ for FILE in $tmpfiles_d ; do
# But IS allowed when globs are expanded for the x/r/R/z/Z types. # But IS allowed when globs are expanded for the x/r/R/z/Z types.
while read cmd path mode uid gid age arg; do while read cmd path mode uid gid age arg; do
LINENUM=$(( LINENUM+1 )) LINENUM=$(( LINENUM+1 ))
FORCE=0
# Unless we have both command and path, skip this line. # Unless we have both command and path, skip this line.
if [ -z "$cmd" -o -z "$path" ]; then if [ -z "$cmd" -o -z "$path" ]; then
@@ -340,20 +311,13 @@ for FILE in $tmpfiles_d ; do
fi fi
case $cmd in case $cmd in
\#*) continue ;; *!) [ "$BOOT" -eq "1" ] || continue; cmd=${cmd%!} ;;
esac esac
while [ ${#cmd} -gt 1 ]; do
case $cmd in
*!) cmd=${cmd%!}; [ "$BOOT" -eq "1" ] || continue 2 ;;
*+) cmd=${cmd%+}; FORCE=1; ;;
*) warninvalid ; continue 2 ;;
esac
done
# whine about invalid entries # whine about invalid entries
case $cmd in case $cmd in
f|F|w|d|D|v|p|L|c|C|b|x|X|r|R|z|Z) ;; f|F|w|d|D|p|L|c|b|x|X|r|R|z|Z) ;;
\#*) continue ;;
*) warninvalid ; continue ;; *) warninvalid ; continue ;;
esac esac
@@ -361,8 +325,8 @@ for FILE in $tmpfiles_d ; do
if [ "$mode" = '-' -o "$mode" = '' ]; then if [ "$mode" = '-' -o "$mode" = '' ]; then
case "$cmd" in case "$cmd" in
p|f|F) mode=0644 ;; p|f|F) mode=0644 ;;
d|D|v) mode=0755 ;; d|D) mode=0755 ;;
C|z|Z|x|r|R|L) ;; z|Z|x|r|R|L) ;;
esac esac
fi fi
@@ -374,13 +338,6 @@ for FILE in $tmpfiles_d ; do
[ -n "$EXCLUDE" ] && checkprefix $path $EXCLUDE && continue [ -n "$EXCLUDE" ] && checkprefix $path $EXCLUDE && continue
[ -n "$PREFIX" ] && ! checkprefix $path $PREFIX && continue [ -n "$PREFIX" ] && ! checkprefix $path $PREFIX && continue
if [ $FORCE -gt 0 ]; then
case $cmd in
p|L|c|b) [ -f "$path" ] && dryrun_or_real rm -f "$path"
esac
fi
[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@" [ "$VERBOSE" -eq "1" ] && echo _$cmd "$@"
_$cmd "$@" _$cmd "$@"
rc=$? rc=$?

View File

@@ -48,6 +48,25 @@
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
/* Some libc implemntations don't have these */
#ifndef TAILQ_CONCAT
#define TAILQ_CONCAT(head1, head2, field) do { \
if (!TAILQ_EMPTY(head2)) { \
*(head1)->tqh_last = (head2)->tqh_first; \
(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
(head1)->tqh_last = (head2)->tqh_last; \
TAILQ_INIT((head2)); \
} \
} while (0)
#endif
#ifndef TAILQ_FOREACH_SAFE
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = TAILQ_FIRST((head)); \
(var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
(var) = (tvar))
#endif
#ifdef __GLIBC__ #ifdef __GLIBC__
# if ! defined (__UCLIBC__) && ! defined (__dietlibc__) # if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
# define strlcpy(dst, src, size) snprintf(dst, size, "%s", src) # define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)

View File

@@ -1,846 +0,0 @@
/* $NetBSD: queue.h,v 1.67 2014/05/17 21:22:56 rmind Exp $ */
/*
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)queue.h 8.5 (Berkeley) 8/20/94
*/
#ifndef _SYS_QUEUE_H_
#define _SYS_QUEUE_H_
/*
* This file defines five types of data structures: singly-linked lists,
* lists, simple queues, tail queues, and circular queues.
*
* A singly-linked list is headed by a single forward pointer. The
* elements are singly linked for minimum space and pointer manipulation
* overhead at the expense of O(n) removal for arbitrary elements. New
* elements can be added to the list after an existing element or at the
* head of the list. Elements being removed from the head of the list
* should use the explicit macro for this purpose for optimum
* efficiency. A singly-linked list may only be traversed in the forward
* direction. Singly-linked lists are ideal for applications with large
* datasets and few or no removals or for implementing a LIFO queue.
*
* A list is headed by a single forward pointer (or an array of forward
* pointers for a hash table header). The elements are doubly linked
* so that an arbitrary element can be removed without a need to
* traverse the list. New elements can be added to the list before
* or after an existing element or at the head of the list. A list
* may only be traversed in the forward direction.
*
* A simple queue is headed by a pair of pointers, one the head of the
* list and the other to the tail of the list. The elements are singly
* linked to save space, so elements can only be removed from the
* head of the list. New elements can be added to the list after
* an existing element, at the head of the list, or at the end of the
* list. A simple queue may only be traversed in the forward direction.
*
* A tail queue is headed by a pair of pointers, one to the head of the
* list and the other to the tail of the list. The elements are doubly
* linked so that an arbitrary element can be removed without a need to
* traverse the list. New elements can be added to the list before or
* after an existing element, at the head of the list, or at the end of
* the list. A tail queue may be traversed in either direction.
*
* A circle queue is headed by a pair of pointers, one to the head of the
* list and the other to the tail of the list. The elements are doubly
* linked so that an arbitrary element can be removed without a need to
* traverse the list. New elements can be added to the list before or after
* an existing element, at the head of the list, or at the end of the list.
* A circle queue may be traversed in either direction, but has a more
* complex end of list detection.
*
* For details on the use of these macros, see the queue(3) manual page.
*/
/*
* Include the definition of NULL only on NetBSD because sys/null.h
* is not available elsewhere. This conditional makes the header
* portable and it can simply be dropped verbatim into any system.
* The caveat is that on other systems some other header
* must provide NULL before the macros can be used.
*/
#ifdef __NetBSD__
#include <sys/null.h>
#endif
#if defined(QUEUEDEBUG)
# if defined(_KERNEL)
# define QUEUEDEBUG_ABORT(...) panic(__VA_ARGS__)
# else
# include <err.h>
# define QUEUEDEBUG_ABORT(...) err(1, __VA_ARGS__)
# endif
#endif
/*
* Singly-linked List definitions.
*/
#define SLIST_HEAD(name, type) \
struct name { \
struct type *slh_first; /* first element */ \
}
#define SLIST_HEAD_INITIALIZER(head) \
{ NULL }
#define SLIST_ENTRY(type) \
struct { \
struct type *sle_next; /* next element */ \
}
/*
* Singly-linked List access methods.
*/
#define SLIST_FIRST(head) ((head)->slh_first)
#define SLIST_END(head) NULL
#define SLIST_EMPTY(head) ((head)->slh_first == NULL)
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
#define SLIST_FOREACH(var, head, field) \
for((var) = (head)->slh_first; \
(var) != SLIST_END(head); \
(var) = (var)->field.sle_next)
#define SLIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = SLIST_FIRST((head)); \
(var) != SLIST_END(head) && \
((tvar) = SLIST_NEXT((var), field), 1); \
(var) = (tvar))
/*
* Singly-linked List functions.
*/
#define SLIST_INIT(head) do { \
(head)->slh_first = SLIST_END(head); \
} while (/*CONSTCOND*/0)
#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
(elm)->field.sle_next = (slistelm)->field.sle_next; \
(slistelm)->field.sle_next = (elm); \
} while (/*CONSTCOND*/0)
#define SLIST_INSERT_HEAD(head, elm, field) do { \
(elm)->field.sle_next = (head)->slh_first; \
(head)->slh_first = (elm); \
} while (/*CONSTCOND*/0)
#define SLIST_REMOVE_AFTER(slistelm, field) do { \
(slistelm)->field.sle_next = \
SLIST_NEXT(SLIST_NEXT((slistelm), field), field); \
} while (/*CONSTCOND*/0)
#define SLIST_REMOVE_HEAD(head, field) do { \
(head)->slh_first = (head)->slh_first->field.sle_next; \
} while (/*CONSTCOND*/0)
#define SLIST_REMOVE(head, elm, type, field) do { \
if ((head)->slh_first == (elm)) { \
SLIST_REMOVE_HEAD((head), field); \
} \
else { \
struct type *curelm = (head)->slh_first; \
while(curelm->field.sle_next != (elm)) \
curelm = curelm->field.sle_next; \
curelm->field.sle_next = \
curelm->field.sle_next->field.sle_next; \
} \
} while (/*CONSTCOND*/0)
/*
* List definitions.
*/
#define LIST_HEAD(name, type) \
struct name { \
struct type *lh_first; /* first element */ \
}
#define LIST_HEAD_INITIALIZER(head) \
{ NULL }
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
/*
* List access methods.
*/
#define LIST_FIRST(head) ((head)->lh_first)
#define LIST_END(head) NULL
#define LIST_EMPTY(head) ((head)->lh_first == LIST_END(head))
#define LIST_NEXT(elm, field) ((elm)->field.le_next)
#define LIST_FOREACH(var, head, field) \
for ((var) = ((head)->lh_first); \
(var) != LIST_END(head); \
(var) = ((var)->field.le_next))
#define LIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = LIST_FIRST((head)); \
(var) != LIST_END(head) && \
((tvar) = LIST_NEXT((var), field), 1); \
(var) = (tvar))
#define LIST_MOVE(head1, head2) do { \
LIST_INIT((head2)); \
if (!LIST_EMPTY((head1))) { \
(head2)->lh_first = (head1)->lh_first; \
LIST_INIT((head1)); \
} \
} while (/*CONSTCOND*/0)
/*
* List functions.
*/
#if defined(QUEUEDEBUG)
#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) \
if ((head)->lh_first && \
(head)->lh_first->field.le_prev != &(head)->lh_first) \
QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head), \
__FILE__, __LINE__);
#define QUEUEDEBUG_LIST_OP(elm, field) \
if ((elm)->field.le_next && \
(elm)->field.le_next->field.le_prev != \
&(elm)->field.le_next) \
QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm), \
__FILE__, __LINE__); \
if (*(elm)->field.le_prev != (elm)) \
QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm), \
__FILE__, __LINE__);
#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) \
(elm)->field.le_next = (void *)1L; \
(elm)->field.le_prev = (void *)1L;
#else
#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field)
#define QUEUEDEBUG_LIST_OP(elm, field)
#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field)
#endif
#define LIST_INIT(head) do { \
(head)->lh_first = LIST_END(head); \
} while (/*CONSTCOND*/0)
#define LIST_INSERT_AFTER(listelm, elm, field) do { \
QUEUEDEBUG_LIST_OP((listelm), field) \
if (((elm)->field.le_next = (listelm)->field.le_next) != \
LIST_END(head)) \
(listelm)->field.le_next->field.le_prev = \
&(elm)->field.le_next; \
(listelm)->field.le_next = (elm); \
(elm)->field.le_prev = &(listelm)->field.le_next; \
} while (/*CONSTCOND*/0)
#define LIST_INSERT_BEFORE(listelm, elm, field) do { \
QUEUEDEBUG_LIST_OP((listelm), field) \
(elm)->field.le_prev = (listelm)->field.le_prev; \
(elm)->field.le_next = (listelm); \
*(listelm)->field.le_prev = (elm); \
(listelm)->field.le_prev = &(elm)->field.le_next; \
} while (/*CONSTCOND*/0)
#define LIST_INSERT_HEAD(head, elm, field) do { \
QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field) \
if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head))\
(head)->lh_first->field.le_prev = &(elm)->field.le_next;\
(head)->lh_first = (elm); \
(elm)->field.le_prev = &(head)->lh_first; \
} while (/*CONSTCOND*/0)
#define LIST_REMOVE(elm, field) do { \
QUEUEDEBUG_LIST_OP((elm), field) \
if ((elm)->field.le_next != NULL) \
(elm)->field.le_next->field.le_prev = \
(elm)->field.le_prev; \
*(elm)->field.le_prev = (elm)->field.le_next; \
QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \
} while (/*CONSTCOND*/0)
#define LIST_REPLACE(elm, elm2, field) do { \
if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \
(elm2)->field.le_next->field.le_prev = \
&(elm2)->field.le_next; \
(elm2)->field.le_prev = (elm)->field.le_prev; \
*(elm2)->field.le_prev = (elm2); \
QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \
} while (/*CONSTCOND*/0)
/*
* Simple queue definitions.
*/
#define SIMPLEQ_HEAD(name, type) \
struct name { \
struct type *sqh_first; /* first element */ \
struct type **sqh_last; /* addr of last next element */ \
}
#define SIMPLEQ_HEAD_INITIALIZER(head) \
{ NULL, &(head).sqh_first }
#define SIMPLEQ_ENTRY(type) \
struct { \
struct type *sqe_next; /* next element */ \
}
/*
* Simple queue access methods.
*/
#define SIMPLEQ_FIRST(head) ((head)->sqh_first)
#define SIMPLEQ_END(head) NULL
#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == SIMPLEQ_END(head))
#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
#define SIMPLEQ_FOREACH(var, head, field) \
for ((var) = ((head)->sqh_first); \
(var) != SIMPLEQ_END(head); \
(var) = ((var)->field.sqe_next))
#define SIMPLEQ_FOREACH_SAFE(var, head, field, next) \
for ((var) = ((head)->sqh_first); \
(var) != SIMPLEQ_END(head) && \
((next = ((var)->field.sqe_next)), 1); \
(var) = (next))
/*
* Simple queue functions.
*/
#define SIMPLEQ_INIT(head) do { \
(head)->sqh_first = NULL; \
(head)->sqh_last = &(head)->sqh_first; \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
(head)->sqh_last = &(elm)->field.sqe_next; \
(head)->sqh_first = (elm); \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
(elm)->field.sqe_next = NULL; \
*(head)->sqh_last = (elm); \
(head)->sqh_last = &(elm)->field.sqe_next; \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
(head)->sqh_last = &(elm)->field.sqe_next; \
(listelm)->field.sqe_next = (elm); \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_REMOVE_HEAD(head, field) do { \
if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
(head)->sqh_last = &(head)->sqh_first; \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \
if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \
== NULL) \
(head)->sqh_last = &(elm)->field.sqe_next; \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_REMOVE(head, elm, type, field) do { \
if ((head)->sqh_first == (elm)) { \
SIMPLEQ_REMOVE_HEAD((head), field); \
} else { \
struct type *curelm = (head)->sqh_first; \
while (curelm->field.sqe_next != (elm)) \
curelm = curelm->field.sqe_next; \
if ((curelm->field.sqe_next = \
curelm->field.sqe_next->field.sqe_next) == NULL) \
(head)->sqh_last = &(curelm)->field.sqe_next; \
} \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_CONCAT(head1, head2) do { \
if (!SIMPLEQ_EMPTY((head2))) { \
*(head1)->sqh_last = (head2)->sqh_first; \
(head1)->sqh_last = (head2)->sqh_last; \
SIMPLEQ_INIT((head2)); \
} \
} while (/*CONSTCOND*/0)
#define SIMPLEQ_LAST(head, type, field) \
(SIMPLEQ_EMPTY((head)) ? \
NULL : \
((struct type *)(void *) \
((char *)((head)->sqh_last) - offsetof(struct type, field))))
/*
* Tail queue definitions.
*/
#define _TAILQ_HEAD(name, type, qual) \
struct name { \
qual type *tqh_first; /* first element */ \
qual type *qual *tqh_last; /* addr of last next element */ \
}
#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,)
#define TAILQ_HEAD_INITIALIZER(head) \
{ TAILQ_END(head), &(head).tqh_first }
#define _TAILQ_ENTRY(type, qual) \
struct { \
qual type *tqe_next; /* next element */ \
qual type *qual *tqe_prev; /* address of previous next element */\
}
#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,)
/*
* Tail queue access methods.
*/
#define TAILQ_FIRST(head) ((head)->tqh_first)
#define TAILQ_END(head) (NULL)
#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
#define TAILQ_LAST(head, headname) \
(*(((struct headname *)((head)->tqh_last))->tqh_last))
#define TAILQ_PREV(elm, headname, field) \
(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
#define TAILQ_EMPTY(head) (TAILQ_FIRST(head) == TAILQ_END(head))
#define TAILQ_FOREACH(var, head, field) \
for ((var) = ((head)->tqh_first); \
(var) != TAILQ_END(head); \
(var) = ((var)->field.tqe_next))
#define TAILQ_FOREACH_SAFE(var, head, field, next) \
for ((var) = ((head)->tqh_first); \
(var) != TAILQ_END(head) && \
((next) = TAILQ_NEXT(var, field), 1); (var) = (next))
#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));\
(var) != TAILQ_END(head); \
(var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \
for ((var) = TAILQ_LAST((head), headname); \
(var) != TAILQ_END(head) && \
((prev) = TAILQ_PREV((var), headname, field), 1); (var) = (prev))
/*
* Tail queue functions.
*/
#if defined(QUEUEDEBUG)
#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) \
if ((head)->tqh_first && \
(head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \
QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head), \
__FILE__, __LINE__);
#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) \
if (*(head)->tqh_last != NULL) \
QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head), \
__FILE__, __LINE__);
#define QUEUEDEBUG_TAILQ_OP(elm, field) \
if ((elm)->field.tqe_next && \
(elm)->field.tqe_next->field.tqe_prev != \
&(elm)->field.tqe_next) \
QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm), \
__FILE__, __LINE__); \
if (*(elm)->field.tqe_prev != (elm)) \
QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm), \
__FILE__, __LINE__);
#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) \
if ((elm)->field.tqe_next == NULL && \
(head)->tqh_last != &(elm)->field.tqe_next) \
QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d",\
(head), (elm), __FILE__, __LINE__);
#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) \
(elm)->field.tqe_next = (void *)1L; \
(elm)->field.tqe_prev = (void *)1L;
#else
#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)
#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)
#define QUEUEDEBUG_TAILQ_OP(elm, field)
#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field)
#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)
#endif
#define TAILQ_INIT(head) do { \
(head)->tqh_first = TAILQ_END(head); \
(head)->tqh_last = &(head)->tqh_first; \
} while (/*CONSTCOND*/0)
#define TAILQ_INSERT_HEAD(head, elm, field) do { \
QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field) \
if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head))\
(head)->tqh_first->field.tqe_prev = \
&(elm)->field.tqe_next; \
else \
(head)->tqh_last = &(elm)->field.tqe_next; \
(head)->tqh_first = (elm); \
(elm)->field.tqe_prev = &(head)->tqh_first; \
} while (/*CONSTCOND*/0)
#define TAILQ_INSERT_TAIL(head, elm, field) do { \
QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field) \
(elm)->field.tqe_next = TAILQ_END(head); \
(elm)->field.tqe_prev = (head)->tqh_last; \
*(head)->tqh_last = (elm); \
(head)->tqh_last = &(elm)->field.tqe_next; \
} while (/*CONSTCOND*/0)
#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
QUEUEDEBUG_TAILQ_OP((listelm), field) \
if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != \
TAILQ_END(head)) \
(elm)->field.tqe_next->field.tqe_prev = \
&(elm)->field.tqe_next; \
else \
(head)->tqh_last = &(elm)->field.tqe_next; \
(listelm)->field.tqe_next = (elm); \
(elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
} while (/*CONSTCOND*/0)
#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
QUEUEDEBUG_TAILQ_OP((listelm), field) \
(elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
(elm)->field.tqe_next = (listelm); \
*(listelm)->field.tqe_prev = (elm); \
(listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
} while (/*CONSTCOND*/0)
#define TAILQ_REMOVE(head, elm, field) do { \
QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field) \
QUEUEDEBUG_TAILQ_OP((elm), field) \
if (((elm)->field.tqe_next) != TAILQ_END(head)) \
(elm)->field.tqe_next->field.tqe_prev = \
(elm)->field.tqe_prev; \
else \
(head)->tqh_last = (elm)->field.tqe_prev; \
*(elm)->field.tqe_prev = (elm)->field.tqe_next; \
QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \
} while (/*CONSTCOND*/0)
#define TAILQ_REPLACE(head, elm, elm2, field) do { \
if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != \
TAILQ_END(head)) \
(elm2)->field.tqe_next->field.tqe_prev = \
&(elm2)->field.tqe_next; \
else \
(head)->tqh_last = &(elm2)->field.tqe_next; \
(elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
*(elm2)->field.tqe_prev = (elm2); \
QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \
} while (/*CONSTCOND*/0)
#define TAILQ_CONCAT(head1, head2, field) do { \
if (!TAILQ_EMPTY(head2)) { \
*(head1)->tqh_last = (head2)->tqh_first; \
(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
(head1)->tqh_last = (head2)->tqh_last; \
TAILQ_INIT((head2)); \
} \
} while (/*CONSTCOND*/0)
/*
* Singly-linked Tail queue declarations.
*/
#define STAILQ_HEAD(name, type) \
struct name { \
struct type *stqh_first; /* first element */ \
struct type **stqh_last; /* addr of last next element */ \
}
#define STAILQ_HEAD_INITIALIZER(head) \
{ NULL, &(head).stqh_first }
#define STAILQ_ENTRY(type) \
struct { \
struct type *stqe_next; /* next element */ \
}
/*
* Singly-linked Tail queue access methods.
*/
#define STAILQ_FIRST(head) ((head)->stqh_first)
#define STAILQ_END(head) NULL
#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
#define STAILQ_EMPTY(head) (STAILQ_FIRST(head) == STAILQ_END(head))
/*
* Singly-linked Tail queue functions.
*/
#define STAILQ_INIT(head) do { \
(head)->stqh_first = NULL; \
(head)->stqh_last = &(head)->stqh_first; \
} while (/*CONSTCOND*/0)
#define STAILQ_INSERT_HEAD(head, elm, field) do { \
if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \
(head)->stqh_last = &(elm)->field.stqe_next; \
(head)->stqh_first = (elm); \
} while (/*CONSTCOND*/0)
#define STAILQ_INSERT_TAIL(head, elm, field) do { \
(elm)->field.stqe_next = NULL; \
*(head)->stqh_last = (elm); \
(head)->stqh_last = &(elm)->field.stqe_next; \
} while (/*CONSTCOND*/0)
#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
(head)->stqh_last = &(elm)->field.stqe_next; \
(listelm)->field.stqe_next = (elm); \
} while (/*CONSTCOND*/0)
#define STAILQ_REMOVE_HEAD(head, field) do { \
if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
(head)->stqh_last = &(head)->stqh_first; \
} while (/*CONSTCOND*/0)
#define STAILQ_REMOVE(head, elm, type, field) do { \
if ((head)->stqh_first == (elm)) { \
STAILQ_REMOVE_HEAD((head), field); \
} else { \
struct type *curelm = (head)->stqh_first; \
while (curelm->field.stqe_next != (elm)) \
curelm = curelm->field.stqe_next; \
if ((curelm->field.stqe_next = \
curelm->field.stqe_next->field.stqe_next) == NULL) \
(head)->stqh_last = &(curelm)->field.stqe_next; \
} \
} while (/*CONSTCOND*/0)
#define STAILQ_FOREACH(var, head, field) \
for ((var) = ((head)->stqh_first); \
(var); \
(var) = ((var)->field.stqe_next))
#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = STAILQ_FIRST((head)); \
(var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
(var) = (tvar))
#define STAILQ_CONCAT(head1, head2) do { \
if (!STAILQ_EMPTY((head2))) { \
*(head1)->stqh_last = (head2)->stqh_first; \
(head1)->stqh_last = (head2)->stqh_last; \
STAILQ_INIT((head2)); \
} \
} while (/*CONSTCOND*/0)
#define STAILQ_LAST(head, type, field) \
(STAILQ_EMPTY((head)) ? \
NULL : \
((struct type *)(void *) \
((char *)((head)->stqh_last) - offsetof(struct type, field))))
#ifndef _KERNEL
/*
* Circular queue definitions. Do not use. We still keep the macros
* for compatibility but because of pointer aliasing issues their use
* is discouraged!
*/
/*
* __launder_type(): We use this ugly hack to work around the the compiler
* noticing that two types may not alias each other and elide tests in code.
* We hit this in the CIRCLEQ macros when comparing 'struct name *' and
* 'struct type *' (see CIRCLEQ_HEAD()). Modern compilers (such as GCC
* 4.8) declare these comparisons as always false, causing the code to
* not run as designed.
*
* This hack is only to be used for comparisons and thus can be fully const.
* Do not use for assignment.
*
* If we ever choose to change the ABI of the CIRCLEQ macros, we could fix
* this by changing the head/tail sentinal values, but see the note above
* this one.
*/
static __inline const void * __launder_type(const void *);
static __inline const void *
__launder_type(const void *__x)
{
__asm __volatile("" : "+r" (__x));
return __x;
}
#if defined(QUEUEDEBUG)
#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field) \
if ((head)->cqh_first != CIRCLEQ_ENDC(head) && \
(head)->cqh_first->field.cqe_prev != CIRCLEQ_ENDC(head)) \
QUEUEDEBUG_ABORT("CIRCLEQ head forw %p %s:%d", (head), \
__FILE__, __LINE__); \
if ((head)->cqh_last != CIRCLEQ_ENDC(head) && \
(head)->cqh_last->field.cqe_next != CIRCLEQ_ENDC(head)) \
QUEUEDEBUG_ABORT("CIRCLEQ head back %p %s:%d", (head), \
__FILE__, __LINE__);
#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field) \
if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) { \
if ((head)->cqh_last != (elm)) \
QUEUEDEBUG_ABORT("CIRCLEQ elm last %p %s:%d", \
(elm), __FILE__, __LINE__); \
} else { \
if ((elm)->field.cqe_next->field.cqe_prev != (elm)) \
QUEUEDEBUG_ABORT("CIRCLEQ elm forw %p %s:%d", \
(elm), __FILE__, __LINE__); \
} \
if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) { \
if ((head)->cqh_first != (elm)) \
QUEUEDEBUG_ABORT("CIRCLEQ elm first %p %s:%d", \
(elm), __FILE__, __LINE__); \
} else { \
if ((elm)->field.cqe_prev->field.cqe_next != (elm)) \
QUEUEDEBUG_ABORT("CIRCLEQ elm prev %p %s:%d", \
(elm), __FILE__, __LINE__); \
}
#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field) \
(elm)->field.cqe_next = (void *)1L; \
(elm)->field.cqe_prev = (void *)1L;
#else
#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field)
#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field)
#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field)
#endif
#define CIRCLEQ_HEAD(name, type) \
struct name { \
struct type *cqh_first; /* first element */ \
struct type *cqh_last; /* last element */ \
}
#define CIRCLEQ_HEAD_INITIALIZER(head) \
{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
#define CIRCLEQ_ENTRY(type) \
struct { \
struct type *cqe_next; /* next element */ \
struct type *cqe_prev; /* previous element */ \
}
/*
* Circular queue functions.
*/
#define CIRCLEQ_INIT(head) do { \
(head)->cqh_first = CIRCLEQ_END(head); \
(head)->cqh_last = CIRCLEQ_END(head); \
} while (/*CONSTCOND*/0)
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \
QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field) \
(elm)->field.cqe_next = (listelm)->field.cqe_next; \
(elm)->field.cqe_prev = (listelm); \
if ((listelm)->field.cqe_next == CIRCLEQ_ENDC(head)) \
(head)->cqh_last = (elm); \
else \
(listelm)->field.cqe_next->field.cqe_prev = (elm); \
(listelm)->field.cqe_next = (elm); \
} while (/*CONSTCOND*/0)
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \
QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field) \
(elm)->field.cqe_next = (listelm); \
(elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
if ((listelm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \
(head)->cqh_first = (elm); \
else \
(listelm)->field.cqe_prev->field.cqe_next = (elm); \
(listelm)->field.cqe_prev = (elm); \
} while (/*CONSTCOND*/0)
#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \
QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \
(elm)->field.cqe_next = (head)->cqh_first; \
(elm)->field.cqe_prev = CIRCLEQ_END(head); \
if ((head)->cqh_last == CIRCLEQ_ENDC(head)) \
(head)->cqh_last = (elm); \
else \
(head)->cqh_first->field.cqe_prev = (elm); \
(head)->cqh_first = (elm); \
} while (/*CONSTCOND*/0)
#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \
QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \
(elm)->field.cqe_next = CIRCLEQ_END(head); \
(elm)->field.cqe_prev = (head)->cqh_last; \
if ((head)->cqh_first == CIRCLEQ_ENDC(head)) \
(head)->cqh_first = (elm); \
else \
(head)->cqh_last->field.cqe_next = (elm); \
(head)->cqh_last = (elm); \
} while (/*CONSTCOND*/0)
#define CIRCLEQ_REMOVE(head, elm, field) do { \
QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \
QUEUEDEBUG_CIRCLEQ_ELM((head), (elm), field) \
if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) \
(head)->cqh_last = (elm)->field.cqe_prev; \
else \
(elm)->field.cqe_next->field.cqe_prev = \
(elm)->field.cqe_prev; \
if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \
(head)->cqh_first = (elm)->field.cqe_next; \
else \
(elm)->field.cqe_prev->field.cqe_next = \
(elm)->field.cqe_next; \
QUEUEDEBUG_CIRCLEQ_POSTREMOVE((elm), field) \
} while (/*CONSTCOND*/0)
#define CIRCLEQ_FOREACH(var, head, field) \
for ((var) = ((head)->cqh_first); \
(var) != CIRCLEQ_ENDC(head); \
(var) = ((var)->field.cqe_next))
#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
for ((var) = ((head)->cqh_last); \
(var) != CIRCLEQ_ENDC(head); \
(var) = ((var)->field.cqe_prev))
/*
* Circular queue access methods.
*/
#define CIRCLEQ_FIRST(head) ((head)->cqh_first)
#define CIRCLEQ_LAST(head) ((head)->cqh_last)
/* For comparisons */
#define CIRCLEQ_ENDC(head) (__launder_type(head))
/* For assignments */
#define CIRCLEQ_END(head) ((void *)(head))
#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
#define CIRCLEQ_EMPTY(head) \
(CIRCLEQ_FIRST(head) == CIRCLEQ_ENDC(head))
#define CIRCLEQ_LOOP_NEXT(head, elm, field) \
(((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) \
? ((head)->cqh_first) \
: (elm->field.cqe_next))
#define CIRCLEQ_LOOP_PREV(head, elm, field) \
(((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \
? ((head)->cqh_last) \
: (elm->field.cqe_prev))
#endif /* !_KERNEL */
#endif /* !_SYS_QUEUE_H_ */

View File

@@ -4,7 +4,7 @@ SRCS= libeinfo.c
INCS= einfo.h INCS= einfo.h
VERSION_MAP= einfo.map VERSION_MAP= einfo.map
LOCAL_CPPFLAGS+= -I../includes CPPFLAGS+= -I../includes
MK= ../../mk MK= ../../mk
include ${MK}/lib.mk include ${MK}/lib.mk

View File

@@ -48,10 +48,7 @@
# endif # endif
#endif #endif
/* __BEGIN_DECLS */ __BEGIN_DECLS
#ifdef __cplusplus
extern "C" {
#endif
/*! @brief Color types to use */ /*! @brief Color types to use */
typedef enum typedef enum
@@ -143,9 +140,5 @@ void eoutdentv(void);
/*! @brief Prefix each einfo line with something */ /*! @brief Prefix each einfo line with something */
void eprefix(const char * EINFO_RESTRICT); void eprefix(const char * EINFO_RESTRICT);
/* __END_DECLS */ __END_DECLS
#ifdef __cplusplus
}
#endif
#endif #endif

View File

@@ -7,7 +7,7 @@ VERSION_MAP= rc.map
LDADD+= ${LIBKVM} LDADD+= ${LIBKVM}
LOCAL_CPPFLAGS+= -I../includes CPPFLAGS+= -I../includes
MK= ../../mk MK= ../../mk
include ${MK}/lib.mk include ${MK}/lib.mk

View File

@@ -28,10 +28,9 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "queue.h"
#include "librc.h" #include "librc.h"
#if defined(__linux__) || (defined (__FreeBSD_kernel__) && defined(__GLIBC__)) #if defined(__linux__) || defined (__GLIBC__)
static bool static bool
pid_is_exec(pid_t pid, const char *exec) pid_is_exec(pid_t pid, const char *exec)
{ {
@@ -99,7 +98,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
pid_t p; pid_t p;
char buffer[PATH_MAX]; char buffer[PATH_MAX];
struct stat sb; struct stat sb;
pid_t openrc_pid = 0; pid_t runscript_pid = 0;
char *pp; char *pp;
RC_PIDLIST *pids = NULL; RC_PIDLIST *pids = NULL;
RC_PID *pi; RC_PID *pi;
@@ -108,7 +107,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
return NULL; return NULL;
/* /*
We never match RC_OPENRC_PID if present so we avoid the below We never match RC_RUNSCRIPT_PID if present so we avoid the below
scenario scenario
/etc/init.d/ntpd stop does /etc/init.d/ntpd stop does
@@ -118,9 +117,9 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
nasty nasty
*/ */
if ((pp = getenv("RC_OPENRC_PID"))) { if ((pp = getenv("RC_RUNSCRIPT_PID"))) {
if (sscanf(pp, "%d", &openrc_pid) != 1) if (sscanf(pp, "%d", &runscript_pid) != 1)
openrc_pid = 0; runscript_pid = 0;
} }
/* /*
@@ -146,7 +145,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
while ((entry = readdir(procdir)) != NULL) { while ((entry = readdir(procdir)) != NULL) {
if (sscanf(entry->d_name, "%d", &p) != 1) if (sscanf(entry->d_name, "%d", &p) != 1)
continue; continue;
if (openrc_pid != 0 && openrc_pid == p) if (runscript_pid != 0 && runscript_pid == p)
continue; continue;
if (pid != 0 && pid != p) if (pid != 0 && pid != p)
continue; continue;
@@ -510,8 +509,6 @@ rc_service_daemons_crashed(const char *service)
RC_STRINGLIST *list = NULL; RC_STRINGLIST *list = NULL;
RC_STRING *s; RC_STRING *s;
size_t i; size_t i;
char *ch_root;
char *spidfile;
path += snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s", path += snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s",
basename_c(service)); basename_c(service));
@@ -556,16 +553,6 @@ rc_service_daemons_crashed(const char *service)
} }
fclose(fp); fclose(fp);
ch_root = rc_service_value_get(basename_c(service), "chroot");
spidfile = pidfile;
if (ch_root && pidfile) {
spidfile = xmalloc(strlen(ch_root) + strlen(pidfile) + 1);
strcpy(spidfile, ch_root);
strcat(spidfile, pidfile);
free(pidfile);
pidfile = spidfile;
}
pid = 0; pid = 0;
if (pidfile) { if (pidfile) {
retval = true; retval = true;

View File

@@ -30,7 +30,6 @@
#include <sys/utsname.h> #include <sys/utsname.h>
#include "queue.h"
#include "librc.h" #include "librc.h"
#define GENDEP RC_LIBEXECDIR "/sh/gendepends.sh" #define GENDEP RC_LIBEXECDIR "/sh/gendepends.sh"

View File

@@ -28,7 +28,6 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "queue.h"
#include "librc.h" #include "librc.h"
bool bool

View File

@@ -28,7 +28,6 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "queue.h"
#include "librc.h" #include "librc.h"
RC_STRINGLIST * RC_STRINGLIST *

View File

@@ -30,7 +30,6 @@
const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples"; const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include "queue.h"
#include "librc.h" #include "librc.h"
#ifdef __FreeBSD__ #ifdef __FreeBSD__
# include <sys/sysctl.h> # include <sys/sysctl.h>
@@ -101,9 +100,7 @@ ls_dir(const char *dir, int options)
continue; continue;
} }
if (options & LS_DIR) { if (options & LS_DIR) {
snprintf(file, sizeof(file), "%s/%s", if (stat(d->d_name, &buf) == 0 &&
dir, d->d_name);
if (stat(file, &buf) != 0 ||
!S_ISDIR(buf.st_mode)) !S_ISDIR(buf.st_mode))
continue; continue;
} }
@@ -296,8 +293,6 @@ rc_sys_v1(void)
return RC_SYS_OPENVZ; /* old test */ return RC_SYS_OPENVZ; /* old test */
else if (file_regex("/proc/1/environ", "container=lxc")) else if (file_regex("/proc/1/environ", "container=lxc"))
return RC_SYS_LXC; return RC_SYS_LXC;
else if (file_regex("/proc/1/environ", "container=systemd-nspawn"))
return RC_SYS_SYSTEMD_NSPAWN;
#endif #endif
return NULL; return NULL;

View File

@@ -57,13 +57,11 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#if defined(BSD) && !defined(__GNU__) #ifdef BSD
#include <sys/param.h> #include <sys/param.h>
#include <sys/user.h> #include <sys/user.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <kvm.h> #include <kvm.h>
#else
#include <sys/param.h>
#endif #endif
#include "rc.h" #include "rc.h"

View File

@@ -27,13 +27,11 @@
#define __RC_H__ #define __RC_H__
#include <sys/types.h> #include <sys/types.h>
#include <sys/queue.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
/* __BEGIN_DECLS */ __BEGIN_DECLS
#ifdef __cplusplus
extern "C" {
#endif
#define RC_PREFIX "@PREFIX@" #define RC_PREFIX "@PREFIX@"
#define RC_SYSCONFDIR "@SYSCONFDIR@" #define RC_SYSCONFDIR "@SYSCONFDIR@"
@@ -41,8 +39,7 @@ extern "C" {
#define RC_LIBEXECDIR "@LIBEXECDIR@" #define RC_LIBEXECDIR "@LIBEXECDIR@"
#if defined(PREFIX) #if defined(PREFIX)
#define RC_SVCDIR RC_LIBEXECDIR "/init.d" #define RC_SVCDIR RC_LIBEXECDIR "/init.d"
#elif defined(__linux__) || (defined(__FreeBSD_kernel__) && \ #elif defined(__linux__)
defined(__GLIBC__)) || defined(__GNU__)
#define RC_SVCDIR "/run/openrc" #define RC_SVCDIR "/run/openrc"
#else #else
#define RC_SVCDIR RC_LIBEXECDIR "/init.d" #define RC_SVCDIR RC_LIBEXECDIR "/init.d"
@@ -77,51 +74,6 @@ extern "C" {
# define RC_LOCAL_CONFDIR RC_LOCAL_PREFIX "/etc/conf.d" # define RC_LOCAL_CONFDIR RC_LOCAL_PREFIX "/etc/conf.d"
#endif #endif
#ifndef _SYS_QUEUE_H_
/*
* The following are copied directly from our imported queue.h.
*/
/*
* List definitions.
*/
#define LIST_HEAD(name, type) \
struct name { \
struct type *lh_first; /* first element */ \
}
#define LIST_HEAD_INITIALIZER(head) \
{ NULL }
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
/*
* Tail queue definitions.
*/
#define _TAILQ_HEAD(name, type, qual) \
struct name { \
qual type *tqh_first; /* first element */ \
qual type *qual *tqh_last; /* addr of last next element */ \
}
#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,)
#define TAILQ_HEAD_INITIALIZER(head) \
{ TAILQ_END(head), &(head).tqh_first }
#define _TAILQ_ENTRY(type, qual) \
struct { \
qual type *tqe_next; /* next element */ \
qual type *qual *tqe_prev; /* address of previous next element */\
}
#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,)
#endif /* _SYS_QUEUE_H_ */
/* A doubly linked list using queue(3) for ease of use */ /* A doubly linked list using queue(3) for ease of use */
typedef struct rc_string { typedef struct rc_string {
char *value; char *value;
@@ -332,7 +284,6 @@ bool rc_service_daemons_crashed(const char *);
#define RC_SYS_OPENVZ "OPENVZ" #define RC_SYS_OPENVZ "OPENVZ"
#define RC_SYS_LXC "LXC" #define RC_SYS_LXC "LXC"
#define RC_SYS_PREFIX "PREFIX" #define RC_SYS_PREFIX "PREFIX"
#define RC_SYS_SYSTEMD_NSPAWN "SYSTEMD-NSPAWN"
#define RC_SYS_UML "UML" #define RC_SYS_UML "UML"
#define RC_SYS_VSERVER "VSERVER" #define RC_SYS_VSERVER "VSERVER"
#define RC_SYS_XEN0 "XEN0" #define RC_SYS_XEN0 "XEN0"
@@ -612,9 +563,5 @@ bool rc_getfile(const char *, char **, size_t *);
* we have our own */ * we have our own */
ssize_t rc_getline(char **, size_t *, FILE *); ssize_t rc_getline(char **, size_t *, FILE *);
/* __END_DECLS */ __END_DECLS
#ifdef __cplusplus
}
#endif
#endif #endif

View File

@@ -1,8 +1,8 @@
PROG= openrc PROG= openrc
SRCS= checkpath.c fstabinfo.c mountinfo.c openrc-run.c \ SRCS= checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \
rc-applets.c rc-depend.c rc-logger.c \ rc-applets.c rc-depend.c rc-logger.c \
rc-misc.c rc-plugin.c rc-service.c rc-status.c rc-update.c \ rc-misc.c rc-plugin.c rc-service.c rc-status.c rc-update.c \
rc.c start-stop-daemon.c swclock.c runscript.c rc.c swclock.c
ifeq (${MKSELINUX},yes) ifeq (${MKSELINUX},yes)
SRCS+= rc-selinux.c SRCS+= rc-selinux.c
@@ -35,14 +35,14 @@ RC_SBINLINKS= mark_service_starting mark_service_started \
ALL_LINKS= ${BINLINKS} ${SBINLINKS} ${RC_BINLINKS} ${RC_SBINLINKS} ALL_LINKS= ${BINLINKS} ${SBINLINKS} ${RC_BINLINKS} ${RC_SBINLINKS}
CLEANFILES+= ${ALL_LINKS} CLEANFILES+= ${ALL_LINKS}
LOCAL_CPPFLAGS=-I../includes -I../librc -I../libeinfo CPPFLAGS+= -I../includes -I../librc -I../libeinfo
LOCAL_LDFLAGS=-L../librc -L../libeinfo LDFLAGS+= -L../librc -L../libeinfo
LDADD+= -lutil -lrc -leinfo LDADD+= -lutil -lrc -leinfo
include ../../Makefile.inc include ../../Makefile.inc
MK= ../../mk MK= ../../mk
include ${MK}/prog.mk include ${MK}/prog.mk
include ${MK}/gitver.mk include ${MK}/git.mk
include ${MK}/cc.mk include ${MK}/cc.mk
include ${MK}/termcap.mk include ${MK}/termcap.mk

Some files were not shown because too many files have changed in this diff Show More