Compare commits
	
		
			54 Commits
		
	
	
		
			openrc-0.1
			...
			0.18.2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 776346e2cd | ||
|   | ce71ffbfbe | ||
|   | d9ee8ca584 | ||
|   | 4e44e2cd73 | ||
|   | 88b807f9bc | ||
|   | feba5d86b7 | ||
|   | 3b1e96a6a3 | ||
|   | 79998bdf9c | ||
|   | 050ddfae4a | ||
|   | d5116cc697 | ||
|   | b86d170037 | ||
|   | 6fa0d6318b | ||
|   | 80d3928b0d | ||
|   | 17ef205bc6 | ||
|   | b20a1951ad | ||
|   | bf0c0dd564 | ||
|   | 1558ad2b9e | ||
|   | 5f4f242036 | ||
|   | b3f7ff901f | ||
|   | a59365a582 | ||
|   | dac5966ca4 | ||
|   | 3b6a6df4b5 | ||
|   | b047ea47e9 | ||
|   | b652752339 | ||
|   | 2a439c85bd | ||
|   | 7341cd882f | ||
|   | 279f1e5d10 | ||
|   | c256a7aa80 | ||
|   | 6a42298257 | ||
|   | f69833a1e1 | ||
|   | eeadca0b8a | ||
|   | dde339070b | ||
|   | 1736be3bc3 | ||
|   | a36a635b01 | ||
|   | 9310ccc06b | ||
|   | 0c2e4eb3cd | ||
|   | d2ce07e227 | ||
|   | b209fe3859 | ||
|   | c94c8288cd | ||
|   | bcb9c44e73 | ||
|   | bbabf546f9 | ||
|   | a7fcc1e264 | ||
|   | b79d058f16 | ||
|   | ddce529c71 | ||
|   | e372f97beb | ||
|   | c2abf4b436 | ||
|   | d247ac4cbb | ||
|   | bb2d7becfd | ||
|   | 0f9354becf | ||
|   | a15fa1a3b1 | ||
|   | 0198affc74 | ||
|   | abef2fcb2d | ||
|   | 0b435ddd83 | ||
|   | 9f6427ea57 | 
| @@ -1,3 +1,3 @@ | |||||||
| NAME=		openrc | NAME=		openrc | ||||||
| VERSION=	0.15 | VERSION=	0.18.2 | ||||||
| PKG=		${NAME}-${VERSION} | PKG=		${NAME}-${VERSION} | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								NEWS.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								NEWS.md
									
									
									
									
									
								
							| @@ -3,6 +3,17 @@ | |||||||
| This file will contain a list of notable changes for each release. Note | This file will contain a list of notable changes for each release. Note | ||||||
| the information in this file is in reverse order. | the information in this file is in reverse order. | ||||||
|  |  | ||||||
|  | ## OpenRC-0.18 | ||||||
|  |  | ||||||
|  | The behaviour of localmount and netmount in this version is changing. In | ||||||
|  | the past, these services always started successfully. In this version, | ||||||
|  | they will be able to fail if file systems they mount fail to mount. If | ||||||
|  | you have file systems listed in fstab which should not be mounted at | ||||||
|  | boot time, make sure to add noauto to the mount options. If you have | ||||||
|  | file systems that you want to attempt to mount at boot time but failure | ||||||
|  | should be allowed, add nofail to the mount options for these file | ||||||
|  | systems in fstab. | ||||||
|  |  | ||||||
| ## OpenRC-0.14 | ## OpenRC-0.14 | ||||||
|  |  | ||||||
| The binfmt service, which registers misc binary formats with the Linux | The binfmt service, which registers misc binary formats with the Linux | ||||||
|   | |||||||
| @@ -62,12 +62,21 @@ rc_tty_number=12 | |||||||
| # Set the devices controller settings for this service. | # Set the devices controller settings for this service. | ||||||
| #rc_cgroup_devices="" | #rc_cgroup_devices="" | ||||||
|  |  | ||||||
|  | # Set the hugetlb controller settings for this service. | ||||||
|  | #rc_cgroup_hugetlb="" | ||||||
|  |  | ||||||
| # Set the memory controller settings for this service. | # Set the memory controller settings for this service. | ||||||
| #rc_cgroup_memory="" | #rc_cgroup_memory="" | ||||||
|  |  | ||||||
|  | # Set the net_cls controller settings for this service. | ||||||
|  | #rc_cgroup_net_cls="" | ||||||
|  |  | ||||||
| # Set the net_prio controller settings for this service. | # Set the net_prio controller settings for this service. | ||||||
| #rc_cgroup_net_prio="" | #rc_cgroup_net_prio="" | ||||||
|  |  | ||||||
|  | # Set the pids controller settings for this service. | ||||||
|  | #rc_cgroup_pids="" | ||||||
|  |  | ||||||
| # Set this to YES if yu want all of the processes in a service's cgroup | # Set this to YES if yu want all of the processes in a service's cgroup | ||||||
| # killed when the service is stopped or restarted. | # killed when the service is stopped or restarted. | ||||||
| # This should not be set globally because it kills all of the service's | # This should not be set globally because it kills all of the service's | ||||||
|   | |||||||
| @@ -116,6 +116,9 @@ | |||||||
| #SSD_NICELEVEL="-19" | #SSD_NICELEVEL="-19" | ||||||
|  |  | ||||||
| # Pass ulimit parameters | # Pass ulimit parameters | ||||||
|  | # If you are using bash in POSIX mode for your shell, note that the | ||||||
|  | # ulimit command uses a block size of 512 bytes for the -c and -f | ||||||
|  | # options | ||||||
| #rc_ulimit="-u 30" | #rc_ulimit="-u 30" | ||||||
|  |  | ||||||
| # It's possible to define extra dependencies for services like so | # It's possible to define extra dependencies for services like so | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ include ../mk/net.mk | |||||||
| DIR=	${INITDIR} | DIR=	${INITDIR} | ||||||
| SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \ | SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \ | ||||||
| 	netmount.in osclock.in root.in savecache.in swap.in swapfiles.in \ | 	netmount.in osclock.in root.in savecache.in swap.in swapfiles.in \ | ||||||
| 	tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}} | 	tmpfiles.setup.in swclock.in sysctl.in urandom.in s6-svscan.in ${SRCS-${OS}} | ||||||
| BIN=	${OBJS} | BIN=	${OBJS} | ||||||
|  |  | ||||||
| # Are we installing our network scripts? | # Are we installing our network scripts? | ||||||
|   | |||||||
| @@ -16,5 +16,5 @@ start() | |||||||
| 	ebegin "Loading custom binary format handlers" | 	ebegin "Loading custom binary format handlers" | ||||||
| 	"$RC_LIBEXECDIR"/sh/binfmt.sh | 	"$RC_LIBEXECDIR"/sh/binfmt.sh | ||||||
| 	eend $? | 	eend $? | ||||||
| return 0 | 	return 0 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -121,11 +121,11 @@ clean_run() | |||||||
| 	local dir | 	local dir | ||||||
| 	# If / is still read-only due to a problem, this will fail! | 	# If / is still read-only due to a problem, this will fail! | ||||||
| 	if ! checkpath -W /; then | 	if ! checkpath -W /; then | ||||||
| 		eerror "/ is not writable; unable to clean up underlying /run" | 		ewarn "/ is not writable; unable to clean up underlying /run" | ||||||
| 		return 1 | 		return 1 | ||||||
| 	fi | 	fi | ||||||
| 	if ! checkpath -W /tmp; then | 	if ! checkpath -W /tmp; then | ||||||
| 		eerror "/tmp is not writable; unable to clean up underlying /run" | 		ewarn "/tmp is not writable; unable to clean up underlying /run" | ||||||
| 		return 1 | 		return 1 | ||||||
| 	fi | 	fi | ||||||
| 	# Now we know that we can modify /tmp and / | 	# Now we know that we can modify /tmp and / | ||||||
| @@ -136,13 +136,12 @@ clean_run() | |||||||
| 	dir=$(mktemp -d) | 	dir=$(mktemp -d) | ||||||
| 	if [ -n "$dir" -a -d $dir -a -w $dir ]; then | 	if [ -n "$dir" -a -d $dir -a -w $dir ]; then | ||||||
| 		mount --bind / $dir && rm -rf $dir/run/* || rc=1 | 		mount --bind / $dir && rm -rf $dir/run/* || rc=1 | ||||||
| 		umount $dir | 		umount $dir && rmdir $dir | ||||||
| 		rm -rf $dir |  | ||||||
| 	else | 	else | ||||||
| 		rc=1 | 		rc=1 | ||||||
| 	fi | 	fi | ||||||
| 	if [ $rc -ne 0 ]; then | 	if [ $rc -ne 0 ]; then | ||||||
| 		eerror "Could not clean up underlying /run on /" | 		ewarn "Could not clean up underlying /run on /" | ||||||
| 		return 1 | 		return 1 | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
| @@ -214,10 +213,13 @@ start() | |||||||
| 	if yesno $log_dmesg; then | 	if yesno $log_dmesg; then | ||||||
| 		if $logw || checkpath -W /var/log; then | 		if $logw || checkpath -W /var/log; then | ||||||
| 			# Create an 'after-boot' dmesg log | 			# Create an 'after-boot' dmesg log | ||||||
| 			if [ "$RC_SYS" != VSERVER -a "$RC_SYS" != OPENVZ -a "$RC_SYS" != LXC ]; then | 			case "$RC_SYS" in | ||||||
| 				dmesg > /var/log/dmesg | 				VSERVER|OPENVZ|LXC|SYSTEMD-NSPAWN) ;; | ||||||
| 				chmod 640 /var/log/dmesg | 				*) | ||||||
| 			fi | 					dmesg > /var/log/dmesg | ||||||
|  | 					chmod 640 /var/log/dmesg | ||||||
|  | 					;; | ||||||
|  | 			esac | ||||||
| 		fi | 		fi | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ depend() | |||||||
| start() | start() | ||||||
| { | { | ||||||
| 	# Mount local filesystems in /etc/fstab. | 	# Mount local filesystems in /etc/fstab. | ||||||
| 	local types="noproc" x= no_netdev= | 	local types="noproc" x= no_netdev= rc= | ||||||
| 	for x in $net_fs_list $extra_net_fs_list; do | 	for x in $net_fs_list $extra_net_fs_list; do | ||||||
| 		types="${types},no${x}" | 		types="${types},no${x}" | ||||||
| 	done | 	done | ||||||
| @@ -29,9 +29,11 @@ start() | |||||||
| 	ebegin "Mounting local filesystems" | 	ebegin "Mounting local filesystems" | ||||||
| 	mount -at "$types" $no_netdev | 	mount -at "$types" $no_netdev | ||||||
| 	eend $? "Some local filesystem failed to mount" | 	eend $? "Some local filesystem failed to mount" | ||||||
|  | 	rc=$? | ||||||
| 	# Always return 0 - some local mounts may not be critical for boot | 	if [ "$RC_UNAME" != Linux ]; then | ||||||
| 	return 0 | 		rc=0 | ||||||
|  | 	fi | ||||||
|  | 	return $rc | ||||||
| } | } | ||||||
|  |  | ||||||
| stop() | stop() | ||||||
| @@ -70,17 +72,19 @@ stop() | |||||||
| 			sync | 			sync | ||||||
| 		fi | 		fi | ||||||
|  |  | ||||||
| 		local aufs_branch aufs_mount_dir aufs_mount_point aufs_si_dir aufs_si_id | 		local aufs_branch aufs_mount_point aufs_si_id aufs_br_id branches | ||||||
| 		for aufs_si_dir in /sys/fs/aufs/*; do | 		for aufs_si_dir in /sys/fs/aufs/si*; do | ||||||
| 			aufs_mount_dir=${aufs_si_dir#/sys/fs/aufs/} | 			[ -d "${aufs_si_dir}" ] || continue | ||||||
| 			aufs_si_id="$(printf "%s" $aufs_mount_dir | sed 's/_/=/g')" | 			aufs_si_id="si=${aufs_si_dir#/sys/fs/aufs/si_}" | ||||||
| 			aufs_mount_point="$(mountinfo -o ${aufs_si_id})" | 			aufs_mount_point="$(mountinfo -o ${aufs_si_id})" | ||||||
| 			for x in $aufs_si_dir/br[0-9][0-9][0-9]; do | 			branches="$aufs_si_dir/br[0-9] $aufs_si_dir/br[0-9][0-9] $aufs_si_dir/br[0-9][0-9][0-9]" | ||||||
|  | 			for x in $branches; do | ||||||
|  | 				[ -e "${x}" ] || continue | ||||||
| 				aufs_branch=$(sed 's/=.*//g' $x) | 				aufs_branch=$(sed 's/=.*//g' $x) | ||||||
| 				eindent | 				eindent | ||||||
| 				if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then | 				if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then | ||||||
| 					ewarn "Failed to remove branch $aufs_branch from aufs \ | 					ewarn "Failed to remove branch $aufs_branch from aufs \ | ||||||
| 						$aufs_mount_point" | 					$aufs_mount_point" | ||||||
| 				fi | 				fi | ||||||
| 				eoutdent | 				eoutdent | ||||||
| 				sync | 				sync | ||||||
|   | |||||||
| @@ -12,21 +12,18 @@ depend() | |||||||
|  |  | ||||||
| start() | start() | ||||||
| { | { | ||||||
| 	[ -L /etc/mtab ] && return 0 |  | ||||||
| 	local rc=0 | 	local rc=0 | ||||||
| 	ebegin "Updating /etc/mtab" | 	ebegin "Updating /etc/mtab" | ||||||
| 	if ! checkpath -W /etc; then | 	if [ -L /etc/mtab ] ; then | ||||||
|  | 		ewarn "/etc/mtab is a symlink, not updating." | ||||||
|  | 		ewarn "FYI - You can safely remove mtab from your runlevels." | ||||||
|  | 	elif ! checkpath -W /etc; then | ||||||
| 		rc=1 | 		rc=1 | ||||||
| 	elif [ ! -e /etc/mtab ]; then | 	elif [ ! -e /etc/mtab ]; then | ||||||
|  | 		einfo "Creating mtab symlink" | ||||||
| 		ln -snf /proc/self/mounts /etc/mtab | 		ln -snf /proc/self/mounts /etc/mtab | ||||||
| 	else | 	else | ||||||
| 		ewarn "The support for updating /etc/mtab as a file is" | 		einfo "Updating mtab file" | ||||||
| 		ewarn "deprecated and will be removed in the future." |  | ||||||
| 		ewarn "Please run the following command as root on your system." |  | ||||||
| 		ewarn |  | ||||||
| 		ewarn "ln -snf /proc/self/mounts /etc/mtab" |  | ||||||
| 		ewarn |  | ||||||
|  |  | ||||||
| 		# With / as tmpfs we cannot umount -at tmpfs in localmount as that | 		# With / as tmpfs we cannot umount -at tmpfs in localmount as that | ||||||
| 		# makes / readonly and dismounts all tmpfs even if in use which is | 		# makes / readonly and dismounts all tmpfs even if in use which is | ||||||
| 		# not good. Luckily, umount uses /etc/mtab instead of /proc/mounts | 		# not good. Luckily, umount uses /etc/mtab instead of /proc/mounts | ||||||
|   | |||||||
| @@ -27,7 +27,10 @@ start() | |||||||
| 		rc=$? | 		rc=$? | ||||||
| 	fi | 	fi | ||||||
| 	ewend $rc "Could not mount all network filesystems" | 	ewend $rc "Could not mount all network filesystems" | ||||||
| 	return 0 | 	if [ "$RC_UNAME" != Linux ]; then | ||||||
|  | 		rc=0 | ||||||
|  | 	fi | ||||||
|  | 	return $rc | ||||||
| } | } | ||||||
|  |  | ||||||
| stop() | stop() | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								init.d/s6-svscan.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								init.d/s6-svscan.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | #!@SBINDIR@/openrc-run | ||||||
|  | # Copyright (C) 2015 William Hubbs <w.d.hubbs@gmail.com> | ||||||
|  | # Released under the 2-clause BSD license. | ||||||
|  |  | ||||||
|  | command=/bin/s6-svscan | ||||||
|  | command_args="${RC_SVCDIR}"/s6-scan | ||||||
|  | command_background=yes | ||||||
|  | pidfile=/var/run/s6-svscan.pid | ||||||
|  |  | ||||||
|  | depend() | ||||||
|  | { | ||||||
|  | 	need localmount | ||||||
|  | } | ||||||
|  |  | ||||||
|  | start_pre() | ||||||
|  | { | ||||||
|  | 	einfo "Creating s6 scan directory" | ||||||
|  | 	checkpath -d -m 0755 "$RC_SVCDIR"/s6-scan | ||||||
|  | 	return $? | ||||||
|  | } | ||||||
|  |  | ||||||
|  | stop_post() | ||||||
|  | { | ||||||
|  | 	ebegin "Stopping any remaining s6 services" | ||||||
|  | 	s6-svc -dx "${RC_SVCDIR}"/s6-scan/* 2>/dev/null || true | ||||||
|  | 	eend $? | ||||||
|  |  | ||||||
|  | 	ebegin "Stopping any remaining s6 service loggers" | ||||||
|  | 	s6-svc -dx "${RC_SVCDIR}"/s6-scan/*/log 2>/dev/null || true | ||||||
|  | 	eend $? | ||||||
|  | } | ||||||
| @@ -7,43 +7,53 @@ description="Saves the caches OpenRC uses to non volatile storage" | |||||||
| start() | start() | ||||||
| { | { | ||||||
| 	if [ -e "$RC_SVCDIR"/clock-skewed ]; then | 	if [ -e "$RC_SVCDIR"/clock-skewed ]; then | ||||||
| 		ewarn "WARNING: clock skew detected!" | 		ewarn "Clock skew detected!" | ||||||
| 		if ! yesno "${RC_GOINGDOWN}"; then | 		if ! yesno "${RC_GOINGDOWN}"; then | ||||||
| 			eerror "Not saving deptree cache" | 			eerror "Not saving deptree cache" | ||||||
| 			return 1 | 			return 1 | ||||||
| 		fi | 		fi | ||||||
| 	fi | 	fi | ||||||
| 	if ! checkpath -W "$RC_LIBEXECDIR"; then | 	if [ ! -d "$RC_LIBEXECDIR"/cache ]; then | ||||||
| 		ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!" | 		if ! checkpath -W "$RC_LIBEXECDIR"; then | ||||||
| 		if ! yesno "${RC_GOINGDOWN}"; then | 			eerror "${RC_LIBEXECDIR} is not writable!" | ||||||
| 			ewarn "Unable to save deptree cache" | 			eerror "Unable to save dependency cache" | ||||||
|  | 			if yesno "${RC_GOINGDOWN}"; then | ||||||
|  | 				return 0 | ||||||
|  | 			fi | ||||||
| 			return 1 | 			return 1 | ||||||
| 		fi | 		fi | ||||||
| 		return 0 |  | ||||||
| 	fi |  | ||||||
| 	ebegin "Saving dependency cache" |  | ||||||
| 	local rc= |  | ||||||
| 	if [ ! -d "$RC_LIBEXECDIR"/cache ]; then |  | ||||||
| 		rm -rf "$RC_LIBEXECDIR"/cache | 		rm -rf "$RC_LIBEXECDIR"/cache | ||||||
| 		if ! mkdir -p "$RC_LIBEXECDIR"/cache; then | 		if ! mkdir -p "$RC_LIBEXECDIR"/cache; then | ||||||
| 			rc=$? | 			eerror "Unable to create $RC_LIBEXECDIR/cache" | ||||||
|  | 			eerror "Unable to save dependency cache" | ||||||
| 			if yesno "${RC_GOINGDOWN}"; then | 			if yesno "${RC_GOINGDOWN}"; then | ||||||
| 				rc=0 | 				return 0 | ||||||
| 			fi | 			fi | ||||||
| 			eend $rc "Unable to create $RC_SVCDIR/cache" | 			return 1 | ||||||
| 			return $rc |  | ||||||
| 		fi | 		fi | ||||||
| 	fi | 	fi | ||||||
| 	local save= | 	if ! checkpath -W "$RC_LIBEXECDIR"/cache; then | ||||||
|  | 		eerror "${RC_LIBEXECDIR}/cache is not writable!" | ||||||
|  | 		eerror "Unable to save dependency cache" | ||||||
|  | 		if yesno "${RC_GOINGDOWN}"; then | ||||||
|  | 			return 0 | ||||||
|  | 		fi | ||||||
|  | 		return 1 | ||||||
|  | 	fi | ||||||
|  | 	ebegin "Saving dependency cache" | ||||||
|  | 	local rc=0 save= | ||||||
| 	for x in deptree depconfig shutdowntime softlevel nettree rc.log; do | 	for x in deptree depconfig shutdowntime softlevel nettree rc.log; do | ||||||
| 		[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x" | 		[ -e "$RC_SVCDIR/$x" ] && save="$save $RC_SVCDIR/$x" | ||||||
| 	done | 	done | ||||||
| 	if [ -n "$save" ]; then | 	if [ -n "$save" ]; then | ||||||
| 		cp -p $save "$RC_LIBEXECDIR"/cache 2>/dev/null | 		cp -p $save "$RC_LIBEXECDIR"/cache | ||||||
|  | 		rc=$? | ||||||
| 	fi | 	fi | ||||||
| 	rc=$? |  | ||||||
| 	if yesno "${RC_GOINGDOWN}"; then | 	if yesno "${RC_GOINGDOWN}"; then | ||||||
| 		rc=0 | 		if [ $rc -ne 0 ]; then | ||||||
|  | 			eerror "Unable to save dependency cache" | ||||||
|  | 		fi | ||||||
|  | 		eend 0 | ||||||
| 	fi | 	fi | ||||||
| 	eend $rc | 	eend $rc "Unable to save dependency cache" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ mount_cgroups() | |||||||
| 		mount -n -t cgroup \ | 		mount -n -t cgroup \ | ||||||
| 			-o none,${sysfs_opts},name=openrc,release_agent="$agent" \ | 			-o none,${sysfs_opts},name=openrc,release_agent="$agent" \ | ||||||
| 			openrc /sys/fs/cgroup/openrc | 			openrc /sys/fs/cgroup/openrc | ||||||
| 		echo 1 > /sys/fs/cgroup/openrc/notify_on_release | 		printf 1 > /sys/fs/cgroup/openrc/notify_on_release | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
| 	yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0 | 	yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0 | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								man/Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								man/Makefile
									
									
									
									
									
								
							| @@ -1,9 +1,17 @@ | |||||||
|  | MK=		../mk | ||||||
|  | include ${MK}/sys.mk | ||||||
|  | include ${MK}/os.mk | ||||||
|  |  | ||||||
| MAN3=		einfo.3 \ | MAN3=		einfo.3 \ | ||||||
| 		rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \ | 		rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \ | ||||||
| 		rc_runlevel.3 rc_service.3 rc_stringlist.3 | 		rc_runlevel.3 rc_service.3 rc_stringlist.3 | ||||||
| MAN8=		rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \ | MAN8=		rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \ | ||||||
| 		service.8 start-stop-daemon.8 | 		service.8 start-stop-daemon.8 | ||||||
|  |  | ||||||
|  | ifeq (${OS},Linux) | ||||||
|  | MAN8 += rc-sstat.8 | ||||||
|  | endif | ||||||
|  |  | ||||||
| # Handy macro to create symlinks | # Handy macro to create symlinks | ||||||
| # This does rely on correctly formatting our manpages! | # This does rely on correctly formatting our manpages! | ||||||
| MAKE_LINKS=	suffix=$${man\#*.}; \ | MAKE_LINKS=	suffix=$${man\#*.}; \ | ||||||
| @@ -16,8 +24,6 @@ MAKE_LINKS=	suffix=$${man\#*.}; \ | |||||||
| 		fi; \ | 		fi; \ | ||||||
| 		done; | 		done; | ||||||
|  |  | ||||||
| MK=		../mk |  | ||||||
| include ${MK}/sys.mk |  | ||||||
| include ${MK}/gitignore.mk | include ${MK}/gitignore.mk | ||||||
|  |  | ||||||
| all: | all: | ||||||
|   | |||||||
| @@ -107,6 +107,19 @@ the service has already been stopped. | |||||||
| String describing the service. | String describing the service. | ||||||
| .It Ar description_$command | .It Ar description_$command | ||||||
| String describing the extra command. | String describing the extra command. | ||||||
|  | .It Ar supervisor | ||||||
|  | Supervisor to use to monitor this daemon. If this is unset, | ||||||
|  | start-stop-daemon will be used. The only alternate supervisor we support | ||||||
|  | in this release is S6 from Skarnet software. To use this, set | ||||||
|  | supervisor=s6. | ||||||
|  | .It Ar s6_service_path | ||||||
|  | The path to the s6 service directory if you are monitoring this service | ||||||
|  | with S6. The default is /var/svc.d/${RC_SVCNAME}. | ||||||
|  | .It Ar s6_svwait_options_start | ||||||
|  | The options to pass to s6-svwait when starting the service via s6. | ||||||
|  | .It Ar s6_service_timeout_stop | ||||||
|  | The amount of time, in milliseconds, s6-svc should wait for the service | ||||||
|  | to go down when stopping the service. The default is 10000. | ||||||
| .It Ar start_stop_daemon_args | .It Ar start_stop_daemon_args | ||||||
| List of arguments passed to start-stop-daemon when starting the daemon. | List of arguments passed to start-stop-daemon when starting the daemon. | ||||||
| .It Ar command | .It Ar command | ||||||
| @@ -114,7 +127,8 @@ Daemon to start or stop via | |||||||
| .Nm start-stop-daemon | .Nm start-stop-daemon | ||||||
| if no start or stop function is defined by the service. | if no start or stop function is defined by the service. | ||||||
| .It Ar command_args | .It Ar command_args | ||||||
| List of arguments to pass to the daemon when starting. | List of arguments to pass to the daemon when starting via | ||||||
|  | .Nm start-stop-daemon . | ||||||
| .It Ar command_background | .It Ar command_background | ||||||
| Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into | Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into | ||||||
| the background. This implies the "--make-pidfile" and "--pidfile" option of | the background. This implies the "--make-pidfile" and "--pidfile" option of | ||||||
| @@ -127,6 +141,8 @@ will chroot into this path before writing the pid file or starting the daemon. | |||||||
| Pidfile to use for the above defined command. | Pidfile to use for the above defined command. | ||||||
| .It Ar name | .It Ar name | ||||||
| Display name used for the above defined command. | Display name used for the above defined command. | ||||||
|  | .It Ar stopsig | ||||||
|  | Signal to send when stopping the daemon. | ||||||
| .It Ar retry | .It Ar retry | ||||||
| Retry schedule to use when stopping the daemon. It can either be a | Retry schedule to use when stopping the daemon. It can either be a | ||||||
| timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5). | timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5). | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								man/rc-sstat.8
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								man/rc-sstat.8
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | .\" Copyright (c) 2015 William Hubbs | ||||||
|  | .\" | ||||||
|  | .\" Redistribution and use in source and binary forms, with or without | ||||||
|  | .\" modification, are permitted provided that the following conditions | ||||||
|  | .\" are met: | ||||||
|  | .\" 1. Redistributions of source code must retain the above copyright | ||||||
|  | .\"    notice, this list of conditions and the following disclaimer. | ||||||
|  | .\" 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | .\"    notice, this list of conditions and the following disclaimer in the | ||||||
|  | .\"    documentation and/or other materials provided with the distribution. | ||||||
|  | .\" | ||||||
|  | .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||||
|  | .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  | .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  | .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||||
|  | .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  | .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||||
|  | .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||||
|  | .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||||
|  | .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||||
|  | .\" SUCH DAMAGE. | ||||||
|  | .\" | ||||||
|  | .Dd April 24, 2008 | ||||||
|  | .Dt RC-sstat 8 SMM | ||||||
|  | .Os OpenRC | ||||||
|  | .Sh NAME | ||||||
|  | .Nm rc-sstat | ||||||
|  | .Nd show status info about services supervised by s6 then rc-status | ||||||
|  | info | ||||||
|  | .Sh SYNOPSIS | ||||||
|  | .Nm | ||||||
|  | .Sh DESCRIPTION | ||||||
|  | .Nm | ||||||
|  | gathers and displays information about the status of services supervised | ||||||
|  | by s6 then runs rc-status to show info about nnormal OpenRC services. | ||||||
|  | .Pp | ||||||
|  | .Sh EXIT STATUS | ||||||
|  | .Nm | ||||||
|  | exits 1 if there is an internal error or exits with the same exit codes | ||||||
|  | as rc-status. | ||||||
|  | .Sh SEE ALSO | ||||||
|  | .Xr rc-status 8 , | ||||||
|  | .Xr rc-update 8 | ||||||
|  | .Sh AUTHORS | ||||||
|  | .An William Hubbs <w.d.hubbs@gmail.com> | ||||||
							
								
								
									
										48
									
								
								s6-guide.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								s6-guide.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | # Using S6 with OpenRC | ||||||
|  |  | ||||||
|  | Beginning with OpenRC-0.16, we support using the s6 supervision suite | ||||||
|  | from Skarmet Software in place of start-stop-daemon for monitoring | ||||||
|  | daemons [1]. | ||||||
|  |  | ||||||
|  | ## Setup | ||||||
|  |  | ||||||
|  | Documenting s6 in detail is beyond the scope of this guide. It will | ||||||
|  | document how to set up OpenRC services to communicate with s6. | ||||||
|  |  | ||||||
|  | ### Use Default start, stop and status functions | ||||||
|  |  | ||||||
|  | If you write your own start, stop and status functions in your service | ||||||
|  | script, none of this will work. You must allow OpenRC to use the default | ||||||
|  | functions. | ||||||
|  |  | ||||||
|  | ### Dependencies | ||||||
|  |  | ||||||
|  | All OpenRC service scripts that want their daemons monitored by s6 | ||||||
|  | should have the following line added to their dependencies to make sure | ||||||
|  | the s6 scan directory is being monitored. | ||||||
|  |  | ||||||
|  | need s6-svscan | ||||||
|  |  | ||||||
|  | ### Variable Settings | ||||||
|  |  | ||||||
|  | The most important setting is the supervisor variable. At the top of | ||||||
|  | your service script, you should set this variable as follows: | ||||||
|  |  | ||||||
|  | supervisor=s6 | ||||||
|  |  | ||||||
|  | Several other variables affect s6 services. They are documented on the | ||||||
|  | openrc-run man page, but I will list them here for convenience: | ||||||
|  |  | ||||||
|  | s6_service_path - the path to the s6 service directory. The default is | ||||||
|  | /var/svc.d/$RC_SVCNAME. | ||||||
|  |  | ||||||
|  | s6_svwait_options_start - the options to pass to s6-svwait when starting | ||||||
|  | the service. If this is not set, s6-svwait will not be called. | ||||||
|  |  | ||||||
|  | s6_service_timeout_stop - the amount of time, in milliseconds, s6-svc | ||||||
|  | should wait for a service to go down when stopping. | ||||||
|  |  | ||||||
|  | This is very early support, so feel free to file bugs if you have | ||||||
|  | issues. | ||||||
|  |  | ||||||
|  | [1] http://www.skarnet.org/software/s6 | ||||||
							
								
								
									
										1
									
								
								scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | rc-sstat | ||||||
| @@ -1,5 +1,19 @@ | |||||||
|  | MK=	../mk | ||||||
|  | include ${MK}/os.mk | ||||||
|  |  | ||||||
| DIR=	${LIBEXECDIR}/bin | DIR=	${LIBEXECDIR}/bin | ||||||
| BIN=	on_ac_power | BIN=	on_ac_power | ||||||
|  | INSTALLAFTER = _installafter | ||||||
|  |  | ||||||
|  | ifeq (${OS},Linux) | ||||||
|  | SRCS+= rc-sstat.in | ||||||
|  | BIN+=	rc-sstat | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | _installafter: | ||||||
|  | ifeq (${OS},Linux) | ||||||
|  | 	${INSTALL} -d ${DESTDIR}${SBINDIR} | ||||||
|  | 	ln -s ${DIR}/rc-sstat ${DESTDIR}/${SBINDIR}/rc-sstat | ||||||
|  | endif | ||||||
|  |  | ||||||
| MK=	../mk |  | ||||||
| include ${MK}/scripts.mk | include ${MK}/scripts.mk | ||||||
|   | |||||||
							
								
								
									
										140
									
								
								scripts/rc-sstat.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								scripts/rc-sstat.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | |||||||
|  | #!@SHELL@ | ||||||
|  |  | ||||||
|  | # Define variables | ||||||
|  | scandir="/run/openrc/s6-scan" | ||||||
|  | statfile=/dev/shm/s6-svstat.${USER} | ||||||
|  |  | ||||||
|  | color_red='\E[01;31m' | ||||||
|  | color_green='\E[32m' | ||||||
|  | color_yellow='\E[01;33m' | ||||||
|  |  | ||||||
|  | # Time Modules | ||||||
|  | uptimeModules() { | ||||||
|  | 	# Given a single integer argument representing seconds of uptime... | ||||||
|  | 	# convert uptime to a friendly human readable string: '2d 16h 58m 46s' | ||||||
|  | 	# define a variable to keep track of the longest length uptime string | ||||||
|  | 	uSec=${1:-0} | ||||||
|  |  | ||||||
|  | 	uDay=$(( $uSec / 86400 )) | ||||||
|  | 	uSec=$(( $uSec % 86400 )) | ||||||
|  | 	uHour=$(( $uSec / 3600 )) | ||||||
|  | 	uSec=$(( $uSec % 3600 )) | ||||||
|  | 	uMin=$(( $uSec / 60 )) | ||||||
|  | 	uSec=$(( $uSec % 60 )) | ||||||
|  |  | ||||||
|  | 	[ $uDay -ne 0 ] && pDay="${uDay}d " || pDay="" | ||||||
|  | 	[ $uHour -ne 0 ] && pHour="${uHour}h " || pHour="" | ||||||
|  | 	[ $uMin -ne 0 ] && pMin="${uMin}m " || pMin="" | ||||||
|  | 	[ $uSec -ne 0 ] && pSec="${uSec}s " || pSec="" | ||||||
|  |  | ||||||
|  | 	parsedUptime="$( echo ${pDay}${pHour}${pMin}${pSec} | sed 's#[ \t]*$##' )" | ||||||
|  | 	uCharCount=${#parsedUptime} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # Make sure we are running as root | ||||||
|  | if [ $(id -u) != 0 ]; then | ||||||
|  | 	printf "This command must be run as root\n" | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # Make sure scandir exists | ||||||
|  | if [ ! -d $scandir ]; then | ||||||
|  | 	printf "%s\n" "$scandir does not exist" | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # Make sure s6-svscan is running  | ||||||
|  | if ! pgrep s6-svscan >/dev/null ; then  | ||||||
|  | 	printf "s6-svscan is not running\n" | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # If TERM is undefined (launching sstat through an ssh command) then make it vt100 | ||||||
|  | if [ -z $TERM -o $TERM = "dumb" ]; then | ||||||
|  | 	export TERM=vt100 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # Gather list of candidate services s6-supervise may be supervising | ||||||
|  | # filter for folders and symlinks at /run/openrc/s6-scan/* ommiting output starting with '.' | ||||||
|  | services="$(find $scandir -maxdepth 1 -mindepth 1 \( -type d -or -type l \) | awk -F'/' '{ if ( $NF !~ "^\\." ) print $NF}')" | ||||||
|  | if [ -z "$services" ]; then | ||||||
|  | 	printf "s6 found no services configured for supervision\n" | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # Gather status for each service from s6-svstat | ||||||
|  | # write to tmp file in memory for non I/O bound repeatative access | ||||||
|  | rm -f $statfile 2>/dev/null | ||||||
|  | for service in $services ; do | ||||||
|  | 	echo "$service $(s6-svstat ${scandir}/${service})" >> $statfile | ||||||
|  | done | ||||||
|  |  | ||||||
|  | # Define longest string from parsed uptime (default to 7 to match string length of 'Up Time') | ||||||
|  | timeStringLength=7 | ||||||
|  | for uptime in $(awk '$2 == "up" {print $5}' $statfile | sort -run) | ||||||
|  | do | ||||||
|  | 	uptimeModules $uptime | ||||||
|  | 	[ ${uCharCount} -gt $timeStringLength ] && timeStringLength=$uCharCount | ||||||
|  | done | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #   Print the status header like so... | ||||||
|  | #                Service Name  State    PID         Up Time           Start Time | ||||||
|  | #----------------------------  -----  -----  --------------  ------------------- | ||||||
|  | printf "\n" | ||||||
|  | printf "%28s  %5s  %5s  %${timeStringLength}s  %19s\n" "Service Name" "State" "PID" "Up Time" "Start Time" | ||||||
|  | for dashes in 28 5 5 $timeStringLength 19 ; do | ||||||
|  | 	printf "%0.s-" $(seq 1 $dashes) ; echo -n '  ' | ||||||
|  | done && printf "\n" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #   sshd up (pid 26300) 80373 seconds | ||||||
|  | cat $statfile | \ | ||||||
|  | while read line | ||||||
|  | do | ||||||
|  | 	set $line | ||||||
|  |  | ||||||
|  | 	service=$1 | ||||||
|  | 	state=$2 | ||||||
|  | 	pid=${4/)/} | ||||||
|  | 	time=$5 | ||||||
|  |  | ||||||
|  | 	# call function to convert time in seconds and define additional variables | ||||||
|  | 	uptimeModules $time | ||||||
|  |  | ||||||
|  | 	if [ "$state" = up ]; then | ||||||
|  | 		if [ $time -lt 30 ]; then | ||||||
|  | 			# uptime < 30 seconds, color the whole line yellow | ||||||
|  | 			echo -en "$color_yellow" | ||||||
|  | 			# 1st 4 columns are printed with printf for space padding | ||||||
|  | 			printf "%28s  %5s  %5s  %${timeStringLength}s" $service $state $pid "$parsedUptime" | ||||||
|  | 			# 4th column is output from date -d | ||||||
|  | 			echo -e "  $(date -d "${time} seconds ago" "+%F %T")" | ||||||
|  | 			# reset terminal colors | ||||||
|  | 			tput sgr0 | ||||||
|  | 		else | ||||||
|  | 			printf "%28s" $service | ||||||
|  | 			# uptime > 30 seconds, color just the "state" value green | ||||||
|  | 			echo -en "$color_green" | ||||||
|  | 			printf "  %5s" $state | ||||||
|  | 			# reset terminal colors | ||||||
|  | 			tput sgr0 | ||||||
|  | 			printf "  %5s" $pid | ||||||
|  | 			printf "  %${timeStringLength}s"  "$parsedUptime" | ||||||
|  | 			echo -e "  $(date -d "${time} seconds ago" "+%F %T")" | ||||||
|  | 		fi | ||||||
|  | 	else | ||||||
|  | 		printf "%28s" $service | ||||||
|  | 		echo -en "$color_red" | ||||||
|  | 		printf "  %5s" $state | ||||||
|  | 		tput sgr0 | ||||||
|  | 		echo "" | ||||||
|  | 	fi | ||||||
|  | done | ||||||
|  |  | ||||||
|  | # Cleanup  | ||||||
|  | rm -f $statfile 2>/dev/null | ||||||
|  |  | ||||||
|  | printf "\n\n" | ||||||
|  |  | ||||||
|  | rc-status | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| DIR=	${LIBEXECDIR}/sh | DIR=	${LIBEXECDIR}/sh | ||||||
| SRCS=	init.sh.in functions.sh.in gendepends.sh.in \ | SRCS=	init.sh.in functions.sh.in gendepends.sh.in \ | ||||||
| 	openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}} | 	openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}} | ||||||
| INC=	rc-mount.sh functions.sh rc-functions.sh | INC=	rc-mount.sh functions.sh rc-functions.sh s6.sh start-stop-daemon.sh | ||||||
| BIN=	gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}} | BIN=	gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}} | ||||||
|  |  | ||||||
| INSTALLAFTER=	_installafter | INSTALLAFTER=	_installafter | ||||||
|   | |||||||
| @@ -126,69 +126,42 @@ _status() | |||||||
| } | } | ||||||
|  |  | ||||||
| # Template start / stop / status functions | # Template start / stop / status functions | ||||||
|  | # These functions select the appropriate function to call from the | ||||||
|  | # supervisor modules | ||||||
| start() | start() | ||||||
| { | { | ||||||
| 	[ -n "$command" ] || return 0 | 	local func=ssd_start | ||||||
| 	local _background= | 	case "$supervisor" in | ||||||
| 	ebegin "Starting ${name:-$RC_SVCNAME}" | 		s6) func=s6_start ;; | ||||||
| 	if yesno "${command_background}"; then | 		?*) | ||||||
| 		if [ -z "${pidfile}" ]; then | 			ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" | ||||||
| 			eend 1 "command_background option used but no pidfile specified" | 			;; | ||||||
| 			return 1 | 	esac | ||||||
| 		fi | 	$func | ||||||
| 		_background="--background --make-pidfile" |  | ||||||
| 	fi |  | ||||||
| 	if yesno "$start_inactive"; then |  | ||||||
| 		local _inactive=false |  | ||||||
| 		service_inactive && _inactive=true |  | ||||||
| 		mark_service_inactive |  | ||||||
| 	fi |  | ||||||
| 	eval start-stop-daemon --start \ |  | ||||||
| 		--exec $command \ |  | ||||||
| 		${chroot:+--chroot} $chroot \ |  | ||||||
| 		${procname:+--name} $procname \ |  | ||||||
| 		${pidfile:+--pidfile} $pidfile \ |  | ||||||
| 		$_background $start_stop_daemon_args \ |  | ||||||
| 		-- $command_args |  | ||||||
| 	if eend $? "Failed to start $RC_SVCNAME"; then |  | ||||||
| 		service_set_value "command" "${command}" |  | ||||||
| 		[ -n "${chroot}" ] && service_set_value "chroot" "${chroot}" |  | ||||||
| 		[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}" |  | ||||||
| 		[ -n "${procname}" ] && service_set_value "procname" "${procname}" |  | ||||||
| 		return 0 |  | ||||||
| 	fi |  | ||||||
| 	if yesno "$start_inactive"; then |  | ||||||
| 		if ! $_inactive; then |  | ||||||
| 			mark_service_stopped |  | ||||||
| 		fi |  | ||||||
| 	fi |  | ||||||
| 	return 1 |  | ||||||
| } | } | ||||||
|  |  | ||||||
| stop() | stop() | ||||||
| { | { | ||||||
| 	local startcommand="$(service_get_value "command")" | 	local func=ssd_stop | ||||||
| 	local startchroot="$(service_get_value "chroot")" | 	case "$supervisor" in | ||||||
| 	local startpidfile="$(service_get_value "pidfile")" | 		s6) func=s6_stop ;; | ||||||
| 	local startprocname="$(service_get_value "procname")" | 		?*) | ||||||
| 	command="${startcommand:-$command}" | 			ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" | ||||||
| 	chroot="${startchroot:-$chroot}" | 			;; | ||||||
| 	pidfile="${startpidfile:-$pidfile}" | 	esac | ||||||
| 	procname="${startprocname:-$procname}" | 	$func | ||||||
| 	[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0 |  | ||||||
| 	ebegin "Stopping ${name:-$RC_SVCNAME}" |  | ||||||
| 	start-stop-daemon --stop \ |  | ||||||
| 		${retry:+--retry} $retry \ |  | ||||||
| 		${command:+--exec} $command \ |  | ||||||
| 		${procname:+--name} $procname \ |  | ||||||
| 		${pidfile:+--pidfile} $chroot$pidfile \ |  | ||||||
| 		${stopsig:+--signal} $stopsig |  | ||||||
| 	eend $? "Failed to stop $RC_SVCNAME" |  | ||||||
| } | } | ||||||
|  |  | ||||||
| status() | status() | ||||||
| { | { | ||||||
| 	_status | 	local func=ssd_status | ||||||
|  | 	case "$supervisor" in | ||||||
|  | 		s6) func=s6_status ;; | ||||||
|  | 		?*) | ||||||
|  | 			ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon" | ||||||
|  | 			;; | ||||||
|  | 	esac | ||||||
|  | 	$func | ||||||
| } | } | ||||||
|  |  | ||||||
| yesno $RC_DEBUG && set -x | yesno $RC_DEBUG && set -x | ||||||
| @@ -212,6 +185,10 @@ unset _conf_d | |||||||
| # Load any system overrides | # Load any system overrides | ||||||
| sourcex -e "@SYSCONFDIR@/rc.conf" | sourcex -e "@SYSCONFDIR@/rc.conf" | ||||||
|  |  | ||||||
|  | # load service supervisor functions | ||||||
|  | sourcex "@LIBEXECDIR@/sh/s6.sh" | ||||||
|  | sourcex "@LIBEXECDIR@/sh/start-stop-daemon.sh" | ||||||
|  |  | ||||||
| # Set verbose mode | # Set verbose mode | ||||||
| if yesno "${rc_verbose:-$RC_VERBOSE}"; then | if yesno "${rc_verbose:-$RC_VERBOSE}"; then | ||||||
| 	EINFO_VERBOSE=yes | 	EINFO_VERBOSE=yes | ||||||
| @@ -244,20 +221,22 @@ done | |||||||
| # Load our script | # Load our script | ||||||
| sourcex "$RC_SERVICE" | sourcex "$RC_SERVICE" | ||||||
|  |  | ||||||
| for _d in $required_dirs; do | eval "printf '%s\n' $required_dirs" | while read _d; do | ||||||
| 	if [ ! -d $_d ]; then | 	if [ -n "$_d" ] && [ ! -d "$_d" ]; then | ||||||
| 		eerror "$RC_SVCNAME: \`$_d' is not a directory" | 		eerror "$RC_SVCNAME: \`$_d' is not a directory" | ||||||
| 		exit 1 | 		exit 1 | ||||||
| 	fi | 	fi | ||||||
| done | done | ||||||
|  | [ $? -ne 0 ] && exit 1 | ||||||
| unset _d | unset _d | ||||||
|  |  | ||||||
| for _f in $required_files; do | eval "printf '%s\n' $required_files" | while read _f; do | ||||||
| 	if [ ! -r $_f ]; then | 	if [ -n "$_f" ] && [ ! -r "$_f" ]; then | ||||||
| 		eerror "$RC_SVCNAME: \`$_f' is not readable" | 		eerror "$RC_SVCNAME: \`$_f' is not readable" | ||||||
| 		exit 1 | 		exit 1 | ||||||
| 	fi | 	fi | ||||||
| done | done | ||||||
|  | [ $? -ne 0 ] && exit 1 | ||||||
| unset _f | unset _f | ||||||
|  |  | ||||||
| if [ -n "$opts" ]; then | if [ -n "$opts" ]; then | ||||||
|   | |||||||
| @@ -54,7 +54,9 @@ cgroup_set_values() | |||||||
| 				val= | 				val= | ||||||
| 				;; | 				;; | ||||||
| 			*) | 			*) | ||||||
| 				val="$val $1" | 				[ -n "$val" ] && | ||||||
|  | 					val="$val $1" || | ||||||
|  | 					val="$1" | ||||||
| 				;; | 				;; | ||||||
| 		esac | 		esac | ||||||
| 		shift | 		shift | ||||||
| @@ -107,12 +109,21 @@ cgroup_set_limits() | |||||||
| 	local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" | 	local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" | ||||||
| 	[ -n "$devices" ] && cgroup_set_values devices "$devices" | 	[ -n "$devices" ] && cgroup_set_values devices "$devices" | ||||||
|  |  | ||||||
|  | 	local hugetlb="${rc_cgroup_hugetlb:-$RC_CGROUP_HUGETLB}" | ||||||
|  | 	[ -n "$hugetlb" ] && cgroup_set_values hugetlb "$hugetlb" | ||||||
|  |  | ||||||
| 	local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" | 	local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" | ||||||
| 	[ -n "$memory" ] && cgroup_set_values memory "$memory" | 	[ -n "$memory" ] && cgroup_set_values memory "$memory" | ||||||
|  |  | ||||||
|  | 	local net_cls="${rc_cgroup_net_cls:-$RC_CGROUP_NET_CLS}" | ||||||
|  | 	[ -n "$net_cls" ] && cgroup_set_values net_cls "$net_cls" | ||||||
|  |  | ||||||
| 	local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" | 	local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" | ||||||
| 	[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" | 	[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" | ||||||
|  |  | ||||||
|  | 	local pids="${rc_cgroup_pids:-$RC_CGROUP_PIDS}" | ||||||
|  | 	[ -n "$pids" ] && cgroup_set_values pids "$pids" | ||||||
|  |  | ||||||
| 	return 0 | 	return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										50
									
								
								sh/s6.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								sh/s6.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | # Start / stop / status functions for s6 support | ||||||
|  | # Copyright (c) 2015 William Hubbs <w.d.hubbs@gmail.com> | ||||||
|  | # Released under the 2-clause BSD license. | ||||||
|  |  | ||||||
|  | [ -z "${s6_service_path}" ] && s6_service_path="/var/svc.d/${RC_SVCNAME}" | ||||||
|  |  | ||||||
|  | s6_start() | ||||||
|  | { | ||||||
|  | 	if [ ! -d "${s6_service_path}" ]; then | ||||||
|  | 		eerror "${s6_service_path} does not exist." | ||||||
|  |  	return 1 | ||||||
|  |  fi | ||||||
|  | 	s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" | ||||||
|  | 	ebegin "Starting ${name:-$RC_SVCNAME}" | ||||||
|  | 	ln -sf "${s6_service_path}" "${s6_service_link}" | ||||||
|  | 	s6-svscanctl -na "${RC_SVCDIR}"/s6-scan | ||||||
|  | 	sleep 1.5 | ||||||
|  | 	s6-svc -u "${s6_service_link}" | ||||||
|  | 	if [ -n "$s6_svwait_options_start" ]; then | ||||||
|  | 		s6-svwait ${s6_svwait_options_start} "${s6_service_link}" | ||||||
|  | 	fi | ||||||
|  | 	sleep 1.5 | ||||||
|  | 	set -- $(s6-svstat "${s6_service_link}") | ||||||
|  | 	[ "$1" = "up" ] | ||||||
|  | 	eend $? "Failed to start $RC_SVCNAME" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | s6_stop() | ||||||
|  | { | ||||||
|  | 	if [ ! -d "${s6_service_path}" ]; then | ||||||
|  | 		eerror "${s6_service_path} does not exist." | ||||||
|  |  	return 1 | ||||||
|  |  fi | ||||||
|  | 	s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" | ||||||
|  | 	ebegin "Stopping ${name:-$RC_SVCNAME}" | ||||||
|  | 	s6-svc -Dd -T ${s6_service_timeout_stop:-10000} "${s6_service_link}" | ||||||
|  | 	set -- $(s6-svstat "${s6_service_link}") | ||||||
|  | 	[ "$1" = "down" ] | ||||||
|  | 	eend $? "Failed to stop $RC_SVCNAME" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | s6_status() | ||||||
|  | { | ||||||
|  | 	s6_service_link="${RC_SVCDIR}/s6-scan/${s6_service_path##*/}" | ||||||
|  | 	if [ -L "${s6_service_link}" ]; then | ||||||
|  | 		s6-svstat "${s6_service_link}" | ||||||
|  | 	else | ||||||
|  | 		_status | ||||||
|  | 	fi | ||||||
|  | } | ||||||
							
								
								
									
										77
									
								
								sh/start-stop-daemon.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								sh/start-stop-daemon.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | # start / stop / status functions for start-stop-daemon | ||||||
|  | # Copyright (c) 2007-2009 Roy Marples <roy@marples.name> | ||||||
|  | # Released under the 2-clause BSD license. | ||||||
|  |  | ||||||
|  | ssd_start() | ||||||
|  | { | ||||||
|  | 	if [ -z "$command" ]; then | ||||||
|  | 		ewarn "The command variable is undefined." | ||||||
|  | 		ewarn "There is nothing for ${name:-$RC_SVCNAME} to start." | ||||||
|  | 		ewarn "If this is what you intend, please write a start function." | ||||||
|  | 		ewarn "This will become a failure in a future release." | ||||||
|  | 		return 0 | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	local _background= | ||||||
|  | 	ebegin "Starting ${name:-$RC_SVCNAME}" | ||||||
|  | 	if yesno "${command_background}"; then | ||||||
|  | 		if [ -z "${pidfile}" ]; then | ||||||
|  | 			eend 1 "command_background option used but no pidfile specified" | ||||||
|  | 			return 1 | ||||||
|  | 		fi | ||||||
|  | 		if [ -n "${command_args_background}" ]; then | ||||||
|  | 			eend 1 "command_background used with command_args_background" | ||||||
|  | 			return 1 | ||||||
|  | 		fi | ||||||
|  | 		_background="--background --make-pidfile" | ||||||
|  | 	fi | ||||||
|  | 	if yesno "$start_inactive"; then | ||||||
|  | 		local _inactive=false | ||||||
|  | 		service_inactive && _inactive=true | ||||||
|  | 		mark_service_inactive | ||||||
|  | 	fi | ||||||
|  | 	eval start-stop-daemon --start \ | ||||||
|  | 		--exec $command \ | ||||||
|  | 		${procname:+--name} $procname \ | ||||||
|  | 		${pidfile:+--pidfile} $pidfile \ | ||||||
|  | 		${command_user+--user} $command_user \ | ||||||
|  | 		$_background $start_stop_daemon_args \ | ||||||
|  | 		-- $command_args $command_args_background | ||||||
|  | 	if eend $? "Failed to start $RC_SVCNAME"; then | ||||||
|  | 		service_set_value "command" "${command}" | ||||||
|  | 		[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}" | ||||||
|  | 		[ -n "${procname}" ] && service_set_value "procname" "${procname}" | ||||||
|  | 		return 0 | ||||||
|  | 	fi | ||||||
|  | 	if yesno "$start_inactive"; then | ||||||
|  | 		if ! $_inactive; then | ||||||
|  | 			mark_service_stopped | ||||||
|  | 		fi | ||||||
|  | 	fi | ||||||
|  | 	return 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ssd_stop() | ||||||
|  | { | ||||||
|  | 	local startcommand="$(service_get_value "command")" | ||||||
|  | 	local startpidfile="$(service_get_value "pidfile")" | ||||||
|  | 	local startprocname="$(service_get_value "procname")" | ||||||
|  | 	command="${startcommand:-$command}" | ||||||
|  | 	pidfile="${startpidfile:-$pidfile}" | ||||||
|  | 	procname="${startprocname:-$procname}" | ||||||
|  | 	[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0 | ||||||
|  | 	ebegin "Stopping ${name:-$RC_SVCNAME}" | ||||||
|  | 	start-stop-daemon --stop \ | ||||||
|  | 		${retry:+--retry} $retry \ | ||||||
|  | 		${command:+--exec} $command \ | ||||||
|  | 		${procname:+--name} $procname \ | ||||||
|  | 		${pidfile:+--pidfile} $pidfile \ | ||||||
|  | 		${stopsig:+--signal} $stopsig | ||||||
|  |  | ||||||
|  | 	eend $? "Failed to stop $RC_SVCNAME" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ssd_status() | ||||||
|  | { | ||||||
|  | 	_status | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								sh/tmpfiles.sh.in
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										23
									
								
								sh/tmpfiles.sh.in
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -53,10 +53,18 @@ relabel() { | |||||||
| 	done | 	done | ||||||
| } | } | ||||||
|  |  | ||||||
|  | splitpath() { | ||||||
|  |     local path=$1 | ||||||
|  |     while [ -n "$path" ]; do | ||||||
|  |         echo $path | ||||||
|  |         path=${path%/*} | ||||||
|  |     done | ||||||
|  | } | ||||||
|  |  | ||||||
| _restorecon() { | _restorecon() { | ||||||
|     local path=$1 |     local path=$1 | ||||||
|     if [ -x /sbin/restorecon ]; then |     if [ -x /sbin/restorecon ]; then | ||||||
|         dryrun_or_real restorecon -F "$path" |         dryrun_or_real restorecon -F $(splitpath "$path") | ||||||
|     fi |     fi | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -122,6 +130,7 @@ _d() { | |||||||
|  |  | ||||||
| 	if [ ! -d "$path" ]; then | 	if [ ! -d "$path" ]; then | ||||||
| 		dryrun_or_real mkdir -p "$path" 2>/dev/null | 		dryrun_or_real mkdir -p "$path" 2>/dev/null | ||||||
|  | 		_restorecon "$path" | ||||||
| 		dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path" | 		dryrun_or_real $CHECKPATH -dq -m "$mode" -o "$uid:$gid" "$path" | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
| @@ -137,10 +146,18 @@ _D() { | |||||||
|  |  | ||||||
| 	if [ $CREATE -gt 0 ]; then | 	if [ $CREATE -gt 0 ]; then | ||||||
| 		dryrun_or_real mkdir -p "$path" 2>/dev/null | 		dryrun_or_real mkdir -p "$path" 2>/dev/null | ||||||
|  | 		_restorecon "$path" | ||||||
| 		dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path" | 		dryrun_or_real $CHECKPATH -Dq -m "$mode" -o "$uid:$gid" "$path" | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | _v() { | ||||||
|  | 	# Create a subvolume if the path does not exist yet and the file system | ||||||
|  | 	# supports this (btrfs). Otherwise create a normal directory. | ||||||
|  | 	# TODO: Implement btrfs subvol creation. | ||||||
|  | 	_d "$@" | ||||||
|  | } | ||||||
|  |  | ||||||
| _L() { | _L() { | ||||||
| 	# Create a symlink if it doesn't exist yet | 	# Create a symlink if it doesn't exist yet | ||||||
| 	local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 | 	local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6 | ||||||
| @@ -336,7 +353,7 @@ for FILE in $tmpfiles_d ; do | |||||||
|  |  | ||||||
| 		# whine about invalid entries | 		# whine about invalid entries | ||||||
| 		case $cmd in | 		case $cmd in | ||||||
| 			f|F|w|d|D|p|L|c|C|b|x|X|r|R|z|Z) ;; | 			f|F|w|d|D|v|p|L|c|C|b|x|X|r|R|z|Z) ;; | ||||||
| 			*) warninvalid ; continue ;; | 			*) warninvalid ; continue ;; | ||||||
| 		esac | 		esac | ||||||
|  |  | ||||||
| @@ -344,7 +361,7 @@ for FILE in $tmpfiles_d ; do | |||||||
| 		if [ "$mode" = '-' -o "$mode" = '' ]; then | 		if [ "$mode" = '-' -o "$mode" = '' ]; then | ||||||
| 			case "$cmd" in | 			case "$cmd" in | ||||||
| 				p|f|F) mode=0644 ;; | 				p|f|F) mode=0644 ;; | ||||||
| 				d|D) mode=0755 ;; | 				d|D|v) mode=0755 ;; | ||||||
| 				C|z|Z|x|r|R|L) ;; | 				C|z|Z|x|r|R|L) ;; | ||||||
| 			esac | 			esac | ||||||
| 		fi | 		fi | ||||||
|   | |||||||
| @@ -101,7 +101,9 @@ ls_dir(const char *dir, int options) | |||||||
| 					continue; | 					continue; | ||||||
| 			} | 			} | ||||||
| 			if (options & LS_DIR) { | 			if (options & LS_DIR) { | ||||||
| 				if (stat(d->d_name, &buf) == 0 && | 				snprintf(file, sizeof(file), "%s/%s", | ||||||
|  | 				    dir, d->d_name); | ||||||
|  | 				if (stat(file, &buf) != 0 || | ||||||
| 				    !S_ISDIR(buf.st_mode)) | 				    !S_ISDIR(buf.st_mode)) | ||||||
| 					continue; | 					continue; | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -298,7 +298,7 @@ find_mounts(struct args *args) | |||||||
| 	int netdev; | 	int netdev; | ||||||
| 	RC_STRINGLIST *list; | 	RC_STRINGLIST *list; | ||||||
|  |  | ||||||
| 	if ((fp = fopen("/proc/mounts", "r")) == NULL) | 	if ((fp = fopen("/proc/self/mounts", "r")) == NULL) | ||||||
| 		eerrorx("getmntinfo: %s", strerror(errno)); | 		eerrorx("getmntinfo: %s", strerror(errno)); | ||||||
|  |  | ||||||
| 	list = rc_stringlist_new(); | 	list = rc_stringlist_new(); | ||||||
| @@ -315,6 +315,8 @@ find_mounts(struct args *args) | |||||||
| 		if ((ent = getmntfile(to))) { | 		if ((ent = getmntfile(to))) { | ||||||
| 			if (strstr(ent->mnt_opts, "_netdev")) | 			if (strstr(ent->mnt_opts, "_netdev")) | ||||||
| 				netdev = 0; | 				netdev = 0; | ||||||
|  | 			else | ||||||
|  | 				netdev = 1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		process_mount(list, args, from, to, fst, opts, netdev); | 		process_mount(list, args, from, to, fst, opts, netdev); | ||||||
| @@ -347,7 +349,7 @@ get_regex(const char *string) | |||||||
|  |  | ||||||
| #include "_usage.h" | #include "_usage.h" | ||||||
| #define extraopts "[mount1] [mount2] ..." | #define extraopts "[mount1] [mount2] ..." | ||||||
| #define getoptstring "f:F:n:N:o:O:p:P:ist" getoptstring_COMMON | #define getoptstring "f:F:n:N:o:O:p:P:iste:E:" getoptstring_COMMON | ||||||
| static const struct option longopts[] = { | static const struct option longopts[] = { | ||||||
| 	{ "fstype-regex",        1, NULL, 'f'}, | 	{ "fstype-regex",        1, NULL, 'f'}, | ||||||
| 	{ "skip-fstype-regex",   1, NULL, 'F'}, | 	{ "skip-fstype-regex",   1, NULL, 'F'}, | ||||||
|   | |||||||
| @@ -85,8 +85,12 @@ static bool sighup, in_background, deps, dry_run; | |||||||
| static pid_t service_pid; | static pid_t service_pid; | ||||||
| static int signal_pipe[2] = { -1, -1 }; | static int signal_pipe[2] = { -1, -1 }; | ||||||
|  |  | ||||||
| static RC_STRINGLIST *types_b, *types_n, *types_nu, *types_nua, *types_m; | static RC_STRINGLIST *deptypes_b; | ||||||
| static RC_STRINGLIST *types_mua = NULL; | static RC_STRINGLIST *deptypes_n; | ||||||
|  | static RC_STRINGLIST *deptypes_nu; | ||||||
|  | static RC_STRINGLIST *deptypes_nua; | ||||||
|  | static RC_STRINGLIST *deptypes_m; | ||||||
|  | static RC_STRINGLIST *deptypes_mua; | ||||||
|  |  | ||||||
| static void | static void | ||||||
| handle_signal(int sig) | handle_signal(int sig) | ||||||
| @@ -231,12 +235,12 @@ cleanup(void) | |||||||
| 	rc_plugin_unload(); | 	rc_plugin_unload(); | ||||||
|  |  | ||||||
| #ifdef DEBUG_MEMORY | #ifdef DEBUG_MEMORY | ||||||
| 	rc_stringlist_free(types_b); | 	rc_stringlist_free(deptypes_b); | ||||||
| 	rc_stringlist_free(types_n); | 	rc_stringlist_free(deptypes_n); | ||||||
| 	rc_stringlist_free(types_nu); | 	rc_stringlist_free(deptypes_nu); | ||||||
| 	rc_stringlist_free(types_nua); | 	rc_stringlist_free(deptypes_nua); | ||||||
| 	rc_stringlist_free(types_m); | 	rc_stringlist_free(deptypes_m); | ||||||
| 	rc_stringlist_free(types_mua); | 	rc_stringlist_free(deptypes_mua); | ||||||
| 	rc_deptree_free(deptree); | 	rc_deptree_free(deptree); | ||||||
| 	rc_stringlist_free(restart_services); | 	rc_stringlist_free(restart_services); | ||||||
| 	rc_stringlist_free(need_services); | 	rc_stringlist_free(need_services); | ||||||
| @@ -518,30 +522,30 @@ get_started_services(void) | |||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| setup_types(void) | setup_deptypes(void) | ||||||
| { | { | ||||||
| 	types_b = rc_stringlist_new(); | 	deptypes_b = rc_stringlist_new(); | ||||||
| 	rc_stringlist_add(types_b, "broken"); | 	rc_stringlist_add(deptypes_b, "broken"); | ||||||
|  |  | ||||||
| 	types_n = rc_stringlist_new(); | 	deptypes_n = rc_stringlist_new(); | ||||||
| 	rc_stringlist_add(types_n, "ineed"); | 	rc_stringlist_add(deptypes_n, "ineed"); | ||||||
|  |  | ||||||
| 	types_nu = rc_stringlist_new(); | 	deptypes_nu = rc_stringlist_new(); | ||||||
| 	rc_stringlist_add(types_nu, "ineed"); | 	rc_stringlist_add(deptypes_nu, "ineed"); | ||||||
| 	rc_stringlist_add(types_nu, "iuse"); | 	rc_stringlist_add(deptypes_nu, "iuse"); | ||||||
|  |  | ||||||
| 	types_nua = rc_stringlist_new(); | 	deptypes_nua = rc_stringlist_new(); | ||||||
| 	rc_stringlist_add(types_nua, "ineed"); | 	rc_stringlist_add(deptypes_nua, "ineed"); | ||||||
| 	rc_stringlist_add(types_nua, "iuse"); | 	rc_stringlist_add(deptypes_nua, "iuse"); | ||||||
| 	rc_stringlist_add(types_nua, "iafter"); | 	rc_stringlist_add(deptypes_nua, "iafter"); | ||||||
|  |  | ||||||
| 	types_m = rc_stringlist_new(); | 	deptypes_m = rc_stringlist_new(); | ||||||
| 	rc_stringlist_add(types_m, "needsme"); | 	rc_stringlist_add(deptypes_m, "needsme"); | ||||||
|  |  | ||||||
| 	types_mua = rc_stringlist_new(); | 	deptypes_mua = rc_stringlist_new(); | ||||||
| 	rc_stringlist_add(types_mua, "needsme"); | 	rc_stringlist_add(deptypes_mua, "needsme"); | ||||||
| 	rc_stringlist_add(types_mua, "usesme"); | 	rc_stringlist_add(deptypes_mua, "usesme"); | ||||||
| 	rc_stringlist_add(types_mua, "beforeme"); | 	rc_stringlist_add(deptypes_mua, "beforeme"); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| @@ -604,10 +608,10 @@ svc_start_deps(void) | |||||||
|  |  | ||||||
| 	if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) | 	if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) | ||||||
| 		eerrorx("failed to load deptree"); | 		eerrorx("failed to load deptree"); | ||||||
| 	if (!types_b) | 	if (!deptypes_b) | ||||||
| 		setup_types(); | 		setup_deptypes(); | ||||||
|  |  | ||||||
| 	services = rc_deptree_depends(deptree, types_b, applet_list, | 	services = rc_deptree_depends(deptree, deptypes_b, applet_list, | ||||||
| 	    runlevel, 0); | 	    runlevel, 0); | ||||||
| 	if (TAILQ_FIRST(services)) { | 	if (TAILQ_FIRST(services)) { | ||||||
| 		eerrorn("ERROR: %s needs service(s) ", applet); | 		eerrorn("ERROR: %s needs service(s) ", applet); | ||||||
| @@ -625,9 +629,9 @@ svc_start_deps(void) | |||||||
| 	rc_stringlist_free(services); | 	rc_stringlist_free(services); | ||||||
| 	services = NULL; | 	services = NULL; | ||||||
|  |  | ||||||
| 	need_services = rc_deptree_depends(deptree, types_n, | 	need_services = rc_deptree_depends(deptree, deptypes_n, | ||||||
| 	    applet_list, runlevel, depoptions); | 	    applet_list, runlevel, depoptions); | ||||||
| 	use_services = rc_deptree_depends(deptree, types_nu, | 	use_services = rc_deptree_depends(deptree, deptypes_nu, | ||||||
| 	    applet_list, runlevel, depoptions); | 	    applet_list, runlevel, depoptions); | ||||||
|  |  | ||||||
| 	if (!rc_runlevel_starting()) { | 	if (!rc_runlevel_starting()) { | ||||||
| @@ -655,7 +659,7 @@ svc_start_deps(void) | |||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	/* Now wait for them to start */ | 	/* Now wait for them to start */ | ||||||
| 	services = rc_deptree_depends(deptree, types_nua, applet_list, | 	services = rc_deptree_depends(deptree, deptypes_nua, applet_list, | ||||||
| 	    runlevel, depoptions); | 	    runlevel, depoptions); | ||||||
| 	/* We use tmplist to hold our scheduled by list */ | 	/* We use tmplist to hold our scheduled by list */ | ||||||
| 	tmplist = rc_stringlist_new(); | 	tmplist = rc_stringlist_new(); | ||||||
| @@ -860,10 +864,10 @@ svc_stop_deps(RC_SERVICE state) | |||||||
| 	if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) | 	if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) | ||||||
| 		eerrorx("failed to load deptree"); | 		eerrorx("failed to load deptree"); | ||||||
|  |  | ||||||
| 	if (!types_m) | 	if (!deptypes_m) | ||||||
| 		setup_types(); | 		setup_deptypes(); | ||||||
|  |  | ||||||
| 	services = rc_deptree_depends(deptree, types_m, applet_list, | 	services = rc_deptree_depends(deptree, deptypes_m, applet_list, | ||||||
| 	    runlevel, depoptions); | 	    runlevel, depoptions); | ||||||
| 	tmplist = rc_stringlist_new(); | 	tmplist = rc_stringlist_new(); | ||||||
| 	TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) { | 	TAILQ_FOREACH_REVERSE(svc, services, rc_stringlist, entries) { | ||||||
| @@ -923,7 +927,7 @@ svc_stop_deps(RC_SERVICE state) | |||||||
|  |  | ||||||
| 	/* We now wait for other services that may use us and are | 	/* We now wait for other services that may use us and are | ||||||
| 	 * stopping. This is important when a runlevel stops */ | 	 * stopping. This is important when a runlevel stops */ | ||||||
| 	services = rc_deptree_depends(deptree, types_mua, applet_list, | 	services = rc_deptree_depends(deptree, deptypes_mua, applet_list, | ||||||
| 	    runlevel, depoptions); | 	    runlevel, depoptions); | ||||||
| 	TAILQ_FOREACH(svc, services, entries) { | 	TAILQ_FOREACH(svc, services, entries) { | ||||||
| 		if (rc_service_state(svc->value) & RC_SERVICE_STOPPED) | 		if (rc_service_state(svc->value) & RC_SERVICE_STOPPED) | ||||||
|   | |||||||
| @@ -66,6 +66,7 @@ static const char *const env_whitelist[] = { | |||||||
| 	"LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", | 	"LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", | ||||||
| 	"LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION", "LC_ALL", | 	"LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION", "LC_ALL", | ||||||
| 	"IN_HOTPLUG", "IN_BACKGROUND", "RC_INTERFACE_KEEP_CONFIG", | 	"IN_HOTPLUG", "IN_BACKGROUND", "RC_INTERFACE_KEEP_CONFIG", | ||||||
|  | 	"EERROR_QUIET", "EINFO_QUIET", | ||||||
| 	NULL | 	NULL | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user