Compare commits
	
		
			6 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					3a96ca1c96 | ||
| 
						 | 
					934530914b | ||
| 
						 | 
					b717625cd2 | ||
| 
						 | 
					b475396134 | ||
| 
						 | 
					e7b1d898ca | ||
| 
						 | 
					5cd09a6f44 | 
							
								
								
									
										15
									
								
								.cirrus.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								.cirrus.yml
									
									
									
									
									
								
							@@ -1,15 +0,0 @@
 | 
			
		||||
# Cirrus CI integration
 | 
			
		||||
# https://cirrus-ci.org
 | 
			
		||||
 | 
			
		||||
test_task:
 | 
			
		||||
  freebsd_instance:
 | 
			
		||||
    matrix:
 | 
			
		||||
      image: freebsd-12-0-release-amd64
 | 
			
		||||
      image: freebsd-11-2-release-amd64
 | 
			
		||||
  env:
 | 
			
		||||
    OS: FreeBSD
 | 
			
		||||
  procfs_script: >
 | 
			
		||||
    [ -f /proc/curproc ] || mount -t procfs proc /proc
 | 
			
		||||
  pkg_install_script: pkg install -y bash gawk gmake gsed
 | 
			
		||||
  gsed_hack_script: rm /usr/bin/sed && ln -s /usr/local/bin/gsed /usr/bin/sed
 | 
			
		||||
  test_script: bash ci/cirrus.sh
 | 
			
		||||
							
								
								
									
										28
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,28 +0,0 @@
 | 
			
		||||
# Travis build integration.
 | 
			
		||||
# https://docs.travis-ci.com/
 | 
			
		||||
 | 
			
		||||
language: c
 | 
			
		||||
 | 
			
		||||
os:
 | 
			
		||||
  - linux
 | 
			
		||||
 | 
			
		||||
compiler:
 | 
			
		||||
  - gcc
 | 
			
		||||
  - clang
 | 
			
		||||
  - musl-gcc
 | 
			
		||||
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    packages:
 | 
			
		||||
    - musl-tools
 | 
			
		||||
 | 
			
		||||
notifications:
 | 
			
		||||
  irc:
 | 
			
		||||
    channels:
 | 
			
		||||
      - "irc.freenode.org#openrc"
 | 
			
		||||
    on_success: change  # options: [always|never|change] default: always
 | 
			
		||||
    on_failure: always  # options: [always|never|change] default: always
 | 
			
		||||
    on_start: false     # default: false
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - ./ci/travis.sh
 | 
			
		||||
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -82,7 +82,6 @@ Semen Maryasin <marsoft@ya.ru>
 | 
			
		||||
Sergei Trofimovich <slyfox@gentoo.org>
 | 
			
		||||
Seth Robertson <in-gentoo@baka.org>
 | 
			
		||||
S. Gilles <sgilles@umd.edu>
 | 
			
		||||
Sony Interactive Entertainment, llc.
 | 
			
		||||
Stefan Knoblich <s.knoblich@axsentis.de>
 | 
			
		||||
Stef Simoens <stef.simoens@scarlet.be>
 | 
			
		||||
Steve L <slong@rathaus.eclipse.co.uk>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
Using Busybox as your Default Shell with OpenRC
 | 
			
		||||
===============================================
 | 
			
		||||
# Using Busybox as your Default Shell with OpenRC
 | 
			
		||||
 | 
			
		||||
If you have/bin/sh linked to busybox, you need to be aware of several
 | 
			
		||||
incompatibilities between busybox's applets and the standalone
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
Features Scheduled for Removal
 | 
			
		||||
==============================
 | 
			
		||||
# Features Scheduled for Removal
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
is happening, and who is going to be doing the work.  When the feature is
 | 
			
		||||
removed, it should also be removed from this file.
 | 
			
		||||
 | 
			
		||||
# Service pause action
 | 
			
		||||
## Service pause action
 | 
			
		||||
 | 
			
		||||
When: 1.0
 | 
			
		||||
 | 
			
		||||
@@ -14,7 +13,7 @@ Why: The same affect can be obtained with the --nodeps option to stop.
 | 
			
		||||
 | 
			
		||||
Who:
 | 
			
		||||
 | 
			
		||||
# start-stop-daemon options --startas, --chuid , --oknodo
 | 
			
		||||
## start-stop-daemon options --startas, --chuid , --oknodo
 | 
			
		||||
 | 
			
		||||
When: 1.0
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +25,7 @@ Why: Obsolete or replaced by other options.
 | 
			
		||||
 | 
			
		||||
Who:
 | 
			
		||||
 | 
			
		||||
# runscript and rc symbolic links
 | 
			
		||||
## runscript and rc symbolic links
 | 
			
		||||
 | 
			
		||||
When: 1.0
 | 
			
		||||
 | 
			
		||||
@@ -35,7 +34,7 @@ Why: Deprecated in favor of openrc-run and openrc due to naming
 | 
			
		||||
 | 
			
		||||
Who:
 | 
			
		||||
 | 
			
		||||
# support for the opts variable in service scripts
 | 
			
		||||
## support for the opts variable in service scripts
 | 
			
		||||
 | 
			
		||||
When: 1.0
 | 
			
		||||
 | 
			
		||||
@@ -44,7 +43,7 @@ Why: Deprecated in favor of extra_commands, extra_started_commands
 | 
			
		||||
 | 
			
		||||
Who:
 | 
			
		||||
 | 
			
		||||
# support for local_start and local_stop
 | 
			
		||||
## support for local_start and local_stop
 | 
			
		||||
 | 
			
		||||
When: 1.0
 | 
			
		||||
 | 
			
		||||
@@ -52,7 +51,7 @@ Why: Deprecated in favor of executable scripts in @SYSCONFDIR@/local.d
 | 
			
		||||
 | 
			
		||||
Who:
 | 
			
		||||
 | 
			
		||||
# the mtab service script
 | 
			
		||||
## the mtab service script
 | 
			
		||||
 | 
			
		||||
When: force /etc/mtab to link to /proc/self/mounts in 1.0, remove
 | 
			
		||||
	  service in 2.0
 | 
			
		||||
@@ -62,13 +61,13 @@ Why: /etc/mtab should be a symbolic link to /proc/self/mounts on modern
 | 
			
		||||
 | 
			
		||||
Who:
 | 
			
		||||
 | 
			
		||||
# C API Functions in rc.h
 | 
			
		||||
## C API Functions in rc.h
 | 
			
		||||
 | 
			
		||||
If you have a c program that links to librc and uses functions from
 | 
			
		||||
there, this section will list API functions which are deprecated and
 | 
			
		||||
will be removed along with the reason they are being removed.
 | 
			
		||||
 | 
			
		||||
## rc_getline()
 | 
			
		||||
### rc_getline()
 | 
			
		||||
 | 
			
		||||
When: 1.0
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
OpenRC History
 | 
			
		||||
==============
 | 
			
		||||
# OpenRC History
 | 
			
		||||
 | 
			
		||||
This history of OpenRC was written by Daniel Robbins, Roy Marples, William
 | 
			
		||||
Hubbs and others.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Makefile
									
									
									
									
									
								
							@@ -15,27 +15,14 @@ include ${TOP}/Makefile.inc
 | 
			
		||||
 | 
			
		||||
SUBDIR=		conf.d etc init.d local.d man scripts sh src support sysctl.d
 | 
			
		||||
 | 
			
		||||
# Build bash completion or not
 | 
			
		||||
MKBASHCOMP?=	no
 | 
			
		||||
ifeq (${MKBASHCOMP},yes)
 | 
			
		||||
SUBDIR+=	bash-completion
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Build pkgconfig or not
 | 
			
		||||
MKPKGCONFIG?=	yes
 | 
			
		||||
ifeq (${MKPKGCONFIG},yes)
 | 
			
		||||
SUBDIR+=	pkgconfig
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Build zsh completion or not
 | 
			
		||||
MKZSHCOMP?=	no
 | 
			
		||||
ifeq (${MKZSHCOMP},yes)
 | 
			
		||||
SUBDIR+=	zsh-completion
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# We need to ensure that runlevels is done last other than test
 | 
			
		||||
# We need to ensure that runlevels is done last
 | 
			
		||||
SUBDIR+=	runlevels
 | 
			
		||||
SUBDIR+=	test
 | 
			
		||||
 | 
			
		||||
INSTALLAFTER=	_installafter
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
NAME=		openrc
 | 
			
		||||
VERSION=	0.42.1
 | 
			
		||||
VERSION=	0.34.2
 | 
			
		||||
PKG=		${NAME}-${VERSION}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										118
									
								
								NEWS.md
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								NEWS.md
									
									
									
									
									
								
							@@ -1,124 +1,8 @@
 | 
			
		||||
OpenRC NEWS
 | 
			
		||||
===========
 | 
			
		||||
# 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.42
 | 
			
		||||
 | 
			
		||||
openrc-shutdown now has the ability to shut down sysvinit-based systems.
 | 
			
		||||
 | 
			
		||||
A guide has been added for migrating systems using another init system
 | 
			
		||||
to openrc-init.
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.41.
 | 
			
		||||
 | 
			
		||||
This version adds the ability to format the output of rc-status when
 | 
			
		||||
showing the status of services in a runlevel so that it may be parsed.
 | 
			
		||||
Currently, the -f switch only accepts ini as an argument which
 | 
			
		||||
causes the output to be in the .ini format.
 | 
			
		||||
 | 
			
		||||
This version adds an experimental build time switch to allow setting the
 | 
			
		||||
default shell to use for service scripts.
 | 
			
		||||
By default, this is set to /bin/sh if it is changed, the new shell must
 | 
			
		||||
be able to understand posix-compatible syntax.
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.40
 | 
			
		||||
 | 
			
		||||
In this version, the keymaps and termencoding services on Linux needed
 | 
			
		||||
to be modified so they do not write to the root file system. This was
 | 
			
		||||
done so they can run earlier in the boot sequence. AS a result, you will
 | 
			
		||||
need to add save-termencoding and save-keymaps to your boot runlevel.
 | 
			
		||||
This can be done as follows:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# rc-update add save-keymaps boot
 | 
			
		||||
# rc-update add save-termencoding boot
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.39
 | 
			
		||||
 | 
			
		||||
This version removes the support for addons.
 | 
			
		||||
The only place I know that this was used was Gentoo Baselayout 1.x, so
 | 
			
		||||
it shouldn't affect anyone since baselayout-1 has been dead for a few
 | 
			
		||||
years.
 | 
			
		||||
 | 
			
		||||
Since all supported Linux kernel versions now make efivarfs immutable
 | 
			
		||||
and all of the tools that access efivarfs are aware of this, we no
 | 
			
		||||
longer mount efivarfs read-only. See the following github issue for more
 | 
			
		||||
information:
 | 
			
		||||
 | 
			
		||||
https://github.com/openrc/openrc/issues/238
 | 
			
		||||
 | 
			
		||||
This version adds timed shutdown and cancelation of shutdown to
 | 
			
		||||
openrc-shutdown. Shutdowns can now be delayed for a certain amount of
 | 
			
		||||
time or scheduled for an exact time.
 | 
			
		||||
 | 
			
		||||
supervise-daemon supports health checks, which are a periodic way to make sure a
 | 
			
		||||
service is healthy. For more information on setting this up, please see
 | 
			
		||||
supervise-daemon-guide.md.
 | 
			
		||||
 | 
			
		||||
The --first-time switch has been added to all modprobe commands in the
 | 
			
		||||
modules service. This means that, on Linux, you will see failures if a
 | 
			
		||||
module was loaded by an initramfs or device manager before this service
 | 
			
		||||
runs. These messages are harmless, but to clean them up, you should adjust your
 | 
			
		||||
modules autoload configuration.
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.37
 | 
			
		||||
 | 
			
		||||
start-stop-daemon now supports logging stdout and stderr of daemons to
 | 
			
		||||
processes instead of files. These processes are defined by the
 | 
			
		||||
output_logger and error_logger variables in standard service scripts, or
 | 
			
		||||
by the  -3/--output-logger or -4/--error-logger switches if you use
 | 
			
		||||
start-stop-daemon directly. For more information on this, see the
 | 
			
		||||
start-stop-daemon man page.
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.36
 | 
			
		||||
 | 
			
		||||
In this release, the modules-load service has been combined into the
 | 
			
		||||
modules service since there is no reason I know of to keep them
 | 
			
		||||
separate. However, modules also provides modules-load in case you were
 | 
			
		||||
using modules-load in  your dependencies.
 | 
			
		||||
 | 
			
		||||
The consolefont, keymaps, numlock and procfs service scripts no longer
 | 
			
		||||
have a dependency on localmount.
 | 
			
		||||
If you are a linux user and are still separaating / from /usr,
 | 
			
		||||
you will need to add the following line to the appropriate conf.d files:
 | 
			
		||||
 | 
			
		||||
rc_need="localmount"
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.35
 | 
			
		||||
 | 
			
		||||
In this version, the cgroups mounting logic has been moved from the
 | 
			
		||||
sysfs service to the cgroups service. This was done so cgroups can be
 | 
			
		||||
mounted inside an lxc/lxd container without using the other parts of the
 | 
			
		||||
sysfs service.
 | 
			
		||||
 | 
			
		||||
?As a result of this change, if you are upgrading, you need to add
 | 
			
		||||
cgroups to your sysinit runlevel by running the following command as
 | 
			
		||||
root:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# rc-update add cgroups sysinit
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For more information, see the following issue:
 | 
			
		||||
 | 
			
		||||
https://github.com/openrc/openrc/issues/187
 | 
			
		||||
 | 
			
		||||
Consider this your second notification with regard to /etc/mtab being a
 | 
			
		||||
file instead of a symbolic link.
 | 
			
		||||
 | 
			
		||||
In this version, the mtab service will complain loudly if you have
 | 
			
		||||
mtab_is_file set to yes and recommend that you change this to no and
 | 
			
		||||
restart the mtab service to migrate /etc/mtab to a symbolic link.
 | 
			
		||||
 | 
			
		||||
If there is a valid technical reason to keep /etc/mtab as a flat file
 | 
			
		||||
instead of a symbolic link to /proc/self/mounts, we are interested and
 | 
			
		||||
we will keep the support in that case. Please open an issue and let us
 | 
			
		||||
know however. Otherwise, consider this your final notice that the mtab
 | 
			
		||||
service will be removed in the future.
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.33
 | 
			
		||||
 | 
			
		||||
This version removes the "service" binary which was just a copy of
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
OpenRC README
 | 
			
		||||
=============
 | 
			
		||||
# OpenRC README
 | 
			
		||||
 | 
			
		||||
OpenRC is a dependency-based init system that works with the
 | 
			
		||||
system-provided init program, normally `/sbin/init`. Currently, it does
 | 
			
		||||
@@ -23,7 +22,6 @@ below arguments to the make command
 | 
			
		||||
PROGLDFLAGS=-static
 | 
			
		||||
LIBNAME=lib64
 | 
			
		||||
DESTDIR=/tmp/openrc-image
 | 
			
		||||
MKBASHCOMP=no
 | 
			
		||||
MKNET=no
 | 
			
		||||
MKPAM=pam
 | 
			
		||||
MKPREFIX=yes
 | 
			
		||||
@@ -33,12 +31,10 @@ MKSTATICLIBS=no
 | 
			
		||||
MKSYSVINIT=yes
 | 
			
		||||
MKTERMCAP=ncurses
 | 
			
		||||
MKTERMCAP=termcap
 | 
			
		||||
MKZSHCOMP=no
 | 
			
		||||
PKG_PREFIX=/usr/pkg
 | 
			
		||||
LOCAL_PREFIX=/usr/local
 | 
			
		||||
PREFIX=/usr/local
 | 
			
		||||
BRANDING=\"Gentoo/$(uname -s)\"
 | 
			
		||||
SH=/bin/sh
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Notes
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
OpenRC Coding Style Guide
 | 
			
		||||
=========================
 | 
			
		||||
# OpenRC Style Guide
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
Setting up the agetty service in OpenRC
 | 
			
		||||
=================================xxxxxx
 | 
			
		||||
# Setting up the agetty service in OpenRC
 | 
			
		||||
 | 
			
		||||
The agetty service is an OpenRC specific way to monitor and respawn a
 | 
			
		||||
getty, using agetty, on Linux. To use this method, make sure you aren't
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
DIR=	${BASHCOMPDIR}
 | 
			
		||||
CONF=	openrc \
 | 
			
		||||
		openrc-service-script \
 | 
			
		||||
		rc-service \
 | 
			
		||||
		rc-status \
 | 
			
		||||
		rc-update \
 | 
			
		||||
 | 
			
		||||
MK=	../mk
 | 
			
		||||
include ${MK}/os.mk
 | 
			
		||||
 | 
			
		||||
include ${MK}/scripts.mk
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
# Copyright (c) 2017 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# openrc completion command
 | 
			
		||||
#
 | 
			
		||||
_openrc()
 | 
			
		||||
{
 | 
			
		||||
	local cur
 | 
			
		||||
	COMPREPLY=()
 | 
			
		||||
	cur="${COMP_WORDS[COMP_CWORD]}"
 | 
			
		||||
	if [[ ${#COMP_WORDS[*]} -le 2 ]]; then
 | 
			
		||||
		COMPREPLY=($(compgen -W "$(rc-status --list)" -- $cur))
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
} &&
 | 
			
		||||
complete -F _openrc openrc
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
# Copyright (c) 2017 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
_openrc_service_script()
 | 
			
		||||
{
 | 
			
		||||
	local script="${COMP_WORDS[0]}"
 | 
			
		||||
	local cur="${COMP_WORDS[$COMP_CWORD]}"
 | 
			
		||||
 | 
			
		||||
	if [[ ( -f "${script}" || -h "${script}" ) && -r "${script}" ]] \
 | 
			
		||||
	&& [[ "$(head -n 1 "${script}")" =~ \#\!.*/openrc-run ]]
 | 
			
		||||
	then
 | 
			
		||||
		[[ $COMP_CWORD -gt 1 ]] && return 1
 | 
			
		||||
		COMPREPLY=($(opts="start stop status restart pause zap ineed needsme iuse usesme broken"; \
 | 
			
		||||
			eval "$(grep '^opts=' "${script}")"; echo "${opts}"))
 | 
			
		||||
		[[ -n "$COMPREPLY" ]] || COMPREPLY=(start stop restart zap)
 | 
			
		||||
		COMPREPLY=($(compgen -W "${COMPREPLY[*]}" -- "${cur}"))
 | 
			
		||||
	else
 | 
			
		||||
		COMPREPLY=($(compgen -o default -- "${cur}"))
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
complete -F _openrc_service_script */etc/init.d/*
 | 
			
		||||
@@ -1,116 +0,0 @@
 | 
			
		||||
# Copyright (c) 2017 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# rc-service completion command
 | 
			
		||||
#
 | 
			
		||||
_rc_service()
 | 
			
		||||
{
 | 
			
		||||
	local cur prev numwords opts
 | 
			
		||||
	local words i x filename
 | 
			
		||||
	local action actionpos
 | 
			
		||||
	COMPREPLY=()
 | 
			
		||||
	cur="${COMP_WORDS[COMP_CWORD]}"
 | 
			
		||||
	prev="${COMP_WORDS[COMP_CWORD-1]}"
 | 
			
		||||
	numwords=${#COMP_WORDS[*]}
 | 
			
		||||
 | 
			
		||||
	if [[ ${prev} == '>' || ${prev} == '<' ]] ; then
 | 
			
		||||
		COMPREPLY=($(compgen -f -- ${cur}))
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# find action
 | 
			
		||||
	for x in ${COMP_LINE} ; do
 | 
			
		||||
		if [[ ${x} =~ --(list|exists|resolve) ]] || [[ ${x} =~ -(l|e|r) ]]
 | 
			
		||||
		then
 | 
			
		||||
			action=${x}
 | 
			
		||||
			break
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
	if [[ -n ${action} ]]; then
 | 
			
		||||
		for ((i = 0; i < ${numwords}; i++ )); do
 | 
			
		||||
			if [[ ${COMP_WORDS[${i}]} == "${action}" ]]; then
 | 
			
		||||
				actionpos=${i}
 | 
			
		||||
				break
 | 
			
		||||
			fi
 | 
			
		||||
		done
 | 
			
		||||
 | 
			
		||||
		for ((i = 1; i < ${numwords}; i++ )); do
 | 
			
		||||
			if [[ ! ${COMP_WORDS[$i]} == -* ]]; then
 | 
			
		||||
				break
 | 
			
		||||
			fi
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [[ ${COMP_CWORD} -eq 3 ]]; then
 | 
			
		||||
		return 1
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# check if an option was typed
 | 
			
		||||
	if [[ ${cur} == -* ]]; then
 | 
			
		||||
		if [[ ${cur} == --* ]]; then
 | 
			
		||||
			opts="--list --exists --resolve"
 | 
			
		||||
			COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
 | 
			
		||||
			return 0
 | 
			
		||||
		elif [[ ${cur} == -* ]]; then
 | 
			
		||||
			opts="-l -e -r"
 | 
			
		||||
			COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		# NOTE: This slows things down!
 | 
			
		||||
		# (Adapted from bash_completion by Ian Macdonald <ian@caliban.org>)
 | 
			
		||||
		# This removes any options from the list of completions that have
 | 
			
		||||
		# already been specified on the command line.
 | 
			
		||||
		COMPREPLY=($(echo "${COMP_WORDS[@]}" | \
 | 
			
		||||
		(while read -d ' ' i; do
 | 
			
		||||
			[[ -z ${i} ]] && continue
 | 
			
		||||
			# flatten array with spaces on either side,
 | 
			
		||||
			# otherwise we cannot grep on word boundaries of
 | 
			
		||||
			# first and last word
 | 
			
		||||
			COMPREPLY=" ${COMPREPLY[@]} "
 | 
			
		||||
			# remove word from list of completions
 | 
			
		||||
			COMPREPLY=(${COMPREPLY/ ${i%% *} / })
 | 
			
		||||
		done
 | 
			
		||||
		echo ${COMPREPLY[@]})))
 | 
			
		||||
 | 
			
		||||
		return 0
 | 
			
		||||
	else
 | 
			
		||||
		# no option was typed
 | 
			
		||||
		if [[ ${COMP_CWORD} -eq 1 ]]; then			  # if first word typed
 | 
			
		||||
			words="$(rc-service --list | grep ^${cur})"		  # complete for init scripts
 | 
			
		||||
			COMPREPLY=($(for i in ${words} ; do \
 | 
			
		||||
			[[ ${i} == ${cur}* ]] && echo ${i} ; \
 | 
			
		||||
			done))
 | 
			
		||||
			return 0
 | 
			
		||||
		elif [[ ${COMP_CWORD} -eq 2 ]] && [[ ${prev} != -* ]]; then # if second word typed and we didn't type in a function
 | 
			
		||||
			rc-service --exists "$prev" || return
 | 
			
		||||
			shopt -s extglob
 | 
			
		||||
			while read -r _ line; do
 | 
			
		||||
				if [[ $line == +([[:alnum:]_]):* ]]; then
 | 
			
		||||
					opts+="${line%%:*} "
 | 
			
		||||
				fi
 | 
			
		||||
			done < <(rc-service "$prev" describe 2>&1)
 | 
			
		||||
			shopt -u extglob
 | 
			
		||||
			COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	if [[ ${action} == '--exists' ]] || [[ ${action} == '-e' ]] || \
 | 
			
		||||
		[[ ${action} == '--resolve' ]]  || [[ ${action} == '-r' ]]; then
 | 
			
		||||
		words="$(rc-service --list | grep ^${cur})"
 | 
			
		||||
		COMPREPLY=($(for i in ${words} ; do \
 | 
			
		||||
			[[ ${i} == ${cur}* ]] && echo ${i} ; \
 | 
			
		||||
		done))
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
} &&
 | 
			
		||||
complete -F _rc_service rc-service
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
# Copyright (c) 2017 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# rc-status completion command
 | 
			
		||||
#
 | 
			
		||||
_rcstatus()
 | 
			
		||||
{
 | 
			
		||||
	local cur
 | 
			
		||||
	cur="${COMP_WORDS[COMP_CWORD]}"
 | 
			
		||||
	if [[ $COMP_CWORD -eq 1 ]]; then
 | 
			
		||||
		if [[ "${cur}" == --* ]]; then
 | 
			
		||||
			COMPREPLY=($(compgen -W '--all --list --unused' -- ${cur}))
 | 
			
		||||
		elif [[ "${cur}" == -* ]]; then
 | 
			
		||||
			COMPREPLY=($(compgen -W '-a -l -u' -- ${cur}))
 | 
			
		||||
		else
 | 
			
		||||
			COMPREPLY=($(compgen -W "$(rc-status --list)" -- ${cur}))
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		unset COMPREPLY
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
} &&
 | 
			
		||||
complete -F _rcstatus rc-status
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
# Copyright (c) 2017 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# rc-update completion command
 | 
			
		||||
#
 | 
			
		||||
_rc_update()
 | 
			
		||||
{
 | 
			
		||||
	local cur show
 | 
			
		||||
	COMPREPLY=()
 | 
			
		||||
	cur="${COMP_WORDS[COMP_CWORD]}"
 | 
			
		||||
	if [[ $COMP_CWORD -eq 1 ]]; then
 | 
			
		||||
		if [[ "${cur}" == -* ]]; then
 | 
			
		||||
			COMPREPLY=($(compgen -W '-a -d -s' -- ${cur}))
 | 
			
		||||
		else
 | 
			
		||||
			COMPREPLY=($(compgen -W 'add del show' ${cur}))
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		if [[ "${COMP_WORDS[1]}" == "show" ]] || [[ "${COMP_WORDS[1]}" == "-s" ]]; then
 | 
			
		||||
			show="TRUE"
 | 
			
		||||
		fi
 | 
			
		||||
		if ([[ $COMP_CWORD -eq 3 ]] && [[ -z "$show" ]]) || \
 | 
			
		||||
			([[ $COMP_CWORD -eq 2 ]] && [[ -n "$show" ]]); then
 | 
			
		||||
		COMPREPLY=($(compgen -W "$(rc-status --list)" -- $cur))
 | 
			
		||||
		elif [[ $COMP_CWORD -eq 2 ]]; then
 | 
			
		||||
			COMPREPLY=($(compgen -W "$(rc-service --list)" $cur))
 | 
			
		||||
		elif [[ ${#COMP_WORDS[*]} -gt 2 ]] ; then
 | 
			
		||||
			COMPREPLY=($(compgen -W "$(rc-status --list)" -- $cur))
 | 
			
		||||
		else
 | 
			
		||||
			unset COMPREPLY
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
} &&
 | 
			
		||||
complete -F _rc_update rc-update
 | 
			
		||||
							
								
								
									
										21
									
								
								ci/cirrus.sh
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								ci/cirrus.sh
									
									
									
									
									
								
							@@ -1,21 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# Copyright (c) 2007-2018 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
set -u
 | 
			
		||||
set -x
 | 
			
		||||
 | 
			
		||||
# These are steps to run on Cirrus CI under a jailed FreeBSD system.
 | 
			
		||||
# See $TOP/.cirrus.yml for more info about the Cirrus CI setup.
 | 
			
		||||
 | 
			
		||||
cpus=$(getconf NPROCESSORS_CONF || echo 1)
 | 
			
		||||
gmake -j"${cpus}" -O
 | 
			
		||||
gmake test
 | 
			
		||||
							
								
								
									
										23
									
								
								ci/travis.sh
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								ci/travis.sh
									
									
									
									
									
								
							@@ -1,23 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# Copyright (c) 2007-2018 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
set -u
 | 
			
		||||
set -x
 | 
			
		||||
 | 
			
		||||
# These are steps to run on TravisCI under a containerized Ubuntu system.
 | 
			
		||||
# See $TOP/.travis.yml for more info about the TravisCI setup.
 | 
			
		||||
 | 
			
		||||
cpus=$(getconf _NPROCESSORS_CONF || echo 1)
 | 
			
		||||
# make on TravisCI doesn't support -O yet
 | 
			
		||||
make -j"${cpus}"
 | 
			
		||||
 | 
			
		||||
make test
 | 
			
		||||
@@ -8,6 +8,11 @@
 | 
			
		||||
#modules_2="ipv6"
 | 
			
		||||
#modules="ohci1394"
 | 
			
		||||
 | 
			
		||||
# Linux users can give modules a different name when they load - the new name
 | 
			
		||||
# will also be used to pick arguments below.
 | 
			
		||||
# This is not supported on FreeBSD.
 | 
			
		||||
#modules="dummy:dummy1"
 | 
			
		||||
 | 
			
		||||
# Linux users can give the modules some arguments if needed, per version
 | 
			
		||||
# if necessary.
 | 
			
		||||
# Again, the most specific versioned variable will take precedence.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								conf.d/mtab
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								conf.d/mtab
									
									
									
									
									
								
							@@ -1,13 +1,5 @@
 | 
			
		||||
# As far as we are aware, there are no modern linux tools or use cases
 | 
			
		||||
# which require /etc/mtab to be a separate file from /proc/self/mounts,
 | 
			
		||||
# so this setting should be commented out.
 | 
			
		||||
# If it is set to yes, please comment it out and run this command:
 | 
			
		||||
# # rc-service mtab restart
 | 
			
		||||
# In the future, the mtab service will be removed since we are not aware
 | 
			
		||||
# of any need to manipulate /etc/mtab as a separate file from
 | 
			
		||||
# /proc/self/mounts.
 | 
			
		||||
# If you have a technical reason we should keep this support, please
 | 
			
		||||
# open an issue at https://github.com/openrc/openrc/issues and let us
 | 
			
		||||
# know about your situation.
 | 
			
		||||
# 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
 | 
			
		||||
 
 | 
			
		||||
@@ -227,11 +227,6 @@ rc_tty_number=12
 | 
			
		||||
# /sys/fs/cgroup in hybrid or legacy mode.
 | 
			
		||||
#rc_controller_cgroups="YES"
 | 
			
		||||
 | 
			
		||||
# The following setting turns on the memory.use_hierarchy setting in the
 | 
			
		||||
# root memory cgroup for cgroups v1.
 | 
			
		||||
# It must be set to yes in this file if you want this functionality.
 | 
			
		||||
#rc_cgroup_memory_use_hierarchy="NO"
 | 
			
		||||
 | 
			
		||||
# The following settings allow you to set up values for the cgroups version 1
 | 
			
		||||
# controllers for your services.
 | 
			
		||||
# They can be set in this file;, however, if you do this, the settings
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2007-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2007-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,3 @@
 | 
			
		||||
OpenRC Users Guide
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
# Purpose and description
 | 
			
		||||
 | 
			
		||||
OpenRC is an init system for Unixoid operating systems. It takes care of 
 | 
			
		||||
@@ -30,8 +27,8 @@ openrc scans the runlevels (default: `/etc/runlevels`) and builds a dependency
 | 
			
		||||
graph, then starts the needed service scripts, either serialized (default) or in 
 | 
			
		||||
parallel.
 | 
			
		||||
 | 
			
		||||
When all the service scripts are started openrc terminates. There is no
 | 
			
		||||
persistent daemon. (Integration with tools like monit, runit or s6 can be done)
 | 
			
		||||
When all the init scripts are started openrc terminates. There is no persistent 
 | 
			
		||||
daemon. (Integration with tools like monit, runit or s6 can be done)
 | 
			
		||||
 | 
			
		||||
# Shutdown
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +63,7 @@ own if needed. This allows, for example, to have a default runlevel with
 | 
			
		||||
disabled.
 | 
			
		||||
 | 
			
		||||
The `rc-status` helper will print all currently active runlevels and the state
 | 
			
		||||
of services in them:
 | 
			
		||||
of init scripts in them:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# rc-status
 | 
			
		||||
@@ -77,7 +74,7 @@ Runlevel: default
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
All runlevels are represented as folders in `/etc/runlevels/` with symlinks to 
 | 
			
		||||
the actual service scripts.
 | 
			
		||||
the actual init scripts.
 | 
			
		||||
 | 
			
		||||
Calling openrc with an argument (`openrc default`) will switch to that
 | 
			
		||||
runlevel; this will start and stop services as needed.
 | 
			
		||||
@@ -86,12 +83,121 @@ Managing runlevels is usually done through the `rc-update` helper, but could of
 | 
			
		||||
course be done by hand if desired.
 | 
			
		||||
e.g. `rc-update add nginx default` - add nginx to the default runlevel
 | 
			
		||||
Note: This will not auto-start nginx! You'd still have to trigger `rc` or run 
 | 
			
		||||
the service script by hand.
 | 
			
		||||
the initscript by hand.
 | 
			
		||||
 | 
			
		||||
FIXME: Document stacked runlevels
 | 
			
		||||
 | 
			
		||||
The default startup uses the runlevels `sysinit`, `boot`, and `default`,
 | 
			
		||||
in that order. Shutdown uses the `shutdown` runlevel.
 | 
			
		||||
The default startup uses the runlevels `boot`, `sysinit` and `default`, in that 
 | 
			
		||||
order. Shutdown uses the `shutdown` runlevel.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Syntax of Service Scripts
 | 
			
		||||
 | 
			
		||||
Service scripts are shell scripts. OpenRC aims at using only the standardized 
 | 
			
		||||
POSIX sh subset for portability reasons. The default interpreter (build-time 
 | 
			
		||||
toggle) is `/bin/sh`, so using for example mksh is not a problem.
 | 
			
		||||
 | 
			
		||||
OpenRC has been tested with busybox sh, ash, dash, bash, mksh, zsh and possibly 
 | 
			
		||||
others. Using busybox sh has been difficult as it replaces commands with 
 | 
			
		||||
builtins that don't offer the expected features.
 | 
			
		||||
 | 
			
		||||
The interpreter for initscripts is `#!/sbin/openrc-run`.
 | 
			
		||||
Not using this interpreter will break the use of dependencies and is not 
 | 
			
		||||
supported. (iow: if you insist on using `#!/bin/sh` you're on your own)
 | 
			
		||||
 | 
			
		||||
A `depend` function declares the dependencies of this service script.
 | 
			
		||||
All scripts must have start/stop/status functions, but defaults are provided.
 | 
			
		||||
Extra functions can be added easily:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
extra_commands="checkconfig"
 | 
			
		||||
checkconfig() {
 | 
			
		||||
	doSomething
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This exports the checkconfig function so that `/etc/init.d/someservice 
 | 
			
		||||
checkconfig` will be available, and it "just" runs this function.
 | 
			
		||||
 | 
			
		||||
While commands defined in `extra_commands` are always available, commands
 | 
			
		||||
defined in `extra_started_commands` will only work when the service is started
 | 
			
		||||
and those defined in `extra_stopped_commands` will only work when the service is
 | 
			
		||||
stopped. This can be used for implementing graceful reload and similar
 | 
			
		||||
behaviour.
 | 
			
		||||
 | 
			
		||||
Adding a restart function will not work, this is a design decision within 
 | 
			
		||||
OpenRC. Since there may be dependencies involved (e.g. network -> apache) a 
 | 
			
		||||
restart function is in general not going to work. 
 | 
			
		||||
restart is internally mapped to `stop()` + `start()` (plus handling dependencies).
 | 
			
		||||
If a service needs to behave differently when it is being restarted vs
 | 
			
		||||
started or stopped, it should test the `$RC_CMD` variable, for example:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
[ "$RC_CMD" = restart ] && do_something
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
# The Depend Function
 | 
			
		||||
 | 
			
		||||
This function declares the dependencies for a service script. This
 | 
			
		||||
determines the order the service scripts start.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
depend() {
 | 
			
		||||
	need net
 | 
			
		||||
	use dns logger netmount
 | 
			
		||||
	want coolservice
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`need` declares a hard dependency - net always needs to be started before this 
 | 
			
		||||
	service does
 | 
			
		||||
 | 
			
		||||
`use` is a soft dependency - if dns, logger or netmount is in this runlevel 
 | 
			
		||||
	start it before, but we don't care if it's not in this runlevel.
 | 
			
		||||
	`want` is between need and use - try to start coolservice if it is
 | 
			
		||||
	installed on the system, regardless of whether it is in the
 | 
			
		||||
	runlevel, but we don't care if it starts.
 | 
			
		||||
 | 
			
		||||
`before` declares that we need to be started before another service
 | 
			
		||||
 | 
			
		||||
`after` declares that we need to be started after another service, without 
 | 
			
		||||
	creating a dependency (so on calling stop the two are independent)
 | 
			
		||||
 | 
			
		||||
`provide` allows multiple implementations to provide one service type, e.g.:
 | 
			
		||||
	`provide cron` is set in all cron-daemons, so any one of them started 
 | 
			
		||||
	satisfies a cron dependency
 | 
			
		||||
 | 
			
		||||
`keyword` allows platform-specific overrides, e.g. `keyword -lxc` makes this 
 | 
			
		||||
	service script a noop in lxc containers. Useful for things like keymaps, 
 | 
			
		||||
	module loading etc. that are either platform-specific or not available 
 | 
			
		||||
	in containers/virtualization/...
 | 
			
		||||
 | 
			
		||||
FIXME: Anything missing in this list?
 | 
			
		||||
 | 
			
		||||
# The Default Functions
 | 
			
		||||
 | 
			
		||||
All service scripts are assumed to have the following functions:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
start()
 | 
			
		||||
stop()
 | 
			
		||||
status()
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
There are default implementations in `lib/rc/sh/openrc-run.sh` - this allows very 
 | 
			
		||||
compact service scripts. These functions can be overridden per service script as 
 | 
			
		||||
needed.
 | 
			
		||||
 | 
			
		||||
The default functions assume the following variables to be set in the service 
 | 
			
		||||
script:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
command=
 | 
			
		||||
command_args=
 | 
			
		||||
pidfile=
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Thus the 'smallest' service scripts can be half a dozen lines long
 | 
			
		||||
 | 
			
		||||
# The Magic of `conf.d`
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +217,7 @@ start() {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The big advantage of this split is that most of the time editing of the service 
 | 
			
		||||
The big advantage of this split is that most of the time editing of the init 
 | 
			
		||||
script can be avoided.
 | 
			
		||||
 | 
			
		||||
# Start-Stop-Daemon
 | 
			
		||||
@@ -162,9 +268,10 @@ stopped, by using:
 | 
			
		||||
The `rc_cgroup_cleanup` setting can be changed to yes to make this
 | 
			
		||||
happen automatically when the service is stopped.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Caching
 | 
			
		||||
 | 
			
		||||
For performance reasons OpenRC keeps a cache of pre-parsed service metadata
 | 
			
		||||
For performance reasons OpenRC keeps a cache of pre-parsed initscript metadata
 | 
			
		||||
(e.g. `depend`). The default location for this is `/${RC_SVCDIR}/cache`.
 | 
			
		||||
 | 
			
		||||
The cache uses `mtime` to check for file staleness. Should any service script
 | 
			
		||||
@@ -174,5 +281,5 @@ change it'll re-source the relevant files and update the cache
 | 
			
		||||
 | 
			
		||||
OpenRC has wrappers for many common output tasks in libeinfo.
 | 
			
		||||
This allows to print colour-coded status notices and other things.
 | 
			
		||||
To make the output consistent the bundled service scripts all use ebegin/eend to 
 | 
			
		||||
To make the output consistent the bundled initscripts all use ebegin/eend to 
 | 
			
		||||
print nice messages.
 | 
			
		||||
@@ -1,50 +0,0 @@
 | 
			
		||||
# OpenRC init process guide
 | 
			
		||||
 | 
			
		||||
OpenRC now includes an init process which can be used on Linux systems
 | 
			
		||||
in place of sysvinit.
 | 
			
		||||
 | 
			
		||||
## migrating a live system to openrc-init
 | 
			
		||||
 | 
			
		||||
Configuring a live system to use this init process is very
 | 
			
		||||
straight-forward, but the steps must be completed in this order.
 | 
			
		||||
 | 
			
		||||
* have your boot loader add "init=/sbin/openrc-init" to the kernel command line
 | 
			
		||||
 | 
			
		||||
The details of how to do this will vary from distro to distro, so they are
 | 
			
		||||
out of scope for this document.
 | 
			
		||||
 | 
			
		||||
* Install gettys into the runlevels where you need them.
 | 
			
		||||
 | 
			
		||||
If you are using the provided /etc/init.d/agetty script,, you should
 | 
			
		||||
first create symlinks in /etc/init.d to it for the ports where you
 | 
			
		||||
want gettys to run, e.g. the following will work if you want gettys on
 | 
			
		||||
tty1-tty6.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# cd /etc/init.d
 | 
			
		||||
# for x in tty1 tty2 tty3 tty4 tty5 tty6; do
 | 
			
		||||
  ln -snf agetty agetty.$x
 | 
			
		||||
  done
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Once this is done, use ```rc-update``` as normal to install the agetty
 | 
			
		||||
services in the appropriate runlevels.
 | 
			
		||||
 | 
			
		||||
* Reboot your system.
 | 
			
		||||
 | 
			
		||||
At this point you are running under openrc-init, and you should use
 | 
			
		||||
openrc-shutdown to handle shutting down, powering off, rebooting etc.
 | 
			
		||||
 | 
			
		||||
## optional sysvinit compatibility
 | 
			
		||||
 | 
			
		||||
If you build and install OpenRC with MKSYSVINIT=yes, you will build and install
 | 
			
		||||
wrappers that make openrc-init compatible with sysvinit -- you will have
 | 
			
		||||
commands like "halt" "shutdown" "reboot" and "poweroff".
 | 
			
		||||
 | 
			
		||||
If you want this functionality on a live system, you should first
 | 
			
		||||
migrate the system to openrc-init, remove sysvinit, then rebuild and
 | 
			
		||||
install this package with MKSYSVINIT=yes.
 | 
			
		||||
 | 
			
		||||
package.
 | 
			
		||||
migrating your system to openrc-init.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								init.d/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,5 @@
 | 
			
		||||
agetty
 | 
			
		||||
binfmt
 | 
			
		||||
cgroups
 | 
			
		||||
modules-load
 | 
			
		||||
bootmisc
 | 
			
		||||
fsck
 | 
			
		||||
@@ -41,8 +40,6 @@ rc-enabled
 | 
			
		||||
rpcbind
 | 
			
		||||
runsvdir
 | 
			
		||||
savecore
 | 
			
		||||
save-keymaps
 | 
			
		||||
save-termencoding
 | 
			
		||||
swap-blk
 | 
			
		||||
swclock
 | 
			
		||||
syslogd
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,11 @@ SRCS-FreeBSD=	hostid.in modules.in moused.in newsyslog.in pf.in rarpd.in \
 | 
			
		||||
		rc-enabled.in rpcbind.in savecore.in syslogd.in
 | 
			
		||||
# These are FreeBSD specific
 | 
			
		||||
SRCS-FreeBSD+=	adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
 | 
			
		||||
		mixer.in nscd.in powerd.in syscons.in
 | 
			
		||||
		modules-load.in mixer.in nscd.in powerd.in syscons.in
 | 
			
		||||
 | 
			
		||||
SRCS-Linux=	agetty.in binfmt.in devfs.in cgroups.in dmesg.in hwclock.in \
 | 
			
		||||
	consolefont.in keymaps.in killprocs.in modules.in \
 | 
			
		||||
	mount-ro.in mtab.in numlock.in procfs.in net-online.in save-keymaps.in \
 | 
			
		||||
	save-termencoding.in sysfs.in termencoding.in
 | 
			
		||||
SRCS-Linux=	agetty.in binfmt.in devfs.in dmesg.in hwclock.in consolefont.in \
 | 
			
		||||
	keymaps.in killprocs.in modules.in modules-load.in mount-ro.in mtab.in \
 | 
			
		||||
	numlock.in procfs.in net-online.in sysfs.in termencoding.in
 | 
			
		||||
 | 
			
		||||
# Generic BSD scripts
 | 
			
		||||
SRCS-NetBSD=	hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
 | 
			
		||||
 
 | 
			
		||||
@@ -12,16 +12,15 @@
 | 
			
		||||
description="start agetty on a terminal line"
 | 
			
		||||
supervisor=supervise-daemon
 | 
			
		||||
port="${RC_SVCNAME#*.}"
 | 
			
		||||
respawn_period="${respawn_period:-60}"
 | 
			
		||||
term_type="${term_type:-linux}"
 | 
			
		||||
command=/sbin/agetty
 | 
			
		||||
command_args_foreground="${agetty_options} ${port} ${baud} ${term_type}"
 | 
			
		||||
pidfile="/run/${RC_SVCNAME}.pid"
 | 
			
		||||
export EINFO_QUIET="${quiet:-yes}"
 | 
			
		||||
 | 
			
		||||
depend() {
 | 
			
		||||
	after local
 | 
			
		||||
	keyword -prefix
 | 
			
		||||
	provide getty
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_pre() {
 | 
			
		||||
@@ -30,12 +29,5 @@ start_pre() {
 | 
			
		||||
		eerror "symbolic links to it for the ports you want to start"
 | 
			
		||||
		eerror "agetty on and add those to the appropriate runlevels."
 | 
			
		||||
		return 1
 | 
			
		||||
	else
 | 
			
		||||
		export EINFO_QUIET="${quiet:-yes}"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop_pre()
 | 
			
		||||
{
 | 
			
		||||
	export EINFO_QUIET="${quiet:-yes}"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,149 +0,0 @@
 | 
			
		||||
#!@SBINDIR@/openrc-run
 | 
			
		||||
# Copyright (c) 2017 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
description="Mount the control groups."
 | 
			
		||||
 | 
			
		||||
cgroup_opts=nodev,noexec,nosuid
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	keyword -docker -prefix -systemd-nspawn -vserver
 | 
			
		||||
	after sysfs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup1_base()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup /proc/filesystems || return 0
 | 
			
		||||
	if ! mountinfo -q /sys/fs/cgroup; then
 | 
			
		||||
		ebegin "Mounting cgroup filesystem"
 | 
			
		||||
		local opts="${cgroup_opts},mode=755,size=${rc_cgroupsize:-10m}"
 | 
			
		||||
		mount -n -t tmpfs -o "${opts}" cgroup_root /sys/fs/cgroup
 | 
			
		||||
		eend $?
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if ! mountinfo -q /sys/fs/cgroup/openrc; then
 | 
			
		||||
		local agent="${RC_LIBEXECDIR}/sh/cgroup-release-agent.sh"
 | 
			
		||||
		mkdir /sys/fs/cgroup/openrc
 | 
			
		||||
		mount -n -t cgroup \
 | 
			
		||||
			-o none,${cgroup_opts},name=openrc,release_agent="$agent" \
 | 
			
		||||
			openrc /sys/fs/cgroup/openrc
 | 
			
		||||
		printf 1 > /sys/fs/cgroup/openrc/notify_on_release
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup1_controllers()
 | 
			
		||||
{
 | 
			
		||||
	yesno "${rc_controller_cgroups:-YES}" && [ -e /proc/cgroups ]  &&
 | 
			
		||||
	grep -qw cgroup /proc/filesystems || return 0
 | 
			
		||||
	while read -r name _ _ enabled _; do
 | 
			
		||||
		case "${enabled}" in
 | 
			
		||||
			1)	mountinfo -q "/sys/fs/cgroup/${name}" && continue
 | 
			
		||||
				local x
 | 
			
		||||
				for x in $rc_cgroup_controllers; do
 | 
			
		||||
				[ "${name}" = "blkio" ] && [ "${x}" = "io" ] &&
 | 
			
		||||
					continue 2
 | 
			
		||||
				[ "${name}" = "${x}" ] &&
 | 
			
		||||
				continue 2
 | 
			
		||||
				done
 | 
			
		||||
				mkdir "/sys/fs/cgroup/${name}"
 | 
			
		||||
				mount -n -t cgroup -o "${cgroup_opts},${name}" \
 | 
			
		||||
					"${name}" "/sys/fs/cgroup/${name}"
 | 
			
		||||
				yesno "${rc_cgroup_memory_use_hierarchy:-no}" &&
 | 
			
		||||
					[ "${name}" = memory ] &&
 | 
			
		||||
					echo 1 > /sys/fs/cgroup/memory/memory.use_hierarchy
 | 
			
		||||
				;;
 | 
			
		||||
		esac
 | 
			
		||||
	done < /proc/cgroups
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_base()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup2 /proc/filesystems || return 0
 | 
			
		||||
	local base
 | 
			
		||||
	base="$(cgroup2_find_path)"
 | 
			
		||||
	mkdir -p "${base}"
 | 
			
		||||
	mount -t cgroup2 none -o "${cgroup_opts},nsdelegate" "${base}" 2> /dev/null ||
 | 
			
		||||
		mount -t cgroup2 none -o "${cgroup_opts}" "${base}"
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_controllers()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup2 /proc/filesystems || return 0
 | 
			
		||||
	local active cgroup_path x y
 | 
			
		||||
	cgroup_path="$(cgroup2_find_path)"
 | 
			
		||||
	[ -z "${cgroup_path}" ] && return 0
 | 
			
		||||
	[ -e "${cgroup_path}/cgroup.controllers" ] &&
 | 
			
		||||
	read -r active < "${cgroup_path}/cgroup.controllers"
 | 
			
		||||
	for x in ${rc_cgroup_controllers}; do
 | 
			
		||||
		for y in ${active}; do
 | 
			
		||||
		[ "$x" = "$y" ] &&
 | 
			
		||||
			[ -e "${cgroup_path}/cgroup.subtree_control" ]&&
 | 
			
		||||
			echo "+${x}"  > "${cgroup_path}/cgroup.subtree_control"
 | 
			
		||||
		done
 | 
			
		||||
	done
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_hybrid()
 | 
			
		||||
{
 | 
			
		||||
	cgroup1_base
 | 
			
		||||
	cgroup2_base
 | 
			
		||||
	cgroup2_controllers
 | 
			
		||||
	cgroup1_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_legacy()
 | 
			
		||||
{
 | 
			
		||||
	cgroup1_base
 | 
			
		||||
	cgroup1_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_unified()
 | 
			
		||||
{
 | 
			
		||||
	cgroup2_base
 | 
			
		||||
	cgroup2_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mount_cgroups()
 | 
			
		||||
{
 | 
			
		||||
	case "${rc_cgroup_mode:-hybrid}" in
 | 
			
		||||
	hybrid) cgroups_hybrid ;;
 | 
			
		||||
	legacy) cgroups_legacy ;;
 | 
			
		||||
	unified) cgroups_unified ;;
 | 
			
		||||
	esac
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
restorecon_cgroups()
 | 
			
		||||
{
 | 
			
		||||
	if [ -x /sbin/restorecon ]; then
 | 
			
		||||
		ebegin "Restoring SELinux contexts in /sys/fs/cgroup"
 | 
			
		||||
		restorecon -rF /sys/fs/cgroup >/dev/null 2>&1
 | 
			
		||||
		eend $?
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	# set up kernel support for cgroups
 | 
			
		||||
	if [ -d /sys/fs/cgroup ]; then
 | 
			
		||||
		mount_cgroups
 | 
			
		||||
		restorecon_cgroups
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
@@ -13,7 +13,7 @@ description="Sets a font for the consoles."
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need termencoding
 | 
			
		||||
	need localmount termencoding
 | 
			
		||||
	after hotplug bootmisc modules
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,12 +20,9 @@ depend()
 | 
			
		||||
 | 
			
		||||
mount_dev()
 | 
			
		||||
{
 | 
			
		||||
	local action conf_d_dir devfstype msg mountopts
 | 
			
		||||
	action=--mount
 | 
			
		||||
	conf_d_dir="${RC_SERVICE%/*/*}/conf.d"
 | 
			
		||||
	msg=Mounting
 | 
			
		||||
	local action=--mount devfstype msg=Mounting
 | 
			
		||||
	# Some devices require exec, Bug #92921
 | 
			
		||||
	mountopts="exec,nosuid,mode=0755"
 | 
			
		||||
	local mountopts="exec,nosuid,mode=0755"
 | 
			
		||||
	if yesno ${skip_mount_dev:-no} ; then
 | 
			
		||||
		einfo "/dev will not be mounted due to user request"
 | 
			
		||||
		return 0
 | 
			
		||||
@@ -36,7 +33,7 @@ mount_dev()
 | 
			
		||||
		msg=Remounting
 | 
			
		||||
	fi
 | 
			
		||||
	if fstabinfo -q /dev; then
 | 
			
		||||
		ebegin "$msg /dev according to fstab"
 | 
			
		||||
		ebegin "$msg /dev according to @SYSCONFDIR@/fstab"
 | 
			
		||||
		fstabinfo -q $action /dev
 | 
			
		||||
		eend $?
 | 
			
		||||
		return 0
 | 
			
		||||
@@ -57,7 +54,7 @@ mount_dev()
 | 
			
		||||
		ewarn "is no entry for /dev in fstab."
 | 
			
		||||
		ewarn "This means /dev will not be mounted."
 | 
			
		||||
		ewarn "To avoid this message, set CONFIG_DEVTMPFS or CONFIG_TMPFS to y"
 | 
			
		||||
		ewarn "in your kernel configuration or see ${conf_d_dir}/${RC_SVCNAME}"
 | 
			
		||||
		ewarn "in your kernel configuration or see @SYSCONFDIR@/conf.d/devfs"
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,9 @@ depend()
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	local h source x
 | 
			
		||||
	if [ -s /etc/hostname ] && [ -r /etc/hostname ]; then
 | 
			
		||||
		read h x </etc/hostname
 | 
			
		||||
		source="from /etc/hostname"
 | 
			
		||||
	if [ -s @SYSCONFDIR@/hostname ] && [ -r @SYSCONFDIR@/hostname ]; then
 | 
			
		||||
		read h x <@SYSCONFDIR@/hostname
 | 
			
		||||
		source="from @SYSCONFDIR@/hostname"
 | 
			
		||||
	else
 | 
			
		||||
		# HOSTNAME variable used to be defined in caps in conf.d/hostname.
 | 
			
		||||
		# It is also a magic variable in bash.
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@ start()
 | 
			
		||||
			done
 | 
			
		||||
			[ -n "$modname" ] &&
 | 
			
		||||
				ewarn "The $modname module needs to be configured in" \
 | 
			
		||||
					"${RC_SERVICE%/*/*}/conf.d/modules or built in."
 | 
			
		||||
					"@SYSCONFDIR@/conf.d/modules or built in."
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@ description="Applies a keymap for the consoles."
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need termencoding
 | 
			
		||||
	after devfs
 | 
			
		||||
	need localmount termencoding
 | 
			
		||||
	after bootmisc clock
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -68,5 +68,10 @@ start()
 | 
			
		||||
		echo "altgr keycode 18 = U+20AC" | loadkeys -q -
 | 
			
		||||
		eend $?
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
 | 
			
		||||
	# Save the keymapping for use immediately at boot
 | 
			
		||||
	if checkpath -W "$RC_LIBEXECDIR"; then
 | 
			
		||||
		mkdir -p "$RC_LIBEXECDIR"/console
 | 
			
		||||
		dumpkeys >"$RC_LIBEXECDIR"/console/keymap
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,10 +9,7 @@
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
conf_d_dir="${RC_SERVICE%/*/*}/conf.d"
 | 
			
		||||
local_d_dir="${RC_SERVICE%/*/*}/local.d"
 | 
			
		||||
 | 
			
		||||
description="Executes user programs in ${local_d_dir}"
 | 
			
		||||
description="Executes user programs in @SYSCONFDIR@/local.d"
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
@@ -22,12 +19,12 @@ depend()
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	local file has_errors redirect retval
 | 
			
		||||
	has_errors=0
 | 
			
		||||
	yesno $rc_verbose || redirect='> /dev/null 2>&1'
 | 
			
		||||
	ebegin "Starting local"
 | 
			
		||||
 | 
			
		||||
	local file has_errors=0 redirect retval
 | 
			
		||||
	yesno $rc_verbose || redirect='> /dev/null 2>&1'
 | 
			
		||||
	eindent
 | 
			
		||||
	for file in "${local_d_dir}"/*.start; do
 | 
			
		||||
	for file in @SYSCONFDIR@/local.d/*.start; do
 | 
			
		||||
		if [ -x "${file}" ]; then
 | 
			
		||||
			vebegin "Executing \"${file}\""
 | 
			
		||||
			eval "${file}" $redirect
 | 
			
		||||
@@ -41,32 +38,32 @@ start()
 | 
			
		||||
	eoutdent
 | 
			
		||||
 | 
			
		||||
	if command -v local_start >/dev/null 2>&1; then
 | 
			
		||||
		ewarn "\"${conf_d_dir}/local\" should be removed."
 | 
			
		||||
		ewarn "\"@SYSCONFDIR@/conf.d/local\" should be removed."
 | 
			
		||||
		ewarn "Please move the code from the local_start function"
 | 
			
		||||
		ewarn "to executable scripts with an .start extension"
 | 
			
		||||
		ewarn "in \"${local_d_dir}\""
 | 
			
		||||
		ewarn "in \"@SYSCONFDIR@/local.d\""
 | 
			
		||||
		local_start
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	eend ${has_errors}
 | 
			
		||||
 | 
			
		||||
	# We have to end with a zero exit code, because a failed execution
 | 
			
		||||
	# of an executable ${local_d_dir}/*.start file shouldn't result in
 | 
			
		||||
	# of an executable @SYSCONFDIR@/local.d/*.start file shouldn't result in
 | 
			
		||||
	# marking the local service as failed. Otherwise we are unable to
 | 
			
		||||
	# execute any executable ${local_d_dir}/*.stop file, because a failed
 | 
			
		||||
	# execute any executable @SYSCONFDIR@/local.d/*.stop file, because a failed
 | 
			
		||||
	# marked service cannot be stopped (and the stop function would
 | 
			
		||||
	# actually call the executable ${local_d_dir}/*.stop file(s)).
 | 
			
		||||
	# actually call the executable @SYSCONFDIR@/local.d/*.stop file(s)).
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop()
 | 
			
		||||
{
 | 
			
		||||
	local file has_errors redirect retval
 | 
			
		||||
	has_errors=0
 | 
			
		||||
	yesno $rc_verbose || redirect='> /dev/null 2>&1'
 | 
			
		||||
	ebegin "Stopping local"
 | 
			
		||||
 | 
			
		||||
	local file has_errors=0 redirect retval
 | 
			
		||||
	yesno $rc_verbose || redirect='> /dev/null 2>&1'
 | 
			
		||||
	eindent
 | 
			
		||||
	for file in "${local_d_dir}"/*.stop; do
 | 
			
		||||
	for file in @SYSCONFDIR@/local.d/*.stop; do
 | 
			
		||||
		if [ -x "${file}" ]; then
 | 
			
		||||
			vebegin "Executing \"${file}\""
 | 
			
		||||
			eval "${file}" $redirect
 | 
			
		||||
@@ -80,16 +77,16 @@ stop()
 | 
			
		||||
	eoutdent
 | 
			
		||||
 | 
			
		||||
	if command -v local_stop >/dev/null 2>&1; then
 | 
			
		||||
		ewarn "\"${conf_d_dir}/local\" should be removed."
 | 
			
		||||
		ewarn "\"@SYSCONFDIR@/conf.d/local\" should be removed."
 | 
			
		||||
		ewarn "Please move the code from the local_stop function"
 | 
			
		||||
		ewarn "to executable scripts with an .stop extension"
 | 
			
		||||
		ewarn "in \"${local_d_dir}\""
 | 
			
		||||
		ewarn "in \"@SYSCONFDIR@/local.d\""
 | 
			
		||||
		local_stop
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	eend ${has_errors}
 | 
			
		||||
 | 
			
		||||
	# An executable ${local_d_dir}/*.stop file which failed with a
 | 
			
		||||
	# An executable @SYSCONFDIR@/local.d/*.stop file which failed with a
 | 
			
		||||
	# non-zero exit status is not a reason to mark this service
 | 
			
		||||
	# as failed, therefore we have to end with a zero exit code.
 | 
			
		||||
	return 0
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ description="Mounts disks and swap according to /etc/fstab."
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need fsck
 | 
			
		||||
	use lvm modules root
 | 
			
		||||
	use lvm modules mtab root
 | 
			
		||||
	after clock lvm modules root
 | 
			
		||||
	keyword -docker -jail -lxc -prefix -systemd-nspawn -vserver
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										72
									
								
								init.d/modules-load.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								init.d/modules-load.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#!@SBINDIR@/openrc-run
 | 
			
		||||
# Copyright (c) 2016 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
description="Loads a list of modules from systemd-compatible locations."
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -vserver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
find_modfiles()
 | 
			
		||||
{
 | 
			
		||||
	local dirs="/usr/lib/modules-load.d /run/modules-load.d /etc/modules-load.d"
 | 
			
		||||
	local basenames files fn x y
 | 
			
		||||
	for x in $dirs; do
 | 
			
		||||
		[ ! -d $x ] && continue
 | 
			
		||||
		for y in $x/*.conf; do
 | 
			
		||||
			[ -f $y ] && basenames="${basenames}\n${y##*/}"
 | 
			
		||||
		done
 | 
			
		||||
	done
 | 
			
		||||
	basenames=$(printf "$basenames" | sort -u)
 | 
			
		||||
	for x in $basenames; do
 | 
			
		||||
		for y in $dirs; do
 | 
			
		||||
			[ -r $y/$x ] &&
 | 
			
		||||
				fn=$y/$x
 | 
			
		||||
		done
 | 
			
		||||
		files="$files $fn"
 | 
			
		||||
	done
 | 
			
		||||
	echo $files
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
load_modules()
 | 
			
		||||
{
 | 
			
		||||
	local file m modules rc x
 | 
			
		||||
	file=$1
 | 
			
		||||
	[ -z "$file" ] && return 0
 | 
			
		||||
	while read m x; do
 | 
			
		||||
		case $m in
 | 
			
		||||
			\;*) continue ;;
 | 
			
		||||
			\#*) continue ;;
 | 
			
		||||
			*) modules="$modules $m"
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
	done < $file
 | 
			
		||||
	for x in $modules; do
 | 
			
		||||
		ebegin "Loading module $x"
 | 
			
		||||
		case "$RC_UNAME" in
 | 
			
		||||
			FreeBSD) kldload "$x"; rc=$? ;;
 | 
			
		||||
			Linux) modprobe --use-blacklist -q "$x"; rc=$? ;;
 | 
			
		||||
			*) ;;
 | 
			
		||||
		esac
 | 
			
		||||
		eend $rc "Failed to load $x"
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	local x
 | 
			
		||||
	files=$(find_modfiles)
 | 
			
		||||
	for x in $files; do
 | 
			
		||||
		load_modules $x
 | 
			
		||||
	done
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
@@ -14,66 +14,10 @@ description="Loads a user defined list of kernel modules."
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	use isapnp
 | 
			
		||||
	provide modules-load
 | 
			
		||||
	want modules-load
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -vserver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
find_modfiles()
 | 
			
		||||
{
 | 
			
		||||
	local dirs="/usr/lib/modules-load.d /run/modules-load.d /etc/modules-load.d"
 | 
			
		||||
	local basenames files fn x y
 | 
			
		||||
	for x in $dirs; do
 | 
			
		||||
		[ ! -d $x ] && continue
 | 
			
		||||
		for y in $x/*.conf; do
 | 
			
		||||
			[ -f $y ] && basenames="${basenames}\n${y##*/}"
 | 
			
		||||
		done
 | 
			
		||||
	done
 | 
			
		||||
	basenames=$(printf "$basenames" | sort -u)
 | 
			
		||||
	for x in $basenames; do
 | 
			
		||||
		for y in $dirs; do
 | 
			
		||||
			[ -r $y/$x ] &&
 | 
			
		||||
				fn=$y/$x
 | 
			
		||||
		done
 | 
			
		||||
		files="$files $fn"
 | 
			
		||||
	done
 | 
			
		||||
	echo $files
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
load_modules()
 | 
			
		||||
{
 | 
			
		||||
	local file m modules rc x
 | 
			
		||||
	file=$1
 | 
			
		||||
	[ -z "$file" ] && return 0
 | 
			
		||||
	while read m x; do
 | 
			
		||||
		case $m in
 | 
			
		||||
			\;*) continue ;;
 | 
			
		||||
			\#*) continue ;;
 | 
			
		||||
			*) modules="$modules $m"
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
	done < $file
 | 
			
		||||
	for x in $modules; do
 | 
			
		||||
		ebegin "Loading module $x"
 | 
			
		||||
		case "$RC_UNAME" in
 | 
			
		||||
			FreeBSD) kldload "$x"; rc=$? ;;
 | 
			
		||||
			Linux) modprobe --first-time -q --use-blacklist "$x"; rc=$? ;;
 | 
			
		||||
			*) ;;
 | 
			
		||||
		esac
 | 
			
		||||
		eend $rc "Failed to load $x"
 | 
			
		||||
	done
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
modules_load_d()
 | 
			
		||||
{
 | 
			
		||||
	local x
 | 
			
		||||
	files=$(find_modfiles)
 | 
			
		||||
	for x in $files; do
 | 
			
		||||
		load_modules $x
 | 
			
		||||
	done
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FreeBSD_modules()
 | 
			
		||||
{
 | 
			
		||||
	local cnt=0 x
 | 
			
		||||
@@ -104,7 +48,7 @@ Linux_modules()
 | 
			
		||||
		x=${x%.*}
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	local list= x= xx= y= args=
 | 
			
		||||
	local list= x= xx= y= args= mpargs= a=
 | 
			
		||||
	for x in $kv_variant_list ; do
 | 
			
		||||
		eval list=\$modules_$(shell_var "$x")
 | 
			
		||||
		[ -n "$list" ] && break
 | 
			
		||||
@@ -113,13 +57,24 @@ Linux_modules()
 | 
			
		||||
 | 
			
		||||
	[ -n "$list" ] && ebegin "Loading kernel modules"
 | 
			
		||||
	for x in $list; do
 | 
			
		||||
		a=${x#*:}
 | 
			
		||||
		if [ "$a" = "$x" ]; then
 | 
			
		||||
			unset mpargs
 | 
			
		||||
		else
 | 
			
		||||
			x=${x%%:*}
 | 
			
		||||
			mpargs="-o $a"
 | 
			
		||||
		fi
 | 
			
		||||
		aa=$(shell_var "$a")
 | 
			
		||||
		xx=$(shell_var "$x")
 | 
			
		||||
		for y in $kv_variant_list ; do
 | 
			
		||||
			eval args=\$module_${aa}_args_$(shell_var "$y")
 | 
			
		||||
			[ -n "${args}" ] && break
 | 
			
		||||
			eval args=\$module_${xx}_args_$(shell_var "$y")
 | 
			
		||||
			[ -n "${args}" ] && break
 | 
			
		||||
		done
 | 
			
		||||
		[ -z "$args" ] && eval args=\$module_${aa}_args
 | 
			
		||||
		[ -z "$args" ] && eval args=\$module_${xx}_args
 | 
			
		||||
		eval modprobe --first-time --use-blacklist --verbose "$x" "$args"
 | 
			
		||||
		eval modprobe --use-blacklist --verbose "$mpargs" "$x" "$args"
 | 
			
		||||
	done
 | 
			
		||||
	[ -n "$list" ] && eend
 | 
			
		||||
}
 | 
			
		||||
@@ -127,10 +82,7 @@ Linux_modules()
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	case "$RC_UNAME" in
 | 
			
		||||
		FreeBSD|Linux)
 | 
			
		||||
			modules_load_d
 | 
			
		||||
			${RC_UNAME}_modules
 | 
			
		||||
			;;
 | 
			
		||||
		FreeBSD|Linux) ${RC_UNAME}_modules ;;
 | 
			
		||||
		*) ;;
 | 
			
		||||
	esac
 | 
			
		||||
	return 0
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ description="Update /etc/mtab to match what the kernel knows about"
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	after clock
 | 
			
		||||
	before localmount
 | 
			
		||||
	need root
 | 
			
		||||
	keyword -prefix -systemd-nspawn
 | 
			
		||||
}
 | 
			
		||||
@@ -31,10 +30,6 @@ start()
 | 
			
		||||
		einfo "Creating mtab symbolic link"
 | 
			
		||||
		ln -snf /proc/self/mounts /etc/mtab
 | 
			
		||||
	else
 | 
			
		||||
		ewarn "The ${RC_SVCNAME} service will be removed in the future."
 | 
			
		||||
		ewarn "Please change the mtab_is_file setting to no and run"
 | 
			
		||||
		ewarn "# rc-service mtab restart"
 | 
			
		||||
		ewarn "to create the mtab symbolic link."
 | 
			
		||||
		[ -L /etc/mtab ] && ewarn "Removing /etc/mtab symbolic link"
 | 
			
		||||
		rm -f /etc/mtab
 | 
			
		||||
		einfo "Creating mtab file"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ description="Delays until the network is online or a specific timeout"
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	after modules net
 | 
			
		||||
	after modules
 | 
			
		||||
	need sysfs
 | 
			
		||||
	provide network-online
 | 
			
		||||
	keyword -docker -jail -lxc -openvz -prefix -systemd-nspawn -uml -vserver
 | 
			
		||||
@@ -23,7 +23,6 @@ get_interfaces()
 | 
			
		||||
{
 | 
			
		||||
	local ifname iftype
 | 
			
		||||
	for ifname in /sys/class/net/*; do
 | 
			
		||||
		[ -h "${ifname}" ] && continue
 | 
			
		||||
		read iftype < ${ifname}/type
 | 
			
		||||
		[ "$iftype" = "1" ] && printf "%s " ${ifname##*/}
 | 
			
		||||
	done
 | 
			
		||||
@@ -32,7 +31,7 @@ get_interfaces()
 | 
			
		||||
start ()
 | 
			
		||||
{
 | 
			
		||||
	local carriers configured dev gateway ifcount infinite
 | 
			
		||||
	local carrier operstate rc
 | 
			
		||||
	local rc state x
 | 
			
		||||
 | 
			
		||||
	ebegin "Checking to see if the network is online"
 | 
			
		||||
	rc=0
 | 
			
		||||
@@ -45,12 +44,10 @@ start ()
 | 
			
		||||
	ifcount=0
 | 
			
		||||
 	for dev in ${interfaces}; do
 | 
			
		||||
		: $((ifcount += 1))
 | 
			
		||||
		read carrier < /sys/class/net/$dev/carrier 2> /dev/null ||
 | 
			
		||||
			carrier=
 | 
			
		||||
		[ "$carrier" = 1 ] && : $((carriers += 1))
 | 
			
		||||
		read operstate < /sys/class/net/$dev/operstate 2> /dev/null ||
 | 
			
		||||
			operstate=
 | 
			
		||||
		[ "$operstate" = up ] && : $((configured += 1))
 | 
			
		||||
		read x < /sys/class/net/$dev/carrier
 | 
			
		||||
		[ $x -eq 1 ] && : $((carriers += 1))
 | 
			
		||||
		read x < /sys/class/net/$dev/operstate
 | 
			
		||||
		[ "$x" = up ] && : $((configured += 1))
 | 
			
		||||
	done
 | 
			
		||||
	[ $configured -eq $ifcount ] && [ $carriers -ge 1 ] && break
 | 
			
		||||
	sleep 1
 | 
			
		||||
@@ -64,12 +61,8 @@ start ()
 | 
			
		||||
 if [ $rc -eq 0 ] && yesno ${include_ping_test:-no}; then
 | 
			
		||||
 	ping_test_host="${ping_test_host:-google.com}"
 | 
			
		||||
 	if [ -n "$ping_test_host" ]; then
 | 
			
		||||
		while $infinite || [ $timeout -gt 0 ]; do
 | 
			
		||||
			ping -c 1 $ping_test_host > /dev/null 2>&1
 | 
			
		||||
			rc=$?
 | 
			
		||||
			[ $rc -eq 0 ] && break
 | 
			
		||||
			: $((timeout -= 1))
 | 
			
		||||
		done
 | 
			
		||||
		ping -c 1 $ping_test_host > /dev/null 2>&1
 | 
			
		||||
		rc=$?
 | 
			
		||||
	fi
 | 
			
		||||
 fi
 | 
			
		||||
 eend $rc "The network is offline"
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ tentative()
 | 
			
		||||
 | 
			
		||||
	case "$RC_UNAME" in
 | 
			
		||||
	Linux)
 | 
			
		||||
		[ -n "$(command -v ip)" ] || return 1
 | 
			
		||||
		[ -x /sbin/ip ] || [ -x /bin/ip ] || return 1
 | 
			
		||||
		[ -n "$(ip -f inet6 addr show tentative)" ]
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
@@ -174,7 +174,7 @@ runip()
 | 
			
		||||
routeflush()
 | 
			
		||||
{
 | 
			
		||||
	if [ "$RC_UNAME" = Linux ]; then
 | 
			
		||||
		if [ -n "$(command -v ip)"  ]; then
 | 
			
		||||
		if [ -x /sbin/ip ] || [ -x /bin/ip ]; then
 | 
			
		||||
			ip route flush scope global
 | 
			
		||||
			ip route delete default 2>/dev/null
 | 
			
		||||
		else
 | 
			
		||||
@@ -346,7 +346,7 @@ stop()
 | 
			
		||||
		then
 | 
			
		||||
			veinfo "$int"
 | 
			
		||||
			runargs /etc/ifdown."$int" "$downcmd"
 | 
			
		||||
			if [ -n "$(command -v ip)" ]; then
 | 
			
		||||
			if [ -x /sbin/ip ] || [ -x /bin/ip ]; then
 | 
			
		||||
				# We need to do this, otherwise we may
 | 
			
		||||
				# fail to add things correctly on restart
 | 
			
		||||
				ip address flush dev "$int" 2>/dev/null
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need localmount
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -vserver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ depend()
 | 
			
		||||
	after clock
 | 
			
		||||
	use devfs
 | 
			
		||||
	want modules
 | 
			
		||||
	need localmount
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -vserver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -26,8 +27,8 @@ start()
 | 
			
		||||
		[ ! -e /proc/sys/fs/binfmt_misc/register ]; then
 | 
			
		||||
		if ! grep -qs binfmt_misc /proc/filesystems &&
 | 
			
		||||
			modprobe -q binfmt-misc; then
 | 
			
		||||
			ewarn "The binfmt-misc module needs to be loaded by" \
 | 
			
		||||
				"the modules service or built in."
 | 
			
		||||
			ewarn "The binfmt-misc module needs to be configured in" \
 | 
			
		||||
				"@SYSCONFDIR@/conf.d/modules or built in."
 | 
			
		||||
		fi
 | 
			
		||||
		if grep -qs binfmt_misc /proc/filesystems; then
 | 
			
		||||
			ebegin "Mounting misc binary format filesystem"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +0,0 @@
 | 
			
		||||
#!@SBINDIR@/openrc-run
 | 
			
		||||
# Copyright (c) 2018 Sony Interactive Entertainment, Inc.
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
description="Save the keymap for use as early as possible"
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need termencoding
 | 
			
		||||
	after bootmisc clock keymaps
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	# Save the keymapping for use immediately at boot
 | 
			
		||||
	ebegin "Saving key mapping"
 | 
			
		||||
	if checkpath -W "$RC_LIBEXECDIR"; then
 | 
			
		||||
		mkdir -p "$RC_LIBEXECDIR"/console
 | 
			
		||||
		dumpkeys >"$RC_LIBEXECDIR"/console/keymap
 | 
			
		||||
	fi
 | 
			
		||||
	eend $? "Unable to save keymapping"
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
#!@SBINDIR@/openrc-run
 | 
			
		||||
# Copyright (c) 2018 Sony Interactive Entertainment, Inc.
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
# except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
description="Configures terminal encoding."
 | 
			
		||||
 | 
			
		||||
ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
 | 
			
		||||
: ${unicode:=${UNICODE}}
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu
 | 
			
		||||
	use root
 | 
			
		||||
	after bootmisc clock termencoding
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	ebegin "Saving terminal encoding"
 | 
			
		||||
	# Save the encoding for use immediately at boot
 | 
			
		||||
	if checkpath -W "$RC_LIBEXECDIR"; then
 | 
			
		||||
		mkdir -p "$RC_LIBEXECDIR"/console
 | 
			
		||||
		if yesno ${unicode:-${UNICODE}}; then
 | 
			
		||||
			echo "" > "$RC_LIBEXECDIR"/console/unicode
 | 
			
		||||
		else
 | 
			
		||||
			rm -f "$RC_LIBEXECDIR"/console/unicode
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	eend 0
 | 
			
		||||
}
 | 
			
		||||
@@ -49,7 +49,7 @@ start()
 | 
			
		||||
	fi
 | 
			
		||||
	ebegin "Saving dependency cache"
 | 
			
		||||
	local rc=0 save=
 | 
			
		||||
	for x in depconfig deptree rc.log shutdowntime softlevel; do
 | 
			
		||||
	for x in shutdowntime softlevel rc.log; do
 | 
			
		||||
		[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x"
 | 
			
		||||
	done
 | 
			
		||||
	if [ -n "$save" ]; then
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	after clock root
 | 
			
		||||
	after clock
 | 
			
		||||
	before localmount
 | 
			
		||||
	keyword -docker -jail -lxc -openvz -prefix -systemd-nspawn -vserver
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ BSD_sysctl()
 | 
			
		||||
	[ -e /etc/sysctl.conf ] || return 0
 | 
			
		||||
	local retval=0 var= comments= conf=
 | 
			
		||||
	eindent
 | 
			
		||||
	for conf in /etc/sysctl.conf /etc/sysctl.d/*.conf; do
 | 
			
		||||
	for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
 | 
			
		||||
		if [ -r "$conf" ]; then
 | 
			
		||||
			vebegin "applying $conf"
 | 
			
		||||
			while read var comments; do
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										114
									
								
								init.d/sysfs.in
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								init.d/sysfs.in
									
									
									
									
									
								
							@@ -101,17 +101,128 @@ mount_misc()
 | 
			
		||||
	if [ -d /sys/firmware/efi/efivars ] &&
 | 
			
		||||
		! mountinfo -q /sys/firmware/efi/efivars; then
 | 
			
		||||
		ebegin "Mounting efivarfs filesystem"
 | 
			
		||||
		mount -n -t efivarfs -o ${sysfs_opts} \
 | 
			
		||||
		mount -n -t efivarfs -o ro \
 | 
			
		||||
			efivarfs /sys/firmware/efi/efivars 2> /dev/null
 | 
			
		||||
		eend 0
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup1_base()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup /proc/filesystems || return 0
 | 
			
		||||
	if ! mountinfo -q /sys/fs/cgroup; then
 | 
			
		||||
		ebegin "Mounting cgroup filesystem"
 | 
			
		||||
		local opts="${sysfs_opts},mode=755,size=${rc_cgroupsize:-10m}"
 | 
			
		||||
		mount -n -t tmpfs -o "${opts}" cgroup_root /sys/fs/cgroup
 | 
			
		||||
		eend $?
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if ! mountinfo -q /sys/fs/cgroup/openrc; then
 | 
			
		||||
		local agent="${RC_LIBEXECDIR}/sh/cgroup-release-agent.sh"
 | 
			
		||||
		mkdir /sys/fs/cgroup/openrc
 | 
			
		||||
		mount -n -t cgroup \
 | 
			
		||||
			-o none,${sysfs_opts},name=openrc,release_agent="$agent" \
 | 
			
		||||
			openrc /sys/fs/cgroup/openrc
 | 
			
		||||
		printf 1 > /sys/fs/cgroup/openrc/notify_on_release
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup1_controllers()
 | 
			
		||||
{
 | 
			
		||||
	yesno "${rc_controller_cgroups:-YES}" && [ -e /proc/cgroups ] || return 0
 | 
			
		||||
	while read -r name _ _ enabled rest; do
 | 
			
		||||
		case "${enabled}" in
 | 
			
		||||
			1)	mountinfo -q "/sys/fs/cgroup/${name}" && continue
 | 
			
		||||
				local x
 | 
			
		||||
				for x in $rc_cgroup_controllers; do
 | 
			
		||||
				[ "${name}" = "blkio" ] && [ "${x}" = "io" ] &&
 | 
			
		||||
					continue 2
 | 
			
		||||
				[ "${name}" = "${x}" ] &&
 | 
			
		||||
				continue 2
 | 
			
		||||
				done
 | 
			
		||||
				mkdir "/sys/fs/cgroup/${name}"
 | 
			
		||||
				mount -n -t cgroup -o "${sysfs_opts},${name}" \
 | 
			
		||||
					"${name}" "/sys/fs/cgroup/${name}"
 | 
			
		||||
				;;
 | 
			
		||||
		esac
 | 
			
		||||
	done < /proc/cgroups
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_base()
 | 
			
		||||
{
 | 
			
		||||
	local base
 | 
			
		||||
	base="$(cgroup2_find_path)"
 | 
			
		||||
	mkdir -p "${base}"
 | 
			
		||||
	mount -t cgroup2 none -o "${sysfs_opts},nsdelegate" "${base}" 2> /dev/null ||
 | 
			
		||||
		mount -t cgroup2 none -o "${sysfs_opts}" "${base}"
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_controllers()
 | 
			
		||||
{
 | 
			
		||||
	local active cgroup_path x y
 | 
			
		||||
	cgroup_path="$(cgroup2_find_path)"
 | 
			
		||||
	[ -z "${cgroup_path}" ] && return 0
 | 
			
		||||
	[ -e "${cgroup_path}/cgroup.controllers" ] &&
 | 
			
		||||
	read -r active < "${cgroup_path}/cgroup.controllers"
 | 
			
		||||
	for x in ${rc_cgroup_controllers}; do
 | 
			
		||||
		for y in ${active}; do
 | 
			
		||||
		[ "$x" = "$y" ] &&
 | 
			
		||||
			[ -e "${cgroup_path}/cgroup.subtree_control" ]&&
 | 
			
		||||
			echo "+${x}"  > "${cgroup_path}/cgroup.subtree_control"
 | 
			
		||||
		done
 | 
			
		||||
	done
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_hybrid()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup /proc/filesystems || return 0
 | 
			
		||||
	cgroup1_base
 | 
			
		||||
	if grep -qw cgroup2 /proc/filesystems; then
 | 
			
		||||
		cgroup2_base
 | 
			
		||||
		cgroup2_controllers
 | 
			
		||||
	fi
 | 
			
		||||
	cgroup1_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_legacy()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup /proc/filesystems || return 0
 | 
			
		||||
	cgroup1_base
 | 
			
		||||
	cgroup1_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_unified()
 | 
			
		||||
{
 | 
			
		||||
	cgroup2_base
 | 
			
		||||
	cgroup2_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mount_cgroups()
 | 
			
		||||
{
 | 
			
		||||
	# set up kernel support for cgroups
 | 
			
		||||
	if [ -d /sys/fs/cgroup ]; then
 | 
			
		||||
		case "${rc_cgroup_mode:-hybrid}" in
 | 
			
		||||
		hybrid) cgroups_hybrid ;;
 | 
			
		||||
		legacy) cgroups_legacy ;;
 | 
			
		||||
		unified) cgroups_unified ;;
 | 
			
		||||
		esac
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
restorecon_sys()
 | 
			
		||||
{
 | 
			
		||||
	if [ -x /sbin/restorecon ]; then
 | 
			
		||||
		ebegin "Restoring SELinux contexts in /sys"
 | 
			
		||||
		restorecon -F /sys/devices/system/cpu/online >/dev/null 2>&1
 | 
			
		||||
		restorecon -rF /sys/fs/cgroup >/dev/null 2>&1
 | 
			
		||||
		eend $?
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
@@ -120,6 +231,7 @@ start()
 | 
			
		||||
{
 | 
			
		||||
	mount_sys
 | 
			
		||||
	mount_misc
 | 
			
		||||
	mount_cgroups
 | 
			
		||||
	restorecon_sys
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,8 @@ ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}}
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	keyword -docker -lxc -openvz -prefix -systemd-nspawn -uml -vserver -xenu
 | 
			
		||||
	after devfs
 | 
			
		||||
	use root
 | 
			
		||||
	after bootmisc clock
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
.\" This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
.\"    except according to the terms contained in the LICENSE file.
 | 
			
		||||
.\"
 | 
			
		||||
.Dd November 30, 2017
 | 
			
		||||
.Dd December 31, 2011
 | 
			
		||||
.Dt openrc-run 8 SMM
 | 
			
		||||
.Os OpenRC
 | 
			
		||||
.Sh NAME
 | 
			
		||||
@@ -111,17 +111,11 @@ 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_force_kill
 | 
			
		||||
Should we force-kill this service if s6_service_timeout_stop expires
 | 
			
		||||
but the service doesn't go down during shutdown? The default is yes.
 | 
			
		||||
.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 60000.
 | 
			
		||||
to go down when stopping the service. The default is 10000.
 | 
			
		||||
.It Ar start_stop_daemon_args
 | 
			
		||||
List of arguments passed to start-stop-daemon when starting the daemon.
 | 
			
		||||
.It Ar supervise_daemon_args
 | 
			
		||||
List of arguments passed to supervise-daemon when starting the daemon.
 | 
			
		||||
If undefined, start_stop_daemon_args is used as a fallback.
 | 
			
		||||
.It Ar command
 | 
			
		||||
Daemon to start or stop via
 | 
			
		||||
.Nm start-stop-daemon
 | 
			
		||||
@@ -145,56 +139,21 @@ List of arguments to pass to the daemon when starting via
 | 
			
		||||
.Nm supervise-daemon .
 | 
			
		||||
to force the daemon to stay in the foreground
 | 
			
		||||
.It Ar command_background
 | 
			
		||||
Set this to "true", "yes" or "1" (case-insensitive) if you want
 | 
			
		||||
Set this to "true", "yes" or "1" (case-insensitive) if you want 
 | 
			
		||||
.Xr start-stop-daemon 8
 | 
			
		||||
to force the daemon into the background. This forces the
 | 
			
		||||
"--make-pidfile" and "--pidfile" options, so the pidfile variable must be set.
 | 
			
		||||
.It Ar command_progress
 | 
			
		||||
Set this to "true", "yes" or "1" (case-insensitive) if you want
 | 
			
		||||
Set this to "true", "yes" or "1" (case-insensitive) if you want 
 | 
			
		||||
.Xr start-stop-daemon 8
 | 
			
		||||
to display a progress meter when waiting for a daemon to stop.
 | 
			
		||||
.It Ar command_user
 | 
			
		||||
If the daemon does not support changing to a different user id, you can
 | 
			
		||||
use this to change the user id, and optionally group id,  before
 | 
			
		||||
use this to change the user id before
 | 
			
		||||
.Xr start-stop-daemon 8
 | 
			
		||||
or
 | 
			
		||||
.Xr supervise-daemon 8
 | 
			
		||||
launches the daemon.
 | 
			
		||||
.It Ar output_log
 | 
			
		||||
This is the path to a file or named pipe where the standard output from
 | 
			
		||||
the service will be redirected. If you are starting this service with
 | 
			
		||||
.Xr start-stop-daemon 8 ,
 | 
			
		||||
,  you must set
 | 
			
		||||
.Pa command_background
 | 
			
		||||
to true. Keep in mind that this path will be inside the chroot if the
 | 
			
		||||
.Pa chroot
 | 
			
		||||
variable is set.
 | 
			
		||||
.It Ar error_log
 | 
			
		||||
The same thing as
 | 
			
		||||
.Pa output_log
 | 
			
		||||
but for the standard error output.
 | 
			
		||||
.It Ar output_logger
 | 
			
		||||
This is a process which will be used to log the standard output from the
 | 
			
		||||
service.  If you are starting this service with
 | 
			
		||||
.Xr start-stop-daemon 8 ,
 | 
			
		||||
,  you must set
 | 
			
		||||
.Pa command_background
 | 
			
		||||
to true. Keep in mind that this command must be executable as a shell
 | 
			
		||||
command inside the chroot if the
 | 
			
		||||
.Pa chroot
 | 
			
		||||
variable is set. Keep in mind also that this command works by accepting
 | 
			
		||||
the stdout of the service on stdin.
 | 
			
		||||
An example of a command that can be run this way is logger if you want
 | 
			
		||||
your service output to go to syslog.
 | 
			
		||||
.It Ar error_logger
 | 
			
		||||
The same thing as
 | 
			
		||||
.Pa output_logger
 | 
			
		||||
but for the standard error output.
 | 
			
		||||
.It Ar directory
 | 
			
		||||
.Xr start-stop-daemon 8
 | 
			
		||||
and
 | 
			
		||||
.Xr supervise-daemon 8
 | 
			
		||||
will chdir to this directory before starting the daemon.
 | 
			
		||||
launches the daemon
 | 
			
		||||
.It Ar chroot
 | 
			
		||||
.Xr start-stop-daemon 8
 | 
			
		||||
and
 | 
			
		||||
@@ -239,8 +198,6 @@ 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.
 | 
			
		||||
.It Ar umask
 | 
			
		||||
Set the umask of the daemon.
 | 
			
		||||
.Pp
 | 
			
		||||
Keep in mind that eval is used to process chroot, command, command_args_*,
 | 
			
		||||
command_user, pidfile and procname. This may affect how they are
 | 
			
		||||
@@ -490,7 +447,6 @@ Also, the -d, -f or -p options should not be specified along with this option.
 | 
			
		||||
.Pp
 | 
			
		||||
The -q option suppresses all informational output. If it is specified
 | 
			
		||||
twice, all error messages are suppressed as well.
 | 
			
		||||
.It Xo
 | 
			
		||||
.Ic fstabinfo
 | 
			
		||||
.Op Fl M , -mount
 | 
			
		||||
.Op Fl R , -remount
 | 
			
		||||
@@ -507,7 +463,6 @@ remounted.
 | 
			
		||||
.Pp
 | 
			
		||||
The -q option suppresses all informational output. If it is specified
 | 
			
		||||
twice, all error messages are suppressed as well.
 | 
			
		||||
.It Xo
 | 
			
		||||
.Ic mountinfo
 | 
			
		||||
.Op Fl f, -fstype-regex Ar regex
 | 
			
		||||
.Op Fl F, -skip-fstype-regex Ar regex
 | 
			
		||||
@@ -522,7 +477,7 @@ twice, all error messages are suppressed as well.
 | 
			
		||||
.Op Fl i, -options
 | 
			
		||||
.Op Fl s, -fstype
 | 
			
		||||
.Op Fl t, -node
 | 
			
		||||
.Ar mount1 mount2 ...
 | 
			
		||||
  .Ar mount1 mount2 ...
 | 
			
		||||
.Xc
 | 
			
		||||
The f, F, n, N, o, O, p, P, e and E options specify what you want to
 | 
			
		||||
search for or skip in the mounted file systems. The i, s and t options
 | 
			
		||||
@@ -614,7 +569,7 @@ rc_net_tap1_provide="!net"
 | 
			
		||||
# It's also possible to negate keywords. This is mainly useful for prefix
 | 
			
		||||
# users testing OpenRC.
 | 
			
		||||
rc_keyword="!-prefix"
 | 
			
		||||
# This can also be used to block a script from running in all
 | 
			
		||||
# This can also be used to block a script from runining in all
 | 
			
		||||
# containers except one or two
 | 
			
		||||
rc_keyword="!-containers !-docker"
 | 
			
		||||
.Ed
 | 
			
		||||
@@ -753,8 +708,6 @@ Users are encouraged to use the is_newer_than function which returns correctly.
 | 
			
		||||
.Xr rc_plugin_hook 3 ,
 | 
			
		||||
.Xr sh 1p ,
 | 
			
		||||
.Xr start-stop-daemon 8 ,
 | 
			
		||||
.Xr supervise-daemon 8 ,
 | 
			
		||||
.Xr uname 1
 | 
			
		||||
.Sh AUTHORS
 | 
			
		||||
.An Roy Marples <roy@marples.name>
 | 
			
		||||
.An William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 
 | 
			
		||||
@@ -16,36 +16,15 @@
 | 
			
		||||
.Nd bring the system down
 | 
			
		||||
.Sh SYNOPSIS
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl c , -cancel
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl R , -reexec
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl w , -write-only
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl d , -no-write
 | 
			
		||||
.Op Fl D , -dry-run
 | 
			
		||||
.Op Fl H , -halt
 | 
			
		||||
time
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl d , -no-write
 | 
			
		||||
.Op Fl D , -dry-run
 | 
			
		||||
.Op Fl k , -kexec
 | 
			
		||||
time
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl d , -no-write
 | 
			
		||||
.Op Fl D , -dry-run
 | 
			
		||||
.Op Fl p , -poweroff
 | 
			
		||||
time
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl d , -no-write
 | 
			
		||||
.Op Fl D , -dry-run
 | 
			
		||||
.Op Fl R , -reexec
 | 
			
		||||
.Op Fl r , -reboot
 | 
			
		||||
time
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl d , -no-write
 | 
			
		||||
.Op Fl D , -dry-run
 | 
			
		||||
.Op Fl s , -single
 | 
			
		||||
time
 | 
			
		||||
.Op Fl w , -write-only
 | 
			
		||||
.Sh DESCRIPTION
 | 
			
		||||
.Nm
 | 
			
		||||
is the utility that communicates with
 | 
			
		||||
@@ -53,8 +32,6 @@ is the utility that communicates with
 | 
			
		||||
to bring down the system or instruct openrc-init to re-execute itself.
 | 
			
		||||
It supports the following options:
 | 
			
		||||
.Bl -tag -width "poweroff"
 | 
			
		||||
.It Fl c , -cancel
 | 
			
		||||
Cancel a pending shutdown.
 | 
			
		||||
.It Fl d , -no-write
 | 
			
		||||
Do not write the wtmp boot record.
 | 
			
		||||
.It Fl D , -dry-run
 | 
			
		||||
@@ -76,7 +53,7 @@ Stop all services, kill all processes and reboot the system.
 | 
			
		||||
.It Fl s , -single
 | 
			
		||||
Stop all services, kill all processes and move to single user mode.
 | 
			
		||||
.It Fl w , -write-only
 | 
			
		||||
Wrrite a wtmp shutdown record and do nothing else.
 | 
			
		||||
Stop all services, kill all processes and move to single user mode.
 | 
			
		||||
.El
 | 
			
		||||
.Sh SEE ALSO
 | 
			
		||||
.Xr openrc-init 8 ,
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,6 @@ and
 | 
			
		||||
.Xr shutdown 8
 | 
			
		||||
and let them call these special runlevels.
 | 
			
		||||
.Sh SEE ALSO
 | 
			
		||||
.Xr openrc-run 8 ,
 | 
			
		||||
.Xr rc-status 8 ,
 | 
			
		||||
.Xr rc-update 8 ,
 | 
			
		||||
.Xr init 8 ,
 | 
			
		||||
 
 | 
			
		||||
@@ -16,18 +16,6 @@
 | 
			
		||||
.Nd locate and run an OpenRC service with the given arguments
 | 
			
		||||
.Sh SYNOPSIS
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl c , -ifcrashed
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Fl d , -debug
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Fl D , -nodeps
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl i , -ifexists
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
@@ -40,21 +28,9 @@
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl s , -ifstarted
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl S , -ifstopped
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Fl e , -exists
 | 
			
		||||
.Ar service
 | 
			
		||||
.Nm
 | 
			
		||||
.Fl Z , -dry-run
 | 
			
		||||
.Ar service cmd
 | 
			
		||||
.Op Ar ...
 | 
			
		||||
.Nm
 | 
			
		||||
.Fl l , -list
 | 
			
		||||
.Nm
 | 
			
		||||
.Fl r , -resolve
 | 
			
		||||
@@ -88,15 +64,6 @@ return 0 if it can find
 | 
			
		||||
otherwise -1.
 | 
			
		||||
.Fl r , -resolve
 | 
			
		||||
does the same and also prints the full path of the service to stdout.
 | 
			
		||||
.Pp
 | 
			
		||||
.Fl d , -debug
 | 
			
		||||
sets -x when running the service script(s).
 | 
			
		||||
.Pp
 | 
			
		||||
.Fl D , -nodeps
 | 
			
		||||
ignores dependencies when running the service.
 | 
			
		||||
.Pp
 | 
			
		||||
.Fl Z , -dry-run
 | 
			
		||||
displays commands rather than executing them.
 | 
			
		||||
.Sh SEE ALSO
 | 
			
		||||
.Xr openrc 8 ,
 | 
			
		||||
.Xr stdout 3
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@
 | 
			
		||||
.Sh SYNOPSIS
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl aclsuC
 | 
			
		||||
.Op Fl f Ar ini
 | 
			
		||||
.Op Ar runlevel
 | 
			
		||||
.Sh DESCRIPTION
 | 
			
		||||
.Nm
 | 
			
		||||
@@ -38,17 +37,12 @@ The options are as follows:
 | 
			
		||||
Show all runlevels and their services.
 | 
			
		||||
.It Fl c , -crashed
 | 
			
		||||
List all services that have crashed.
 | 
			
		||||
.It Fl f , -format
 | 
			
		||||
Select a format for the output. Currently, the only one that can be
 | 
			
		||||
specified is ini, which outputs in *.ini format.
 | 
			
		||||
.It Fl l , -list
 | 
			
		||||
List all defined runlevels.
 | 
			
		||||
.It Fl m , -manual
 | 
			
		||||
Show all manually started services.
 | 
			
		||||
.It Fl r , -runlevel
 | 
			
		||||
Print the current runlevel name.
 | 
			
		||||
.It Fl S , -supervised
 | 
			
		||||
Show all supervised services.
 | 
			
		||||
.It Fl s , -servicelist
 | 
			
		||||
Show all services.
 | 
			
		||||
.It Fl u , -unused
 | 
			
		||||
 
 | 
			
		||||
@@ -131,34 +131,9 @@ Modifies the scheduling priority of the daemon.
 | 
			
		||||
.It Fl 1 , -stdout Ar logfile
 | 
			
		||||
Redirect the standard output of the process to logfile when started with
 | 
			
		||||
.Fl background .
 | 
			
		||||
The logfile Must be an absolute pathname, but relative to the path
 | 
			
		||||
optionally given with
 | 
			
		||||
Must be an absolute pathname, but relative to the path optionally given with
 | 
			
		||||
.Fl r , -chroot .
 | 
			
		||||
The logfile can also be a named pipe.
 | 
			
		||||
.It Fl 2 , -stderr Ar logfile
 | 
			
		||||
Redirect the standard error of the process to logfile when started with
 | 
			
		||||
.Fl background .
 | 
			
		||||
The logfile must be an absolute pathname, but relative to the path
 | 
			
		||||
optionally given with
 | 
			
		||||
.Fl r , -chroot .
 | 
			
		||||
The logfile can also be a named pipe.
 | 
			
		||||
.It Fl 3 , -stdout-logger Ar cmd
 | 
			
		||||
Run cmd as a child process redirecting the standard output to the
 | 
			
		||||
standard input of cmd when started with
 | 
			
		||||
.Fl background .
 | 
			
		||||
Cmd must be an absolute pathname, but relative to the path optionally given with
 | 
			
		||||
.Fl r , -chroot .
 | 
			
		||||
This process must be prepared to accept input on stdin and be able to
 | 
			
		||||
log it or send it to another location.
 | 
			
		||||
.It Fl 4 , -stderr-logger Ar cmd
 | 
			
		||||
Run cmd as a child process and 
 | 
			
		||||
Redirect the standard error of the process to the standard input of cmd
 | 
			
		||||
when started with
 | 
			
		||||
.Fl background .
 | 
			
		||||
Cmd must be an absolute pathname, but relative to the path optionally given with
 | 
			
		||||
.Fl r , -chroot .
 | 
			
		||||
This process must be prepared to accept input on stdin and be able to
 | 
			
		||||
log it or send it to another location.
 | 
			
		||||
.It Fl w , -wait Ar milliseconds
 | 
			
		||||
Wait
 | 
			
		||||
.Ar milliseconds
 | 
			
		||||
@@ -176,7 +151,6 @@ These options are only used for stopping daemons:
 | 
			
		||||
.It Fl R , -retry Ar timeout | Ar signal Ns / Ns Ar timeout
 | 
			
		||||
The retry specification can be either a timeout in seconds or multiple
 | 
			
		||||
signal/timeout pairs (like SIGTERM/5).
 | 
			
		||||
If this option is not given, the default is SIGTERM/5.
 | 
			
		||||
.El
 | 
			
		||||
.Sh ENVIRONMENT
 | 
			
		||||
.Va SSD_IONICELEVEL
 | 
			
		||||
 
 | 
			
		||||
@@ -9,18 +9,13 @@
 | 
			
		||||
.\"    except according to the terms contained in the LICENSE file.
 | 
			
		||||
.\"
 | 
			
		||||
.Dd April 27, 2016
 | 
			
		||||
.Dt SUPERVISE-DAEMON 8 SMM
 | 
			
		||||
.Dt supervise-DAEMON 8 SMM
 | 
			
		||||
.Os OpenRC
 | 
			
		||||
.Sh NAME
 | 
			
		||||
.Nm supervise-daemon
 | 
			
		||||
.Nd starts a daemon and restarts it if it crashes
 | 
			
		||||
.Sh SYNOPSIS
 | 
			
		||||
.Nm
 | 
			
		||||
servicename
 | 
			
		||||
.Fl a , -healthcheck-timer
 | 
			
		||||
.Ar seconds
 | 
			
		||||
.Fl A , -healthcheck-delay
 | 
			
		||||
.Ar seconds
 | 
			
		||||
.Fl D , -respawn-delay
 | 
			
		||||
.Ar seconds
 | 
			
		||||
.Fl d , -chdir
 | 
			
		||||
@@ -37,6 +32,8 @@ servicename
 | 
			
		||||
.Ar count
 | 
			
		||||
.Fl N , -nicelevel
 | 
			
		||||
.Ar level
 | 
			
		||||
.Fl p , -pidfile
 | 
			
		||||
.Ar pidfile
 | 
			
		||||
.Fl P , -respawn-period
 | 
			
		||||
.Ar seconds
 | 
			
		||||
.Fl R , -retry
 | 
			
		||||
@@ -54,15 +51,10 @@ servicename
 | 
			
		||||
.Op Fl -
 | 
			
		||||
.Op Ar arguments
 | 
			
		||||
.Nm
 | 
			
		||||
servicename
 | 
			
		||||
.Fl K , -stop
 | 
			
		||||
.Ar daemon
 | 
			
		||||
.Fl r , -chroot
 | 
			
		||||
.Ar chrootpath
 | 
			
		||||
.Nm
 | 
			
		||||
servicename
 | 
			
		||||
.Fl s , -signal
 | 
			
		||||
.Ar signal
 | 
			
		||||
.Fl p , -pidfile
 | 
			
		||||
.Ar pidfile
 | 
			
		||||
.Fl r , -chroot
 | 
			
		||||
.Ar chrootpath
 | 
			
		||||
.Sh DESCRIPTION
 | 
			
		||||
@@ -70,15 +62,22 @@ servicename
 | 
			
		||||
provides a consistent method of starting, stopping and restarting
 | 
			
		||||
daemons. If
 | 
			
		||||
.Fl K , -stop
 | 
			
		||||
or
 | 
			
		||||
.Fl s , -signal
 | 
			
		||||
is not provided, then we assume we are starting the daemon.
 | 
			
		||||
.Nm
 | 
			
		||||
only works with daemons which do not fork. If your daemon has options to
 | 
			
		||||
tell it not to fork, it should be configured to not fork.
 | 
			
		||||
only works with daemons which do not fork. Also, it uses its own pid
 | 
			
		||||
file, so the daemon should not write a pid file, or the pid file passed
 | 
			
		||||
to 
 | 
			
		||||
.Nm
 | 
			
		||||
should not be the one the daemon writes.
 | 
			
		||||
.Pp
 | 
			
		||||
Here are the options to specify the daemon and how it should start or stop:
 | 
			
		||||
.Bl -tag -width indent
 | 
			
		||||
.It Fl p , -pidfile Ar pidfile
 | 
			
		||||
When starting, we write a
 | 
			
		||||
.Ar pidfile
 | 
			
		||||
so we know which supervisor to stop.  When stopping we only stop the pid(s)
 | 
			
		||||
listed in the
 | 
			
		||||
.Ar pidfile .
 | 
			
		||||
.It Fl u , -user Ar user Ns Op : Ns Ar group
 | 
			
		||||
Start the daemon as the
 | 
			
		||||
.Ar user
 | 
			
		||||
@@ -88,17 +87,11 @@ owned by the user. You can optionally append a
 | 
			
		||||
name here also.
 | 
			
		||||
.It Fl v , -verbose
 | 
			
		||||
Print the action(s) that are taken just before doing them.
 | 
			
		||||
.El
 | 
			
		||||
.Pp
 | 
			
		||||
The options are as follows:
 | 
			
		||||
.Bl -tag -width indent
 | 
			
		||||
.It Fl a , -healthcheck-timer Ar seconds
 | 
			
		||||
Run the healthcheck() command, possibly followed by the unhealthy()
 | 
			
		||||
command every time this number of seconds passes.
 | 
			
		||||
.It Fl A , -healthcheck-delay Ar seconds
 | 
			
		||||
Wait this long before the first health check.
 | 
			
		||||
.It Fl D , -respawn-delay Ar seconds
 | 
			
		||||
Wait this number of seconds before restarting a daemon after it crashes.
 | 
			
		||||
wait this number of seconds before restarting a daemon after it crashes.
 | 
			
		||||
The default is 0.
 | 
			
		||||
.It Fl d , -chdir Ar path
 | 
			
		||||
chdir to this directory before starting the daemon.
 | 
			
		||||
@@ -113,31 +106,23 @@ Data can be from 0 to 7 inclusive.
 | 
			
		||||
.It Fl k , -umask Ar mode
 | 
			
		||||
Set the umask of the daemon.
 | 
			
		||||
.It Fl m , -respawn-max Ar count
 | 
			
		||||
Sets the maximum number of times a daemon will be respawned. If a daemon
 | 
			
		||||
crashes more than this number of times,
 | 
			
		||||
Sets the maximum number of times a daemon will be respawned during a
 | 
			
		||||
respawn period. If a daemon dies more than this number of times during a
 | 
			
		||||
respawn period,
 | 
			
		||||
.Nm
 | 
			
		||||
will give up and exit. The default is 10 and 0 means unlimited.
 | 
			
		||||
.Pp
 | 
			
		||||
If respawn-period is also set, more than respawn-max crashes must occur
 | 
			
		||||
during respawn-period seconds to cause
 | 
			
		||||
.Nm
 | 
			
		||||
to give up and exit.
 | 
			
		||||
will give up trying to respawn it and exit. The default is 10, and 0
 | 
			
		||||
means unlimited.
 | 
			
		||||
.It Fl N , -nicelevel Ar level
 | 
			
		||||
Modifies the scheduling priority of the daemon.
 | 
			
		||||
.It Fl P , -respawn-period Ar seconds
 | 
			
		||||
Sets the length of a respawn period. See the
 | 
			
		||||
Sets the length of a respawn period. The default is 10 seconds. See the
 | 
			
		||||
description of --respawn-max for more information.
 | 
			
		||||
.It Fl R , -retry Ar timeout | Ar signal Ns / Ns Ar timeout
 | 
			
		||||
The retry specification can be either a timeout in seconds or multiple
 | 
			
		||||
signal/timeout pairs (like SIGTERM/5).
 | 
			
		||||
If this option is not given, the default is SIGTERM/5.
 | 
			
		||||
.It Fl r , -chroot Ar path
 | 
			
		||||
chroot to this directory before starting the daemon. All other paths, such
 | 
			
		||||
as the path to the daemon and chdir should be relative to the chroot.
 | 
			
		||||
.It Fl  , -signal Ar signal
 | 
			
		||||
Instruct a supervisor to signal the process it is supervising. The
 | 
			
		||||
process to communicate with is determined by the name of the service
 | 
			
		||||
taken from the RC_SVCNAME environment variable.
 | 
			
		||||
as the path to the daemon, chdir and pidfile, should be relative to the chroot.
 | 
			
		||||
.It Fl u , -user Ar user
 | 
			
		||||
Start the daemon as the specified user.
 | 
			
		||||
.It Fl 1 , -stdout Ar logfile
 | 
			
		||||
@@ -150,6 +135,7 @@ The same thing as
 | 
			
		||||
.Fl 1 , -stdout
 | 
			
		||||
but with the standard error output.
 | 
			
		||||
.El
 | 
			
		||||
.El
 | 
			
		||||
.Sh ENVIRONMENT
 | 
			
		||||
.Va SSD_NICELEVEL
 | 
			
		||||
can also set the scheduling priority of the daemon, but the command line
 | 
			
		||||
@@ -171,16 +157,15 @@ make sure the settings mmake sense. For example, a respawn period of 5
 | 
			
		||||
seconds with a respawn max of 10 and a respawn delay of 1 second leads
 | 
			
		||||
to infinite respawning since there can never be 10 respawns within 5
 | 
			
		||||
seconds.
 | 
			
		||||
.Sh NOTE
 | 
			
		||||
Invoking supervise-daemon requires both the RC_SVCNAME  environment
 | 
			
		||||
variable to be set and the name of the service as the first argument on
 | 
			
		||||
the command line, so it is best to invoke it inside a service script
 | 
			
		||||
rather than manually.
 | 
			
		||||
.Sh SEE ALSO
 | 
			
		||||
.Xr chdir 2 ,
 | 
			
		||||
.Xr chroot 2 ,
 | 
			
		||||
.Xr getopt 3 ,
 | 
			
		||||
.Xr nice 2 ,
 | 
			
		||||
.Xr rc_find_pids 3
 | 
			
		||||
.Sh BUGS
 | 
			
		||||
.Nm
 | 
			
		||||
cannot stop an interpreted daemon that no longer exists without a pidfile.
 | 
			
		||||
.Sh HISTORY
 | 
			
		||||
.Nm
 | 
			
		||||
first appeared in Debian.
 | 
			
		||||
 
 | 
			
		||||
@@ -11,5 +11,3 @@
 | 
			
		||||
# Generic definitions
 | 
			
		||||
 | 
			
		||||
include ${MK}/os-BSD.mk
 | 
			
		||||
 | 
			
		||||
CPPFLAGS+=	-D_BSD_SOURCE
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,6 @@
 | 
			
		||||
SFX=		.GNU-kFreeBSD.in
 | 
			
		||||
PKG_PREFIX?=	/usr
 | 
			
		||||
 | 
			
		||||
CPPFLAGS+=	-D_BSD_SOURCE
 | 
			
		||||
CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=700
 | 
			
		||||
LIBDL=		-Wl,-Bdynamic -ldl
 | 
			
		||||
LIBKVM?=
 | 
			
		||||
 
 | 
			
		||||
@@ -11,5 +11,5 @@
 | 
			
		||||
SFX=		.GNU.in
 | 
			
		||||
PKG_PREFIX?=	/usr
 | 
			
		||||
 | 
			
		||||
CPPFLAGS+=	-D_DEFAULT_SOURCE -DMAXPATHLEN=4096 -DPATH_MAX=4096
 | 
			
		||||
CPPFLAGS+=	-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 -DMAXPATHLEN=4096 -DPATH_MAX=4096
 | 
			
		||||
LIBDL=		-Wl,-Bdynamic -ldl
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
SFX=		.Linux.in
 | 
			
		||||
PKG_PREFIX?=	/usr
 | 
			
		||||
 | 
			
		||||
CPPFLAGS+=	-D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE -D_XOPEN_SOURCE
 | 
			
		||||
CPPFLAGS+=	-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700
 | 
			
		||||
LIBDL=		-Wl,-Bdynamic -ldl
 | 
			
		||||
 | 
			
		||||
ifeq (${MKSELINUX},yes)
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ _PKG_SED:=		$(shell ${_PKG_SED_SH})
 | 
			
		||||
_LCL_SED_SH=		if test "${PREFIX}" = "${LOCAL_PREFIX}"; then echo "-e 's:@LOCAL_PREFIX@::g'"; else echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; fi
 | 
			
		||||
_LCL_SED:=		$(shell ${_LCL_SED_SH})
 | 
			
		||||
 | 
			
		||||
SED_REPLACE=		-e 's:@SHELL@:${SH}:' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@BINDIR@:${BINDIR}:g' -e 's:@SBINDIR@:${SBINDIR}:g' ${_PKG_SED} ${_LCL_SED}
 | 
			
		||||
SED_REPLACE=		-e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@BINDIR@:${BINDIR}:g' -e 's:@SBINDIR@:${SBINDIR}:g' ${_PKG_SED} ${_LCL_SED}
 | 
			
		||||
 | 
			
		||||
# Tweak our shell scripts
 | 
			
		||||
%.sh: %.sh.in
 | 
			
		||||
@@ -53,6 +53,7 @@ realinstall: ${BIN} ${CONF} ${INC}
 | 
			
		||||
install: all realinstall ${INSTALLAFTER}
 | 
			
		||||
 | 
			
		||||
check test::
 | 
			
		||||
	@if test -e runtests.sh ; then ./runtests.sh || exit $$? ; fi
 | 
			
		||||
 | 
			
		||||
# A lot of scripts don't have anything to clean
 | 
			
		||||
# Also, some rm implentation require a file argument regardless of error
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								mk/sys.mk
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								mk/sys.mk
									
									
									
									
									
								
							@@ -34,7 +34,6 @@ PICFLAG?=		-fPIC
 | 
			
		||||
SYSCONFDIR?=		${PREFIX}/etc
 | 
			
		||||
INITDIR?=		${SYSCONFDIR}/init.d
 | 
			
		||||
CONFDIR?=		${SYSCONFDIR}/conf.d
 | 
			
		||||
CONFMODE?=		0644
 | 
			
		||||
LOCALDIR?=		${SYSCONFDIR}/local.d
 | 
			
		||||
SYSCTLDIR?=		${SYSCONFDIR}/sysctl.d
 | 
			
		||||
 | 
			
		||||
@@ -45,22 +44,20 @@ SBINDIR?=		${PREFIX}/sbin
 | 
			
		||||
SBINMODE?=		0755
 | 
			
		||||
 | 
			
		||||
INCDIR?=		${UPREFIX}/include
 | 
			
		||||
INCMODE?=		0644
 | 
			
		||||
INCMODE?=		0444
 | 
			
		||||
 | 
			
		||||
_LIBNAME_SH=		case `readlink /lib` in /lib64|lib64) echo "lib64";; *) echo "lib";; esac
 | 
			
		||||
_LIBNAME:=		$(shell ${_LIBNAME_SH})
 | 
			
		||||
LIBNAME?=		${_LIBNAME}
 | 
			
		||||
LIBDIR?=		${UPREFIX}/${LIBNAME}
 | 
			
		||||
LIBMODE?=		0644
 | 
			
		||||
LIBMODE?=		0444
 | 
			
		||||
SHLIBDIR?=		${PREFIX}/${LIBNAME}
 | 
			
		||||
 | 
			
		||||
LIBEXECDIR?=		${PREFIX}/libexec/rc
 | 
			
		||||
 | 
			
		||||
MANPREFIX?=		${UPREFIX}/share
 | 
			
		||||
MANDIR?=		${MANPREFIX}/man
 | 
			
		||||
MANMODE?=		0644
 | 
			
		||||
 | 
			
		||||
BASHCOMPDIR?=		${UPREFIX}/share/bash-completion/completions
 | 
			
		||||
MANMODE?=		0444
 | 
			
		||||
 | 
			
		||||
DATADIR?=		${UPREFIX}/share/openrc
 | 
			
		||||
DATAMODE?=		0644
 | 
			
		||||
@@ -68,4 +65,4 @@ DATAMODE?=		0644
 | 
			
		||||
DOCDIR?=		${UPREFIX}/share/doc
 | 
			
		||||
DOCMODE?=		0644
 | 
			
		||||
 | 
			
		||||
ZSHCOMPDIR?=		${UPREFIX}/share/zsh/site-functions
 | 
			
		||||
CONFMODE?=		0644
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
Using runit with OpenRC
 | 
			
		||||
=======================
 | 
			
		||||
# Using runit with OpenRC
 | 
			
		||||
 | 
			
		||||
Beginning with OpenRC-0.21, we support using runit [1] in place of
 | 
			
		||||
start-stop-daemon for monitoring and restarting daemons.
 | 
			
		||||
 
 | 
			
		||||
@@ -36,10 +36,9 @@ BOOT-FreeBSD+=	hostid modules newsyslog savecore syslogd
 | 
			
		||||
# FreeBSD specific stuff
 | 
			
		||||
BOOT-FreeBSD+=	adjkerntz dumpon syscons
 | 
			
		||||
 | 
			
		||||
BOOT-Linux+=	binfmt hwclock keymaps modules mtab procfs save-keymaps \
 | 
			
		||||
	save-termencoding termencoding
 | 
			
		||||
BOOT-Linux+=	binfmt hwclock keymaps modules mtab procfs termencoding
 | 
			
		||||
SHUTDOWN-Linux=	killprocs mount-ro
 | 
			
		||||
SYSINIT-Linux=	devfs cgroups dmesg sysfs
 | 
			
		||||
SYSINIT-Linux=	devfs dmesg sysfs
 | 
			
		||||
 | 
			
		||||
# Generic BSD stuff
 | 
			
		||||
BOOT-NetBSD+=	hostid newsyslog savecore syslogd
 | 
			
		||||
@@ -90,12 +89,6 @@ install:
 | 
			
		||||
			fi; \
 | 
			
		||||
			ln -snf ${INITDIR}/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
 | 
			
		||||
	fi
 | 
			
		||||
	if test "${MKSYSVINIT}" = yes && test "${OS}" = Linux; then \
 | 
			
		||||
		for x in tty1 tty2 tty3 tty4 tty5 tty6; do \
 | 
			
		||||
			ln -snf ${INITDIR}/agetty ${DESTDIR}/${INITDIR}/"agetty.$$x" || exit $$?; \
 | 
			
		||||
			ln -snf ${INITDIR}/agetty.$$x ${DEFAULTDIR}/"agetty.$$x" || exit $$?; \
 | 
			
		||||
		done; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
check test::
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
Using S6 with OpenRC
 | 
			
		||||
====================
 | 
			
		||||
# Using S6 with OpenRC
 | 
			
		||||
 | 
			
		||||
Beginning with OpenRC-0.16, we support using the s6 supervision suite
 | 
			
		||||
from Skarnet Software in place of start-stop-daemon for monitoring
 | 
			
		||||
@@ -40,10 +39,6 @@ s6_service_path - the path to the s6 service directory. The default is
 | 
			
		||||
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_force_kill - Should we try to force kill this service if the
 | 
			
		||||
s6_service_timeout_stop timeout expires when shutting down this service?
 | 
			
		||||
The default is yes.
 | 
			
		||||
 | 
			
		||||
s6_service_timeout_stop - the amount of time, in milliseconds, s6-svc
 | 
			
		||||
should wait for a service to go down when stopping.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
option_arg=
 | 
			
		||||
poweroff_arg=
 | 
			
		||||
@@ -21,9 +21,4 @@ if [ -z "${poweroff_arg}" ]; then
 | 
			
		||||
	poweroff_arg=--poweroff
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
script_args="$@"
 | 
			
		||||
if [ -z "${script_args}" ]; then
 | 
			
		||||
	script_args=now
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "${script_args}"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
option_arg=
 | 
			
		||||
poweroff_arg=
 | 
			
		||||
@@ -20,9 +20,4 @@ if [ -z "${poweroff_arg}" ]; then
 | 
			
		||||
	poweroff_arg=--poweroff
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
script_args="$@"
 | 
			
		||||
if [ -z "${script_args}" ]; then
 | 
			
		||||
	script_args=now
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "${script_args}"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
option_arg=
 | 
			
		||||
poweroff_arg=
 | 
			
		||||
@@ -22,9 +22,4 @@ if [ -z "${poweroff_arg}" ]; then
 | 
			
		||||
	poweroff_arg=--reboot
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
script_args="$@"
 | 
			
		||||
if [ -z "${script_args}" ]; then
 | 
			
		||||
	script_args=now
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "${script_args}"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
shutdown_arg=
 | 
			
		||||
while getopts :akrhPHfFnct: opt; do
 | 
			
		||||
 
 | 
			
		||||
@@ -1,495 +0,0 @@
 | 
			
		||||
OpenRC Service Script Writing Guide
 | 
			
		||||
===================================
 | 
			
		||||
 | 
			
		||||
This document is aimed at developers or packagers who
 | 
			
		||||
write OpenRC service scripts, either for their own projects, or for
 | 
			
		||||
the packages they maintain. It contains advice, suggestions, tips,
 | 
			
		||||
tricks, hints, and counsel; cautions, warnings, heads-ups,
 | 
			
		||||
admonitions, proscriptions, enjoinders, and reprimands.
 | 
			
		||||
 | 
			
		||||
It is intended to prevent common mistakes that are found "in the wild"
 | 
			
		||||
by pointing out those mistakes and suggesting alternatives.  Each
 | 
			
		||||
good/bad thing that you should/not do has a section devoted to it. We
 | 
			
		||||
don't consider anything exotic, and assume that you will use
 | 
			
		||||
start-stop-daemon to manage a fairly typical long-running UNIX
 | 
			
		||||
process.
 | 
			
		||||
 | 
			
		||||
# Syntax of Service Scripts
 | 
			
		||||
 | 
			
		||||
Service scripts are shell scripts. OpenRC aims at using only the standardized 
 | 
			
		||||
POSIX sh subset for portability reasons. The default interpreter (build-time 
 | 
			
		||||
toggle) is `/bin/sh`, so using for example mksh is not a problem.
 | 
			
		||||
 | 
			
		||||
OpenRC has been tested with busybox sh, ash, dash, bash, mksh, zsh and possibly 
 | 
			
		||||
others. Using busybox sh has been difficult as it replaces commands with 
 | 
			
		||||
builtins that don't offer the expected features.
 | 
			
		||||
 | 
			
		||||
The interpreter for service scripts is `#!/sbin/openrc-run`.
 | 
			
		||||
Not using this interpreter will break the use of dependencies and is not 
 | 
			
		||||
supported. (iow: if you insist on using `#!/bin/sh` you're on your own)
 | 
			
		||||
 | 
			
		||||
A `depend` function declares the dependencies of this service script.
 | 
			
		||||
All scripts must have start/stop/status functions, but defaults are
 | 
			
		||||
provided and should be used unless you have a very strong reason not to
 | 
			
		||||
use them.
 | 
			
		||||
 | 
			
		||||
Extra functions can be added easily:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
extra_commands="checkconfig"
 | 
			
		||||
checkconfig() {
 | 
			
		||||
	doSomething
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This exports the checkconfig function so that `/etc/init.d/someservice 
 | 
			
		||||
checkconfig` will be available, and it "just" runs this function.
 | 
			
		||||
 | 
			
		||||
While commands defined in `extra_commands` are always available, commands
 | 
			
		||||
defined in `extra_started_commands` will only work when the service is started
 | 
			
		||||
and those defined in `extra_stopped_commands` will only work when the service is
 | 
			
		||||
stopped. This can be used for implementing graceful reload and similar
 | 
			
		||||
behaviour.
 | 
			
		||||
 | 
			
		||||
Adding a restart function will not work, this is a design decision within 
 | 
			
		||||
OpenRC. Since there may be dependencies involved (e.g. network -> apache) a 
 | 
			
		||||
restart function is in general not going to work. 
 | 
			
		||||
restart is internally mapped to `stop()` + `start()` (plus handling dependencies).
 | 
			
		||||
If a service needs to behave differently when it is being restarted vs
 | 
			
		||||
started or stopped, it should test the `$RC_CMD` variable, for example:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
[ "$RC_CMD" = restart ] && do_something
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
# The Depend Function
 | 
			
		||||
 | 
			
		||||
This function declares the dependencies for a service script. This
 | 
			
		||||
determines the order the service scripts start.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
depend() {
 | 
			
		||||
	need net
 | 
			
		||||
	use dns logger netmount
 | 
			
		||||
	want coolservice
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`need` declares a hard dependency - net always needs to be started before this 
 | 
			
		||||
	service does
 | 
			
		||||
 | 
			
		||||
`use` is a soft dependency - if dns, logger or netmount is in this runlevel 
 | 
			
		||||
	start it before, but we don't care if it's not in this runlevel.
 | 
			
		||||
	`want` is between need and use - try to start coolservice if it is
 | 
			
		||||
	installed on the system, regardless of whether it is in the
 | 
			
		||||
	runlevel, but we don't care if it starts.
 | 
			
		||||
 | 
			
		||||
`before` declares that we need to be started before another service
 | 
			
		||||
 | 
			
		||||
`after` declares that we need to be started after another service, without 
 | 
			
		||||
	creating a dependency (so on calling stop the two are independent)
 | 
			
		||||
 | 
			
		||||
`provide` allows multiple implementations to provide one service type, e.g.:
 | 
			
		||||
	`provide cron` is set in all cron-daemons, so any one of them started 
 | 
			
		||||
	satisfies a cron dependency
 | 
			
		||||
 | 
			
		||||
`keyword` allows platform-specific overrides, e.g. `keyword -lxc` makes this 
 | 
			
		||||
	service script a noop in lxc containers. Useful for things like keymaps, 
 | 
			
		||||
	module loading etc. that are either platform-specific or not available 
 | 
			
		||||
	in containers/virtualization/...
 | 
			
		||||
 | 
			
		||||
FIXME: Anything missing in this list?
 | 
			
		||||
 | 
			
		||||
# The Default Functions
 | 
			
		||||
 | 
			
		||||
All service scripts are assumed to have the following functions:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
start()
 | 
			
		||||
stop()
 | 
			
		||||
status()
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
There are default implementations in `lib/rc/sh/openrc-run.sh` - this allows very 
 | 
			
		||||
compact service scripts. These functions can be overridden per service script as 
 | 
			
		||||
needed.
 | 
			
		||||
 | 
			
		||||
The default functions assume the following variables to be set in the service 
 | 
			
		||||
script:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
command=
 | 
			
		||||
command_args=
 | 
			
		||||
pidfile=
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Thus the 'smallest' service scripts can be half a dozen lines long
 | 
			
		||||
 | 
			
		||||
## Don't write your own start/stop functions
 | 
			
		||||
 | 
			
		||||
OpenRC is capable of stopping and starting most daemons based on the
 | 
			
		||||
information that you give it. For a well-behaved daemon that
 | 
			
		||||
backgrounds itself and writes its own PID file by default, the
 | 
			
		||||
following OpenRC variables are likely all that you'll need:
 | 
			
		||||
 | 
			
		||||
  * command
 | 
			
		||||
  * command_args
 | 
			
		||||
  * pidfile
 | 
			
		||||
 | 
			
		||||
Given those three pieces of information, OpenRC will be able to start
 | 
			
		||||
and stop the daemon on its own. The following is taken from an
 | 
			
		||||
[OpenNTPD](http://www.openntpd.org/) service script:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
command="/usr/sbin/ntpd"
 | 
			
		||||
 | 
			
		||||
# The special RC_SVCNAME variable contains the name of this service.
 | 
			
		||||
pidfile="/run/${RC_SVCNAME}.pid"
 | 
			
		||||
command_args="-p ${pidfile}"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If the daemon runs in the foreground by default but has options to
 | 
			
		||||
background itself and to create a pidfile, then you'll also need
 | 
			
		||||
 | 
			
		||||
  * command_args_background
 | 
			
		||||
 | 
			
		||||
That variable should contain the flags needed to background your
 | 
			
		||||
daemon, and to make it write a PID file. Take for example the
 | 
			
		||||
following snippet of an
 | 
			
		||||
[NRPE](https://github.com/NagiosEnterprises/nrpe) service script:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
command="/usr/bin/nrpe"
 | 
			
		||||
command_args="--config=/etc/nagios/nrpe.cfg"
 | 
			
		||||
command_args_background="--daemon"
 | 
			
		||||
pidfile="/run/${RC_SVCNAME}.pid"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Since NRPE runs as *root* by default, it needs no special permissions
 | 
			
		||||
to write to `/run/nrpe.pid`. OpenRC takes care of starting and
 | 
			
		||||
stopping the daemon with the appropriate arguments, even passing the
 | 
			
		||||
`--daemon` flag during startup to force NRPE into the background (NRPE
 | 
			
		||||
knows how to write its own PID file).
 | 
			
		||||
 | 
			
		||||
But what if the daemon isn't so well behaved? What if it doesn't know
 | 
			
		||||
how to background itself or create a pidfile? If it can do neither,
 | 
			
		||||
then use,
 | 
			
		||||
 | 
			
		||||
  * command_background=true
 | 
			
		||||
 | 
			
		||||
which will additionally pass `--make-pidfile` to start-stop-daemon,
 | 
			
		||||
causing it to create the `$pidfile` for you (rather than the daemon
 | 
			
		||||
itself being responsible for creating the PID file).
 | 
			
		||||
 | 
			
		||||
If your daemon doesn't know how to change its own user or group, then
 | 
			
		||||
you can tell start-stop-daemon to launch it as an unprivileged user
 | 
			
		||||
with
 | 
			
		||||
 | 
			
		||||
  * command_user="user:group"
 | 
			
		||||
 | 
			
		||||
Finally, if your daemon always forks into the background but fails to
 | 
			
		||||
create a PID file, then your only option is to use
 | 
			
		||||
 | 
			
		||||
  * procname
 | 
			
		||||
 | 
			
		||||
With `procname`, OpenRC will try to find the running daemon by
 | 
			
		||||
matching the name of its process. That's not so reliable, but daemons
 | 
			
		||||
shouldn't background themselves without creating a PID file in the
 | 
			
		||||
first place. The next example is part of the [CA NetConsole
 | 
			
		||||
Daemon](https://oss.oracle.com/projects/cancd/) service script:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
command="/usr/sbin/cancd"
 | 
			
		||||
command_args="-p ${CANCD_PORT}
 | 
			
		||||
              -l ${CANCD_LOG_DIR}
 | 
			
		||||
              -o ${CANCD_LOG_FORMAT}"
 | 
			
		||||
command_user="cancd"
 | 
			
		||||
 | 
			
		||||
# cancd daemonizes itself, but doesn't write a PID file and doesn't
 | 
			
		||||
# have an option to run in the foreground. So, the best we can do
 | 
			
		||||
# is try to match the process name when stopping it.
 | 
			
		||||
procname="cancd"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To recap, in order of preference:
 | 
			
		||||
 | 
			
		||||
  1. If the daemon backgrounds itself and creates its own PID file, use
 | 
			
		||||
     `pidfile`.
 | 
			
		||||
  2. If the daemon does not background itself (or has an option to run
 | 
			
		||||
     in the foreground) and does not create a PID file, then use
 | 
			
		||||
     `command_background=true` and `pidfile`.
 | 
			
		||||
  3. If the daemon backgrounds itself and does not create a PID file,
 | 
			
		||||
     use `procname` instead of `pidfile`. But, if your daemon has the
 | 
			
		||||
     option to run in the foreground, then you should do that instead
 | 
			
		||||
     (that would be the case in the previous item).
 | 
			
		||||
  4. The last case, where the daemon does not background itself but
 | 
			
		||||
     does create a PID file, doesn't make much sense. If there's a way
 | 
			
		||||
     to disable the daemon's PID file (or, to write it straight into the
 | 
			
		||||
     garbage), then do that, and use `command_background=true`.
 | 
			
		||||
 | 
			
		||||
## Reloading your daemon's configuration
 | 
			
		||||
 | 
			
		||||
Many daemons will reload their configuration files in response to a
 | 
			
		||||
signal. Suppose your daemon will reload its configuration in response
 | 
			
		||||
to a `SIGHUP`. It's possible to add a new "reload" command to your
 | 
			
		||||
service script that performs this action. First, tell the service
 | 
			
		||||
script about the new command.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
extra_started_commands="reload"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
We use `extra_started_commands` as opposed to `extra_commands` because
 | 
			
		||||
the "reload" action is only valid while the daemon is running (that
 | 
			
		||||
is, started). Now, start-stop-daemon can be used to send the signal to
 | 
			
		||||
the appropriate process (assuming you've defined the `pidfile`
 | 
			
		||||
variable elsewhere):
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
reload() {
 | 
			
		||||
  ebegin "Reloading ${RC_SVCNAME}"
 | 
			
		||||
  start-stop-daemon --signal HUP --pidfile "${pidfile}"
 | 
			
		||||
  eend $?
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Don't restart/reload with a broken config
 | 
			
		||||
 | 
			
		||||
Often, users will start a daemon, make some configuration change, and
 | 
			
		||||
then attempt to restart the daemon. If the recent configuration change
 | 
			
		||||
contains a mistake, the result will be that the daemon is stopped but
 | 
			
		||||
then cannot be started again (due to the configuration error). It's
 | 
			
		||||
possible to prevent that situation with a function that checks for
 | 
			
		||||
configuration errors, and a combination of the `start_pre` and
 | 
			
		||||
`stop_pre` hooks.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
checkconfig() {
 | 
			
		||||
  # However you want to check this...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_pre() {
 | 
			
		||||
  # If this isn't a restart, make sure that the user's config isn't
 | 
			
		||||
  # busted before we try to start the daemon (this will produce
 | 
			
		||||
  # better error messages than if we just try to start it blindly).
 | 
			
		||||
  #
 | 
			
		||||
  # If, on the other hand, this *is* a restart, then the stop_pre
 | 
			
		||||
  # action will have ensured that the config is usable and we don't
 | 
			
		||||
  # need to do that again.
 | 
			
		||||
  if [ "${RC_CMD}" != "restart" ] ; then
 | 
			
		||||
    checkconfig || return $?
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop_pre() {
 | 
			
		||||
  # If this is a restart, check to make sure the user's config
 | 
			
		||||
  # isn't busted before we stop the running daemon.
 | 
			
		||||
  if [ "${RC_CMD}" = "restart" ] ; then
 | 
			
		||||
      checkconfig || return $?
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To prevent a *reload* with a broken config, keep it simple:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
reload() {
 | 
			
		||||
  checkconfig || return $?
 | 
			
		||||
  ebegin "Reloading ${RC_SVCNAME}"
 | 
			
		||||
  start-stop-daemon --signal HUP --pidfile "${pidfile}"
 | 
			
		||||
  eend $?
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## PID files should be writable only by root
 | 
			
		||||
 | 
			
		||||
PID files must be writable only by *root*, which means additionally
 | 
			
		||||
that they must live in a *root*-owned directory. This directory is
 | 
			
		||||
normally /run under Linux and /var/run under other operating systems.
 | 
			
		||||
 | 
			
		||||
Some daemons run as an unprivileged user account, and create their PID
 | 
			
		||||
files (as the unprivileged user) in a path like
 | 
			
		||||
`/var/run/foo/foo.pid`. That can usually be exploited by the unprivileged
 | 
			
		||||
user to kill *root* processes, since when a service is stopped, *root*
 | 
			
		||||
usually sends a SIGTERM to the contents of the PID file (which are
 | 
			
		||||
controlled by the unprivileged user). The main warning sign for that
 | 
			
		||||
problem is using `checkpath` to set ownership on the directory
 | 
			
		||||
containing the PID file. For example,
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# BAD BAD BAD BAD BAD BAD BAD BAD
 | 
			
		||||
start_pre() {
 | 
			
		||||
  # Ensure that the pidfile directory is writable by the foo user/group.
 | 
			
		||||
  checkpath --directory --mode 0700 --owner foo:foo "/var/run/foo"
 | 
			
		||||
}
 | 
			
		||||
# BAD BAD BAD BAD BAD BAD BAD BAD
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If the *foo* user owns `/var/run/foo`, then he can put whatever he wants
 | 
			
		||||
in the `/var/run/foo/foo.pid` file. Even if *root* owns the PID file, the
 | 
			
		||||
*foo* user can delete it and replace it with his own. To avoid
 | 
			
		||||
security concerns, the PID file must be created as *root* and live in
 | 
			
		||||
a *root*-owned directory. If your daemon is responsible for forking
 | 
			
		||||
and writing its own PID file but the PID file is still owned by the
 | 
			
		||||
unprivileged runtime user, then you may have an upstream issue.
 | 
			
		||||
 | 
			
		||||
Once the PID file is being created as *root* (before dropping
 | 
			
		||||
privileges), it can be written directly to a *root*-owned
 | 
			
		||||
directory.  For example, the *foo* daemon might write
 | 
			
		||||
`/var/run/foo.pid`. No calls to checkpath are needed. Note: there is
 | 
			
		||||
nothing technically wrong with using a directory structure like
 | 
			
		||||
`/var/run/foo/foo.pid`, so long as *root* owns the PID file and the
 | 
			
		||||
directory containing it.
 | 
			
		||||
 | 
			
		||||
Ideally (see "Upstream your service scripts"), your service script
 | 
			
		||||
will be integrated upstream and the build system will determine the
 | 
			
		||||
appropriate directory for the pid file. For example,
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
pidfile="@piddir@/${RC_SVCNAME}.pid"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
A decent example of this is the [Nagios core service
 | 
			
		||||
script](https://github.com/NagiosEnterprises/nagioscore/blob/master/openrc-init.in),
 | 
			
		||||
where the full path to the PID file is specified at build-time.
 | 
			
		||||
 | 
			
		||||
## Don't let the user control the PID file location
 | 
			
		||||
 | 
			
		||||
It's usually a mistake to let the end user control the PID file
 | 
			
		||||
location through a conf.d variable, for a few reasons:
 | 
			
		||||
 | 
			
		||||
  1. When the PID file path is controlled by the user, you need to
 | 
			
		||||
     ensure that its parent directory exists and is writable. This
 | 
			
		||||
     adds unnecessary code to the service script.
 | 
			
		||||
 | 
			
		||||
  2. If the PID file path changes while the service is running, then
 | 
			
		||||
     you'll find yourself unable to stop the service.
 | 
			
		||||
 | 
			
		||||
  3. The directory that should contain the PID file is best determined
 | 
			
		||||
     by the upstream build system (see "Upstream your service scripts").
 | 
			
		||||
     On Linux, the preferred location these days is `/run`. Other systems
 | 
			
		||||
     still use `/var/run`, though, and a `./configure` script is the
 | 
			
		||||
     best place to decide which one you want.
 | 
			
		||||
 | 
			
		||||
  4. Nobody cares where the PID file is located, anyway.
 | 
			
		||||
 | 
			
		||||
Since OpenRC service names must be unique, a value of
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
pidfile="/var/run/${RC_SVCNAME}.pid"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
guarantees that your PID file has a unique name.
 | 
			
		||||
 | 
			
		||||
## Upstream your service scripts (for packagers)
 | 
			
		||||
 | 
			
		||||
The ideal place for an OpenRC service script is **upstream**. Much like
 | 
			
		||||
systemd services, a well-crafted OpenRC service script should be
 | 
			
		||||
distribution-agnostic, and the best place for it is upstream. Why? For
 | 
			
		||||
two reasons. First, having it upstream means that there's a single
 | 
			
		||||
authoritative source for improvements. Second, a few paths in every
 | 
			
		||||
service script are dependent upon flags passed to the build system. For
 | 
			
		||||
example,
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
command=/usr/bin/foo
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
in an autotools-based build system should really be
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
command=@bindir@/foo
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
so that the user's value of `--bindir` is respected. If you keep the
 | 
			
		||||
service script in your own distribution's repository, then you have to
 | 
			
		||||
keep the command path and package synchronized yourself, and that's no
 | 
			
		||||
fun.
 | 
			
		||||
 | 
			
		||||
## Be wary of "need net" dependencies
 | 
			
		||||
 | 
			
		||||
There are two things you need to know about "need net" dependencies:
 | 
			
		||||
 | 
			
		||||
  1. They are not satisfied by the loopback interface, so "need net"
 | 
			
		||||
     requires some *other* interface to be up.
 | 
			
		||||
 | 
			
		||||
  2. Depending on the value of `rc_depend_strict` in `rc.conf`, the
 | 
			
		||||
     "need net" will be satisfied when either *any* non-loopback
 | 
			
		||||
     interface is up, or when *all* non-loopback interfaces are up.
 | 
			
		||||
 | 
			
		||||
The first item means that "need net" is wrong for daemons that are
 | 
			
		||||
happy with `0.0.0.0`, and the second point means that "need net" is
 | 
			
		||||
wrong for daemons that need a particular (for example, the WAN)
 | 
			
		||||
interface. We'll consider the two most common users of "need net";
 | 
			
		||||
network clients who access some network resource, and network servers
 | 
			
		||||
who provide them.
 | 
			
		||||
 | 
			
		||||
### Network clients
 | 
			
		||||
 | 
			
		||||
Network clients typically want the WAN interface to be up. That may
 | 
			
		||||
tempt you to depend on the WAN interface; but first, you should ask
 | 
			
		||||
yourself a question: does anything bad happen if the WAN interface is
 | 
			
		||||
not available? In other words, if the administrator wants to disable
 | 
			
		||||
the WAN, should the service be stopped? Usually the answer to that
 | 
			
		||||
question is "no," and in that case, you should forego the "net"
 | 
			
		||||
dependency entirely.
 | 
			
		||||
 | 
			
		||||
Suppose, for example, that your service retrieves virus signature
 | 
			
		||||
updates from the internet. In order to do its job correctly, it needs
 | 
			
		||||
a (working) internet connection. However, the service itself does not
 | 
			
		||||
require the WAN interface to be up: if it is, great; otherwise, the
 | 
			
		||||
worst that will happen is that a "server unavailable" warning will be
 | 
			
		||||
logged. The signature update service will not crash, and—perhaps more
 | 
			
		||||
importantly—you don't want it to terminate if the administrator turns
 | 
			
		||||
off the WAN interface for a second.
 | 
			
		||||
 | 
			
		||||
### Network servers
 | 
			
		||||
 | 
			
		||||
Network servers are generally easier to handle than their client
 | 
			
		||||
counterparts. Most server daemons listen on `0.0.0.0` (all addresses)
 | 
			
		||||
by default, and are therefore satisfied to have the loopback interface
 | 
			
		||||
present and operational. OpenRC ships with the loopback service in the
 | 
			
		||||
*boot* runlevel, and therefore most server daemons require no further
 | 
			
		||||
network dependencies.
 | 
			
		||||
 | 
			
		||||
The exceptions to this rule are those daemons who produce negative
 | 
			
		||||
side-effects when the WAN is unavailable. For example, the Nagios
 | 
			
		||||
server daemon will generate "the sky is falling" alerts for as long as
 | 
			
		||||
your monitored hosts are unreachable. So in that case, you should
 | 
			
		||||
require some other interface (often the WAN) to be up. A "need"
 | 
			
		||||
dependency would be appropriate, because you want Nagios to be
 | 
			
		||||
stopped before the network is taken down.
 | 
			
		||||
 | 
			
		||||
If your daemon can optionally be configured to listen on a particular
 | 
			
		||||
interface, then please see the "Depending on a particular interface"
 | 
			
		||||
section.
 | 
			
		||||
 | 
			
		||||
### Depending on a particular interface
 | 
			
		||||
 | 
			
		||||
If you need to depend on one particular interface, usually it's not
 | 
			
		||||
easy to determine programmatically what that interface is. For
 | 
			
		||||
example, if your *sshd* daemon listens on `192.168.1.100` (rather than
 | 
			
		||||
`0.0.0.0`), then you have two problems:
 | 
			
		||||
 | 
			
		||||
  1. Parsing `sshd_config` to figure that out; and
 | 
			
		||||
 | 
			
		||||
  2. Determining which network service name corresponds to the
 | 
			
		||||
     interface for `192.168.1.100`.
 | 
			
		||||
 | 
			
		||||
It's generally a bad idea to parse config files in your service
 | 
			
		||||
scripts, but the second problem is the harder one. Instead, the most
 | 
			
		||||
robust (i.e. the laziest) approach is to make the user specify the
 | 
			
		||||
dependency when he makes a change to sshd_config. Include something
 | 
			
		||||
like the following in the service configuration file,
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# Specify the network service that corresponds to the "bind" setting
 | 
			
		||||
# in your configuration file. For example, if you bind to 127.0.0.1,
 | 
			
		||||
# this should be set to "loopback" which provides the loopback interface.
 | 
			
		||||
rc_need="loopback"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This is a sensible default for daemons that are happy with `0.0.0.0`,
 | 
			
		||||
but lets the user specify something else, like `rc_need="net.wan"` if
 | 
			
		||||
he needs it. The burden is on the user to determine the appropriate
 | 
			
		||||
service whenever he changes the daemon's configuration file.
 | 
			
		||||
							
								
								
									
										3
									
								
								sh/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								sh/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,7 +1,10 @@
 | 
			
		||||
functions.sh
 | 
			
		||||
gendepends.sh
 | 
			
		||||
rc-functions.sh
 | 
			
		||||
openrc-run.sh
 | 
			
		||||
cgroup-release-agent.sh
 | 
			
		||||
init.sh
 | 
			
		||||
init-early.sh
 | 
			
		||||
rc-cgroup.sh
 | 
			
		||||
migrate-to-run.sh
 | 
			
		||||
binfmt.sh
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								sh/Makefile
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								sh/Makefile
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
DIR=	${LIBEXECDIR}/sh
 | 
			
		||||
SRCS=	init.sh.in functions.sh.in gendepends.sh.in \
 | 
			
		||||
	openrc-run.sh.in ${SRCS-${OS}}
 | 
			
		||||
	openrc-run.sh.in rc-functions.sh.in ${SRCS-${OS}}
 | 
			
		||||
INC=	rc-mount.sh functions.sh rc-functions.sh runit.sh s6.sh \
 | 
			
		||||
		start-stop-daemon.sh supervise-daemon.sh ${INC-${OS}}
 | 
			
		||||
		start-stop-daemon.sh supervise-daemon.sh
 | 
			
		||||
BIN=	gendepends.sh init.sh openrc-run.sh ${BIN-${OS}}
 | 
			
		||||
 | 
			
		||||
INSTALLAFTER=	_installafter
 | 
			
		||||
@@ -13,9 +13,10 @@ include ${MK}/os.mk
 | 
			
		||||
SRCS-FreeBSD=
 | 
			
		||||
BIN-FreeBSD=
 | 
			
		||||
 | 
			
		||||
SRCS-Linux=	binfmt.sh.in cgroup-release-agent.sh.in init-early.sh.in
 | 
			
		||||
BIN-Linux=	binfmt.sh cgroup-release-agent.sh init-early.sh
 | 
			
		||||
INC-Linux= rc-cgroup.sh
 | 
			
		||||
SRCS-Linux=	binfmt.sh.in cgroup-release-agent.sh.in init-early.sh.in \
 | 
			
		||||
	migrate-to-run.sh.in rc-cgroup.sh.in
 | 
			
		||||
BIN-Linux=	binfmt.sh cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
 | 
			
		||||
	rc-cgroup.sh
 | 
			
		||||
 | 
			
		||||
SRCS-NetBSD=
 | 
			
		||||
BIN-NetBSD=
 | 
			
		||||
@@ -31,3 +32,4 @@ _installafter:
 | 
			
		||||
	ln -snf ${LIBEXECDIR}/sh/functions.sh ${DESTDIR}/${INITDIR} || exit $$?
 | 
			
		||||
 | 
			
		||||
check test::
 | 
			
		||||
	./runtests.sh
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# This is a reimplementation of the systemd binfmt.d code to register
 | 
			
		||||
# misc binary formats with the kernel.
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# This is run by the kernel after the last task is removed from a
 | 
			
		||||
# control group in the openrc hierarchy.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ yesno()
 | 
			
		||||
	case "$value" in
 | 
			
		||||
		[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) return 0;;
 | 
			
		||||
		[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) return 1;;
 | 
			
		||||
		*) vewarn "\$$1 is not set properly"; return 2;;
 | 
			
		||||
		*) vewarn "\$$1 is not set properly"; return 1;;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2007-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
@@ -33,9 +33,6 @@ else
 | 
			
		||||
	kmode="-a"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Set the SELinux label on console before everything so we dont lose output
 | 
			
		||||
[ -x /sbin/restorecon ] && /sbin/restorecon -F /dev/console
 | 
			
		||||
 | 
			
		||||
# Try and set a font and as early as we can
 | 
			
		||||
if service_present "$RC_DEFAULTLEVEL" consolefont ||
 | 
			
		||||
   service_present "$RC_BOOTLEVEL" consolefont; then
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2007-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2007-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2007-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 1999-2007 Gentoo Foundation
 | 
			
		||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
			
		||||
# Released under the 2-clause BSD license.
 | 
			
		||||
@@ -83,7 +83,6 @@ elif ! mountinfo -q /run; then
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
[ -x /sbin/restorecon ] && /sbin/restorecon -rF /run
 | 
			
		||||
checkpath -d $RC_SVCDIR
 | 
			
		||||
checkpath -d -m 0775 -o root:uucp /run/lock
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								sh/migrate-to-run.sh.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								sh/migrate-to-run.sh.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2012-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
#
 | 
			
		||||
# This file is part of OpenRC. It is subject to the license terms in
 | 
			
		||||
# the LICENSE file found in the top-level directory of this
 | 
			
		||||
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
#    except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
. "@LIBEXECDIR@/sh/functions.sh"
 | 
			
		||||
 | 
			
		||||
if [ -e /run/openrc/softlevel ]; then
 | 
			
		||||
	einfo "The OpenRC dependency data has already been migrated."
 | 
			
		||||
	exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d /run ]; then
 | 
			
		||||
	eerror "/run is not a directory."
 | 
			
		||||
	eerror "moving /run to /run.pre-openrc"
 | 
			
		||||
	mv /run /run.pre-openrc
 | 
			
		||||
	mkdir /run
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm -rf /run/openrc
 | 
			
		||||
 | 
			
		||||
if ! mountinfo -q -f tmpfs /run; then
 | 
			
		||||
	ln -s "@LIBEXECDIR@"/init.d /run/openrc
 | 
			
		||||
else
 | 
			
		||||
	cp -a "@LIBEXECDIR@/init.d" /run/openrc
 | 
			
		||||
	rc-update -u
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
einfo "The OpenRC dependency data was migrated successfully."
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -133,10 +133,11 @@ _status()
 | 
			
		||||
	elif service_inactive; then
 | 
			
		||||
		ewarn "status: inactive"
 | 
			
		||||
		return 16
 | 
			
		||||
	elif service_crashed; then
 | 
			
		||||
		eerror "status: crashed"
 | 
			
		||||
		return 32
 | 
			
		||||
	elif service_started; then
 | 
			
		||||
		if service_crashed; then
 | 
			
		||||
			eerror "status: crashed"
 | 
			
		||||
			return 32
 | 
			
		||||
		fi
 | 
			
		||||
		einfo "status: started"
 | 
			
		||||
		return 0
 | 
			
		||||
	else
 | 
			
		||||
@@ -259,14 +260,12 @@ for _cmd; do
 | 
			
		||||
		# Apply cgroups settings if defined
 | 
			
		||||
		if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ]
 | 
			
		||||
		then
 | 
			
		||||
			if grep -qs /sys/fs/cgroup /proc/1/mountinfo
 | 
			
		||||
			then
 | 
			
		||||
				if [ -d /sys/fs/cgroup -a ! -w /sys/fs/cgroup ]; then
 | 
			
		||||
					eerror "No permission to apply cgroup settings"
 | 
			
		||||
					break
 | 
			
		||||
				fi
 | 
			
		||||
			if [ -d /sys/fs/cgroup -a ! -w /sys/fs/cgroup ]; then
 | 
			
		||||
				eerror "No permission to apply cgroup settings"
 | 
			
		||||
				break
 | 
			
		||||
			fi
 | 
			
		||||
			cgroup_add_service
 | 
			
		||||
			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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
# Copyright (c) 2012-2015 The OpenRC Authors.
 | 
			
		||||
# See the Authors file at the top-level directory of this distribution and
 | 
			
		||||
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
 | 
			
		||||
@@ -61,7 +62,7 @@ cgroup_set_values()
 | 
			
		||||
	while [ -n "$1" ] && [ "$controller" != "cpuacct" ]; do
 | 
			
		||||
		case "$1" in
 | 
			
		||||
			$controller.*)
 | 
			
		||||
				if [ -n "${name}" ] && [ -w "${cgroup}/${name}" ] &&
 | 
			
		||||
				if [ -n "${name}" ] && [ -w "${cgroup}/${name}" ] && 
 | 
			
		||||
					[ -n "${val}" ]; then
 | 
			
		||||
					veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
 | 
			
		||||
					printf "%s" "$val" > "$cgroup/$name"
 | 
			
		||||
@@ -183,17 +184,18 @@ cgroup2_set_limits()
 | 
			
		||||
	cgroup_path="$(cgroup2_find_path)"
 | 
			
		||||
	[ -d "${cgroup_path}" ] || return 0
 | 
			
		||||
	rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}"
 | 
			
		||||
	local OIFS="$IFS"
 | 
			
		||||
	IFS="
 | 
			
		||||
"
 | 
			
		||||
	[ ! -d "${rc_cgroup_path}" ] && mkdir "${rc_cgroup_path}"
 | 
			
		||||
	[ -f "${rc_cgroup_path}"/cgroup.procs ] &&
 | 
			
		||||
		printf 0 > "${rc_cgroup_path}"/cgroup.procs
 | 
			
		||||
	[ -z "${rc_cgroup_settings}" ] && return 0
 | 
			
		||||
	echo "${rc_cgroup_settings}" | while read -r key value; do
 | 
			
		||||
		[ -z "${key}" ] && continue
 | 
			
		||||
		[ -z "${value}" ] && continue
 | 
			
		||||
		[ ! -f "${rc_cgroup_path}/${key}" ] && continue
 | 
			
		||||
		veinfo "${RC_SVCNAME}: cgroups: setting ${key} to ${value}"
 | 
			
		||||
		printf "%s\n" "${value}" > "${rc_cgroup_path}/${key}"
 | 
			
		||||
	printf "%d" 0 > "${rc_cgroup_path}/cgroup.procs"
 | 
			
		||||
	echo "${rc_cgroup_settings}" | while IFS="$OIFS" read -r key value; do
 | 
			
		||||
		[ -z "${key}" ] || [ -z "${value}" ] && continue
 | 
			
		||||
		[ ! -e "${rc_cgroup_path}/${key}" ] && continue
 | 
			
		||||
		veinfo "${RC_SVCNAME}: cgroups: ${key} ${value}"
 | 
			
		||||
		printf "%s" "${value}" > "${rc_cgroup_path}/${key}"
 | 
			
		||||
	done
 | 
			
		||||
	IFS="$OIFS"
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -201,21 +203,15 @@ cgroup_cleanup()
 | 
			
		||||
{
 | 
			
		||||
	cgroup_running || return 0
 | 
			
		||||
	ebegin "starting cgroups cleanup"
 | 
			
		||||
	local pids loops=0
 | 
			
		||||
	local pids
 | 
			
		||||
	pids="$(cgroup_get_pids)"
 | 
			
		||||
	if [ -n "${pids}" ]; then
 | 
			
		||||
		kill -s CONT ${pids} 2> /dev/null
 | 
			
		||||
		kill -s "${stopsig:-TERM}" ${pids} 2> /dev/null
 | 
			
		||||
		kill -s CONT ${pids} 2> /dev/null
 | 
			
		||||
		yesno "${rc_send_sighup:-no}" &&
 | 
			
		||||
			kill -s HUP ${pids} 2> /dev/null
 | 
			
		||||
		kill -s "${stopsig:-TERM}" ${pids} 2> /dev/null
 | 
			
		||||
		while [ -n "$(cgroup_get_pids)" ] &&
 | 
			
		||||
			[ "${loops}" -lt "${rc_timeout_stopsec:-90}" ]; do
 | 
			
		||||
			loops=$((loops+1))
 | 
			
		||||
			sleep 1
 | 
			
		||||
		done
 | 
			
		||||
		pids="$(cgroup_get_pids)"
 | 
			
		||||
		[ -n "${pids}" ] && yesno "${rc_send_sigkill:-yes}" &&
 | 
			
		||||
		sleep "${rc_timeout_stopsec:-90}"
 | 
			
		||||
		yesno "${rc_send_sigkill:-yes}" &&
 | 
			
		||||
			kill -s KILL ${pids} 2> /dev/null
 | 
			
		||||
	fi
 | 
			
		||||
	cgroup2_remove
 | 
			
		||||
@@ -2,6 +2,42 @@
 | 
			
		||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
			
		||||
# Released under the 2-clause BSD license.
 | 
			
		||||
 | 
			
		||||
has_addon()
 | 
			
		||||
{
 | 
			
		||||
	[ -e /@LIB@/rc/addons/"$1".sh -o -e /@LIB@/rcscripts/addons/"$1".sh ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_addon_warn()
 | 
			
		||||
{
 | 
			
		||||
	eindent
 | 
			
		||||
	ewarn "$RC_SVCNAME uses addon code which is deprecated"
 | 
			
		||||
	ewarn "and may not be available in the future."
 | 
			
		||||
	eoutdent
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
import_addon()
 | 
			
		||||
{
 | 
			
		||||
	if [ -e /@LIB@/rc/addons/"$1".sh ]; then
 | 
			
		||||
		_addon_warn
 | 
			
		||||
		. /@LIB@/rc/addons/"$1".sh
 | 
			
		||||
	elif [ -e /@LIB@/rcscripts/addons/"$1".sh ]; then
 | 
			
		||||
		_addon_warn
 | 
			
		||||
		. /@LIB@/rcscripts/addons/"$1".sh
 | 
			
		||||
	else
 | 
			
		||||
		return 1
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_addon()
 | 
			
		||||
{
 | 
			
		||||
	( import_addon "$1-start" )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop_addon()
 | 
			
		||||
{
 | 
			
		||||
	( import_addon "$1-stop" )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
net_fs_list="afs ceph cifs coda davfs fuse fuse.sshfs gfs glusterfs lustre
 | 
			
		||||
ncpfs nfs nfs4 ocfs2 shfs smbfs"
 | 
			
		||||
is_net_fs()
 | 
			
		||||
@@ -15,6 +15,7 @@
 | 
			
		||||
ret=0
 | 
			
		||||
 | 
			
		||||
tret=0
 | 
			
		||||
ebegin "Testing yesno()"
 | 
			
		||||
for f in yes YES Yes true TRUE True 1 ; do
 | 
			
		||||
	if ! yesno $f; then
 | 
			
		||||
		: $(( tret += 1 ))
 | 
			
		||||
@@ -27,7 +28,7 @@ for f in no NO No false FALSE False 0 ; do
 | 
			
		||||
		echo "!$f!"
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
eend $tret
 | 
			
		||||
: $(( ret += $tret ))
 | 
			
		||||
 | 
			
		||||
eend $ret
 | 
			
		||||
exit $ret
 | 
			
		||||
							
								
								
									
										20
									
								
								sh/s6.sh
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								sh/s6.sh
									
									
									
									
									
								
							@@ -12,20 +12,6 @@
 | 
			
		||||
 | 
			
		||||
[ -z "${s6_service_path}" ] && s6_service_path="/var/svc.d/${RC_SVCNAME}"
 | 
			
		||||
 | 
			
		||||
_s6_force_kill() {
 | 
			
		||||
	local pid
 | 
			
		||||
	s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
 | 
			
		||||
	pid="${3%)}"
 | 
			
		||||
	[ -z "${pid}" ] && return 0
 | 
			
		||||
	if kill -0 "${pid}" 2> /dev/null; then
 | 
			
		||||
		ewarn "Sending DOWN & KILL for ${RC_SVCNAME}"
 | 
			
		||||
		s6-svc -dk "${s6_service_link}"
 | 
			
		||||
		sleep 1
 | 
			
		||||
		kill -0 "${pid}" 2>/dev/null && return 1
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
s6_start()
 | 
			
		||||
{
 | 
			
		||||
	if [ ! -d "${s6_service_path}" ]; then
 | 
			
		||||
@@ -55,11 +41,7 @@ s6_stop()
 | 
			
		||||
 fi
 | 
			
		||||
	s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
 | 
			
		||||
	ebegin "Stopping ${name:-$RC_SVCNAME}"
 | 
			
		||||
	s6-svc -d -wD -T ${s6_service_timeout_stop:-60000} "${s6_service_link}"
 | 
			
		||||
	set -- $(s6-svstat "${s6_service_link}")
 | 
			
		||||
	[ "$1" = "up" ] &&
 | 
			
		||||
		yesno "${s6_force_kill:-yes}" &&
 | 
			
		||||
			_s6_force_kill "$@"
 | 
			
		||||
	s6-svc -wD -d -T ${s6_service_timeout_stop:-10000} "${s6_service_link}"
 | 
			
		||||
	set -- $(s6-svstat "${s6_service_link}")
 | 
			
		||||
	[ "$1" = "down" ]
 | 
			
		||||
	eend $? "Failed to stop ${name:-$RC_SVCNAME}"
 | 
			
		||||
 
 | 
			
		||||
@@ -38,25 +38,15 @@ ssd_start()
 | 
			
		||||
		service_inactive && _inactive=true
 | 
			
		||||
		mark_service_inactive
 | 
			
		||||
	fi
 | 
			
		||||
	[ -n "$output_logger" ] &&
 | 
			
		||||
		output_logger_arg="--stdout-logger \"$output_logger\""
 | 
			
		||||
	[ -n "$error_logger" ] &&
 | 
			
		||||
		error_logger_arg="--stderr-logger \"$error_logger\""
 | 
			
		||||
	#the eval call is necessary for cases like:
 | 
			
		||||
	# command_args="this \"is a\" test"
 | 
			
		||||
	# to work properly.
 | 
			
		||||
	eval start-stop-daemon --start \
 | 
			
		||||
		--exec $command \
 | 
			
		||||
		${chroot:+--chroot} $chroot \
 | 
			
		||||
		${directory:+--chdir} $directory \
 | 
			
		||||
		${output_log+--stdout} $output_log \
 | 
			
		||||
		${error_log+--stderr} $error_log \
 | 
			
		||||
		${output_logger_arg} \
 | 
			
		||||
		${error_logger_arg} \
 | 
			
		||||
		${procname:+--name} $procname \
 | 
			
		||||
		${pidfile:+--pidfile} $pidfile \
 | 
			
		||||
		${command_user+--user} $command_user \
 | 
			
		||||
		${umask+--umask} $umask \
 | 
			
		||||
		$_background $start_stop_daemon_args \
 | 
			
		||||
		-- $command_args $command_args_background
 | 
			
		||||
	if eend $? "Failed to start ${name:-$RC_SVCNAME}"; then
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,6 @@
 | 
			
		||||
# This file may not be copied, modified, propagated, or distributed
 | 
			
		||||
#    except according to the terms contained in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
extra_commands="healthcheck unhealthy ${extra_commands}"
 | 
			
		||||
 | 
			
		||||
supervise_start()
 | 
			
		||||
{
 | 
			
		||||
	if [ -z "$command" ]; then
 | 
			
		||||
@@ -24,21 +22,15 @@ supervise_start()
 | 
			
		||||
	# The eval call is necessary for cases like:
 | 
			
		||||
	# command_args="this \"is a\" test"
 | 
			
		||||
	# to work properly.
 | 
			
		||||
	eval supervise-daemon "${RC_SVCNAME}" --start \
 | 
			
		||||
	eval supervise-daemon --start \
 | 
			
		||||
		${retry:+--retry} $retry \
 | 
			
		||||
		${directory:+--chdir} $directory  \
 | 
			
		||||
		${chroot:+--chroot} $chroot \
 | 
			
		||||
		${output_log+--stdout} ${output_log} \
 | 
			
		||||
		${error_log+--stderr} $error_log \
 | 
			
		||||
		${pidfile:+--pidfile} $pidfile \
 | 
			
		||||
		${respawn_delay:+--respawn-delay} $respawn_delay \
 | 
			
		||||
		${respawn_max:+--respawn-max} $respawn_max \
 | 
			
		||||
		${respawn_period:+--respawn-period} $respawn_period \
 | 
			
		||||
		${healthcheck_delay:+--healthcheck-delay} $healthcheck_delay \
 | 
			
		||||
		${healthcheck_timer:+--healthcheck-timer} $healthcheck_timer \
 | 
			
		||||
		${command_user+--user} $command_user \
 | 
			
		||||
		${umask+--umask} $umask \
 | 
			
		||||
		${supervise_daemon_args:-${start_stop_daemon_args}} \
 | 
			
		||||
		$supervise_daemon_args \
 | 
			
		||||
		$command \
 | 
			
		||||
		-- $command_args $command_args_foreground
 | 
			
		||||
	rc=$?
 | 
			
		||||
@@ -55,20 +47,31 @@ supervise_stop()
 | 
			
		||||
	local startpidfile="$(service_get_value "pidfile")"
 | 
			
		||||
	chroot="${startchroot:-$chroot}"
 | 
			
		||||
	pidfile="${startpidfile:-$pidfile}"
 | 
			
		||||
	[ -n "$pidfile" ] || return 0
 | 
			
		||||
	ebegin "Stopping ${name:-$RC_SVCNAME}"
 | 
			
		||||
	supervise-daemon "${RC_SVCNAME}" --stop \
 | 
			
		||||
		${pidfile:+--pidfile} $chroot$pidfile
 | 
			
		||||
	supervise-daemon --stop \
 | 
			
		||||
		${pidfile:+--pidfile} $chroot$pidfile \
 | 
			
		||||
		${stopsig:+--signal} $stopsig
 | 
			
		||||
 | 
			
		||||
	eend $? "Failed to stop ${name:-$RC_SVCNAME}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_check_supervised()
 | 
			
		||||
{
 | 
			
		||||
	local child_pid start_time
 | 
			
		||||
	child_pid="$(service_get_value "child_pid")"
 | 
			
		||||
	start_time="$(service_get_value "start_time")"
 | 
			
		||||
	if [ -n "${child_pid}" ] && [ -n "${start_time}" ]; then
 | 
			
		||||
		return 1
 | 
			
		||||
	[ "$RC_UNAME" != Linux ] && return 0
 | 
			
		||||
	local child_pid="$(service_get_value "child_pid")"
 | 
			
		||||
	local pid="$(cat ${pidfile})"
 | 
			
		||||
	if [ -n "${child_pid}" ]; then
 | 
			
		||||
		if ! [ -e "/proc/${pid}" ] && [ -e "/proc/${child_pid}" ]; then
 | 
			
		||||
			if [ -e "/proc/self/ns/pid" ] && [ -e "/proc/${child_pid}/ns/pid" ]; then
 | 
			
		||||
				local n1 n2
 | 
			
		||||
				n1=$(readlink "/proc/self/ns/pid")
 | 
			
		||||
				n2=$(readlink "/proc/${child_pid}/ns/pid")
 | 
			
		||||
				if [ "${n1}" = "${n2}" ]; then
 | 
			
		||||
					return 1
 | 
			
		||||
				fi
 | 
			
		||||
			fi
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
@@ -100,13 +103,3 @@ supervise_status()
 | 
			
		||||
		return 3
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
healthcheck()
 | 
			
		||||
{
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unhealthy()
 | 
			
		||||
{
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
 | 
			
		||||
# Released under the 2-clause BSD license.
 | 
			
		||||
 | 
			
		||||
SUBDIR=		libeinfo librc rc
 | 
			
		||||
SUBDIR=		test libeinfo librc rc
 | 
			
		||||
 | 
			
		||||
MK=		../mk
 | 
			
		||||
include		${MK}/subdir.mk
 | 
			
		||||
 
 | 
			
		||||
@@ -28,11 +28,9 @@
 | 
			
		||||
#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
 | 
			
		||||
# define _dead __attribute__((__noreturn__))
 | 
			
		||||
# define _unused __attribute__((__unused__))
 | 
			
		||||
# define _xasprintf(a, b)  __attribute__((__format__(__printf__, a, b)))
 | 
			
		||||
#else
 | 
			
		||||
# define _dead
 | 
			
		||||
# define _unused
 | 
			
		||||
# define _xasprintf(a, b)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
 | 
			
		||||
@@ -55,7 +53,6 @@
 | 
			
		||||
	} while (/* CONSTCOND */ 0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
@@ -99,10 +96,8 @@ _unused static char *xstrdup(const char *str)
 | 
			
		||||
 | 
			
		||||
#undef ERRX
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * basename_c never modifies the argument. As such, if there is a trailing
 | 
			
		||||
 * slash then an empty string is returned.
 | 
			
		||||
 */
 | 
			
		||||
/* basename_c never modifies the argument. As such, if there is a trailing
 | 
			
		||||
 * slash then an empty string is returned. */
 | 
			
		||||
_unused static const char *basename_c(const char *path)
 | 
			
		||||
{
 | 
			
		||||
	const char *slash = strrchr(path, '/');
 | 
			
		||||
@@ -126,49 +121,4 @@ _unused static bool existss(const char *pathname)
 | 
			
		||||
	return (stat(pathname, &buf) == 0 && buf.st_size != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is an OpenRC specific version of the asprintf() function.
 | 
			
		||||
 * We do this to avoid defining the _GNU_SOURCE feature test macro on
 | 
			
		||||
 * glibc systems and to insure that we have a consistent function across
 | 
			
		||||
 * platforms. This also allows us to call our xmalloc and xrealloc
 | 
			
		||||
 * functions to handle memory allocation.
 | 
			
		||||
 * this function was originally written by Mike Frysinger.
 | 
			
		||||
 */
 | 
			
		||||
_unused _xasprintf(2,3) static int xasprintf(char **strp, const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	int len;
 | 
			
		||||
	int memlen;
 | 
			
		||||
	char *ret;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Start with a buffer size that should cover the vast majority of uses
 | 
			
		||||
	 * (path construction).
 | 
			
		||||
	 */
 | 
			
		||||
	memlen = 4096;
 | 
			
		||||
	ret = xmalloc(memlen);
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	len = vsnprintf(ret, memlen, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
	if (len >= memlen) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * Output was truncated, so increase buffer to exactly what we need.
 | 
			
		||||
		 */
 | 
			
		||||
		memlen = len + 1;
 | 
			
		||||
		ret = xrealloc(ret, memlen);
 | 
			
		||||
		va_start(ap, fmt);
 | 
			
		||||
		len = vsnprintf(ret, len + 1, fmt, ap);
 | 
			
		||||
		va_end(ap);
 | 
			
		||||
	}
 | 
			
		||||
	if (len < 0 || len >= memlen) {
 | 
			
		||||
		/* Give up! */
 | 
			
		||||
		fprintf(stderr, "xasprintf: unable to format a buffer\n");
 | 
			
		||||
		free(ret);
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
	*strp = ret;
 | 
			
		||||
	return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								src/includes/hidden-visibility.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/includes/hidden-visibility.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Written by Mike Frysinger
 | 
			
		||||
 * Placed in the Public Domain
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _HIDDEN_VISIBILITY_H_
 | 
			
		||||
#define _HIDDEN_VISIBILITY_H_
 | 
			
		||||
 | 
			
		||||
#if defined(__ELF__) && defined(__GNUC__)
 | 
			
		||||
# define __hidden_asmname(name) __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
 | 
			
		||||
# define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
 | 
			
		||||
# define __hidden_asmname2(prefix, name) #prefix name
 | 
			
		||||
# define __hidden_proto(name, internal) \
 | 
			
		||||
	extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
 | 
			
		||||
	__attribute__ ((visibility ("hidden")));
 | 
			
		||||
# define __hidden_ver(local, internal, name) \
 | 
			
		||||
   extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
 | 
			
		||||
   extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
 | 
			
		||||
# define hidden_proto(name) __hidden_proto(name, __RC_##name)
 | 
			
		||||
# define hidden_def(name) __hidden_ver(__RC_##name, name, name);
 | 
			
		||||
#else
 | 
			
		||||
# define hidden_proto(name)
 | 
			
		||||
# define hidden_def(name)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -66,6 +66,9 @@ int parse_mode(mode_t *, char *);
 | 
			
		||||
/* Handy function so we can wrap einfo around our deptree */
 | 
			
		||||
RC_DEPTREE *_rc_deptree_load (int, int *);
 | 
			
		||||
 | 
			
		||||
/* Test to see if we can see pid 1 or not */
 | 
			
		||||
bool _rc_can_find_pids(void);
 | 
			
		||||
 | 
			
		||||
RC_SERVICE lookup_service_state(const char *service);
 | 
			
		||||
void from_time_t(char *time_string, time_t tv);
 | 
			
		||||
time_t to_time_t(char *timestring);
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
 *    except according to the terms contained in the LICENSE file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
			
		||||
const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
@@ -39,6 +39,34 @@ static const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
			
		||||
 | 
			
		||||
#include "einfo.h"
 | 
			
		||||
#include "helpers.h"
 | 
			
		||||
#include "hidden-visibility.h"
 | 
			
		||||
 | 
			
		||||
hidden_proto(ecolor)
 | 
			
		||||
hidden_proto(ebegin)
 | 
			
		||||
hidden_proto(ebeginv)
 | 
			
		||||
hidden_proto(ebracket)
 | 
			
		||||
hidden_proto(eend)
 | 
			
		||||
hidden_proto(eendv)
 | 
			
		||||
hidden_proto(eerror)
 | 
			
		||||
hidden_proto(eerrorn)
 | 
			
		||||
hidden_proto(eerrorx)
 | 
			
		||||
hidden_proto(eindent)
 | 
			
		||||
hidden_proto(eindentv)
 | 
			
		||||
hidden_proto(einfo)
 | 
			
		||||
hidden_proto(einfon)
 | 
			
		||||
hidden_proto(einfov)
 | 
			
		||||
hidden_proto(einfovn)
 | 
			
		||||
hidden_proto(elog)
 | 
			
		||||
hidden_proto(eoutdent)
 | 
			
		||||
hidden_proto(eoutdentv)
 | 
			
		||||
hidden_proto(eprefix)
 | 
			
		||||
hidden_proto(ewarn)
 | 
			
		||||
hidden_proto(ewarnn)
 | 
			
		||||
hidden_proto(ewarnv)
 | 
			
		||||
hidden_proto(ewarnvn)
 | 
			
		||||
hidden_proto(ewarnx)
 | 
			
		||||
hidden_proto(ewend)
 | 
			
		||||
hidden_proto(ewendv)
 | 
			
		||||
 | 
			
		||||
/* Incase we cannot work out how many columns from ioctl, supply a default */
 | 
			
		||||
#define DEFAULT_COLS		 80
 | 
			
		||||
@@ -482,6 +510,7 @@ eprefix(const char *EINFO_RESTRICT prefix)
 | 
			
		||||
{
 | 
			
		||||
	_eprefix = prefix;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eprefix)
 | 
			
		||||
 | 
			
		||||
static void EINFO_PRINTF(2, 0)
 | 
			
		||||
elogv(int level, const char *EINFO_RESTRICT fmt, va_list ap)
 | 
			
		||||
@@ -508,6 +537,7 @@ elog(int level, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	elogv(level, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
}
 | 
			
		||||
hidden_def(elog)
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_eindent(FILE * EINFO_RESTRICT stream)
 | 
			
		||||
@@ -546,6 +576,7 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color)
 | 
			
		||||
			return ecolors_str[i];
 | 
			
		||||
	return "";
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ecolor)
 | 
			
		||||
 | 
			
		||||
const char *
 | 
			
		||||
ecolor(ECOLOR color)
 | 
			
		||||
@@ -612,6 +643,7 @@ einfon(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("einfon");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(einfon)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ewarnn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -627,6 +659,7 @@ ewarnn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ewarnn");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewarnn)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
eerrorn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -642,6 +675,7 @@ eerrorn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("errorn");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eerrorn)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
einfo(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -658,6 +692,7 @@ einfo(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("einfo");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(einfo)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ewarn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -675,6 +710,7 @@ ewarn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ewarn");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewarn)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ewarnx(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -691,6 +727,7 @@ ewarnx(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	}
 | 
			
		||||
	exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewarnx)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
eerror(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -708,6 +745,7 @@ eerror(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("eerror");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eerror)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eerrorx(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -723,6 +761,7 @@ eerrorx(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	}
 | 
			
		||||
	exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eerrorx)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ebegin(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -741,6 +780,7 @@ ebegin(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ebegin");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ebegin)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
_eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg)
 | 
			
		||||
@@ -814,6 +854,7 @@ eend(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("eend");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eend)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ewend(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -828,19 +869,21 @@ ewend(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ewend");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewend)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ebracket(int col, ECOLOR color, const char *msg)
 | 
			
		||||
{
 | 
			
		||||
	_eend(stdout, col, color, msg);
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ebracket)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eindent(void)
 | 
			
		||||
{
 | 
			
		||||
	char *env = getenv("EINFO_INDENT");
 | 
			
		||||
	int amount = 0;
 | 
			
		||||
	char *num;
 | 
			
		||||
	char num[10];
 | 
			
		||||
 | 
			
		||||
	if (env) {
 | 
			
		||||
		errno = 0;
 | 
			
		||||
@@ -851,16 +894,16 @@ eindent(void)
 | 
			
		||||
	amount += INDENT_WIDTH;
 | 
			
		||||
	if (amount > INDENT_MAX)
 | 
			
		||||
		amount = INDENT_MAX;
 | 
			
		||||
	xasprintf(&num, "%08d", amount);
 | 
			
		||||
	snprintf(num, 10, "%08d", amount);
 | 
			
		||||
	setenv("EINFO_INDENT", num, 1);
 | 
			
		||||
	free(num);
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eindent)
 | 
			
		||||
 | 
			
		||||
void eoutdent(void)
 | 
			
		||||
{
 | 
			
		||||
	char *env = getenv("EINFO_INDENT");
 | 
			
		||||
	int amount = 0;
 | 
			
		||||
	char *num = NULL;
 | 
			
		||||
	char num[10];
 | 
			
		||||
	int serrno = errno;
 | 
			
		||||
 | 
			
		||||
	if (!env)
 | 
			
		||||
@@ -874,12 +917,12 @@ void eoutdent(void)
 | 
			
		||||
	if (amount <= 0)
 | 
			
		||||
		unsetenv("EINFO_INDENT");
 | 
			
		||||
	else {
 | 
			
		||||
		xasprintf(&num, "%08d", amount);
 | 
			
		||||
		snprintf(num, 10, "%08d", amount);
 | 
			
		||||
		setenv("EINFO_INDENT", num, 1);
 | 
			
		||||
		free(num);
 | 
			
		||||
	}
 | 
			
		||||
	errno = serrno;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eoutdent)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
einfovn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -895,6 +938,7 @@ einfovn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("einfovn");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(einfovn)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ewarnvn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -910,6 +954,7 @@ ewarnvn(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ewarnvn");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewarnvn)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
einfov(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -926,6 +971,7 @@ einfov(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("einfov");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(einfov)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ewarnv(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -942,6 +988,7 @@ ewarnv(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ewarnv");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewarnv)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ebeginv(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -961,6 +1008,7 @@ ebeginv(const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ebeginv");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ebeginv)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
eendv(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -975,6 +1023,7 @@ eendv(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("eendv");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eendv)
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ewendv(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
@@ -989,6 +1038,7 @@ ewendv(int retval, const char *EINFO_RESTRICT fmt, ...)
 | 
			
		||||
	LASTCMD("ewendv");
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
hidden_def(ewendv)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eindentv(void)
 | 
			
		||||
@@ -996,6 +1046,7 @@ eindentv(void)
 | 
			
		||||
	if (is_verbose())
 | 
			
		||||
		eindent();
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eindentv)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eoutdentv(void)
 | 
			
		||||
@@ -1003,3 +1054,4 @@ eoutdentv(void)
 | 
			
		||||
	if (is_verbose())
 | 
			
		||||
		eoutdent();
 | 
			
		||||
}
 | 
			
		||||
hidden_def(eoutdentv)
 | 
			
		||||
 
 | 
			
		||||
@@ -23,13 +23,13 @@
 | 
			
		||||
static bool
 | 
			
		||||
pid_is_exec(pid_t pid, const char *exec)
 | 
			
		||||
{
 | 
			
		||||
	char *buffer = NULL;
 | 
			
		||||
	char buffer[32];
 | 
			
		||||
	FILE *fp;
 | 
			
		||||
	int c;
 | 
			
		||||
	bool retval = false;
 | 
			
		||||
 | 
			
		||||
	exec = basename_c(exec);
 | 
			
		||||
	xasprintf(&buffer, "/proc/%d/stat", pid);
 | 
			
		||||
	snprintf(buffer, sizeof(buffer), "/proc/%d/stat", pid);
 | 
			
		||||
	if ((fp = fopen(buffer, "r"))) {
 | 
			
		||||
		while ((c = getc(fp)) != EOF && c != '(')
 | 
			
		||||
			;
 | 
			
		||||
@@ -41,27 +41,23 @@ pid_is_exec(pid_t pid, const char *exec)
 | 
			
		||||
		}
 | 
			
		||||
		fclose(fp);
 | 
			
		||||
	}
 | 
			
		||||
	free(buffer);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
pid_is_argv(pid_t pid, const char *const *argv)
 | 
			
		||||
{
 | 
			
		||||
	char *cmdline = NULL;
 | 
			
		||||
	char cmdline[32];
 | 
			
		||||
	int fd;
 | 
			
		||||
	char buffer[PATH_MAX];
 | 
			
		||||
	char *p;
 | 
			
		||||
	ssize_t bytes;
 | 
			
		||||
 | 
			
		||||
	xasprintf(&cmdline, "/proc/%u/cmdline", pid);
 | 
			
		||||
	if ((fd = open(cmdline, O_RDONLY)) < 0) {
 | 
			
		||||
		free(cmdline);
 | 
			
		||||
	snprintf(cmdline, sizeof(cmdline), "/proc/%u/cmdline", pid);
 | 
			
		||||
	if ((fd = open(cmdline, O_RDONLY)) < 0)
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	bytes = read(fd, buffer, sizeof(buffer) - 1);
 | 
			
		||||
	bytes = read(fd, buffer, sizeof(buffer));
 | 
			
		||||
	close(fd);
 | 
			
		||||
	free(cmdline);
 | 
			
		||||
	if (bytes == -1)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
@@ -92,7 +88,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
 | 
			
		||||
	char proc_ns[30];
 | 
			
		||||
	size_t len = 0;
 | 
			
		||||
	pid_t p;
 | 
			
		||||
	char *buffer = NULL;
 | 
			
		||||
	char buffer[PATH_MAX];
 | 
			
		||||
	struct stat sb;
 | 
			
		||||
	pid_t openrc_pid = 0;
 | 
			
		||||
	char *pp;
 | 
			
		||||
@@ -141,7 +137,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
 | 
			
		||||
	memset(my_ns, 0, sizeof(my_ns));
 | 
			
		||||
	memset(proc_ns, 0, sizeof(proc_ns));
 | 
			
		||||
	if (exists("/proc/self/ns/pid")) {
 | 
			
		||||
		rc = readlink("/proc/self/ns/pid", my_ns, sizeof(my_ns)-1);
 | 
			
		||||
		rc = readlink("/proc/self/ns/pid", my_ns, sizeof(my_ns));
 | 
			
		||||
		if (rc <= 0)
 | 
			
		||||
			my_ns[0] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
@@ -153,22 +149,18 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (pid != 0 && pid != p)
 | 
			
		||||
			continue;
 | 
			
		||||
		xasprintf(&buffer, "/proc/%d/ns/pid", p);
 | 
			
		||||
		snprintf(buffer, sizeof(buffer), "/proc/%d/ns/pid", p);
 | 
			
		||||
		if (exists(buffer)) {
 | 
			
		||||
			rc = readlink(buffer, proc_ns, sizeof(proc_ns)-1);
 | 
			
		||||
			rc = readlink(buffer, proc_ns, sizeof(proc_ns));
 | 
			
		||||
			if (rc <= 0)
 | 
			
		||||
				proc_ns[0] = '\0';
 | 
			
		||||
		}
 | 
			
		||||
		free(buffer);
 | 
			
		||||
		if (strlen(my_ns) && strlen (proc_ns) && strcmp(my_ns, proc_ns))
 | 
			
		||||
		if (strcmp(my_ns, proc_ns))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (uid) {
 | 
			
		||||
			xasprintf(&buffer, "/proc/%d", p);
 | 
			
		||||
			if (stat(buffer, &sb) != 0 || sb.st_uid != uid) {
 | 
			
		||||
				free(buffer);
 | 
			
		||||
			snprintf(buffer, sizeof(buffer), "/proc/%d", p);
 | 
			
		||||
			if (stat(buffer, &sb) != 0 || sb.st_uid != uid)
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			free(buffer);
 | 
			
		||||
		}
 | 
			
		||||
		if (exec && !pid_is_exec(p, exec))
 | 
			
		||||
			continue;
 | 
			
		||||
@@ -177,10 +169,9 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
 | 
			
		||||
			continue;
 | 
			
		||||
		/* If this is an OpenVZ host, filter out container processes */
 | 
			
		||||
		if (openvz_host) {
 | 
			
		||||
			xasprintf(&buffer, "/proc/%d/status", p);
 | 
			
		||||
			snprintf(buffer, sizeof(buffer), "/proc/%d/status", p);
 | 
			
		||||
			if (exists(buffer)) {
 | 
			
		||||
				fp = fopen(buffer, "r");
 | 
			
		||||
				free(buffer);
 | 
			
		||||
				if (! fp)
 | 
			
		||||
					continue;
 | 
			
		||||
				while (! feof(fp)) {
 | 
			
		||||
@@ -208,6 +199,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
 | 
			
		||||
	closedir(procdir);
 | 
			
		||||
	return pids;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_find_pids)
 | 
			
		||||
 | 
			
		||||
#elif BSD
 | 
			
		||||
 | 
			
		||||
@@ -312,6 +304,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
 | 
			
		||||
 | 
			
		||||
	return pids;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_find_pids)
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  error "Platform not supported!"
 | 
			
		||||
@@ -322,13 +315,12 @@ _match_daemon(const char *path, const char *file, RC_STRINGLIST *match)
 | 
			
		||||
{
 | 
			
		||||
	char *line = NULL;
 | 
			
		||||
	size_t len = 0;
 | 
			
		||||
	char *ffile = NULL;
 | 
			
		||||
	char ffile[PATH_MAX];
 | 
			
		||||
	FILE *fp;
 | 
			
		||||
	RC_STRING *m;
 | 
			
		||||
 | 
			
		||||
	xasprintf(&ffile, "%s/%s", path, file);
 | 
			
		||||
	snprintf(ffile, sizeof(ffile), "%s/%s", path, file);
 | 
			
		||||
	fp = fopen(ffile, "r");
 | 
			
		||||
	free(ffile);
 | 
			
		||||
 | 
			
		||||
	if (!fp)
 | 
			
		||||
		return false;
 | 
			
		||||
@@ -354,22 +346,29 @@ _match_list(const char *exec, const char *const *argv, const char *pidfile)
 | 
			
		||||
{
 | 
			
		||||
	RC_STRINGLIST *match = rc_stringlist_new();
 | 
			
		||||
	int i = 0;
 | 
			
		||||
	size_t l;
 | 
			
		||||
	char *m;
 | 
			
		||||
 | 
			
		||||
	if (exec) {
 | 
			
		||||
		xasprintf(&m, "exec=%s", exec);
 | 
			
		||||
		l = strlen(exec) + 6;
 | 
			
		||||
		m = xmalloc(sizeof(char) * l);
 | 
			
		||||
		snprintf(m, l, "exec=%s", exec);
 | 
			
		||||
		rc_stringlist_add(match, m);
 | 
			
		||||
		free(m);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (argv && argv[i]) {
 | 
			
		||||
		xasprintf(&m, "argv_0=%s", argv[i++]);
 | 
			
		||||
		l = strlen(*argv) + strlen("argv_=") + 16;
 | 
			
		||||
		m = xmalloc(sizeof(char) * l);
 | 
			
		||||
		snprintf(m, l, "argv_0=%s", argv[i++]);
 | 
			
		||||
		rc_stringlist_add(match, m);
 | 
			
		||||
		free(m);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (pidfile) {
 | 
			
		||||
		xasprintf(&m, "pidfile=%s", pidfile);
 | 
			
		||||
		l = strlen(pidfile) + 9;
 | 
			
		||||
		m = xmalloc(sizeof(char) * l);
 | 
			
		||||
		snprintf(m, l, "pidfile=%s", pidfile);
 | 
			
		||||
		rc_stringlist_add(match, m);
 | 
			
		||||
		free(m);
 | 
			
		||||
	}
 | 
			
		||||
@@ -382,8 +381,8 @@ rc_service_daemon_set(const char *service, const char *exec,
 | 
			
		||||
    const char *const *argv,
 | 
			
		||||
    const char *pidfile, bool started)
 | 
			
		||||
{
 | 
			
		||||
	char *dirpath = NULL;
 | 
			
		||||
	char *file = NULL;
 | 
			
		||||
	char dirpath[PATH_MAX];
 | 
			
		||||
	char file[PATH_MAX];
 | 
			
		||||
	int nfiles = 0;
 | 
			
		||||
	char oldfile[PATH_MAX] = { '\0' };
 | 
			
		||||
	bool retval = false;
 | 
			
		||||
@@ -398,7 +397,8 @@ rc_service_daemon_set(const char *service, const char *exec,
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	xasprintf(&dirpath, RC_SVCDIR "/daemons/%s", basename_c(service));
 | 
			
		||||
	snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s",
 | 
			
		||||
	    basename_c(service));
 | 
			
		||||
 | 
			
		||||
	/* Regardless, erase any existing daemon info */
 | 
			
		||||
	if ((dp = opendir(dirpath))) {
 | 
			
		||||
@@ -407,7 +407,8 @@ rc_service_daemon_set(const char *service, const char *exec,
 | 
			
		||||
			if (d->d_name[0] == '.')
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
			xasprintf(&file, "%s/%s", dirpath, d->d_name);
 | 
			
		||||
			snprintf(file, sizeof(file), "%s/%s",
 | 
			
		||||
			    dirpath, d->d_name);
 | 
			
		||||
			nfiles++;
 | 
			
		||||
 | 
			
		||||
			if (!*oldfile) {
 | 
			
		||||
@@ -420,7 +421,6 @@ rc_service_daemon_set(const char *service, const char *exec,
 | 
			
		||||
				rename(file, oldfile);
 | 
			
		||||
				strlcpy(oldfile, file, sizeof(oldfile));
 | 
			
		||||
			}
 | 
			
		||||
			free(file);
 | 
			
		||||
		}
 | 
			
		||||
		closedir(dp);
 | 
			
		||||
		rc_stringlist_free(match);
 | 
			
		||||
@@ -429,7 +429,8 @@ rc_service_daemon_set(const char *service, const char *exec,
 | 
			
		||||
	/* Now store our daemon info */
 | 
			
		||||
	if (started) {
 | 
			
		||||
		if (mkdir(dirpath, 0755) == 0 || errno == EEXIST) {
 | 
			
		||||
			xasprintf(&file, "%s/%03d", dirpath, nfiles + 1);
 | 
			
		||||
			snprintf(file, sizeof(file), "%s/%03d",
 | 
			
		||||
			    dirpath, nfiles + 1);
 | 
			
		||||
			if ((fp = fopen(file, "w"))) {
 | 
			
		||||
				fprintf(fp, "exec=");
 | 
			
		||||
				if (exec)
 | 
			
		||||
@@ -445,21 +446,20 @@ rc_service_daemon_set(const char *service, const char *exec,
 | 
			
		||||
				fclose(fp);
 | 
			
		||||
				retval = true;
 | 
			
		||||
			}
 | 
			
		||||
			free(file);
 | 
			
		||||
		}
 | 
			
		||||
	} else
 | 
			
		||||
		retval = true;
 | 
			
		||||
 | 
			
		||||
	free(dirpath);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_service_daemon_set)
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
rc_service_started_daemon(const char *service,
 | 
			
		||||
    const char *exec, const char *const *argv, int indx)
 | 
			
		||||
{
 | 
			
		||||
	char *dirpath = NULL;
 | 
			
		||||
	char *file = NULL;
 | 
			
		||||
	char dirpath[PATH_MAX];
 | 
			
		||||
	char file[16];
 | 
			
		||||
	RC_STRINGLIST *match;
 | 
			
		||||
	bool retval = false;
 | 
			
		||||
	DIR *dp;
 | 
			
		||||
@@ -468,13 +468,13 @@ rc_service_started_daemon(const char *service,
 | 
			
		||||
	if (!service || !exec)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	xasprintf(&dirpath, RC_SVCDIR "/daemons/%s", basename_c(service));
 | 
			
		||||
	snprintf(dirpath, sizeof(dirpath), RC_SVCDIR "/daemons/%s",
 | 
			
		||||
	    basename_c(service));
 | 
			
		||||
	match = _match_list(exec, argv, NULL);
 | 
			
		||||
 | 
			
		||||
	if (indx > 0) {
 | 
			
		||||
		xasprintf(&file, "%03d", indx);
 | 
			
		||||
		snprintf(file, sizeof(file), "%03d", indx);
 | 
			
		||||
		retval = _match_daemon(dirpath, file, match);
 | 
			
		||||
		free(file);
 | 
			
		||||
	} else {
 | 
			
		||||
		if ((dp = opendir(dirpath))) {
 | 
			
		||||
			while ((d = readdir(dp))) {
 | 
			
		||||
@@ -489,9 +489,9 @@ rc_service_started_daemon(const char *service,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rc_stringlist_free(match);
 | 
			
		||||
	free(dirpath);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_service_started_daemon)
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
rc_service_daemons_crashed(const char *service)
 | 
			
		||||
@@ -611,7 +611,7 @@ rc_service_daemons_crashed(const char *service)
 | 
			
		||||
				i = 0;
 | 
			
		||||
				TAILQ_FOREACH(s, list, entries)
 | 
			
		||||
				    argv[i++] = s->value;
 | 
			
		||||
				argv[i] = NULL;
 | 
			
		||||
				argv[i] = '\0';
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -649,3 +649,4 @@ rc_service_daemons_crashed(const char *service)
 | 
			
		||||
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_service_daemons_crashed)
 | 
			
		||||
 
 | 
			
		||||
@@ -78,16 +78,16 @@ rc_deptree_free(RC_DEPTREE *deptree)
 | 
			
		||||
	}
 | 
			
		||||
	free(deptree);
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_free)
 | 
			
		||||
 | 
			
		||||
static RC_DEPINFO *
 | 
			
		||||
get_depinfo(const RC_DEPTREE *deptree, const char *service)
 | 
			
		||||
{
 | 
			
		||||
	RC_DEPINFO *di;
 | 
			
		||||
	if (deptree) {
 | 
			
		||||
		TAILQ_FOREACH(di, deptree, entries)
 | 
			
		||||
			if (strcmp(di->service, service) == 0)
 | 
			
		||||
				return di;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH(di, deptree, entries)
 | 
			
		||||
		if (strcmp(di->service, service) == 0)
 | 
			
		||||
			return di;
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -96,11 +96,9 @@ get_deptype(const RC_DEPINFO *depinfo, const char *type)
 | 
			
		||||
{
 | 
			
		||||
	RC_DEPTYPE *dt;
 | 
			
		||||
 | 
			
		||||
	if (depinfo) {
 | 
			
		||||
		TAILQ_FOREACH(dt, &depinfo->depends, entries)
 | 
			
		||||
			if (strcmp(dt->type, type) == 0)
 | 
			
		||||
				return dt;
 | 
			
		||||
	}
 | 
			
		||||
	TAILQ_FOREACH(dt, &depinfo->depends, entries)
 | 
			
		||||
		if (strcmp(dt->type, type) == 0)
 | 
			
		||||
			return dt;
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -108,6 +106,7 @@ RC_DEPTREE *
 | 
			
		||||
rc_deptree_load(void) {
 | 
			
		||||
	return rc_deptree_load_file(RC_DEPTREE_CACHE);
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_load)
 | 
			
		||||
 | 
			
		||||
RC_DEPTREE *
 | 
			
		||||
rc_deptree_load_file(const char *deptree_file)
 | 
			
		||||
@@ -171,6 +170,7 @@ rc_deptree_load_file(const char *deptree_file)
 | 
			
		||||
 | 
			
		||||
	return deptree;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_load_file)
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
valid_service(const char *runlevel, const char *service, const char *type)
 | 
			
		||||
@@ -456,6 +456,7 @@ rc_deptree_depend(const RC_DEPTREE *deptree,
 | 
			
		||||
		rc_stringlist_add(svcs, svc->value);
 | 
			
		||||
	return svcs;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_depend)
 | 
			
		||||
 | 
			
		||||
RC_STRINGLIST *
 | 
			
		||||
rc_deptree_depends(const RC_DEPTREE *deptree,
 | 
			
		||||
@@ -483,6 +484,7 @@ rc_deptree_depends(const RC_DEPTREE *deptree,
 | 
			
		||||
	rc_stringlist_free(visited);
 | 
			
		||||
	return sorted;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_depends)
 | 
			
		||||
 | 
			
		||||
RC_STRINGLIST *
 | 
			
		||||
rc_deptree_order(const RC_DEPTREE *deptree, const char *runlevel, int options)
 | 
			
		||||
@@ -538,42 +540,54 @@ rc_deptree_order(const RC_DEPTREE *deptree, const char *runlevel, int options)
 | 
			
		||||
	rc_stringlist_free(types);
 | 
			
		||||
	return services;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_order)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Given a time, recurse the target path to find out if there are
 | 
			
		||||
   any older (or newer) files.   If false, sets the time to the
 | 
			
		||||
   oldest (or newest) found.
 | 
			
		||||
*/
 | 
			
		||||
static bool
 | 
			
		||||
deep_mtime_check(const char *target, bool newer,
 | 
			
		||||
mtime_check(const char *source, const char *target, bool newer,
 | 
			
		||||
	    time_t *rel, char *file)
 | 
			
		||||
{
 | 
			
		||||
	struct stat buf;
 | 
			
		||||
	time_t mtime;
 | 
			
		||||
	bool retval = true;
 | 
			
		||||
	DIR *dp;
 | 
			
		||||
	struct dirent *d;
 | 
			
		||||
	char path[PATH_MAX];
 | 
			
		||||
	int serrno = errno;
 | 
			
		||||
 | 
			
		||||
	/* We have to exist */
 | 
			
		||||
	if (stat(source, &buf) != 0)
 | 
			
		||||
		return false;
 | 
			
		||||
	mtime = buf.st_mtime;
 | 
			
		||||
 | 
			
		||||
	/* If target does not exist, return true to mimic shell test */
 | 
			
		||||
	if (stat(target, &buf) != 0)
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	if (newer) {
 | 
			
		||||
		if (*rel < buf.st_mtime) {
 | 
			
		||||
		if (mtime < buf.st_mtime) {
 | 
			
		||||
			if (rel == NULL)
 | 
			
		||||
				return false;
 | 
			
		||||
			retval = false;
 | 
			
		||||
 | 
			
		||||
			if (file)
 | 
			
		||||
				strlcpy(file, target, PATH_MAX);
 | 
			
		||||
			*rel = buf.st_mtime;
 | 
			
		||||
		}
 | 
			
		||||
		if (rel != NULL) {
 | 
			
		||||
			if (*rel < buf.st_mtime) {
 | 
			
		||||
				if (file)
 | 
			
		||||
					strlcpy(file, target, PATH_MAX);
 | 
			
		||||
				*rel = buf.st_mtime;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if (*rel > buf.st_mtime) {
 | 
			
		||||
		if (mtime > buf.st_mtime) {
 | 
			
		||||
			if (rel == NULL)
 | 
			
		||||
				return false;
 | 
			
		||||
			retval = false;
 | 
			
		||||
 | 
			
		||||
			if (file)
 | 
			
		||||
				strlcpy(file, target, PATH_MAX);
 | 
			
		||||
			*rel = buf.st_mtime;
 | 
			
		||||
		}
 | 
			
		||||
		if (rel != NULL) {
 | 
			
		||||
			if (*rel > buf.st_mtime) {
 | 
			
		||||
				if (file)
 | 
			
		||||
					strlcpy(file, target, PATH_MAX);
 | 
			
		||||
				*rel = buf.st_mtime;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -588,38 +602,16 @@ deep_mtime_check(const char *target, bool newer,
 | 
			
		||||
		if (d->d_name[0] == '.')
 | 
			
		||||
			continue;
 | 
			
		||||
		snprintf(path, sizeof(path), "%s/%s", target, d->d_name);
 | 
			
		||||
		if (!deep_mtime_check(path, newer, rel, file)) {
 | 
			
		||||
		if (!mtime_check(source, path, newer, rel, file)) {
 | 
			
		||||
			retval = false;
 | 
			
		||||
			if (rel == NULL)
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	closedir(dp);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Recursively check if target is older/newer than source.
 | 
			
		||||
 * If false, return the filename and most different time (if
 | 
			
		||||
 * the return value arguments are non-null).
 | 
			
		||||
 */
 | 
			
		||||
static bool
 | 
			
		||||
mtime_check(const char *source, const char *target, bool newer,
 | 
			
		||||
	    time_t *rel, char *file)
 | 
			
		||||
{
 | 
			
		||||
	struct stat buf;
 | 
			
		||||
	time_t mtime;
 | 
			
		||||
	bool retval = true;
 | 
			
		||||
 | 
			
		||||
	/* We have to exist */
 | 
			
		||||
	if (stat(source, &buf) != 0)
 | 
			
		||||
		return false;
 | 
			
		||||
	mtime = buf.st_mtime;
 | 
			
		||||
 | 
			
		||||
	retval = deep_mtime_check(target,newer,&mtime,file);
 | 
			
		||||
	if (rel) {
 | 
			
		||||
		*rel = mtime;
 | 
			
		||||
	}
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
rc_newer_than(const char *source, const char *target,
 | 
			
		||||
	      time_t *newest, char *file)
 | 
			
		||||
@@ -627,6 +619,7 @@ rc_newer_than(const char *source, const char *target,
 | 
			
		||||
 | 
			
		||||
	return mtime_check(source, target, true, newest, file);
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_newer_than)
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
rc_older_than(const char *source, const char *target,
 | 
			
		||||
@@ -634,6 +627,7 @@ rc_older_than(const char *source, const char *target,
 | 
			
		||||
{
 | 
			
		||||
	return mtime_check(source, target, false, oldest, file);
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_older_than)
 | 
			
		||||
 | 
			
		||||
typedef struct deppair
 | 
			
		||||
{
 | 
			
		||||
@@ -676,8 +670,6 @@ rc_deptree_update_needed(time_t *newest, char *file)
 | 
			
		||||
	RC_STRINGLIST *config;
 | 
			
		||||
	RC_STRING *s;
 | 
			
		||||
	int i;
 | 
			
		||||
	struct stat buf;
 | 
			
		||||
	time_t mtime;
 | 
			
		||||
 | 
			
		||||
	/* Create base directories if needed */
 | 
			
		||||
	for (i = 0; depdirs[i]; i++)
 | 
			
		||||
@@ -685,50 +677,45 @@ rc_deptree_update_needed(time_t *newest, char *file)
 | 
			
		||||
			fprintf(stderr, "mkdir `%s': %s\n", depdirs[i], strerror(errno));
 | 
			
		||||
 | 
			
		||||
	/* Quick test to see if anything we use has changed and we have
 | 
			
		||||
	 * data in our deptree. */
 | 
			
		||||
 | 
			
		||||
	if (stat(RC_DEPTREE_CACHE, &buf) == 0) {
 | 
			
		||||
		mtime = buf.st_mtime;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* No previous cache found.
 | 
			
		||||
		 * We still run the scan, in case of clock skew; we still need to return
 | 
			
		||||
		 * the newest time.
 | 
			
		||||
		 */
 | 
			
		||||
		newer = true;
 | 
			
		||||
		mtime = time(NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newer |= !deep_mtime_check(RC_INITDIR,true,&mtime,file);
 | 
			
		||||
	newer |= !deep_mtime_check(RC_CONFDIR,true,&mtime,file);
 | 
			
		||||
	 * data in our deptree */
 | 
			
		||||
	if (!existss(RC_DEPTREE_CACHE))
 | 
			
		||||
		return true;
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_INITDIR, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONFDIR, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
#ifdef RC_PKG_INITDIR
 | 
			
		||||
    newer |= !deep_mtime_check(RC_PKG_INITDIR,true,&mtime,file);
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_INITDIR, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef RC_PKG_CONFDIR
 | 
			
		||||
    newer |= !deep_mtime_check(RC_PKG_CONFDIR,true,&mtime,file);
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_PKG_CONFDIR, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef RC_LOCAL_INITDIRs
 | 
			
		||||
    newer |= !deep_mtime_check(RC_LOCAL_INITDIR,true,&mtime,file);
 | 
			
		||||
#ifdef RC_LOCAL_INITDIR
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_INITDIR, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef RC_LOCAL_CONFDIR
 | 
			
		||||
    newer |= !deep_mtime_check(RC_LOCAL_CONFDIR,true,&mtime,file);
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_LOCAL_CONFDIR, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
#endif
 | 
			
		||||
    newer |= !deep_mtime_check(RC_CONF,true,&mtime,file);
 | 
			
		||||
	if (!rc_newer_than(RC_DEPTREE_CACHE, RC_CONF, newest, file))
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	/* Some init scripts dependencies change depending on config files
 | 
			
		||||
	 * outside of baselayout, like syslog-ng, so we check those too. */
 | 
			
		||||
	config = rc_config_list(RC_DEPCONFIG);
 | 
			
		||||
	TAILQ_FOREACH(s, config, entries) {
 | 
			
		||||
		newer |= !deep_mtime_check(s->value, true, &mtime, file);
 | 
			
		||||
		if (!rc_newer_than(RC_DEPTREE_CACHE, s->value, newest, file)) {
 | 
			
		||||
			newer = true;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	rc_stringlist_free(config);
 | 
			
		||||
 | 
			
		||||
	/* Return newest file time, if requested */
 | 
			
		||||
	if ((newer) && (newest != NULL)) {
 | 
			
		||||
	    *newest = mtime;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return newer;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_update_needed)
 | 
			
		||||
 | 
			
		||||
/* This is a 7 phase operation
 | 
			
		||||
   Phase 1 is a shell script which loads each init script and config in turn
 | 
			
		||||
@@ -1075,3 +1062,4 @@ rc_deptree_update(void)
 | 
			
		||||
	rc_deptree_free(deptree);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
librc_hidden_def(rc_deptree_update)
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user