Compare commits
	
		
			3 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					03e61ccd30 | ||
| 
						 | 
					7067f7670e | ||
| 
						 | 
					3c198185b2 | 
							
								
								
									
										874
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										874
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,366 +1,3 @@
 | 
			
		||||
commit 2f60a959b442866b0e879d83f2732c4fa3ed3f7d
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    update news file
 | 
			
		||||
 | 
			
		||||
commit 25b45a5a239318fb57c405c3fe64e53b0738ad68
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    cgroup_cleanup: try to remove the cgroup version 2 cgroup
 | 
			
		||||
    
 | 
			
		||||
    If we were able to kill all the processes in the cgroup, it should be
 | 
			
		||||
    removed.
 | 
			
		||||
 | 
			
		||||
commit 4651b8c7e9e2ef9c1ea1fb8d174d1ca4693627af
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    rc-cgroup.sh: cgroup_cleanup fix error handling
 | 
			
		||||
    
 | 
			
		||||
    cgroup_cleanup should warn if it is unable to clean up all processes in
 | 
			
		||||
    the control group, but it will always return success.
 | 
			
		||||
 | 
			
		||||
commit 50608b54ed98acb54fec5fe3323909ea684d3af9
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    rc-cgroup.sh: fix signal names
 | 
			
		||||
    
 | 
			
		||||
    The "SIG" prefix on signal names passed to kill -s isn't portable.
 | 
			
		||||
 | 
			
		||||
commit b0a077a35f85e266fdb82a245dcbda18664a8567
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    add quiet switch to do_stop in src-schedules.c
 | 
			
		||||
    
 | 
			
		||||
    This allows supervise-daemon to run this code without attempting to
 | 
			
		||||
    print some status messages used by start-stop-daemon.
 | 
			
		||||
 | 
			
		||||
commit 6a5ca2ab368d0a85f51bb559672dba2e3ffcc6be
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    make the procedure for killing child processes of services configurable
 | 
			
		||||
 | 
			
		||||
commit 2b0345165e5af57ca61a4000c3671bbe6d677cf9
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Make cgroup_cleanup send only one sigterm and sigkill
 | 
			
		||||
    
 | 
			
		||||
    Instead of looping and sending multiple signals to child processes in
 | 
			
		||||
    cgroup_cleanup, we send sigterm followed by sleeping one second then
 | 
			
		||||
    sigkill.
 | 
			
		||||
    
 | 
			
		||||
    This brings us more in line with systemd's "control group" killmode
 | 
			
		||||
    setting.
 | 
			
		||||
    
 | 
			
		||||
    Also, this commit includes several shellcheck cleanups.
 | 
			
		||||
 | 
			
		||||
commit 8885580986ab8adc951fe32b9323c8b16130fb4f
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    rc-cgroup.sh: move cgroup_cleanup to the end of the file
 | 
			
		||||
 | 
			
		||||
commit 6d7713a758b7e78f05e6a3cc101f862d28d778ab
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    guide.md: clarify cgroups documentation
 | 
			
		||||
    
 | 
			
		||||
    Update the documentation to reflect cgroups version 2 support.
 | 
			
		||||
    Also, add a section on dealing with orphaned service processes.
 | 
			
		||||
    
 | 
			
		||||
    This fixes #94.
 | 
			
		||||
 | 
			
		||||
commit 457f928e793cb1f6ef254935ad07f58b8762c72f
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    add support for control groups version 2
 | 
			
		||||
    
 | 
			
		||||
    This is for #94.
 | 
			
		||||
 | 
			
		||||
commit a71a461e452a98554346c47411e9c9012023c201
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    version 0.31
 | 
			
		||||
 | 
			
		||||
commit a09b8af3f98c0700a9b838b7f3683ee58eecc912
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Update ChangeLog
 | 
			
		||||
 | 
			
		||||
commit 382efdbfcb99703d03211efacd800c9575e64230
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    add quiet parameter to run_stop_schedule
 | 
			
		||||
 | 
			
		||||
commit 17b5cc78d35dc5fe4904e5951715c3e0d07d6343
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    add retry option to supervise-daemon
 | 
			
		||||
    
 | 
			
		||||
    The --retry option for supervise-daemon defines how the supervisor will
 | 
			
		||||
    attempt to stop the child process it is monitoring. It is defined when
 | 
			
		||||
    the supervisor is started since stopping the supervisor just sends a
 | 
			
		||||
    signal to the active supervisor.
 | 
			
		||||
    
 | 
			
		||||
    This fixes #160.
 | 
			
		||||
 | 
			
		||||
commit 36a0ab9054512ade413226fb8e8b28060045e9a4
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    make run_stop_schedule accept a pid instead of a pid file
 | 
			
		||||
 | 
			
		||||
commit 27c2bd997d5173aa30844a16bc22dc8caab09f8c
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    version 0.30
 | 
			
		||||
 | 
			
		||||
commit d7938f54f29193251e083ad35a7d464949829096
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    start-stop-daemon: move --retry processing code to a shared module
 | 
			
		||||
    
 | 
			
		||||
    This was part of start-stop-daemon; however, it needs to be shared in
 | 
			
		||||
    order to be used by supervise-daemon.
 | 
			
		||||
 | 
			
		||||
commit cfbe9c2ede24dac530ef58e5c35bd57f22a788a3
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    move get_pid function to a shared file
 | 
			
		||||
 | 
			
		||||
commit df28002b728b033c00c2da64dedf2bcd4ab5e11b
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Update ChangeLog
 | 
			
		||||
 | 
			
		||||
commit 66ed8082d0c865a0b4f4cc436cf9e13351e3d6fe
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    sh/openrc-run: source service script before ulimit is processed
 | 
			
		||||
    
 | 
			
		||||
    This is needed to allow the service script author to set a default for
 | 
			
		||||
    rc_ulimit inside the service script.
 | 
			
		||||
 | 
			
		||||
commit c2d256bafb9d1dfafbfd0846c035c5d26f7449c8
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    man/openrc-run.8: document fstabinfo and mountinfo
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 592374
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=592374
 | 
			
		||||
 | 
			
		||||
commit f48d9c33a5c708c871d6657a39485d1c0c735548
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    man/openrc-run.8: document _pre and _post functions
 | 
			
		||||
    
 | 
			
		||||
    Fixes https://github.com/openrc/openrc/issues/155.
 | 
			
		||||
 | 
			
		||||
commit 6d4e8433974fd8567885635ae0454031290f96b1
 | 
			
		||||
Author: Jason Graham <jgraha8@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix ENT macro usage
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 624796
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=624796
 | 
			
		||||
 | 
			
		||||
commit 0513cd3964a9564e0ba39b50aa8ebd3d7e9a3920
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    version 0.29
 | 
			
		||||
 | 
			
		||||
commit 72bb2e57de935ab46ad000f97a5720265bed9342
 | 
			
		||||
Author: John R. Graham <john_r_graham@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Typo fix
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 624908
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=624908
 | 
			
		||||
 | 
			
		||||
commit 84c5da30695db89d686d3c28c7cacdf172cbf429
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Update ChangeLog
 | 
			
		||||
 | 
			
		||||
commit b35099cb707e333b6b8d30d956ffa93bcd2da0ab
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Add comment about overriding the default efivars mount in fstab to news
 | 
			
		||||
 | 
			
		||||
commit 3fd3bfc76dccc3752f4af949ad4076dab26357fb
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    add link to efivars issue to news file
 | 
			
		||||
 | 
			
		||||
commit 492a6303cb8314263bfd3631e3b0de5a9df178da
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Update ChangeLog
 | 
			
		||||
 | 
			
		||||
commit e7807b3136d8993805082320784460f5059e6275
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix sysvinit compatibility for shutdown wrapper
 | 
			
		||||
 | 
			
		||||
commit 03a461ac0ee34b7900868cdea624c6fd868b1656
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix sysvinit compatibility for reboot wrapper
 | 
			
		||||
 | 
			
		||||
commit 7e0f76e0adc545c74a8332a6ef0811d2aa62cb81
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix sysvinit compatibility for poweroff wrapper
 | 
			
		||||
 | 
			
		||||
commit 9812ce5b8dc22fe36cc7bf75cf6e62db204ece3d
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix halt wrapper so it is sysvinit compatible
 | 
			
		||||
    
 | 
			
		||||
    This makes the halt wrapper sysvinit compatible. It ignores several
 | 
			
		||||
    command line switches which are not currently implemented; however,
 | 
			
		||||
    those can be implemented if we need to do so.
 | 
			
		||||
    
 | 
			
		||||
    This fixes https://github.com/openrc/openrc/issues/146.
 | 
			
		||||
 | 
			
		||||
commit 12f75e4167f84a9a85f69924ebdb28ad36c085cb
 | 
			
		||||
Author: Adam Borowski <kilobyte@angband.pl>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    man: fix an unclosed .Bl/.El warning
 | 
			
		||||
    
 | 
			
		||||
    This fixes #151.
 | 
			
		||||
 | 
			
		||||
commit 260368e0103e95625c29760f2c2ec89143e5a233
 | 
			
		||||
Author: Adam Borowski <kilobyte@angband.pl>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    man: fix missing .Pp warnings
 | 
			
		||||
    
 | 
			
		||||
    This fixes #151.
 | 
			
		||||
 | 
			
		||||
commit f87a9eec3d23ea01578500972f1df993d5d24fba
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/sysfs: mount efivars read only
 | 
			
		||||
    
 | 
			
		||||
    This fixes #134.
 | 
			
		||||
 | 
			
		||||
commit 1e837d596e483ceb5cec177a6c7faff24a42384b
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix argument parsing for the sysvinit shutdown wrapper
 | 
			
		||||
    
 | 
			
		||||
    This fixes #140.
 | 
			
		||||
 | 
			
		||||
commit dcc686e42b406d63d52ef75de9a326f67d0a06c9
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    scripts/shutdown: fix arguments to be sysvinit shutdown compatible
 | 
			
		||||
    
 | 
			
		||||
    This fixes #140.
 | 
			
		||||
 | 
			
		||||
commit 2f81c100afdf45ebf787dfc5d3261aa6055640e4
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Fix link to shutdown for MKSYSVINIT=yes
 | 
			
		||||
 | 
			
		||||
commit a511a48d77b1dcb8a3fb0dd1abddb750a152869b
 | 
			
		||||
Author: Nuno Silva <nuno.m.ribeiro.silva@tecnico.ulisboa.pt>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/hostname: fix default parameter syntax
 | 
			
		||||
    
 | 
			
		||||
    The syntax for expanding a variable with a default value is
 | 
			
		||||
            ${parameter:-word}
 | 
			
		||||
    not
 | 
			
		||||
            ${parameter-word}
 | 
			
		||||
    although the latter still works for a reason I could not explain.
 | 
			
		||||
    
 | 
			
		||||
    This fixes #143.
 | 
			
		||||
 | 
			
		||||
commit 1e5322e5c55ec744a2cdcc3342ef6547eab7c46f
 | 
			
		||||
Author: Nuno Silva <nuno.m.ribeiro.silva@tecnico.ulisboa.pt>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/hostname: fix indentation
 | 
			
		||||
    
 | 
			
		||||
    This is for #143.
 | 
			
		||||
 | 
			
		||||
commit 199a210d2fbc524c9c400a06f832dabffd7ed1b3
 | 
			
		||||
Author: udeved <artoo@manjaro.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    scripts/Makefile: make symlinks absolute instead of relative
 | 
			
		||||
    
 | 
			
		||||
    This closes #142.
 | 
			
		||||
 | 
			
		||||
commit 5b7667af32effddf867a5d021c66d43f0645d374
 | 
			
		||||
Author: udeved <artoo@manjaro.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    scripts/Makefile: respect SBINDIR with MKSYSVINIT
 | 
			
		||||
    
 | 
			
		||||
    This is for #142.
 | 
			
		||||
 | 
			
		||||
commit 11243f85b67e5f450ddf50346ffd4a1b2c6faeb5
 | 
			
		||||
Author: Jory A. Pratt <anarchy@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    kill_all: include limits.h for PATH_MAX
 | 
			
		||||
 | 
			
		||||
commit 3c40826d3466cdda1a46abcd5c86b661b8185f46
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    version 0.28
 | 
			
		||||
 | 
			
		||||
commit 560d874d2fee63bf7ca11f17cf9933021b639a1d
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fix compile issue for musl
 | 
			
		||||
 | 
			
		||||
commit e84366fd232a41c3ba79ed351e93c74cef8d7c8d
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Update ChangeLog
 | 
			
		||||
 | 
			
		||||
commit caacedc0a82285fb2d25c6d3473f154044c7ad66
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
@@ -1436,3 +1073,514 @@ Author: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
Commit: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
 | 
			
		||||
    rc-misc: allow EINFO_VERBOSE through too
 | 
			
		||||
 | 
			
		||||
commit 1edb5f6fd9c4827e5d4ed5c854bc322ba8a7df73
 | 
			
		||||
Author: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
Commit: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
 | 
			
		||||
    rc-misc: Allow EINFO_COLOR through env_filter()
 | 
			
		||||
    
 | 
			
		||||
    This allows rc-service -C <service> <action> to properly not print color
 | 
			
		||||
    messages.
 | 
			
		||||
    
 | 
			
		||||
    Fixes #93
 | 
			
		||||
 | 
			
		||||
commit c4d7e02abd7008b8e8ad16f62c2abbb60fab252b
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Fix permission checks for cgroups
 | 
			
		||||
    
 | 
			
		||||
    This is needed because containers may give read access to cgroups but
 | 
			
		||||
    not allow the settings to be changed.
 | 
			
		||||
 | 
			
		||||
commit a4e0d675e13f07bf880da10a4d602983a556264d
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    man/openrc-run.8: update variable documentation
 | 
			
		||||
    
 | 
			
		||||
    - document command_args_background and command_user.r
 | 
			
		||||
    - clarify documentation for command_background
 | 
			
		||||
    
 | 
			
		||||
    This fixes #78.
 | 
			
		||||
 | 
			
		||||
commit 8a8032478a755f6e2ceaebc5425e61c6817df936
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Make use of name vs RC_SVCNAME consistent in supervisor scripts
 | 
			
		||||
    
 | 
			
		||||
    This fixes #79.
 | 
			
		||||
 | 
			
		||||
commit ac53c9a658589456c678b6bfe674a66a3845e564
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    sh/init.sh: fix the test for cache restoration
 | 
			
		||||
    
 | 
			
		||||
    This fixes the test for cache restoration since we are no longer caching
 | 
			
		||||
    the dependency tree.
 | 
			
		||||
 | 
			
		||||
commit b02ff466fa75cc4b5bcfaff3f2989cc65c823f43
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    savecache: stop saving the dependency tree
 | 
			
		||||
    
 | 
			
		||||
    This fixes #85.
 | 
			
		||||
 | 
			
		||||
commit 6bd0f2d096f149906061a4ac7b66b7e85516784a
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/procfs: typo fix
 | 
			
		||||
 | 
			
		||||
commit 63f8ae466f046dcdbb0ba13ef96e63eeec86e6e6
 | 
			
		||||
Author: frickler01 <frickler01@users.noreply.github.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Format code blocks and variable/path notations
 | 
			
		||||
    
 | 
			
		||||
    Add markdown backticks for commands, variable names and path as well
 | 
			
		||||
    as code blocks for better readability.
 | 
			
		||||
    
 | 
			
		||||
    This fixes #97.
 | 
			
		||||
 | 
			
		||||
commit 841b883825ddf9982a673b3964757f6df25acd46
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    hwclock: fix module load warning
 | 
			
		||||
 | 
			
		||||
commit ba10793b0b85b11fae04e6526716c6f7976afde1
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/procfs: fix binfmt_misc module load warning
 | 
			
		||||
    
 | 
			
		||||
    This reworks the logic so that the warning about configuring the
 | 
			
		||||
    binfmt_misc module is only displayed if the module actually has to be
 | 
			
		||||
    loaded.
 | 
			
		||||
 | 
			
		||||
commit d4d559323819c8a5279bf197d8d3ff80f1e28cdc
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    sh/openrc-run.sh: read global configuration settings first
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 503134
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=503134
 | 
			
		||||
 | 
			
		||||
commit d5db5489be135ae9295e378e789b4b7b13367fdd
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/swap: do not unmount all tmpfs file systems
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 568162
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=568162
 | 
			
		||||
 | 
			
		||||
commit d06db93d5954460668d09cf6ef2fc401ee9d981c
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    remove swapfiles service
 | 
			
		||||
    
 | 
			
		||||
    The swapfiles service was basically a copy of the swap service, so this
 | 
			
		||||
    commit consolidates the functionality into the swap service.
 | 
			
		||||
    
 | 
			
		||||
    X-Funtoo-Bug-URL: https://bugs.funtoo.org/browse/FL-2523
 | 
			
		||||
    X-Gentoo-Bug: 568162
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=568162
 | 
			
		||||
 | 
			
		||||
commit 8c14d0c476e06fff7598c526e26b6a13d53a4600
 | 
			
		||||
Author: Martin Väth <martin@mvath.de>
 | 
			
		||||
Commit: Martin Väth <martin@mvath.de>
 | 
			
		||||
 | 
			
		||||
    Fix typo in RC_UNAME check of modules-load
 | 
			
		||||
    
 | 
			
		||||
    The $RC_UNAME "Linux" had been misspelled as "linux".
 | 
			
		||||
    As a consequence, entries in e.g. /etc/modules-load.d failed to
 | 
			
		||||
    load any module succesfully under Linux(!)
 | 
			
		||||
 | 
			
		||||
commit 04debf6f25b3748a101b61cb85f78617dbe5be6e
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    another news typo fix
 | 
			
		||||
 | 
			
		||||
commit c289774b00d0d7dc38fdc1f0f623569bd184a4b1
 | 
			
		||||
Author: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
Commit: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
 | 
			
		||||
    modules-load: handle comments better
 | 
			
		||||
    
 | 
			
		||||
    This handles comments without a trailing space after the comment
 | 
			
		||||
    character.
 | 
			
		||||
    
 | 
			
		||||
    Reported-By: josef64
 | 
			
		||||
 | 
			
		||||
commit 9dd8ee330d8a4449c937bc95fc8393a55913c8d1
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    typo fix
 | 
			
		||||
 | 
			
		||||
commit 5d5856c193768d24f11d5f0533e48c39526aef5c
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Update news file
 | 
			
		||||
    
 | 
			
		||||
    Add information on modules-load service and more explanation about
 | 
			
		||||
    dealing with the rc -> openrc and runscript -> openrc-run transitions.
 | 
			
		||||
 | 
			
		||||
commit 686e172207ac9e23560da18a6f877be777ded935
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d: add modules-load to ignore patterns
 | 
			
		||||
 | 
			
		||||
commit fef6268f8d03e3ab3e2564cbf3634d0db2bcd99e
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    modules-load.d: cleanups
 | 
			
		||||
    
 | 
			
		||||
    Move list of directories to a local variable and create the fn variable
 | 
			
		||||
    to use for an individual file name rather than using path.
 | 
			
		||||
 | 
			
		||||
commit 556dbff99d53cdcc00e6b1ec67e1679f72b6f284
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Add modules-load.d support
 | 
			
		||||
 | 
			
		||||
commit 69ac78d76a31d843c004717eb6aa6a77bb4c9a8e
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    openrc-run: make runscript warning respect quiet option
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 591414
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=591414
 | 
			
		||||
 | 
			
		||||
commit 4018dfc8de4818101c336ff8bcf0f4762b318c6a
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/hostname: do not use localhost as a default hostname
 | 
			
		||||
    
 | 
			
		||||
    This allows the operating system default hostname to be used if no
 | 
			
		||||
    hostname is configured.
 | 
			
		||||
 | 
			
		||||
commit 353bb9bc9a0ab3c6650d72d2ceb14c990762a2a0
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/hostname: add support for /etc/hostname
 | 
			
		||||
 | 
			
		||||
commit 73cdf10f1f513be7b5dec4f1cc91e0c68cda689b
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Deprecate automatic loading of modules
 | 
			
		||||
    
 | 
			
		||||
    In the hwclock, procfs and sysfs service scripts, we automatically
 | 
			
		||||
    attempt to load the kernel modules we need before we take any action. We
 | 
			
		||||
    shouldn't do this, because there are systems which do not use kernel
 | 
			
		||||
    modules and do not have the kmod package installed.
 | 
			
		||||
    
 | 
			
		||||
    With this change, we continue to load the modules ourselves, but we warn
 | 
			
		||||
    the admin that they need to be added to /etc/conf.d/modules or built
 | 
			
		||||
    into the kernel.
 | 
			
		||||
    
 | 
			
		||||
    In the future, this automatic loading will be dropped.
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 342313
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=342313
 | 
			
		||||
 | 
			
		||||
commit 1a55d46645b376cd27f394796934150120a08387
 | 
			
		||||
Author: Raymond Jennings <shentino@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    local.d/README: typo fix
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 591258
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=591258
 | 
			
		||||
 | 
			
		||||
commit cae3976ef1276ce33aa7e49474f13499a48a3fe6
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d: Add runsvdir to ignore patterns
 | 
			
		||||
 | 
			
		||||
commit da28a3d367b6078deda6bc205806b43b971e67a9
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d: initial service adjustments for docker support
 | 
			
		||||
    
 | 
			
		||||
    Add -docker keyword to the same scripts that have -lxc keyword.
 | 
			
		||||
 | 
			
		||||
commit ca8c29ee60b0e8ca89091aaf801725bd71e28001
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    librc: fix Docker auto detection
 | 
			
		||||
    
 | 
			
		||||
    The original auto detection of Docker containers assumed the presence of
 | 
			
		||||
    a container environment variable. However, Docker-1.12 does not
 | 
			
		||||
    implement this, and I'm not sure which versions of docker implemented
 | 
			
		||||
    it.
 | 
			
		||||
    
 | 
			
		||||
    The new test is for the presence of a file named .dockerenv in the
 | 
			
		||||
    root directory.
 | 
			
		||||
 | 
			
		||||
commit f62253b8334a85dac4671e42817b96a3bedd1881
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Add support for runit
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 501364
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=501364
 | 
			
		||||
 | 
			
		||||
commit f2c2e2dd5a5e0a22da4dcabea6615d0f4697a962
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/sysctl.in: typo fix
 | 
			
		||||
 | 
			
		||||
commit 94b98430cb83a8f4e62d837100fc357e9eb12ca6
 | 
			
		||||
Author: Kenneth Lakin <kennethlakin@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    start-stop-daemon: Add SSD_IONICELEVEL
 | 
			
		||||
    
 | 
			
		||||
    This is the disk IO counterpart to SSD_NICELEVEL.
 | 
			
		||||
    Modified by William Hubbs to add the variable to the start-stop-daemon
 | 
			
		||||
    man page.
 | 
			
		||||
    
 | 
			
		||||
    This fixes #69.
 | 
			
		||||
 | 
			
		||||
commit b19d0a40d7f20987323d5af91469c720ead39561
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d/loopback: remove unnecessary stop function
 | 
			
		||||
 | 
			
		||||
commit 0c229faf7e6a57bcff70f2143b83cb69a34c89f4
 | 
			
		||||
Author: Martin Väth <martin@mvath.de>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    tmpfiles.sh: Support lines with q Q h H
 | 
			
		||||
    
 | 
			
		||||
    btrfs support is not implemented yet (for q Q v), but at least tmpfiles.sh
 | 
			
		||||
    no longer chokes about tmpfiles.d lines of recent systemd versions
 | 
			
		||||
    
 | 
			
		||||
    This fixes #87.
 | 
			
		||||
 | 
			
		||||
commit 3092e310acd376fc626cc051549e02bcd7697aed
 | 
			
		||||
Author: Mike Gilbert <floppym@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    tmpfiles: Accept filenames as command line arguments
 | 
			
		||||
    
 | 
			
		||||
    This brings us closer to being able to use tmpfiles.sh as a full
 | 
			
		||||
    replacement for systemd-tmpfiles.
 | 
			
		||||
    
 | 
			
		||||
    This closes #83.
 | 
			
		||||
 | 
			
		||||
commit 671911762d1bcd90c10d8ac0eb30fe10be4a65f6
 | 
			
		||||
Author: Mike Gilbert <floppym@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    tmpfiles: Process command line before gathering config files
 | 
			
		||||
    
 | 
			
		||||
    This is part of #83.
 | 
			
		||||
 | 
			
		||||
commit 7d68839e9ea89b0a92aef69a9b4fd298554bb9b1
 | 
			
		||||
Author: Mike Gilbert <floppym@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    tmpfiles: Make unrecognized options fatal
 | 
			
		||||
    
 | 
			
		||||
    This is part of #83.
 | 
			
		||||
 | 
			
		||||
commit 5341a925c15934674031aebb97533b0adcd10236
 | 
			
		||||
Author: Jakub Jirutka <jakub@jirutka.cz>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    s6-guide: fix typo
 | 
			
		||||
    
 | 
			
		||||
    This fixes #92.
 | 
			
		||||
 | 
			
		||||
commit 3adb8fb389caaafbed1be13c5ac4d96214c8eed3
 | 
			
		||||
Author: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
Commit: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
 | 
			
		||||
    rc-logger: refuse to cat TMPLOG into itself
 | 
			
		||||
    
 | 
			
		||||
    This prevents an infinite loop in case somebody decides to set
 | 
			
		||||
    rc_log_path to match TMPLOG.
 | 
			
		||||
 | 
			
		||||
commit 8927a37fb790e718c956376242a532ab9d1755e7
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    etc: remove rc.conf.* file fragments
 | 
			
		||||
 | 
			
		||||
commit b085b2cda58bc884acb959e48f14fb044c983042
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    etc: create default rc.conf
 | 
			
		||||
    
 | 
			
		||||
    Before now, /etc/rc.conf was created by the build system from multiple
 | 
			
		||||
    rc.conf.* file fragments and there was no reason for this.
 | 
			
		||||
 | 
			
		||||
commit daf93977641201f16c477b075ce9055a1da8f7b3
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    init.d: combine sysctl scripts
 | 
			
		||||
    
 | 
			
		||||
    We had separate sysctl scripts for each operating system. However, there
 | 
			
		||||
    is no need to do this since we can detect the operating system at
 | 
			
		||||
    runtime with $RC_UNAME.
 | 
			
		||||
 | 
			
		||||
commit 2984504c887afc9a36610eb7c20b097f7d1e70d0
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    conf.d: remove staticroute file fragments
 | 
			
		||||
 | 
			
		||||
commit 35e8386c24df6483f2918979dae150421f7151df
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    conf.d: makestaticroute file static
 | 
			
		||||
 | 
			
		||||
commit 2108285d64e2ee8cc03fbe544efc3752fe349bdd
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    conf.d: remove network file fragnents
 | 
			
		||||
 | 
			
		||||
commit a3133fec250eca3cdfb460c2ce26c707fd593c09
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    conf.d: make network file static
 | 
			
		||||
 | 
			
		||||
commit 314ae3dc781d7ae8fc26c276a85b0dc6ab6bc326
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    modules: add support for FreeBSD
 | 
			
		||||
    
 | 
			
		||||
    This is based on a patch submitted by
 | 
			
		||||
    Joe Maloney <pkgdemonteam@gmail.com>.
 | 
			
		||||
    
 | 
			
		||||
    This fixes #91.
 | 
			
		||||
 | 
			
		||||
commit 695be59083cdf0d2ff9296f2c210e591c51bdf40
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    rc-status: add -m/--manual  option to show manually started services
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 585906
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=585906
 | 
			
		||||
 | 
			
		||||
commit c962678dd6ab1314b55c2a3bcdae03902bda39b8
 | 
			
		||||
Author: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
Commit: Doug Freed <dwfreed@mtu.edu>
 | 
			
		||||
 | 
			
		||||
    rc: Rename some static variables to kill warnings
 | 
			
		||||
 | 
			
		||||
commit 3a1262703fd20d2e8288d13d908fb282c77d1793
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Remove the DEBUG_MEMORY macro
 | 
			
		||||
    
 | 
			
		||||
    This fixes #43.
 | 
			
		||||
 | 
			
		||||
commit 20035210bdf5d5729734457f35f5f32a53a5b3ad
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    make variable aflag a boolean show_all
 | 
			
		||||
 | 
			
		||||
commit 7f84b5d741c150cd159d5a3cda3ef532f0381826
 | 
			
		||||
Author: Jaromil <jaromil@dyne.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    libeinfo: document the x suffix on function names
 | 
			
		||||
    
 | 
			
		||||
    This fixes #88.
 | 
			
		||||
 | 
			
		||||
commit 8bca2cd4b3c710809131ac036456b34c223e8d12
 | 
			
		||||
Author: Julian Ospald <hasufell@posteo.de>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Build: fix hardcoded pkg-config invocation
 | 
			
		||||
    
 | 
			
		||||
    This fixes #89.
 | 
			
		||||
 | 
			
		||||
commit ac8ad169ae59fece38066c2e08ff57d53d737edd
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    hwclock: always use --noadjfile if available
 | 
			
		||||
    
 | 
			
		||||
    When we use the --utc or --localtime switch, also use --noadjfile if it
 | 
			
		||||
    is available. This means hwclock will not use a drift file.
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 584722
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=584722
 | 
			
		||||
 | 
			
		||||
commit 553799400218903ab495d1154a41c6d8890cb752
 | 
			
		||||
Author: Mike Gilbert <floppym@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    man: Document the procname variable for openrc-run
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 586794
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/586794
 | 
			
		||||
 | 
			
		||||
commit 5af5d12f3e56f9f2ff232d124d27c856fd66f551
 | 
			
		||||
Author: Benda Xu <heroxbd@gentoo.org>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    Fix PATH for Prefix.
 | 
			
		||||
    
 | 
			
		||||
    1. remove default /bin:/sbin:/usr/bin:/usr/sbin
 | 
			
		||||
    2. PKG_PREFIX should be defaulted to $(PREFIX)/usr
 | 
			
		||||
    3. LOCAL_PREFIX should be defaulted to $(PREFIX)/usr/local
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug:583634
 | 
			
		||||
    X-Gentoo-Bug-URL:https://bugs.gentoo.org/show_bug.cgi?id=583634
 | 
			
		||||
 | 
			
		||||
commit b2c92b88cc6ce6d81444667efbc6d44542db1788
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    fstabinfo/mountinfo: ensure /etc/fstab exists before calling setmntent
 | 
			
		||||
    
 | 
			
		||||
    This is based on a patch by A. Wilcox <awilfox.gentoo@foxkit.us>.
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 478226
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=478226
 | 
			
		||||
    
 | 
			
		||||
    X-Gentoo-Bug: 478226
 | 
			
		||||
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=478226
 | 
			
		||||
 | 
			
		||||
commit 1b32af17225a4b18ced7f4326727cbe8265e7fd2
 | 
			
		||||
Author: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
Commit: William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
 | 
			
		||||
    increment version to 0.22
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
NAME=		openrc
 | 
			
		||||
VERSION=	0.31
 | 
			
		||||
VERSION=	0.27.1
 | 
			
		||||
PKG=		${NAME}-${VERSION}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								NEWS.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								NEWS.md
									
									
									
									
									
								
							@@ -3,26 +3,6 @@
 | 
			
		||||
This file will contain a list of notable changes for each release. Note
 | 
			
		||||
the information in this file is in reverse order.
 | 
			
		||||
 | 
			
		||||
## OpenRC 0.31
 | 
			
		||||
 | 
			
		||||
This version adds support for Control Groups version 2, which is
 | 
			
		||||
considered stable as of Linux-4.13. Please see /etc/rc.conf for
 | 
			
		||||
documentation on how to configure control groups.
 | 
			
		||||
 | 
			
		||||
## OpenRC-0.28
 | 
			
		||||
 | 
			
		||||
This version mounts efivars read only due to concerns about changes in
 | 
			
		||||
this file system making systems unbootable.  If you need to change something
 | 
			
		||||
in this path, you will need to re-mount it read-write, make the change
 | 
			
		||||
and re-mount it read-only.
 | 
			
		||||
 | 
			
		||||
Also, you can override this behavior by adding a line for efivars to
 | 
			
		||||
fstab if you want efivars mounted read-write.
 | 
			
		||||
 | 
			
		||||
For more information on this issue, see the following url:
 | 
			
		||||
 | 
			
		||||
https://github.com/openrc/openrc/issues/134
 | 
			
		||||
 | 
			
		||||
## OpenRC-0.25
 | 
			
		||||
 | 
			
		||||
This version contains an OpenRC-specific implementation of init for
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
#no_umounts="/dir1:/var/dir2"
 | 
			
		||||
#
 | 
			
		||||
# Mark certain mount points as critical.
 | 
			
		||||
# This contains a space separated list of mount points which should be
 | 
			
		||||
# This contains aspace separated list of mount points which should be
 | 
			
		||||
# considered critical. If one of these mount points cannot be mounted,
 | 
			
		||||
# localmount will fail.
 | 
			
		||||
# By default, this is empty.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										74
									
								
								etc/rc.conf
									
									
									
									
									
								
							
							
						
						
									
										74
									
								
								etc/rc.conf
									
									
									
									
									
								
							@@ -191,43 +191,13 @@ rc_tty_number=12
 | 
			
		||||
##############################################################################
 | 
			
		||||
# LINUX CGROUPS RESOURCE MANAGEMENT
 | 
			
		||||
 | 
			
		||||
# This sets the mode used to mount cgroups.
 | 
			
		||||
# "hybrid" mounts cgroups version 2 on /sys/fs/cgroup/unified and
 | 
			
		||||
# cgroups version 1 on /sys/fs/cgroup.
 | 
			
		||||
# "legacy" mounts cgroups version 1 on /sys/fs/cgroup
 | 
			
		||||
# "unified" mounts cgroups version 2 on /sys/fs/cgroup
 | 
			
		||||
#rc_cgroup_mode="hybrid"
 | 
			
		||||
 | 
			
		||||
# This is a list of controllers which should be enabled for cgroups version 2.
 | 
			
		||||
# If hybrid mode is being used, controllers listed here will not be
 | 
			
		||||
# available for cgroups version 1.
 | 
			
		||||
# This is a global setting.
 | 
			
		||||
#rc_cgroup_controllers=""
 | 
			
		||||
 | 
			
		||||
# This variable contains the cgroups version 2 settings for your services.
 | 
			
		||||
# If this is set in this file, the settings will apply to all services.
 | 
			
		||||
# If you want different settings for each service, place the settings in
 | 
			
		||||
# /etc/conf.d/foo for service foo.
 | 
			
		||||
# The format is to specify the setting and value followed by a newline.
 | 
			
		||||
# Multiple settings and values can be specified.
 | 
			
		||||
# For example, you would use this to set the maximum memory and maximum
 | 
			
		||||
# number of pids for a service.
 | 
			
		||||
#rc_cgroup_settings="
 | 
			
		||||
#memory.max 10485760
 | 
			
		||||
#pids.max max
 | 
			
		||||
#"
 | 
			
		||||
#
 | 
			
		||||
# For more information about the adjustments that can be made with
 | 
			
		||||
# cgroups version 2, see Documentation/cgroups-v2.txt in the linux kernel
 | 
			
		||||
# source tree.
 | 
			
		||||
#rc_cgroup_settings=""
 | 
			
		||||
 | 
			
		||||
# This switch controls whether or not cgroups version 1 controllers are
 | 
			
		||||
# individually mounted under
 | 
			
		||||
# /sys/fs/cgroup in hybrid or legacy mode.
 | 
			
		||||
# If you have cgroups turned on in your kernel, this switch controls
 | 
			
		||||
# whether or not a group for each controller is mounted under
 | 
			
		||||
# /sys/fs/cgroup.
 | 
			
		||||
# None of the other options in this section work if this is set to "NO".
 | 
			
		||||
#rc_controller_cgroups="YES"
 | 
			
		||||
 | 
			
		||||
# The following settings allow you to set up values for the cgroups version 1
 | 
			
		||||
# The following settings allow you to set up values for the cgroup
 | 
			
		||||
# controllers for your services.
 | 
			
		||||
# They can be set in this file;, however, if you do this, the settings
 | 
			
		||||
# will apply to all of your services.
 | 
			
		||||
@@ -241,9 +211,8 @@ rc_tty_number=12
 | 
			
		||||
# cpu.shares 512
 | 
			
		||||
# "
 | 
			
		||||
#
 | 
			
		||||
# For more information about the adjustments that can be made with
 | 
			
		||||
# cgroups version 1, see Documentation/cgroups-v1/* in the linux kernel
 | 
			
		||||
# source tree.
 | 
			
		||||
#For more information about the adjustments that can be made with
 | 
			
		||||
#cgroups, see Documentation/cgroups/* in the linux kernel source tree.
 | 
			
		||||
 | 
			
		||||
# Set the blkio controller settings for this service.
 | 
			
		||||
#rc_cgroup_blkio=""
 | 
			
		||||
@@ -277,33 +246,10 @@ rc_tty_number=12
 | 
			
		||||
 | 
			
		||||
# Set this to YES if you want all of the processes in a service's cgroup
 | 
			
		||||
# killed when the service is stopped or restarted.
 | 
			
		||||
# Be aware that setting this to yes means all of a service's
 | 
			
		||||
# child processes will be killed. Keep this in mind if you set this to
 | 
			
		||||
# yes here instead of for the individual services in
 | 
			
		||||
# /etc/conf.d/<service>.
 | 
			
		||||
# This should not be set globally because it kills all of the service's
 | 
			
		||||
# child processes, and most of the time this is undesirable. Please set
 | 
			
		||||
# it in /etc/conf.d/<service>.
 | 
			
		||||
# To perform this cleanup manually for a stopped service, you can
 | 
			
		||||
# execute cgroup_cleanup with /etc/init.d/<service> cgroup_cleanup or
 | 
			
		||||
# rc-service <service> cgroup_cleanup.
 | 
			
		||||
# The process followed in this cleanup is the following:
 | 
			
		||||
# 1. send stopsig (sigterm if it isn't set) to all processes left in the
 | 
			
		||||
# cgroup immediately followed by sigcont.
 | 
			
		||||
# 2. Send sighup to all processes in the cgroup if rc_send_sighup is
 | 
			
		||||
# yes.
 | 
			
		||||
# 3. delay for rc_timeout_stopsec seconds.
 | 
			
		||||
# 4. send sigkill to all processes in the cgroup unless disabled by
 | 
			
		||||
# setting rc_send_sigkill to no.
 | 
			
		||||
# rc_cgroup_cleanup="NO"
 | 
			
		||||
 | 
			
		||||
# If this is yes, we will send sighup to the processes in the cgroup
 | 
			
		||||
# immediately after stopsig and sigcont.
 | 
			
		||||
#rc_send_sighup="NO"
 | 
			
		||||
 | 
			
		||||
# This is the amount of time in seconds that we delay after sending sigcont
 | 
			
		||||
# and optionally sighup, before we optionally send sigkill to all
 | 
			
		||||
# processes in the # cgroup.
 | 
			
		||||
# The default is 90 seconds.
 | 
			
		||||
#rc_timeout_stopsec="90"
 | 
			
		||||
 | 
			
		||||
# If this is set to no, we do not send sigkill to all processes in the
 | 
			
		||||
# cgroup.
 | 
			
		||||
#rc_send_sigkill="YES"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								guide.md
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								guide.md
									
									
									
									
									
								
							@@ -241,36 +241,17 @@ messages to a file), and a few others.
 | 
			
		||||
 | 
			
		||||
# ulimit and CGroups
 | 
			
		||||
 | 
			
		||||
Setting `ulimit` and `nice` values per service can be done through the
 | 
			
		||||
`rc_ulimit` variable.
 | 
			
		||||
Setting `ulimit` and `nice` values per service can be done through the `rc_ulimit`
 | 
			
		||||
variable.
 | 
			
		||||
 | 
			
		||||
Under Linux, OpenRC can use cgroups for process management as well. Once
 | 
			
		||||
the kernel is configured appropriately, the `rc_cgroup_mode` setting in
 | 
			
		||||
/etc/rc.conf should be used to control whether cgroups version one,,
 | 
			
		||||
two, or both are used. The default is to use both if they are available.
 | 
			
		||||
 | 
			
		||||
By changing certain settings in the service's `conf.d` file limits can be
 | 
			
		||||
enforced per service. These settings are documented in detail in the
 | 
			
		||||
default /etc/rc.conf under `LINUX CGROUPS RESOURCE MANAGEMENT`.
 | 
			
		||||
 | 
			
		||||
# Dealing with Orphaned Processes
 | 
			
		||||
 | 
			
		||||
It is possible to get into a state where there are orphaned processes
 | 
			
		||||
running which were part of a service. For example, if you are monitoring
 | 
			
		||||
a service with supervise-daemon and supervise-daemon dies for an unknown
 | 
			
		||||
reason. The way to deal with this will be different for each system.
 | 
			
		||||
 | 
			
		||||
On Linux systems with cgroups enabled, the cgroup_cleanup command is
 | 
			
		||||
added to all services. You can run it manually, when the service is
 | 
			
		||||
stopped, by using:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# rc-service someservice cgroup_cleanup
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The `rc_cgroup_cleanup` setting can be changed to yes to make this
 | 
			
		||||
happen automatically when the service is stopped.
 | 
			
		||||
Under Linux, OpenRC can optionally use CGroups for process management.
 | 
			
		||||
By default each service script's processes are migrated to their own CGroup.
 | 
			
		||||
 | 
			
		||||
By changing certain values in the `conf.d` file limits can be enforced per 
 | 
			
		||||
service. It is easy to find orphan processes of a service that persist after 
 | 
			
		||||
`stop()`, but by default these will NOT be terminated.
 | 
			
		||||
To change this add `rc_cgroup_cleanup="yes"` in the `conf.d` files for services 
 | 
			
		||||
where you desire this functionality.
 | 
			
		||||
 | 
			
		||||
# Caching
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,7 @@
 | 
			
		||||
 | 
			
		||||
description="Sets the hostname of the machine."
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
depend() {
 | 
			
		||||
	after clock
 | 
			
		||||
	keyword -docker -lxc -prefix -systemd-nspawn
 | 
			
		||||
}
 | 
			
		||||
@@ -21,12 +20,12 @@ start()
 | 
			
		||||
{
 | 
			
		||||
	local h source x
 | 
			
		||||
	if [ -s @SYSCONFDIR@/hostname ] && [ -r @SYSCONFDIR@/hostname ]; then
 | 
			
		||||
		read h x <@SYSCONFDIR@/hostname
 | 
			
		||||
		source="from @SYSCONFDIR@/hostname"
 | 
			
		||||
	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.
 | 
			
		||||
		h=${hostname:-${HOSTNAME}} # checkbashisms: false positive (HOSTNAME var)
 | 
			
		||||
		h=${hostname-${HOSTNAME}} # checkbashisms: false positive
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -z "$h" ]; then
 | 
			
		||||
		einfo "Using default system hostname"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										102
									
								
								init.d/sysfs.in
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								init.d/sysfs.in
									
									
									
									
									
								
							@@ -101,22 +101,26 @@ mount_misc()
 | 
			
		||||
	if [ -d /sys/firmware/efi/efivars ] &&
 | 
			
		||||
		! mountinfo -q /sys/firmware/efi/efivars; then
 | 
			
		||||
		ebegin "Mounting efivarfs filesystem"
 | 
			
		||||
		mount -n -t efivarfs -o ro \
 | 
			
		||||
		mount -n -t efivarfs -o ${sysfs_opts} \
 | 
			
		||||
			efivarfs /sys/firmware/efi/efivars 2> /dev/null
 | 
			
		||||
		eend 0
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup1_base()
 | 
			
		||||
mount_cgroups()
 | 
			
		||||
{
 | 
			
		||||
	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 $?
 | 
			
		||||
	# set up kernel support for cgroups
 | 
			
		||||
	if [ -d /sys/fs/cgroup ] && ! mountinfo -q /sys/fs/cgroup; then
 | 
			
		||||
		if grep -qs cgroup /proc/filesystems; then
 | 
			
		||||
			ebegin "Mounting cgroup filesystem"
 | 
			
		||||
			local opts="${sysfs_opts},mode=755,size=${rc_cgroupsize:-10m}"
 | 
			
		||||
			mount -n -t tmpfs -o ${opts} cgroup_root /sys/fs/cgroup
 | 
			
		||||
			eend $?
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	mountinfo -q /sys/fs/cgroup || return 0
 | 
			
		||||
 | 
			
		||||
	if ! mountinfo -q /sys/fs/cgroup/openrc; then
 | 
			
		||||
		local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh"
 | 
			
		||||
		mkdir /sys/fs/cgroup/openrc
 | 
			
		||||
@@ -125,87 +129,17 @@ cgroup1_base()
 | 
			
		||||
			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
 | 
			
		||||
	yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
 | 
			
		||||
	while read name hier groups 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}"
 | 
			
		||||
			1)	mountinfo -q /sys/fs/cgroup/${name} && continue
 | 
			
		||||
				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_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 &&
 | 
			
		||||
		grep -qw cgroup2 /proc/filesystems ||
 | 
			
		||||
		return 0
 | 
			
		||||
	cgroup1_base
 | 
			
		||||
	mkdir /sys/fs/cgroup/unified
 | 
			
		||||
	mount -t cgroup2 none -o "${sysfs_opts},nsdelegate" /sys/fs/cgroup/unified
 | 
			
		||||
	cgroup2_controllers
 | 
			
		||||
	cgroup1_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_legacy()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup /proc/filesystems || return 0
 | 
			
		||||
	cgroup1_base
 | 
			
		||||
	cgroup1_controllers
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroups_unified()
 | 
			
		||||
{
 | 
			
		||||
	grep -qw cgroup2 /proc/filesystems || return 0
 | 
			
		||||
	mount -t cgroup2 none -o "${sysfs_opts},nsdelegate" /sys/fs/cgroup
 | 
			
		||||
	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()
 | 
			
		||||
 
 | 
			
		||||
@@ -284,18 +284,6 @@ system.
 | 
			
		||||
To see how to influence dependencies in configuration files, see the
 | 
			
		||||
.Sx FILES
 | 
			
		||||
section below.
 | 
			
		||||
.Sh _pre AND _post FUNCTIONS
 | 
			
		||||
Any command defined in extra_commands, extra_started_commands or
 | 
			
		||||
extra_stopped_commands can have _pre and _post functions in the service
 | 
			
		||||
script. If the command function is called foo, the_pre and _post
 | 
			
		||||
functions for it should be called foo_pre and foo_post.
 | 
			
		||||
.Pp
 | 
			
		||||
These functions should be used to perform preparation before the
 | 
			
		||||
command is run and cleanup after the command completes. In order for
 | 
			
		||||
.Nm
 | 
			
		||||
to record the command as being run successfully, the _pre
 | 
			
		||||
function, command function itself and the _post function should all exit
 | 
			
		||||
with a zero return code.
 | 
			
		||||
.Sh BUILTINS
 | 
			
		||||
.Nm
 | 
			
		||||
defines some builtin functions that you can use inside your service scripts:
 | 
			
		||||
@@ -424,63 +412,27 @@ If -d, -f or -p is specified, checkpath checks to see if the path
 | 
			
		||||
exists, is the right type and has the correct owner and access modes. If
 | 
			
		||||
any of these tests fail, the path is created and set up as specified. If
 | 
			
		||||
more than one of -d, -f or -p are specified, the last one will be used.
 | 
			
		||||
.Pp
 | 
			
		||||
 | 
			
		||||
The argument to -m is a three or four digit octal number. If this option
 | 
			
		||||
is not provided, the value defaults to 0644 for files and 0775 for
 | 
			
		||||
directories.
 | 
			
		||||
.Pp
 | 
			
		||||
 | 
			
		||||
The argument to -o is a representation of the user and/or group which
 | 
			
		||||
should own the path. The user and group can be represented numerically
 | 
			
		||||
or with names, and are separated by a colon.
 | 
			
		||||
.Pp
 | 
			
		||||
 | 
			
		||||
The truncate options (-D and -F) cause the directory or file to be
 | 
			
		||||
cleared of all contents.
 | 
			
		||||
.Pp
 | 
			
		||||
 | 
			
		||||
If -W is specified, checkpath checks to see if the first path given on
 | 
			
		||||
the command line is writable.  This is different from how the test
 | 
			
		||||
command in the shell works, because it also checks to make sure the file
 | 
			
		||||
system is not read only.
 | 
			
		||||
.Pp
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
.Ic fstabinfo
 | 
			
		||||
.Op Fl M , -mount
 | 
			
		||||
.Op Fl R , -remount
 | 
			
		||||
.Op Fl b , -blockdevice
 | 
			
		||||
.Op Fl m , -mountargs
 | 
			
		||||
.Op Fl o , -options
 | 
			
		||||
.Op Fl p , -passno Ar passno
 | 
			
		||||
.Op Fl t , -type Ar fstype
 | 
			
		||||
.Ar path
 | 
			
		||||
.Xc
 | 
			
		||||
If -b, -m, -o, -p or -t is specified,the appropriate information is
 | 
			
		||||
extracted from fstab. If -M or -R are given, file systems are mounted or
 | 
			
		||||
remounted.
 | 
			
		||||
.Pp
 | 
			
		||||
The -q option suppresses all informational output. If it is specified
 | 
			
		||||
twice, all error messages are suppressed as well.
 | 
			
		||||
.Ic mountinfo
 | 
			
		||||
.Op Fl f, -fstype-regex Ar regex
 | 
			
		||||
.Op Fl F, -skip-fstype-regex Ar regex
 | 
			
		||||
.Op Fl n, -node-regex Ar regex
 | 
			
		||||
.Op Fl N, -skip-node-regex Ar regex
 | 
			
		||||
.Op Fl o, -options-regex Ar regex
 | 
			
		||||
.Op Fl O, -skip-options-regex Ar regex
 | 
			
		||||
.Op Fl p, -point-regex Ar regex
 | 
			
		||||
.Op Fl P, -skip-point-regex Ar regex
 | 
			
		||||
.Op Fl e, -netdev
 | 
			
		||||
.Op Fl E, -nonetdev
 | 
			
		||||
.Op Fl i, -options
 | 
			
		||||
.Op Fl s, -fstype
 | 
			
		||||
.Op Fl t, -node
 | 
			
		||||
  .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
 | 
			
		||||
specify what you want to display. If no mount points are given, all
 | 
			
		||||
mount points will be considered.
 | 
			
		||||
.It Ic yesno Ar value
 | 
			
		||||
If
 | 
			
		||||
.Ar value
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,6 @@
 | 
			
		||||
.Ar pidfile
 | 
			
		||||
.Fl P , -respawn-period
 | 
			
		||||
.Ar seconds
 | 
			
		||||
.Fl R , -retry
 | 
			
		||||
.Ar arg
 | 
			
		||||
.Fl r , -chroot
 | 
			
		||||
.Ar chrootpath
 | 
			
		||||
.Fl u , -user
 | 
			
		||||
@@ -117,9 +115,6 @@ Modifies the scheduling priority of the daemon.
 | 
			
		||||
.It Fl P , -respawn-period Ar seconds
 | 
			
		||||
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).
 | 
			
		||||
.It Fl r , -chroot Ar path
 | 
			
		||||
chroot to this directory before starting the daemon. All other paths, such
 | 
			
		||||
as the path to the daemon, chdir and pidfile, should be relative to the chroot.
 | 
			
		||||
@@ -135,7 +130,6 @@ 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
 | 
			
		||||
 
 | 
			
		||||
@@ -17,13 +17,13 @@ endif
 | 
			
		||||
_installafter:
 | 
			
		||||
ifeq (${OS},Linux)
 | 
			
		||||
	${INSTALL} -d ${DESTDIR}${SBINDIR}
 | 
			
		||||
	ln -sf ${DIR}/rc-sstat ${DESTDIR}/${SBINDIR}/rc-sstat
 | 
			
		||||
	ln -sf ../${DIR}/rc-sstat ${DESTDIR}/${SBINDIR}/rc-sstat
 | 
			
		||||
ifeq (${MKSYSVINIT},yes)
 | 
			
		||||
	ln -sf	${DIR}/halt ${DESTDIR}/${SBINDIR}/halt
 | 
			
		||||
	ln -sf	${DIR}/poweroff ${DESTDIR}/${SBINDIR}/poweroff
 | 
			
		||||
	ln -sf	${DIR}/reboot ${DESTDIR}/${SBINDIR}/reboot
 | 
			
		||||
	ln -sf	${DIR}/shutdown ${DESTDIR}/${SBINDIR}/shutdown
 | 
			
		||||
	ln -sf	openrc-init ${DESTDIR}/${SBINDIR}/init
 | 
			
		||||
	ln -sf	../${DIR}/halt ${DESTDIR}/sbin/halt
 | 
			
		||||
	ln -sf	../${DIR}/poweroff ${DESTDIR}/sbin/poweroff
 | 
			
		||||
	ln -sf	../${DIR}/reboot ${DESTDIR}/sbin/reboot
 | 
			
		||||
	ln -sf	../${DIR}/shutdown ${DESTDIR}/sbin/shutdown
 | 
			
		||||
	ln -sf	openrc-init ${DESTDIR}/sbin/init
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,3 @@
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
option_arg=
 | 
			
		||||
poweroff_arg=
 | 
			
		||||
while getopts :nwdfiph opt; do
 | 
			
		||||
	case "$opt" in
 | 
			
		||||
		n) ;;
 | 
			
		||||
		w) poweroff_arg=--write-only ;;
 | 
			
		||||
		d) option_arg=--no-write ;;
 | 
			
		||||
		f) ;;
 | 
			
		||||
		i) ;;
 | 
			
		||||
		p) poweroff_arg=--poweroff ;;
 | 
			
		||||
		[?]) printf "%s\n" "${0##*/}: invalid command line option" >&2
 | 
			
		||||
		exit 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
shift $((OPTIND-1))
 | 
			
		||||
 | 
			
		||||
if [ -z "${poweroff_arg}" ]; then
 | 
			
		||||
	poweroff_arg=--poweroff
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown --halt "$@"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,3 @@
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
option_arg=
 | 
			
		||||
poweroff_arg=
 | 
			
		||||
while getopts :nwdfiph opt; do
 | 
			
		||||
	case "$opt" in
 | 
			
		||||
		n) ;;
 | 
			
		||||
		w) poweroff_arg=--write-only ;;
 | 
			
		||||
		d) option_arg=--no-write ;;
 | 
			
		||||
		f) ;;
 | 
			
		||||
		i) ;;
 | 
			
		||||
		[?]) printf "%s\n" "${0##*/}: invalid command line option" >&2
 | 
			
		||||
		exit 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
shift $((OPTIND-1))
 | 
			
		||||
 | 
			
		||||
if [ -z "${poweroff_arg}" ]; then
 | 
			
		||||
	poweroff_arg=--poweroff
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown --poweroff "$@"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,3 @@
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
option_arg=
 | 
			
		||||
poweroff_arg=
 | 
			
		||||
while getopts :nwdfhik opt; do
 | 
			
		||||
	case "$opt" in
 | 
			
		||||
		n) ;;
 | 
			
		||||
		w) poweroff_arg=--write-only ;;
 | 
			
		||||
		d) option_arg=--no-write ;;
 | 
			
		||||
		f) ;;
 | 
			
		||||
		h) ;;
 | 
			
		||||
		i) ;;
 | 
			
		||||
		k) poweroff_arg=--kexec ;;
 | 
			
		||||
		[?]) printf "%s\n" "${0##*/}: invalid command line option" >&2
 | 
			
		||||
		exit 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
shift $((OPTIND-1))
 | 
			
		||||
 | 
			
		||||
if [ -z "${poweroff_arg}" ]; then
 | 
			
		||||
	poweroff_arg=--reboot
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown --reboot "$@"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,8 @@
 | 
			
		||||
#!@SHELL@
 | 
			
		||||
 | 
			
		||||
shutdown_arg=
 | 
			
		||||
while getopts :akrhPHfFnct: opt; do
 | 
			
		||||
	case "$opt" in
 | 
			
		||||
		a) ;;
 | 
			
		||||
		k) ;;
 | 
			
		||||
		r) shutdown_arg=--reboot ;;
 | 
			
		||||
		h) shutdown_arg=--halt ;;
 | 
			
		||||
		P) shutdown_arg=--poweroff ;;
 | 
			
		||||
		H) shutdown_arg=--halt ;;
 | 
			
		||||
		f) ;;
 | 
			
		||||
		F) ;;
 | 
			
		||||
		n) ;;
 | 
			
		||||
		c) ;;
 | 
			
		||||
		t) ;;
 | 
			
		||||
		[?]) printf "%s\n" "${0##*/}: invalid command line option" >&2
 | 
			
		||||
		exit 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
shift $((OPTIND-1))
 | 
			
		||||
 | 
			
		||||
if [ -z "${shutdown_arg}" ]; then
 | 
			
		||||
	shutdown_arg=--single
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@"
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@"
 | 
			
		||||
args="$@"
 | 
			
		||||
case "$@" in
 | 
			
		||||
	*--single*|*-s*) args="$@" ;;
 | 
			
		||||
	*) args="--single $@";;
 | 
			
		||||
esac
 | 
			
		||||
exec @SBINDIR@/openrc-shutdown "$args"
 | 
			
		||||
 
 | 
			
		||||
@@ -243,9 +243,6 @@ sourcex "@LIBEXECDIR@/sh/s6.sh"
 | 
			
		||||
sourcex "@LIBEXECDIR@/sh/start-stop-daemon.sh"
 | 
			
		||||
sourcex "@LIBEXECDIR@/sh/supervise-daemon.sh"
 | 
			
		||||
 | 
			
		||||
# Load our script
 | 
			
		||||
sourcex "$RC_SERVICE"
 | 
			
		||||
 | 
			
		||||
# Set verbose mode
 | 
			
		||||
if yesno "${rc_verbose:-$RC_VERBOSE}"; then
 | 
			
		||||
	EINFO_VERBOSE=yes
 | 
			
		||||
@@ -258,7 +255,8 @@ for _cmd; do
 | 
			
		||||
		[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && \
 | 
			
		||||
			ulimit ${rc_ulimit:-$RC_ULIMIT}
 | 
			
		||||
		# Apply cgroups settings if defined
 | 
			
		||||
		if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ]
 | 
			
		||||
		if [ "$(command -v cgroup_add_service)" = \
 | 
			
		||||
		    "cgroup_add_service" ]
 | 
			
		||||
		then
 | 
			
		||||
			if [ -d /sys/fs/cgroup -a ! -w /sys/fs/cgroup ]; then
 | 
			
		||||
				eerror "No permission to apply cgroup settings"
 | 
			
		||||
@@ -267,15 +265,16 @@ for _cmd; do
 | 
			
		||||
			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
 | 
			
		||||
		[ "$(command -v cgroup2_set_limits)" = "cgroup2_set_limits" ] &&
 | 
			
		||||
			[ "$_cmd" = start ] &&
 | 
			
		||||
			cgroup2_set_limits
 | 
			
		||||
		[ "$(command -v cgroup_set_limits)" = \
 | 
			
		||||
		    "cgroup_set_limits" ] && \
 | 
			
		||||
		    cgroup_set_limits
 | 
			
		||||
		break
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Load our script
 | 
			
		||||
sourcex "$RC_SERVICE"
 | 
			
		||||
 | 
			
		||||
eval "printf '%s\n' $required_dirs" | while read _d; do
 | 
			
		||||
	if [ -n "$_d" ] && [ ! -d "$_d" ]; then
 | 
			
		||||
		eerror "$RC_SVCNAME: \`$_d' is not a directory"
 | 
			
		||||
@@ -365,14 +364,10 @@ while [ -n "$1" ]; do
 | 
			
		||||
				then
 | 
			
		||||
					"$1"_post || exit $?
 | 
			
		||||
				fi
 | 
			
		||||
				[ "$(command -v cgroup_cleanup)" = "cgroup_cleanup" ] &&
 | 
			
		||||
					[ "$1" = "stop" ] &&
 | 
			
		||||
					yesno "${rc_cgroup_cleanup}" && \
 | 
			
		||||
				[ "$(command -v cgroup_cleanup)" = "cgroup_cleanup" -a \
 | 
			
		||||
				"$1" = "stop" ] && \
 | 
			
		||||
				yesno "${rc_cgroup_cleanup}" && \
 | 
			
		||||
					cgroup_cleanup
 | 
			
		||||
				if [ "$(command -v cgroup2_remove)" = "cgroup2_remove" ]; then
 | 
			
		||||
					[ "$1" = stop ] || [ -z "${command}" ] &&
 | 
			
		||||
					cgroup2_remove
 | 
			
		||||
				fi
 | 
			
		||||
				shift
 | 
			
		||||
				continue 2
 | 
			
		||||
			else
 | 
			
		||||
 
 | 
			
		||||
@@ -14,56 +14,46 @@ description_cgroup_cleanup="Kill all processes in the cgroup"
 | 
			
		||||
 | 
			
		||||
cgroup_find_path()
 | 
			
		||||
{
 | 
			
		||||
	local OIFS name dir result
 | 
			
		||||
	local OIFS n name dir result
 | 
			
		||||
	[ -n "$1" ] || return 0
 | 
			
		||||
	OIFS="$IFS"
 | 
			
		||||
	IFS=":"
 | 
			
		||||
	while read -r _ name dir; do
 | 
			
		||||
	while read n name dir; do
 | 
			
		||||
		[ "$name" = "$1" ] && result="$dir"
 | 
			
		||||
	done < /proc/1/cgroup
 | 
			
		||||
	IFS="$OIFS"
 | 
			
		||||
	printf "%s" "${result}"
 | 
			
		||||
	echo $result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup_get_pids()
 | 
			
		||||
{
 | 
			
		||||
	local cgroup_procs p pids
 | 
			
		||||
	cgroup_procs="$(cgroup2_find_path)"
 | 
			
		||||
	[ -n "${cgroup_procs}" ] &&
 | 
			
		||||
		cgroup_procs="${cgroup_procs}/${RC_SVCNAME}/cgroup.procs" ||
 | 
			
		||||
		cgroup_procs="/sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks"
 | 
			
		||||
	[ -f "${cgroup_procs}" ] || return 0
 | 
			
		||||
	while read -r p; do
 | 
			
		||||
		[ "$p" -eq $$ ] || pids="${pids} ${p}"
 | 
			
		||||
	done < "${cgroup_procs}"
 | 
			
		||||
	printf "%s" "${pids}"
 | 
			
		||||
	return 0
 | 
			
		||||
	local p
 | 
			
		||||
	pids=
 | 
			
		||||
	while read p; do
 | 
			
		||||
		[ $p -eq $$ ] || pids="${pids} ${p}"
 | 
			
		||||
	done < /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks
 | 
			
		||||
	[ -n "$pids" ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup_running()
 | 
			
		||||
{
 | 
			
		||||
	[ -d "/sys/fs/cgroup/unified/${RC_SVCNAME}" ] ||
 | 
			
		||||
			[ -d "/sys/fs/cgroup/${RC_SVCNAME}" ] ||
 | 
			
		||||
			[ -d "/sys/fs/cgroup/openrc/${RC_SVCNAME}" ]
 | 
			
		||||
	[ -d "/sys/fs/cgroup/openrc/${RC_SVCNAME}" ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup_set_values()
 | 
			
		||||
{
 | 
			
		||||
	[ -n "$1" ] && [ -n "$2" ] && [ -d "/sys/fs/cgroup/$1" ] || return 0
 | 
			
		||||
	[ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0
 | 
			
		||||
 | 
			
		||||
	local controller h
 | 
			
		||||
	controller="$1"
 | 
			
		||||
	h=$(cgroup_find_path "$1")
 | 
			
		||||
	local controller="$1" h=$(cgroup_find_path "$1")
 | 
			
		||||
	cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}"
 | 
			
		||||
	[ -d "$cgroup" ] || mkdir -p "$cgroup"
 | 
			
		||||
 | 
			
		||||
	set -- $2
 | 
			
		||||
	local name val
 | 
			
		||||
	while [ -n "$1" ] && [ "$controller" != "cpuacct" ]; do
 | 
			
		||||
	while [ -n "$1" -a "$controller" != "cpuacct" ]; do
 | 
			
		||||
		case "$1" in
 | 
			
		||||
			$controller.*)
 | 
			
		||||
				if [ -n "${name}" ] && [ -w "${cgroup}/${name}" ] && 
 | 
			
		||||
					[ -n "${val}" ]; then
 | 
			
		||||
				if [ -n "$name" -a -w "$cgroup/$name" -a -n "$val" ]; then
 | 
			
		||||
					veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
 | 
			
		||||
					printf "%s" "$val" > "$cgroup/$name"
 | 
			
		||||
				fi
 | 
			
		||||
@@ -78,7 +68,7 @@ cgroup_set_values()
 | 
			
		||||
		esac
 | 
			
		||||
		shift
 | 
			
		||||
	done
 | 
			
		||||
	if [ -n "${name}" ] && [ -w "${cgroup}/${name}" ] && [ -n "${val}" ]; then
 | 
			
		||||
	if [ -n "$name" -a -w "$cgroup/$name" -a -n "$val" ]; then
 | 
			
		||||
		veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val"
 | 
			
		||||
		printf "%s" "$val" > "$cgroup/$name"
 | 
			
		||||
	fi
 | 
			
		||||
@@ -144,76 +134,21 @@ cgroup_set_limits()
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_find_path()
 | 
			
		||||
{
 | 
			
		||||
	case "${rc_cgroup_mode:-hybrid}" in
 | 
			
		||||
		hybrid) printf "/sys/fs/cgroup/unified" ;;
 | 
			
		||||
		unified) printf "/sys/fs/cgroup" ;;
 | 
			
		||||
		esac
 | 
			
		||||
		return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_remove()
 | 
			
		||||
{
 | 
			
		||||
	local cgroup_path rc_cgroup_path
 | 
			
		||||
	cgroup_path="$(cgroup2_find_path)"
 | 
			
		||||
	[ -z "${cgroup_path}" ] && return 0
 | 
			
		||||
	rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}"
 | 
			
		||||
	[ ! -d "${rc_cgroup_path}" ] ||
 | 
			
		||||
		[ ! -e "${rc_cgroup_path}"/cgroup.events ] &&
 | 
			
		||||
		return 0
 | 
			
		||||
	grep -qx "$$" "${rc_cgroup_path}/cgroup.procs" &&
 | 
			
		||||
		echo 0 > "${cgroup_path}/cgroup.procs"
 | 
			
		||||
	local key populated vvalue
 | 
			
		||||
	while read -r key value; do
 | 
			
		||||
		case "${key}" in
 | 
			
		||||
			populated) populated=${value} ;;
 | 
			
		||||
			*) ;;
 | 
			
		||||
		esac
 | 
			
		||||
	done < "${rc_cgroup_path}/cgroup.events"
 | 
			
		||||
	[ "${populated}" = 1 ] && return 0
 | 
			
		||||
	rmdir "${rc_cgroup_path}"
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup2_set_limits()
 | 
			
		||||
{
 | 
			
		||||
	local cgroup_path
 | 
			
		||||
	cgroup_path="$(cgroup2_find_path)"
 | 
			
		||||
	[ -z "${cgroup_path}" ] && return 0
 | 
			
		||||
	rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}"
 | 
			
		||||
	local OIFS="$IFS"
 | 
			
		||||
	IFS="
 | 
			
		||||
"
 | 
			
		||||
	[ ! -d "${rc_cgroup_path}" ] && mkdir "${rc_cgroup_path}"
 | 
			
		||||
	echo 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}"
 | 
			
		||||
		echo "${value}" > "${rc_cgroup_path}/${key}"
 | 
			
		||||
	done
 | 
			
		||||
	IFS="$OIFS"
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cgroup_cleanup()
 | 
			
		||||
{
 | 
			
		||||
	cgroup_running || return 0
 | 
			
		||||
	ebegin "starting cgroups cleanup"
 | 
			
		||||
	local pids
 | 
			
		||||
	pids="$(cgroup_get_pids)"
 | 
			
		||||
	if [ -n "${pids}" ]; then
 | 
			
		||||
		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
 | 
			
		||||
		sleep "${rc_timeout_stopsec:-90}"
 | 
			
		||||
		yesno "${rc_send_sigkill:-yes}" &&
 | 
			
		||||
			kill -s KILL ${pids} 2> /dev/null
 | 
			
		||||
	fi
 | 
			
		||||
	cgroup2_remove
 | 
			
		||||
	[ -z "$(cgroup_get_pids)" ]
 | 
			
		||||
	eend $? "Unable to stop all processes"
 | 
			
		||||
	return 0
 | 
			
		||||
	for sig in TERM QUIT INT; do
 | 
			
		||||
		cgroup_get_pids || { eend 0 "finished" ; return 0 ; }
 | 
			
		||||
		for i in 0 1; do
 | 
			
		||||
			kill -s $sig $pids
 | 
			
		||||
			for j in 0 1 2; do
 | 
			
		||||
				cgroup_get_pids || { eend 0 "finished" ; return 0 ; }
 | 
			
		||||
				sleep 1
 | 
			
		||||
			done
 | 
			
		||||
		done 2>/dev/null
 | 
			
		||||
	done
 | 
			
		||||
	cgroup_get_pids || { eend 0 "finished" ; return 0; }
 | 
			
		||||
	kill -9 $pids
 | 
			
		||||
	eend $(cgroup_running && echo 1 || echo 0) "fail to stop all processes"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ supervise_start()
 | 
			
		||||
	# command_args="this \"is a\" test"
 | 
			
		||||
	# to work properly.
 | 
			
		||||
	eval supervise-daemon --start \
 | 
			
		||||
		${retry:+--retry} $retry \
 | 
			
		||||
		${chroot:+--chroot} $chroot \
 | 
			
		||||
		${pidfile:+--pidfile} $pidfile \
 | 
			
		||||
		${respawn_delay:+--respawn-delay} $respawn_delay \
 | 
			
		||||
 
 | 
			
		||||
@@ -71,6 +71,5 @@ 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);
 | 
			
		||||
pid_t get_pid(const char *applet, const char *pidfile);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -156,10 +156,10 @@ rc-service service: rc-service.o _usage.o rc-misc.o
 | 
			
		||||
rc-update: rc-update.o _usage.o rc-misc.o
 | 
			
		||||
	${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
 | 
			
		||||
 | 
			
		||||
start-stop-daemon: start-stop-daemon.o _usage.o rc-misc.o rc-schedules.o
 | 
			
		||||
start-stop-daemon: start-stop-daemon.o _usage.o rc-misc.o
 | 
			
		||||
	${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
 | 
			
		||||
 | 
			
		||||
supervise-daemon: supervise-daemon.o _usage.o rc-misc.o rc-schedules.o
 | 
			
		||||
supervise-daemon: supervise-daemon.o _usage.o rc-misc.o
 | 
			
		||||
	${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
 | 
			
		||||
 | 
			
		||||
service_get_value service_set_value get_options save_options: do_value.o rc-misc.o
 | 
			
		||||
 
 | 
			
		||||
@@ -35,11 +35,11 @@
 | 
			
		||||
#  define GET_ENT getmntent (fp)
 | 
			
		||||
#  define GET_ENT_FILE(_name) getmntfile (_name)
 | 
			
		||||
#  define END_ENT endmntent (fp)
 | 
			
		||||
#  define ENT_BLOCKDEVICE(_ent) (_ent)->mnt_fsname
 | 
			
		||||
#  define ENT_FILE(_ent) (_ent)->mnt_dir
 | 
			
		||||
#  define ENT_TYPE(_ent) (_ent)->mnt_type
 | 
			
		||||
#  define ENT_OPTS(_ent) (_ent)->mnt_opts
 | 
			
		||||
#  define ENT_PASS(_ent) (_ent)->mnt_passno
 | 
			
		||||
#  define ENT_BLOCKDEVICE(_ent) ent->mnt_fsname
 | 
			
		||||
#  define ENT_FILE(_ent) ent->mnt_dir
 | 
			
		||||
#  define ENT_TYPE(_ent) ent->mnt_type
 | 
			
		||||
#  define ENT_OPTS(_ent) ent->mnt_opts
 | 
			
		||||
#  define ENT_PASS(_ent) ent->mnt_passno
 | 
			
		||||
#else
 | 
			
		||||
#  define HAVE_GETFSENT
 | 
			
		||||
#  include <fstab.h>
 | 
			
		||||
@@ -48,11 +48,11 @@
 | 
			
		||||
#  define GET_ENT getfsent ()
 | 
			
		||||
#  define GET_ENT_FILE(_name) getfsfile (_name)
 | 
			
		||||
#  define END_ENT endfsent ()
 | 
			
		||||
#  define ENT_BLOCKDEVICE(_ent) (_ent)->fs_spec
 | 
			
		||||
#  define ENT_TYPE(_ent) (_ent)->fs_vfstype
 | 
			
		||||
#  define ENT_FILE(_ent) (_ent)->fs_file
 | 
			
		||||
#  define ENT_OPTS(_ent) (_ent)->fs_mntops
 | 
			
		||||
#  define ENT_PASS(_ent) (_ent)->fs_passno
 | 
			
		||||
#  define ENT_BLOCKDEVICE(_ent) ent->fs_spec
 | 
			
		||||
#  define ENT_TYPE(_ent) ent->fs_vfstype
 | 
			
		||||
#  define ENT_FILE(_ent) ent->fs_file
 | 
			
		||||
#  define ENT_OPTS(_ent) ent->fs_mntops
 | 
			
		||||
#  define ENT_PASS(_ent) ent->fs_passno
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "einfo.h"
 | 
			
		||||
@@ -114,24 +114,24 @@ do_mount(struct ENT *ent, bool remount)
 | 
			
		||||
 | 
			
		||||
	argv[0] = UNCONST("mount");
 | 
			
		||||
	argv[1] = UNCONST("-o");
 | 
			
		||||
	argv[2] = ENT_OPTS(ent);
 | 
			
		||||
	argv[2] = ENT_OPTS(*ent);
 | 
			
		||||
	argv[3] = UNCONST("-t");
 | 
			
		||||
	argv[4] = ENT_TYPE(ent);
 | 
			
		||||
	argv[4] = ENT_TYPE(*ent);
 | 
			
		||||
	if (!remount) {
 | 
			
		||||
		argv[5] = ENT_BLOCKDEVICE(ent);
 | 
			
		||||
		argv[6] = ENT_FILE(ent);
 | 
			
		||||
		argv[5] = ENT_BLOCKDEVICE(*ent);
 | 
			
		||||
		argv[6] = ENT_FILE(*ent);
 | 
			
		||||
		argv[7] = NULL;
 | 
			
		||||
	} else {
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
		argv[5] = UNCONST("-o");
 | 
			
		||||
		argv[6] = UNCONST("remount");
 | 
			
		||||
		argv[7] = ENT_BLOCKDEVICE(ent);
 | 
			
		||||
		argv[8] = ENT_FILE(ent);
 | 
			
		||||
		argv[7] = ENT_BLOCKDEVICE(*ent);
 | 
			
		||||
		argv[8] = ENT_FILE(*ent);
 | 
			
		||||
		argv[9] = NULL;
 | 
			
		||||
#else
 | 
			
		||||
		argv[5] = UNCONST("-u");
 | 
			
		||||
		argv[6] = ENT_BLOCKDEVICE(ent);
 | 
			
		||||
		argv[7] = ENT_FILE(ent);
 | 
			
		||||
		argv[6] = ENT_BLOCKDEVICE(*ent);
 | 
			
		||||
		argv[7] = ENT_FILE(*ent);
 | 
			
		||||
		argv[8] = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -474,27 +474,3 @@ time_t to_time_t(char *timestring)
 | 
			
		||||
	}
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pid_t get_pid(const char *applet,const char *pidfile)
 | 
			
		||||
{
 | 
			
		||||
	FILE *fp;
 | 
			
		||||
	pid_t pid;
 | 
			
		||||
 | 
			
		||||
	if (! pidfile)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if ((fp = fopen(pidfile, "r")) == NULL) {
 | 
			
		||||
		ewarnv("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (fscanf(fp, "%d", &pid) != 1) {
 | 
			
		||||
		ewarnv("%s: no pid found in `%s'", applet, pidfile);
 | 
			
		||||
		fclose(fp);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fclose(fp);
 | 
			
		||||
 | 
			
		||||
	return pid;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,422 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * The functions in this file control the stopping of daemons by
 | 
			
		||||
 * start-stop-daemon and supervise-daemon.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* nano seconds */
 | 
			
		||||
#define POLL_INTERVAL   20000000
 | 
			
		||||
#define WAIT_PIDFILE   500000000
 | 
			
		||||
#define ONE_SECOND    1000000000
 | 
			
		||||
#define ONE_MS           1000000
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
 | 
			
		||||
#include "einfo.h"
 | 
			
		||||
#include "queue.h"
 | 
			
		||||
#include "rc.h"
 | 
			
		||||
#include "rc-misc.h"
 | 
			
		||||
#include "rc-schedules.h"
 | 
			
		||||
#include "helpers.h"
 | 
			
		||||
 | 
			
		||||
typedef struct scheduleitem {
 | 
			
		||||
	enum {
 | 
			
		||||
		SC_TIMEOUT,
 | 
			
		||||
		SC_SIGNAL,
 | 
			
		||||
		SC_GOTO,
 | 
			
		||||
		SC_FOREVER,
 | 
			
		||||
	} type;
 | 
			
		||||
	int value;
 | 
			
		||||
	struct scheduleitem *gotoitem;
 | 
			
		||||
	TAILQ_ENTRY(scheduleitem) entries;
 | 
			
		||||
} SCHEDULEITEM;
 | 
			
		||||
 | 
			
		||||
static TAILQ_HEAD(, scheduleitem) schedule;
 | 
			
		||||
 | 
			
		||||
void initialize_schedulelist(void)
 | 
			
		||||
{
 | 
			
		||||
	TAILQ_INIT(&schedule);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_schedulelist(void)
 | 
			
		||||
{
 | 
			
		||||
	SCHEDULEITEM *s1 = TAILQ_FIRST(&schedule);
 | 
			
		||||
	SCHEDULEITEM *s2;
 | 
			
		||||
 | 
			
		||||
	while (s1) {
 | 
			
		||||
		s2 = TAILQ_NEXT(s1, entries);
 | 
			
		||||
		free(s1);
 | 
			
		||||
		s1 = s2;
 | 
			
		||||
	}
 | 
			
		||||
	TAILQ_INIT(&schedule);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int parse_signal(const char *applet, const char *sig)
 | 
			
		||||
{
 | 
			
		||||
	typedef struct signalpair
 | 
			
		||||
	{
 | 
			
		||||
		const char *name;
 | 
			
		||||
		int signal;
 | 
			
		||||
	} SIGNALPAIR;
 | 
			
		||||
 | 
			
		||||
#define signalpair_item(name) { #name, SIG##name },
 | 
			
		||||
 | 
			
		||||
	static const SIGNALPAIR signallist[] = {
 | 
			
		||||
		signalpair_item(HUP)
 | 
			
		||||
		signalpair_item(INT)
 | 
			
		||||
		signalpair_item(QUIT)
 | 
			
		||||
		signalpair_item(ILL)
 | 
			
		||||
		signalpair_item(TRAP)
 | 
			
		||||
		signalpair_item(ABRT)
 | 
			
		||||
		signalpair_item(BUS)
 | 
			
		||||
		signalpair_item(FPE)
 | 
			
		||||
		signalpair_item(KILL)
 | 
			
		||||
		signalpair_item(USR1)
 | 
			
		||||
		signalpair_item(SEGV)
 | 
			
		||||
		signalpair_item(USR2)
 | 
			
		||||
		signalpair_item(PIPE)
 | 
			
		||||
		signalpair_item(ALRM)
 | 
			
		||||
		signalpair_item(TERM)
 | 
			
		||||
		signalpair_item(CHLD)
 | 
			
		||||
		signalpair_item(CONT)
 | 
			
		||||
		signalpair_item(STOP)
 | 
			
		||||
		signalpair_item(TSTP)
 | 
			
		||||
		signalpair_item(TTIN)
 | 
			
		||||
		signalpair_item(TTOU)
 | 
			
		||||
		signalpair_item(URG)
 | 
			
		||||
		signalpair_item(XCPU)
 | 
			
		||||
		signalpair_item(XFSZ)
 | 
			
		||||
		signalpair_item(VTALRM)
 | 
			
		||||
		signalpair_item(PROF)
 | 
			
		||||
#ifdef SIGWINCH
 | 
			
		||||
		signalpair_item(WINCH)
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SIGIO
 | 
			
		||||
		signalpair_item(IO)
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SIGPWR
 | 
			
		||||
		signalpair_item(PWR)
 | 
			
		||||
#endif
 | 
			
		||||
		signalpair_item(SYS)
 | 
			
		||||
		{ "NULL",	0 },
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	unsigned int i = 0;
 | 
			
		||||
	const char *s;
 | 
			
		||||
 | 
			
		||||
	if (!sig || *sig == '\0')
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if (sscanf(sig, "%u", &i) == 1) {
 | 
			
		||||
		if (i < NSIG)
 | 
			
		||||
			return i;
 | 
			
		||||
		eerrorx("%s: `%s' is not a valid signal", applet, sig);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (strncmp(sig, "SIG", 3) == 0)
 | 
			
		||||
		s = sig + 3;
 | 
			
		||||
	else
 | 
			
		||||
		s = NULL;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_SIZE(signallist); ++i)
 | 
			
		||||
		if (strcmp(sig, signallist[i].name) == 0 ||
 | 
			
		||||
		    (s && strcmp(s, signallist[i].name) == 0))
 | 
			
		||||
			return signallist[i].signal;
 | 
			
		||||
 | 
			
		||||
	eerrorx("%s: `%s' is not a valid signal", applet, sig);
 | 
			
		||||
	/* NOTREACHED */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SCHEDULEITEM *parse_schedule_item(const char *applet, const char *string)
 | 
			
		||||
{
 | 
			
		||||
	const char *after_hyph;
 | 
			
		||||
	int sig;
 | 
			
		||||
	SCHEDULEITEM *item = xmalloc(sizeof(*item));
 | 
			
		||||
 | 
			
		||||
	item->value = 0;
 | 
			
		||||
	item->gotoitem = NULL;
 | 
			
		||||
	if (strcmp(string,"forever") == 0)
 | 
			
		||||
		item->type = SC_FOREVER;
 | 
			
		||||
	else if (isdigit((unsigned char)string[0])) {
 | 
			
		||||
		item->type = SC_TIMEOUT;
 | 
			
		||||
		errno = 0;
 | 
			
		||||
		if (sscanf(string, "%d", &item->value) != 1)
 | 
			
		||||
			eerrorx("%s: invalid timeout value in schedule `%s'",
 | 
			
		||||
			    applet, string);
 | 
			
		||||
	} else if ((after_hyph = string + (string[0] == '-')) &&
 | 
			
		||||
	    ((sig = parse_signal(applet, after_hyph)) != -1))
 | 
			
		||||
	{
 | 
			
		||||
		item->type = SC_SIGNAL;
 | 
			
		||||
		item->value = (int)sig;
 | 
			
		||||
	} else
 | 
			
		||||
		eerrorx("%s: invalid schedule item `%s'", applet, string);
 | 
			
		||||
 | 
			
		||||
	return item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void parse_schedule(const char *applet, const char *string, int timeout)
 | 
			
		||||
{
 | 
			
		||||
	char buffer[20];
 | 
			
		||||
	const char *slash;
 | 
			
		||||
	int count = 0;
 | 
			
		||||
	SCHEDULEITEM *repeatat = NULL;
 | 
			
		||||
	size_t len;
 | 
			
		||||
	SCHEDULEITEM *item;
 | 
			
		||||
 | 
			
		||||
	if (string)
 | 
			
		||||
		for (slash = string; *slash; slash++)
 | 
			
		||||
			if (*slash == '/')
 | 
			
		||||
				count++;
 | 
			
		||||
 | 
			
		||||
	free_schedulelist();
 | 
			
		||||
 | 
			
		||||
	if (count == 0) {
 | 
			
		||||
		item = xmalloc(sizeof(*item));
 | 
			
		||||
		item->type = SC_SIGNAL;
 | 
			
		||||
		item->value = timeout;
 | 
			
		||||
		item->gotoitem = NULL;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
 | 
			
		||||
		item = xmalloc(sizeof(*item));
 | 
			
		||||
		item->type = SC_TIMEOUT;
 | 
			
		||||
		item->gotoitem = NULL;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
		if (string) {
 | 
			
		||||
			if (sscanf(string, "%d", &item->value) != 1)
 | 
			
		||||
				eerrorx("%s: invalid timeout in schedule",
 | 
			
		||||
				    applet);
 | 
			
		||||
		} else
 | 
			
		||||
			item->value = 5;
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (string != NULL) {
 | 
			
		||||
		if ((slash = strchr(string, '/')))
 | 
			
		||||
			len = slash - string;
 | 
			
		||||
		else
 | 
			
		||||
			len = strlen(string);
 | 
			
		||||
 | 
			
		||||
		if (len >= (ptrdiff_t)sizeof(buffer))
 | 
			
		||||
			eerrorx("%s: invalid schedule item, far too long",
 | 
			
		||||
			    applet);
 | 
			
		||||
 | 
			
		||||
		memcpy(buffer, string, len);
 | 
			
		||||
		buffer[len] = 0;
 | 
			
		||||
		string = slash ? slash + 1 : NULL;
 | 
			
		||||
 | 
			
		||||
		item = parse_schedule_item(applet, buffer);
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
		if (item->type == SC_FOREVER) {
 | 
			
		||||
			if (repeatat)
 | 
			
		||||
				eerrorx("%s: invalid schedule, `forever' "
 | 
			
		||||
				    "appears more than once", applet);
 | 
			
		||||
 | 
			
		||||
			repeatat = item;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (repeatat) {
 | 
			
		||||
		item = xmalloc(sizeof(*item));
 | 
			
		||||
		item->type = SC_GOTO;
 | 
			
		||||
		item->value = 0;
 | 
			
		||||
		item->gotoitem = repeatat;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return number of processes killed, -1 on error */
 | 
			
		||||
int do_stop(const char *applet, const char *exec, const char *const *argv,
 | 
			
		||||
    pid_t pid, uid_t uid,int sig, bool test, bool quiet)
 | 
			
		||||
{
 | 
			
		||||
	RC_PIDLIST *pids;
 | 
			
		||||
	RC_PID *pi;
 | 
			
		||||
	RC_PID *np;
 | 
			
		||||
	bool killed;
 | 
			
		||||
	int nkilled = 0;
 | 
			
		||||
 | 
			
		||||
	if (pid)
 | 
			
		||||
		pids = rc_find_pids(NULL, NULL, 0, pid);
 | 
			
		||||
	else
 | 
			
		||||
		pids = rc_find_pids(exec, argv, uid, pid);
 | 
			
		||||
 | 
			
		||||
	if (!pids)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	LIST_FOREACH_SAFE(pi, pids, entries, np) {
 | 
			
		||||
		if (test) {
 | 
			
		||||
			einfo("Would send signal %d to PID %d", sig, pi->pid);
 | 
			
		||||
			nkilled++;
 | 
			
		||||
		} else {
 | 
			
		||||
			if (!quiet)
 | 
			
		||||
				ebeginv("Sending signal %d to PID %d", sig, pi->pid);
 | 
			
		||||
			errno = 0;
 | 
			
		||||
			killed = (kill(pi->pid, sig) == 0 ||
 | 
			
		||||
			    errno == ESRCH ? true : false);
 | 
			
		||||
			if (! quiet)
 | 
			
		||||
				eendv(killed ? 0 : 1,
 | 
			
		||||
				"%s: failed to send signal %d to PID %d: %s",
 | 
			
		||||
				applet, sig, pi->pid, strerror(errno));
 | 
			
		||||
			if (!killed) {
 | 
			
		||||
				nkilled = -1;
 | 
			
		||||
			} else {
 | 
			
		||||
				if (nkilled != -1)
 | 
			
		||||
					nkilled++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		free(pi);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	free(pids);
 | 
			
		||||
	return nkilled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int run_stop_schedule(const char *applet,
 | 
			
		||||
		const char *exec, const char *const *argv,
 | 
			
		||||
		pid_t pid, uid_t uid,
 | 
			
		||||
    bool test, bool progress, bool quiet)
 | 
			
		||||
{
 | 
			
		||||
	SCHEDULEITEM *item = TAILQ_FIRST(&schedule);
 | 
			
		||||
	int nkilled = 0;
 | 
			
		||||
	int tkilled = 0;
 | 
			
		||||
	int nrunning = 0;
 | 
			
		||||
	long nloops, nsecs;
 | 
			
		||||
	struct timespec ts;
 | 
			
		||||
	const char *const *p;
 | 
			
		||||
	bool progressed = false;
 | 
			
		||||
 | 
			
		||||
	if (exec)
 | 
			
		||||
		einfov("Will stop %s", exec);
 | 
			
		||||
	if (pid > 0)
 | 
			
		||||
		einfov("Will stop PID %d", pid);
 | 
			
		||||
	if (uid)
 | 
			
		||||
		einfov("Will stop processes owned by UID %d", uid);
 | 
			
		||||
	if (argv && *argv) {
 | 
			
		||||
		einfovn("Will stop processes of `");
 | 
			
		||||
		if (rc_yesno(getenv("EINFO_VERBOSE"))) {
 | 
			
		||||
			for (p = argv; p && *p; p++) {
 | 
			
		||||
				if (p != argv)
 | 
			
		||||
					printf(" ");
 | 
			
		||||
				printf("%s", *p);
 | 
			
		||||
			}
 | 
			
		||||
			printf("'\n");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (item) {
 | 
			
		||||
		switch (item->type) {
 | 
			
		||||
		case SC_GOTO:
 | 
			
		||||
			item = item->gotoitem;
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		case SC_SIGNAL:
 | 
			
		||||
			nrunning = 0;
 | 
			
		||||
			nkilled = do_stop(applet, exec, argv, pid, uid, item->value, test,
 | 
			
		||||
					quiet);
 | 
			
		||||
			if (nkilled == 0) {
 | 
			
		||||
				if (tkilled == 0) {
 | 
			
		||||
					if (progressed)
 | 
			
		||||
						printf("\n");
 | 
			
		||||
					eerror("%s: no matching processes found", applet);
 | 
			
		||||
				}
 | 
			
		||||
				return tkilled;
 | 
			
		||||
			}
 | 
			
		||||
			else if (nkilled == -1)
 | 
			
		||||
				return 0;
 | 
			
		||||
 | 
			
		||||
			tkilled += nkilled;
 | 
			
		||||
			break;
 | 
			
		||||
		case SC_TIMEOUT:
 | 
			
		||||
			if (item->value < 1) {
 | 
			
		||||
				item = NULL;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ts.tv_sec = 0;
 | 
			
		||||
			ts.tv_nsec = POLL_INTERVAL;
 | 
			
		||||
 | 
			
		||||
			for (nsecs = 0; nsecs < item->value; nsecs++) {
 | 
			
		||||
				for (nloops = 0;
 | 
			
		||||
				     nloops < ONE_SECOND / POLL_INTERVAL;
 | 
			
		||||
				     nloops++)
 | 
			
		||||
				{
 | 
			
		||||
					if ((nrunning = do_stop(applet, exec, argv,
 | 
			
		||||
						    pid, uid, 0, test, quiet)) == 0)
 | 
			
		||||
						return 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
					if (nanosleep(&ts, NULL) == -1) {
 | 
			
		||||
						if (progressed) {
 | 
			
		||||
							printf("\n");
 | 
			
		||||
							progressed = false;
 | 
			
		||||
						}
 | 
			
		||||
						if (errno == EINTR)
 | 
			
		||||
							eerror("%s: caught an"
 | 
			
		||||
							    " interrupt", applet);
 | 
			
		||||
						else {
 | 
			
		||||
							eerror("%s: nanosleep: %s",
 | 
			
		||||
							    applet, strerror(errno));
 | 
			
		||||
							return 0;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if (progress) {
 | 
			
		||||
					printf(".");
 | 
			
		||||
					fflush(stdout);
 | 
			
		||||
					progressed = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			if (progressed) {
 | 
			
		||||
				printf("\n");
 | 
			
		||||
				progressed = false;
 | 
			
		||||
			}
 | 
			
		||||
			eerror("%s: invalid schedule item `%d'",
 | 
			
		||||
			    applet, item->type);
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (item)
 | 
			
		||||
			item = TAILQ_NEXT(item, entries);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (test || (tkilled > 0 && nrunning == 0))
 | 
			
		||||
		return nkilled;
 | 
			
		||||
 | 
			
		||||
	if (progressed)
 | 
			
		||||
		printf("\n");
 | 
			
		||||
	if (! quiet)
 | 
			
		||||
		if (nrunning == 1)
 | 
			
		||||
			eerror("%s: %d process refused to stop", applet, nrunning);
 | 
			
		||||
		else
 | 
			
		||||
			eerror("%s: %d process(es) refused to stop", applet, nrunning);
 | 
			
		||||
 | 
			
		||||
	return -nrunning;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,27 +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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __RC_SCHEDULES_H
 | 
			
		||||
#define __RC_SCHEDULES_H
 | 
			
		||||
 | 
			
		||||
void initialize_schedulelist(void);
 | 
			
		||||
void free_schedulelist(void);
 | 
			
		||||
int parse_signal(const char *applet, const char *sig);
 | 
			
		||||
void parse_schedule(const char *applet, const char *string, int timeout);
 | 
			
		||||
int do_stop(const char *applet, const char *exec, const char *const *argv,
 | 
			
		||||
		pid_t pid, uid_t uid,int sig, bool test, bool quiet);
 | 
			
		||||
int run_stop_schedule(const char *applet,
 | 
			
		||||
		const char *exec, const char *const *argv,
 | 
			
		||||
		pid_t pid, uid_t uid,
 | 
			
		||||
		bool test, bool progress, bool quiet);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -19,6 +19,10 @@
 | 
			
		||||
 *    except according to the terms contained in the LICENSE file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* nano seconds */
 | 
			
		||||
#define POLL_INTERVAL   20000000
 | 
			
		||||
#define WAIT_PIDFILE   500000000
 | 
			
		||||
#define ONE_SECOND    1000000000
 | 
			
		||||
#define ONE_MS           1000000
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
@@ -59,7 +63,6 @@ static struct pam_conv conv = { NULL, NULL};
 | 
			
		||||
#include "queue.h"
 | 
			
		||||
#include "rc.h"
 | 
			
		||||
#include "rc-misc.h"
 | 
			
		||||
#include "rc-schedules.h"
 | 
			
		||||
#include "_usage.h"
 | 
			
		||||
#include "helpers.h"
 | 
			
		||||
 | 
			
		||||
@@ -127,6 +130,20 @@ const char * const longopts_help[] = {
 | 
			
		||||
};
 | 
			
		||||
const char *usagestring = NULL;
 | 
			
		||||
 | 
			
		||||
typedef struct scheduleitem
 | 
			
		||||
{
 | 
			
		||||
	enum
 | 
			
		||||
		{
 | 
			
		||||
			SC_TIMEOUT,
 | 
			
		||||
			SC_SIGNAL,
 | 
			
		||||
			SC_GOTO,
 | 
			
		||||
			SC_FOREVER
 | 
			
		||||
		} type;
 | 
			
		||||
	int value;
 | 
			
		||||
	struct scheduleitem *gotoitem;
 | 
			
		||||
	TAILQ_ENTRY(scheduleitem) entries;
 | 
			
		||||
} SCHEDULEITEM;
 | 
			
		||||
TAILQ_HEAD(, scheduleitem) schedule;
 | 
			
		||||
static char **nav;
 | 
			
		||||
 | 
			
		||||
static char *changeuser, *ch_root, *ch_dir;
 | 
			
		||||
@@ -149,6 +166,20 @@ static inline int ioprio_set(int which _unused,
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
free_schedulelist(void)
 | 
			
		||||
{
 | 
			
		||||
	SCHEDULEITEM *s1 = TAILQ_FIRST(&schedule);
 | 
			
		||||
	SCHEDULEITEM *s2;
 | 
			
		||||
 | 
			
		||||
	while (s1) {
 | 
			
		||||
		s2 = TAILQ_NEXT(s1, entries);
 | 
			
		||||
		free(s1);
 | 
			
		||||
		s1 = s2;
 | 
			
		||||
	}
 | 
			
		||||
	TAILQ_INIT(&schedule);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cleanup(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -157,6 +188,385 @@ cleanup(void)
 | 
			
		||||
	free_schedulelist();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
parse_signal(const char *sig)
 | 
			
		||||
{
 | 
			
		||||
	typedef struct signalpair
 | 
			
		||||
	{
 | 
			
		||||
		const char *name;
 | 
			
		||||
		int signal;
 | 
			
		||||
	} SIGNALPAIR;
 | 
			
		||||
 | 
			
		||||
#define signalpair_item(name) { #name, SIG##name },
 | 
			
		||||
 | 
			
		||||
	static const SIGNALPAIR signallist[] = {
 | 
			
		||||
		signalpair_item(HUP)
 | 
			
		||||
		signalpair_item(INT)
 | 
			
		||||
		signalpair_item(QUIT)
 | 
			
		||||
		signalpair_item(ILL)
 | 
			
		||||
		signalpair_item(TRAP)
 | 
			
		||||
		signalpair_item(ABRT)
 | 
			
		||||
		signalpair_item(BUS)
 | 
			
		||||
		signalpair_item(FPE)
 | 
			
		||||
		signalpair_item(KILL)
 | 
			
		||||
		signalpair_item(USR1)
 | 
			
		||||
		signalpair_item(SEGV)
 | 
			
		||||
		signalpair_item(USR2)
 | 
			
		||||
		signalpair_item(PIPE)
 | 
			
		||||
		signalpair_item(ALRM)
 | 
			
		||||
		signalpair_item(TERM)
 | 
			
		||||
		signalpair_item(CHLD)
 | 
			
		||||
		signalpair_item(CONT)
 | 
			
		||||
		signalpair_item(STOP)
 | 
			
		||||
		signalpair_item(TSTP)
 | 
			
		||||
		signalpair_item(TTIN)
 | 
			
		||||
		signalpair_item(TTOU)
 | 
			
		||||
		signalpair_item(URG)
 | 
			
		||||
		signalpair_item(XCPU)
 | 
			
		||||
		signalpair_item(XFSZ)
 | 
			
		||||
		signalpair_item(VTALRM)
 | 
			
		||||
		signalpair_item(PROF)
 | 
			
		||||
#ifdef SIGWINCH
 | 
			
		||||
		signalpair_item(WINCH)
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SIGIO
 | 
			
		||||
		signalpair_item(IO)
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef SIGPWR
 | 
			
		||||
		signalpair_item(PWR)
 | 
			
		||||
#endif
 | 
			
		||||
		signalpair_item(SYS)
 | 
			
		||||
		{ "NULL",	0 },
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	unsigned int i = 0;
 | 
			
		||||
	const char *s;
 | 
			
		||||
 | 
			
		||||
	if (!sig || *sig == '\0')
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if (sscanf(sig, "%u", &i) == 1) {
 | 
			
		||||
		if (i < NSIG)
 | 
			
		||||
			return i;
 | 
			
		||||
		eerrorx("%s: `%s' is not a valid signal", applet, sig);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (strncmp(sig, "SIG", 3) == 0)
 | 
			
		||||
		s = sig + 3;
 | 
			
		||||
	else
 | 
			
		||||
		s = NULL;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_SIZE(signallist); ++i)
 | 
			
		||||
		if (strcmp(sig, signallist[i].name) == 0 ||
 | 
			
		||||
		    (s && strcmp(s, signallist[i].name) == 0))
 | 
			
		||||
			return signallist[i].signal;
 | 
			
		||||
 | 
			
		||||
	eerrorx("%s: `%s' is not a valid signal", applet, sig);
 | 
			
		||||
	/* NOTREACHED */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SCHEDULEITEM *
 | 
			
		||||
parse_schedule_item(const char *string)
 | 
			
		||||
{
 | 
			
		||||
	const char *after_hyph;
 | 
			
		||||
	int sig;
 | 
			
		||||
	SCHEDULEITEM *item = xmalloc(sizeof(*item));
 | 
			
		||||
 | 
			
		||||
	item->value = 0;
 | 
			
		||||
	item->gotoitem = NULL;
 | 
			
		||||
	if (strcmp(string,"forever") == 0)
 | 
			
		||||
		item->type = SC_FOREVER;
 | 
			
		||||
	else if (isdigit((unsigned char)string[0])) {
 | 
			
		||||
		item->type = SC_TIMEOUT;
 | 
			
		||||
		errno = 0;
 | 
			
		||||
		if (sscanf(string, "%d", &item->value) != 1)
 | 
			
		||||
			eerrorx("%s: invalid timeout value in schedule `%s'",
 | 
			
		||||
			    applet, string);
 | 
			
		||||
	} else if ((after_hyph = string + (string[0] == '-')) &&
 | 
			
		||||
	    ((sig = parse_signal(after_hyph)) != -1))
 | 
			
		||||
	{
 | 
			
		||||
		item->type = SC_SIGNAL;
 | 
			
		||||
		item->value = (int)sig;
 | 
			
		||||
	} else
 | 
			
		||||
		eerrorx("%s: invalid schedule item `%s'", applet, string);
 | 
			
		||||
 | 
			
		||||
	return item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
parse_schedule(const char *string, int timeout)
 | 
			
		||||
{
 | 
			
		||||
	char buffer[20];
 | 
			
		||||
	const char *slash;
 | 
			
		||||
	int count = 0;
 | 
			
		||||
	SCHEDULEITEM *repeatat = NULL;
 | 
			
		||||
	size_t len;
 | 
			
		||||
	SCHEDULEITEM *item;
 | 
			
		||||
 | 
			
		||||
	if (string)
 | 
			
		||||
		for (slash = string; *slash; slash++)
 | 
			
		||||
			if (*slash == '/')
 | 
			
		||||
				count++;
 | 
			
		||||
 | 
			
		||||
	free_schedulelist();
 | 
			
		||||
 | 
			
		||||
	if (count == 0) {
 | 
			
		||||
		item = xmalloc(sizeof(*item));
 | 
			
		||||
		item->type = SC_SIGNAL;
 | 
			
		||||
		item->value = timeout;
 | 
			
		||||
		item->gotoitem = NULL;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
 | 
			
		||||
		item = xmalloc(sizeof(*item));
 | 
			
		||||
		item->type = SC_TIMEOUT;
 | 
			
		||||
		item->gotoitem = NULL;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
		if (string) {
 | 
			
		||||
			if (sscanf(string, "%d", &item->value) != 1)
 | 
			
		||||
				eerrorx("%s: invalid timeout in schedule",
 | 
			
		||||
				    applet);
 | 
			
		||||
		} else
 | 
			
		||||
			item->value = 5;
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (string != NULL) {
 | 
			
		||||
		if ((slash = strchr(string, '/')))
 | 
			
		||||
			len = slash - string;
 | 
			
		||||
		else
 | 
			
		||||
			len = strlen(string);
 | 
			
		||||
 | 
			
		||||
		if (len >= (ptrdiff_t)sizeof(buffer))
 | 
			
		||||
			eerrorx("%s: invalid schedule item, far too long",
 | 
			
		||||
			    applet);
 | 
			
		||||
 | 
			
		||||
		memcpy(buffer, string, len);
 | 
			
		||||
		buffer[len] = 0;
 | 
			
		||||
		string = slash ? slash + 1 : NULL;
 | 
			
		||||
 | 
			
		||||
		item = parse_schedule_item(buffer);
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
		if (item->type == SC_FOREVER) {
 | 
			
		||||
			if (repeatat)
 | 
			
		||||
				eerrorx("%s: invalid schedule, `forever' "
 | 
			
		||||
				    "appears more than once", applet);
 | 
			
		||||
 | 
			
		||||
			repeatat = item;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (repeatat) {
 | 
			
		||||
		item = xmalloc(sizeof(*item));
 | 
			
		||||
		item->type = SC_GOTO;
 | 
			
		||||
		item->value = 0;
 | 
			
		||||
		item->gotoitem = repeatat;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&schedule, item, entries);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static pid_t
 | 
			
		||||
get_pid(const char *pidfile)
 | 
			
		||||
{
 | 
			
		||||
	FILE *fp;
 | 
			
		||||
	pid_t pid;
 | 
			
		||||
 | 
			
		||||
	if (! pidfile)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if ((fp = fopen(pidfile, "r")) == NULL) {
 | 
			
		||||
		ewarnv("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (fscanf(fp, "%d", &pid) != 1) {
 | 
			
		||||
		ewarnv("%s: no pid found in `%s'", applet, pidfile);
 | 
			
		||||
		fclose(fp);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fclose(fp);
 | 
			
		||||
 | 
			
		||||
	return pid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return number of processed killed, -1 on error */
 | 
			
		||||
static int
 | 
			
		||||
do_stop(const char *exec, const char *const *argv,
 | 
			
		||||
    pid_t pid, uid_t uid,int sig, bool test)
 | 
			
		||||
{
 | 
			
		||||
	RC_PIDLIST *pids;
 | 
			
		||||
	RC_PID *pi;
 | 
			
		||||
	RC_PID *np;
 | 
			
		||||
	bool killed;
 | 
			
		||||
	int nkilled = 0;
 | 
			
		||||
 | 
			
		||||
	if (pid)
 | 
			
		||||
		pids = rc_find_pids(NULL, NULL, 0, pid);
 | 
			
		||||
	else
 | 
			
		||||
		pids = rc_find_pids(exec, argv, uid, pid);
 | 
			
		||||
 | 
			
		||||
	if (!pids)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	LIST_FOREACH_SAFE(pi, pids, entries, np) {
 | 
			
		||||
		if (test) {
 | 
			
		||||
			einfo("Would send signal %d to PID %d", sig, pi->pid);
 | 
			
		||||
			nkilled++;
 | 
			
		||||
		} else {
 | 
			
		||||
			ebeginv("Sending signal %d to PID %d", sig, pi->pid);
 | 
			
		||||
			errno = 0;
 | 
			
		||||
			killed = (kill(pi->pid, sig) == 0 ||
 | 
			
		||||
			    errno == ESRCH ? true : false);
 | 
			
		||||
			eendv(killed ? 0 : 1,
 | 
			
		||||
				"%s: failed to send signal %d to PID %d: %s",
 | 
			
		||||
				applet, sig, pi->pid, strerror(errno));
 | 
			
		||||
			if (!killed) {
 | 
			
		||||
				nkilled = -1;
 | 
			
		||||
			} else {
 | 
			
		||||
				if (nkilled != -1)
 | 
			
		||||
					nkilled++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		free(pi);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	free(pids);
 | 
			
		||||
	return nkilled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
run_stop_schedule(const char *exec, const char *const *argv,
 | 
			
		||||
    const char *pidfile, uid_t uid,
 | 
			
		||||
    bool test, bool progress)
 | 
			
		||||
{
 | 
			
		||||
	SCHEDULEITEM *item = TAILQ_FIRST(&schedule);
 | 
			
		||||
	int nkilled = 0;
 | 
			
		||||
	int tkilled = 0;
 | 
			
		||||
	int nrunning = 0;
 | 
			
		||||
	long nloops, nsecs;
 | 
			
		||||
	struct timespec ts;
 | 
			
		||||
	pid_t pid = 0;
 | 
			
		||||
	const char *const *p;
 | 
			
		||||
	bool progressed = false;
 | 
			
		||||
 | 
			
		||||
	if (exec)
 | 
			
		||||
		einfov("Will stop %s", exec);
 | 
			
		||||
	if (pidfile)
 | 
			
		||||
		einfov("Will stop PID in pidfile `%s'", pidfile);
 | 
			
		||||
	if (uid)
 | 
			
		||||
		einfov("Will stop processes owned by UID %d", uid);
 | 
			
		||||
	if (argv && *argv) {
 | 
			
		||||
		einfovn("Will stop processes of `");
 | 
			
		||||
		if (rc_yesno(getenv("EINFO_VERBOSE"))) {
 | 
			
		||||
			for (p = argv; p && *p; p++) {
 | 
			
		||||
				if (p != argv)
 | 
			
		||||
					printf(" ");
 | 
			
		||||
				printf("%s", *p);
 | 
			
		||||
			}
 | 
			
		||||
			printf("'\n");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (pidfile) {
 | 
			
		||||
		pid = get_pid(pidfile);
 | 
			
		||||
		if (pid == -1)
 | 
			
		||||
			return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (item) {
 | 
			
		||||
		switch (item->type) {
 | 
			
		||||
		case SC_GOTO:
 | 
			
		||||
			item = item->gotoitem;
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		case SC_SIGNAL:
 | 
			
		||||
			nrunning = 0;
 | 
			
		||||
			nkilled = do_stop(exec, argv, pid, uid, item->value, test);
 | 
			
		||||
			if (nkilled == 0) {
 | 
			
		||||
				if (tkilled == 0) {
 | 
			
		||||
					if (progressed)
 | 
			
		||||
						printf("\n");
 | 
			
		||||
					eerror("%s: no matching processes found", applet);
 | 
			
		||||
				}
 | 
			
		||||
				return tkilled;
 | 
			
		||||
			}
 | 
			
		||||
			else if (nkilled == -1)
 | 
			
		||||
				return 0;
 | 
			
		||||
 | 
			
		||||
			tkilled += nkilled;
 | 
			
		||||
			break;
 | 
			
		||||
		case SC_TIMEOUT:
 | 
			
		||||
			if (item->value < 1) {
 | 
			
		||||
				item = NULL;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ts.tv_sec = 0;
 | 
			
		||||
			ts.tv_nsec = POLL_INTERVAL;
 | 
			
		||||
 | 
			
		||||
			for (nsecs = 0; nsecs < item->value; nsecs++) {
 | 
			
		||||
				for (nloops = 0;
 | 
			
		||||
				     nloops < ONE_SECOND / POLL_INTERVAL;
 | 
			
		||||
				     nloops++)
 | 
			
		||||
				{
 | 
			
		||||
					if ((nrunning = do_stop(exec, argv,
 | 
			
		||||
						    pid, uid, 0, test)) == 0)
 | 
			
		||||
						return 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
					if (nanosleep(&ts, NULL) == -1) {
 | 
			
		||||
						if (progressed) {
 | 
			
		||||
							printf("\n");
 | 
			
		||||
							progressed = false;
 | 
			
		||||
						}
 | 
			
		||||
						if (errno == EINTR)
 | 
			
		||||
							eerror("%s: caught an"
 | 
			
		||||
							    " interrupt", applet);
 | 
			
		||||
						else {
 | 
			
		||||
							eerror("%s: nanosleep: %s",
 | 
			
		||||
							    applet, strerror(errno));
 | 
			
		||||
							return 0;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if (progress) {
 | 
			
		||||
					printf(".");
 | 
			
		||||
					fflush(stdout);
 | 
			
		||||
					progressed = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			if (progressed) {
 | 
			
		||||
				printf("\n");
 | 
			
		||||
				progressed = false;
 | 
			
		||||
			}
 | 
			
		||||
			eerror("%s: invalid schedule item `%d'",
 | 
			
		||||
			    applet, item->type);
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (item)
 | 
			
		||||
			item = TAILQ_NEXT(item, entries);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (test || (tkilled > 0 && nrunning == 0))
 | 
			
		||||
		return nkilled;
 | 
			
		||||
 | 
			
		||||
	if (progressed)
 | 
			
		||||
		printf("\n");
 | 
			
		||||
	if (nrunning == 1)
 | 
			
		||||
		eerror("%s: %d process refused to stop", applet, nrunning);
 | 
			
		||||
	else
 | 
			
		||||
		eerror("%s: %d process(es) refused to stop", applet, nrunning);
 | 
			
		||||
 | 
			
		||||
	return -nrunning;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
handle_signal(int sig)
 | 
			
		||||
{
 | 
			
		||||
@@ -297,6 +707,7 @@ int main(int argc, char **argv)
 | 
			
		||||
	unsigned int start_wait = 0;
 | 
			
		||||
 | 
			
		||||
	applet = basename_c(argv[0]);
 | 
			
		||||
	TAILQ_INIT(&schedule);
 | 
			
		||||
	atexit(cleanup);
 | 
			
		||||
 | 
			
		||||
	signal_setup(SIGINT, handle_signal);
 | 
			
		||||
@@ -465,7 +876,7 @@ int main(int argc, char **argv)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case 's':  /* --signal <signal> */
 | 
			
		||||
			sig = parse_signal(applet, optarg);
 | 
			
		||||
			sig = parse_signal(optarg);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case 't':  /* --test */
 | 
			
		||||
@@ -651,13 +1062,13 @@ int main(int argc, char **argv)
 | 
			
		||||
		if (!stop)
 | 
			
		||||
			oknodo = true;
 | 
			
		||||
		if (retry)
 | 
			
		||||
			parse_schedule(applet, retry, sig);
 | 
			
		||||
			parse_schedule(retry, sig);
 | 
			
		||||
		else if (test || oknodo)
 | 
			
		||||
			parse_schedule(applet, "0", sig);
 | 
			
		||||
			parse_schedule("0", sig);
 | 
			
		||||
		else
 | 
			
		||||
			parse_schedule(applet, NULL, sig);
 | 
			
		||||
		i = run_stop_schedule(applet, exec, (const char *const *)margv,
 | 
			
		||||
		    get_pid(applet, pidfile), uid, test, progress, false);
 | 
			
		||||
			parse_schedule(NULL, sig);
 | 
			
		||||
		i = run_stop_schedule(exec, (const char *const *)margv,
 | 
			
		||||
		    pidfile, uid, test, progress);
 | 
			
		||||
 | 
			
		||||
		if (i < 0)
 | 
			
		||||
			/* We failed to stop something */
 | 
			
		||||
@@ -679,12 +1090,12 @@ int main(int argc, char **argv)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (pidfile)
 | 
			
		||||
		pid = get_pid(applet, pidfile);
 | 
			
		||||
		pid = get_pid(pidfile);
 | 
			
		||||
	else
 | 
			
		||||
		pid = 0;
 | 
			
		||||
 | 
			
		||||
	if (do_stop(applet, exec, (const char * const *)margv, pid, uid,
 | 
			
		||||
		0, test, false) > 0)
 | 
			
		||||
	if (do_stop(exec, (const char * const *)margv, pid, uid,
 | 
			
		||||
		0, test) > 0)
 | 
			
		||||
		eerrorx("%s: %s is already running", applet, exec);
 | 
			
		||||
 | 
			
		||||
	if (test) {
 | 
			
		||||
@@ -954,7 +1365,7 @@ int main(int argc, char **argv)
 | 
			
		||||
				alive = true;
 | 
			
		||||
		} else {
 | 
			
		||||
			if (pidfile) {
 | 
			
		||||
				pid = get_pid(applet, pidfile);
 | 
			
		||||
				pid = get_pid(pidfile);
 | 
			
		||||
				if (pid == -1) {
 | 
			
		||||
					eerrorx("%s: did not "
 | 
			
		||||
					    "create a valid"
 | 
			
		||||
@@ -963,8 +1374,8 @@ int main(int argc, char **argv)
 | 
			
		||||
				}
 | 
			
		||||
			} else
 | 
			
		||||
				pid = 0;
 | 
			
		||||
			if (do_stop(applet, exec, (const char *const *)margv,
 | 
			
		||||
				pid, uid, 0, test, false) > 0)
 | 
			
		||||
			if (do_stop(exec, (const char *const *)margv,
 | 
			
		||||
				pid, uid, 0, test) > 0)
 | 
			
		||||
				alive = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,13 +61,12 @@ static struct pam_conv conv = { NULL, NULL};
 | 
			
		||||
#include "queue.h"
 | 
			
		||||
#include "rc.h"
 | 
			
		||||
#include "rc-misc.h"
 | 
			
		||||
#include "rc-schedules.h"
 | 
			
		||||
#include "_usage.h"
 | 
			
		||||
#include "helpers.h"
 | 
			
		||||
 | 
			
		||||
const char *applet = NULL;
 | 
			
		||||
const char *extraopts = NULL;
 | 
			
		||||
const char *getoptstring = "D:d:e:g:I:Kk:m:N:p:R:r:Su:1:2:" \
 | 
			
		||||
const char *getoptstring = "D:d:e:g:I:Kk:m:N:p:r:Su:1:2:" \
 | 
			
		||||
	getoptstring_COMMON;
 | 
			
		||||
const struct option longopts[] = {
 | 
			
		||||
	{ "respawn-delay",        1, NULL, 'D'},
 | 
			
		||||
@@ -81,7 +80,6 @@ const struct option longopts[] = {
 | 
			
		||||
	{ "nicelevel",    1, NULL, 'N'},
 | 
			
		||||
	{ "pidfile",      1, NULL, 'p'},
 | 
			
		||||
	{ "respawn-period",        1, NULL, 'P'},
 | 
			
		||||
	{ "retry",       1, NULL, 'R'},
 | 
			
		||||
	{ "chroot",       1, NULL, 'r'},
 | 
			
		||||
	{ "start",        0, NULL, 'S'},
 | 
			
		||||
	{ "user",         1, NULL, 'u'},
 | 
			
		||||
@@ -101,7 +99,6 @@ const char * const longopts_help[] = {
 | 
			
		||||
	"Set a nicelevel when starting",
 | 
			
		||||
	"Match pid found in this file",
 | 
			
		||||
	"Set respawn time period",
 | 
			
		||||
	"Retry schedule to use when stopping",
 | 
			
		||||
	"Chroot to this directory",
 | 
			
		||||
	"Start daemon",
 | 
			
		||||
	"Change the process user",
 | 
			
		||||
@@ -150,6 +147,30 @@ static void cleanup(void)
 | 
			
		||||
	free(changeuser);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static pid_t get_pid(const char *pidfile)
 | 
			
		||||
{
 | 
			
		||||
	FILE *fp;
 | 
			
		||||
	pid_t pid;
 | 
			
		||||
 | 
			
		||||
	if (! pidfile)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if ((fp = fopen(pidfile, "r")) == NULL) {
 | 
			
		||||
		ewarnv("%s: fopen `%s': %s", applet, pidfile, strerror(errno));
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (fscanf(fp, "%d", &pid) != 1) {
 | 
			
		||||
		ewarnv("%s: no pid found in `%s'", applet, pidfile);
 | 
			
		||||
		fclose(fp);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fclose(fp);
 | 
			
		||||
 | 
			
		||||
	return pid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void child_process(char *exec, char **argv, char *svcname,
 | 
			
		||||
		int start_count)
 | 
			
		||||
{
 | 
			
		||||
@@ -413,9 +434,6 @@ int main(int argc, char **argv)
 | 
			
		||||
	bool stop = false;
 | 
			
		||||
	char *exec = NULL;
 | 
			
		||||
	char *pidfile = NULL;
 | 
			
		||||
	char *retry = NULL;
 | 
			
		||||
	int nkilled;
 | 
			
		||||
	int sig = SIGTERM;
 | 
			
		||||
	char *home = NULL;
 | 
			
		||||
	int tid = 0;
 | 
			
		||||
	pid_t child_pid, pid;
 | 
			
		||||
@@ -440,6 +458,11 @@ int main(int argc, char **argv)
 | 
			
		||||
	applet = basename_c(argv[0]);
 | 
			
		||||
	atexit(cleanup);
 | 
			
		||||
 | 
			
		||||
	signal_setup(SIGINT, handle_signal);
 | 
			
		||||
	signal_setup(SIGQUIT, handle_signal);
 | 
			
		||||
	signal_setup(SIGTERM, handle_signal);
 | 
			
		||||
	openlog(applet, LOG_PID, LOG_DAEMON);
 | 
			
		||||
 | 
			
		||||
	if ((tmp = getenv("SSD_NICELEVEL")))
 | 
			
		||||
		if (sscanf(tmp, "%d", &nicelevel) != 1)
 | 
			
		||||
			eerror("%s: invalid nice level `%s' (SSD_NICELEVEL)",
 | 
			
		||||
@@ -535,9 +558,6 @@ int main(int argc, char **argv)
 | 
			
		||||
			pidfile = optarg;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case 'R':  /* --retry <schedule>|timeout */
 | 
			
		||||
			retry = optarg;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'r':  /* --chroot /new/root */
 | 
			
		||||
			ch_root = optarg;
 | 
			
		||||
			break;
 | 
			
		||||
@@ -609,10 +629,6 @@ int main(int argc, char **argv)
 | 
			
		||||
				"than %d to avoid infinite respawning", applet, 
 | 
			
		||||
				respawn_delay * respawn_max);
 | 
			
		||||
		}
 | 
			
		||||
		if (retry)
 | 
			
		||||
			parse_schedule(applet, retry, sig);
 | 
			
		||||
		else
 | 
			
		||||
			parse_schedule(applet, NULL, sig);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Expand ~ */
 | 
			
		||||
@@ -657,19 +673,15 @@ int main(int argc, char **argv)
 | 
			
		||||
		    *exec_file ? exec_file : exec);
 | 
			
		||||
 | 
			
		||||
	if (stop) {
 | 
			
		||||
		pid = get_pid(applet, pidfile);
 | 
			
		||||
		pid = get_pid(pidfile);
 | 
			
		||||
		if (pid == -1)
 | 
			
		||||
			i = pid;
 | 
			
		||||
		else
 | 
			
		||||
			i = kill(pid, SIGTERM);
 | 
			
		||||
		if (i != 0)
 | 
			
		||||
			/* We failed to send the signal */
 | 
			
		||||
			/* We failed to stop something */
 | 
			
		||||
			exit(EXIT_FAILURE);
 | 
			
		||||
 | 
			
		||||
		/* wait for the supervisor to go down */
 | 
			
		||||
		while (kill(pid, 0) == 0)
 | 
			
		||||
			sleep(1);
 | 
			
		||||
 | 
			
		||||
		/* Even if we have not actually killed anything, we should
 | 
			
		||||
		 * remove information about it as it may have unexpectedly
 | 
			
		||||
		 * crashed out. We should also return success as the end
 | 
			
		||||
@@ -685,7 +697,7 @@ int main(int argc, char **argv)
 | 
			
		||||
		exit(EXIT_SUCCESS);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pid = get_pid(applet, pidfile);
 | 
			
		||||
	pid = get_pid(pidfile);
 | 
			
		||||
	if (pid != -1)
 | 
			
		||||
		if (kill(pid, 0) == 0)
 | 
			
		||||
			eerrorx("%s: %s is already running", applet, exec);
 | 
			
		||||
@@ -724,8 +736,6 @@ int main(int argc, char **argv)
 | 
			
		||||
	if (child_pid != 0) {
 | 
			
		||||
		/* this is the supervisor */
 | 
			
		||||
		umask(numask);
 | 
			
		||||
		openlog(applet, LOG_PID, LOG_DAEMON);
 | 
			
		||||
		signal_setup(SIGTERM, handle_signal);
 | 
			
		||||
 | 
			
		||||
		fp = fopen(pidfile, "w");
 | 
			
		||||
		if (! fp)
 | 
			
		||||
@@ -751,10 +761,7 @@ int main(int argc, char **argv)
 | 
			
		||||
			wait(&i);
 | 
			
		||||
			if (exiting) {
 | 
			
		||||
				syslog(LOG_INFO, "stopping %s, pid %d", exec, child_pid);
 | 
			
		||||
				nkilled = run_stop_schedule(applet, exec, NULL, child_pid,
 | 
			
		||||
						0, false, false, true);
 | 
			
		||||
				if (nkilled > 0)
 | 
			
		||||
					syslog(LOG_INFO, "killed %d processes", nkilled);
 | 
			
		||||
				kill(child_pid, SIGTERM);
 | 
			
		||||
			} else {
 | 
			
		||||
				sleep(respawn_delay);
 | 
			
		||||
				if (respawn_max > 0 && respawn_period > 0) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user