Compare commits
	
		
			31 Commits
		
	
	
		
			0.20.2
			...
			openrc-0.1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					cb2c45a3c0 | ||
| 
						 | 
					d92eca3988 | ||
| 
						 | 
					5bdd08e0e7 | ||
| 
						 | 
					8a68dc899e | ||
| 
						 | 
					2d1e255285 | ||
| 
						 | 
					6f9fd30edb | ||
| 
						 | 
					e0c32c23dc | ||
| 
						 | 
					4777035d53 | ||
| 
						 | 
					f049b535b3 | ||
| 
						 | 
					4ba30c5a1b | ||
| 
						 | 
					91734d20be | ||
| 
						 | 
					b4194fef43 | ||
| 
						 | 
					5f23128f30 | ||
| 
						 | 
					a634534167 | ||
| 
						 | 
					f77006b58e | ||
| 
						 | 
					ef22f78a48 | ||
| 
						 | 
					735dc45c39 | ||
| 
						 | 
					0d3fdd3769 | ||
| 
						 | 
					5a1a94b2cc | ||
| 
						 | 
					a76e5a827c | ||
| 
						 | 
					b964de8287 | ||
| 
						 | 
					2c1051ad3f | ||
| 
						 | 
					a2187e897e | ||
| 
						 | 
					e8043fe378 | ||
| 
						 | 
					082fd53d9e | ||
| 
						 | 
					61fd8b2996 | ||
| 
						 | 
					43d727dc3f | ||
| 
						 | 
					b8e52583ca | ||
| 
						 | 
					1a7af5bbde | ||
| 
						 | 
					785b61e872 | ||
| 
						 | 
					54ed42503f | 
@@ -1,3 +1,3 @@
 | 
				
			|||||||
NAME=		openrc
 | 
					NAME=		openrc
 | 
				
			||||||
VERSION=	0.13
 | 
					VERSION=	0.13.3
 | 
				
			||||||
PKG=		${NAME}-${VERSION}
 | 
					PKG=		${NAME}-${VERSION}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								NEWS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								NEWS
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					OpenRC NEWS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file will contain a list of notable changes for each release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OpenRC-0.13.2
 | 
				
			||||||
 | 
					=============
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A chroot variable has been added to the service script variables.
 | 
				
			||||||
 | 
					This fixes the support for running a service in a chroot.
 | 
				
			||||||
 | 
					This is documented in man 8 openrc-run.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The netmount service now mounts nfs file systems.
 | 
				
			||||||
 | 
					This change was made to correct a fix for an earlier bug.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OpenRC-0.13
 | 
				
			||||||
 | 
					===========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/sbin/rc was renamed to /sbin/openrc and /sbin/runscript was renamed to
 | 
				
			||||||
 | 
					/sbin/openrc-run due to naming conflicts with other software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Backward compatible symbolic links are currently in place so your
 | 
				
			||||||
 | 
					system will keep working if you are using the old names; however, it is
 | 
				
			||||||
 | 
					strongly advised that you migrate to the new names because the symbolic
 | 
				
			||||||
 | 
					links will be removed in the future.
 | 
				
			||||||
 | 
					Warnings have been added to assist with this migration; however, due to the
 | 
				
			||||||
 | 
					level of noise they produce, they only appear in verbose mode in this release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The devfs script now handles the initial mounting and setup of the
 | 
				
			||||||
 | 
					/dev directory. If /dev has already been mounted by the kernel or an
 | 
				
			||||||
 | 
					initramfs, devfs will remount /dev with the correct mount options
 | 
				
			||||||
 | 
					instead of mounting a second /dev over the existing mount point.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It attempts to mount /dev from fstab first if an entry exists there. If
 | 
				
			||||||
 | 
					it doesn't it attempts to mount devtmpfs if it is configured in the
 | 
				
			||||||
 | 
					kernel. If not, it attempts to mount tmpfs.
 | 
				
			||||||
 | 
					If none of these is available, an error message is displayed and static
 | 
				
			||||||
 | 
					/dev is assumed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OpenRC-0.12
 | 
				
			||||||
 | 
					===========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The net.* scripts, originally from Gentoo Linux, have
 | 
				
			||||||
 | 
					been removed. If you need these scripts, look for a package called
 | 
				
			||||||
 | 
					netifrc, which is maintained by them.
 | 
				
			||||||
							
								
								
									
										28
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README
									
									
									
									
									
								
							@@ -57,34 +57,6 @@ init.d.misc is not installed by default as the scripts will need
 | 
				
			|||||||
tweaking on a per distro basis. They are also non essential to the operation
 | 
					tweaking on a per distro basis. They are also non essential to the operation
 | 
				
			||||||
of the system.
 | 
					of the system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
As of OpenRC-0.12, the net.* scripts, originally from Gentoo Linux, have
 | 
					 | 
				
			||||||
been removed. If you need these scripts, look for a package called
 | 
					 | 
				
			||||||
netifrc, which is maintained by them.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
As of OpenRC-0.13, two binaries have been renamed due to naming
 | 
					 | 
				
			||||||
conflicts with other software. The /sbin/rc binary was renamed to
 | 
					 | 
				
			||||||
/sbin/openrc, and /sbin/runscript was renamed to /sbin/openrc-run.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Backward compatible symbolic links are currently in place so your
 | 
					 | 
				
			||||||
system will keep working if you are using the old names; however, it is
 | 
					 | 
				
			||||||
strongly advised that you migrate to the new names because the symbolic
 | 
					 | 
				
			||||||
links will be removed in the future.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Warnings have been added to assist with this migration; however, they
 | 
					 | 
				
			||||||
only show in verbose mode in this release due to the level of noise they
 | 
					 | 
				
			||||||
produce.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Also, the devfs script now handles the initial mounting and setup of the
 | 
					 | 
				
			||||||
/dev directory. If /dev has already been mounted by the kernel or an
 | 
					 | 
				
			||||||
initramfs, devfs will remount /dev with the correct mount options
 | 
					 | 
				
			||||||
instead of mounting a second /dev over the existing mount point.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
It attempts to mount /dev from fstab first if an entry exists there. If
 | 
					 | 
				
			||||||
it doesn't it attempts to mount devtmpfs if it is configured in the
 | 
					 | 
				
			||||||
kernel. If not, it attempts to mount tmpfs.
 | 
					 | 
				
			||||||
If none of these is available, an error message is displayed and static
 | 
					 | 
				
			||||||
/dev is assumed.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Reporting Bugs
 | 
					Reporting Bugs
 | 
				
			||||||
--------------
 | 
					--------------
 | 
				
			||||||
Since Gentoo Linux is hosting OpenRC development, Bugs should go to
 | 
					Since Gentoo Linux is hosting OpenRC development, Bugs should go to
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								conf.d/network.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								conf.d/network.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# You can assign a default route
 | 
				
			||||||
 | 
					#defaultroute="192.168.0.1"
 | 
				
			||||||
 | 
					#defaultroute6="2001:a:b:c"
 | 
				
			||||||
							
								
								
									
										4
									
								
								conf.d/network.GNU.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								conf.d/network.GNU.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# You can assign a default route
 | 
				
			||||||
 | 
					#defaultroute="gw 192.168.0.1"
 | 
				
			||||||
 | 
					#defaultroute6="gw 2001:a:b:c"
 | 
				
			||||||
							
								
								
									
										5
									
								
								conf.d/staticroute.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								conf.d/staticroute.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					# Separate multiple routes using ; or new lines.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Example static routes. See route(8) for syntax.
 | 
				
			||||||
 | 
					#staticroute="net 192.168.0.0 10.73.1.1 netmask 255.255.255.0
 | 
				
			||||||
 | 
					#net 192.168.1.0 10.73.1.1 netmask 255.255.255.0"
 | 
				
			||||||
							
								
								
									
										7
									
								
								conf.d/staticroute.GNU.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								conf.d/staticroute.GNU.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					# Separate multiple routes using ; or new lines.
 | 
				
			||||||
 | 
					# /etc/route.conf(5) takes precedence over this configuration.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Example static routes. See route(8) for syntax.
 | 
				
			||||||
 | 
					# FIXME: "net ..." not supported
 | 
				
			||||||
 | 
					#staticroute="net 192.168.0.0 -netmask 255.255.255.0 --address 10.73.1.1
 | 
				
			||||||
 | 
					#net 192.168.1.0 -netmask 255.255.255.0 --address 10.73.1.1"
 | 
				
			||||||
							
								
								
									
										14
									
								
								etc/rc.conf.GNU
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								etc/rc.conf.GNU
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					# GNU/Hurd SPECIFIC OPTIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This is the subsystem type. Valid options on GNU/Hurd:
 | 
				
			||||||
 | 
					# ""        - nothing special
 | 
				
			||||||
 | 
					# "subhurd" - Hurd subhurds (to be checked)
 | 
				
			||||||
 | 
					# If this is commented out, automatic detection will be used.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This should be set to the value representing the environment this file is
 | 
				
			||||||
 | 
					# PRESENTLY in, not the virtualization the environment is capable of.
 | 
				
			||||||
 | 
					#rc_sys=""
 | 
				
			||||||
 | 
					# This is the number of tty's used in most of the rc-scripts (like
 | 
				
			||||||
 | 
					# consolefont, numlock, etc ...)
 | 
				
			||||||
 | 
					#rc_tty_number=6?
 | 
				
			||||||
@@ -63,6 +63,31 @@ stop()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	. "$RC_LIBEXECDIR"/sh/rc-mount.sh
 | 
						. "$RC_LIBEXECDIR"/sh/rc-mount.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "$RC_UNAME" = Linux ] && [ -d /sys/fs/aufs ] ; then
 | 
				
			||||||
 | 
							#if / is aufs we remount it noxino during shutdown
 | 
				
			||||||
 | 
							if mountinfo -q -f '^aufs$' / ; then
 | 
				
			||||||
 | 
								mount -o remount,noxino,rw /
 | 
				
			||||||
 | 
								sync
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local aufs_branch aufs_mount_dir aufs_mount_point aufs_si_dir aufs_si_id
 | 
				
			||||||
 | 
							for aufs_si_dir in /sys/fs/aufs/*; do
 | 
				
			||||||
 | 
								aufs_mount_dir=${aufs_si_dir#/sys/fs/aufs/}
 | 
				
			||||||
 | 
								aufs_si_id="$(printf "%s" $aufs_mount_dir | sed 's/_/=/g')"
 | 
				
			||||||
 | 
								aufs_mount_point="$(mountinfo -o ${aufs_si_id})"
 | 
				
			||||||
 | 
								for x in $aufs_si_dir/br[0-9][0-9][0-9]; do
 | 
				
			||||||
 | 
									aufs_branch=$(sed 's/=.*//g' $x)
 | 
				
			||||||
 | 
									eindent
 | 
				
			||||||
 | 
									if ! mount -o "remount,del:$aufs_branch" "$aufs_mount_point" > /dev/null 2>&1; then
 | 
				
			||||||
 | 
										ewarn "Failed to remove branch $aufs_branch from aufs \
 | 
				
			||||||
 | 
											$aufs_mount_point"
 | 
				
			||||||
 | 
									fi
 | 
				
			||||||
 | 
									eoutdent
 | 
				
			||||||
 | 
									sync
 | 
				
			||||||
 | 
								done
 | 
				
			||||||
 | 
							done
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Umount loop devices
 | 
						# Umount loop devices
 | 
				
			||||||
	einfo "Unmounting loop devices"
 | 
						einfo "Unmounting loop devices"
 | 
				
			||||||
	eindent
 | 
						eindent
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,7 @@
 | 
				
			|||||||
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
# Released under the 2-clause BSD license.
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
description="Mounts network shares, other than NFS, according to /etc/fstab."
 | 
					description="Mounts network shares according to /etc/fstab."
 | 
				
			||||||
# We skip all NFS shares in this script because they require extra
 | 
					 | 
				
			||||||
# daemons to be running on the client in order to work correctly.
 | 
					 | 
				
			||||||
# It is best to allow nfs-utils to handle all nfs shares.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
depend()
 | 
					depend()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -19,11 +16,6 @@ start()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	local x= fs= rc=
 | 
						local x= fs= rc=
 | 
				
			||||||
	for x in $net_fs_list $extra_net_fs_list; do
 | 
						for x in $net_fs_list $extra_net_fs_list; do
 | 
				
			||||||
		case "$x" in
 | 
					 | 
				
			||||||
			nfs|nfs4)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
			;;
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
		fs="$fs${fs:+,}$x"
 | 
							fs="$fs${fs:+,}$x"
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,14 +38,7 @@ stop()
 | 
				
			|||||||
	. "$RC_LIBEXECDIR"/sh/rc-mount.sh
 | 
						. "$RC_LIBEXECDIR"/sh/rc-mount.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for x in $net_fs_list $extra_net_fs_list; do
 | 
						for x in $net_fs_list $extra_net_fs_list; do
 | 
				
			||||||
		case "$x" in
 | 
							fs="$fs${fs:+,}$x"
 | 
				
			||||||
			nfs|nfs4)
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
				;;
 | 
					 | 
				
			||||||
			*)
 | 
					 | 
				
			||||||
				fs="$fs${fs:+,}$x"
 | 
					 | 
				
			||||||
				;;
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
	if [ -n "$fs" ]; then
 | 
						if [ -n "$fs" ]; then
 | 
				
			||||||
		umount -at $fs || eerror "Failed to simply unmount filesystems"
 | 
							umount -at $fs || eerror "Failed to simply unmount filesystems"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,8 +13,8 @@ start()
 | 
				
			|||||||
			return 1
 | 
								return 1
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	if ! checkpath -W "$RC_LIBEXECDIR"; then
 | 
						if ! checkpath -W "$RC_LIBEXECDIR"/cache; then
 | 
				
			||||||
		ewarn "WARNING: ${RC_LIBEXECDIR} is not writable!"
 | 
							ewarn "WARNING: ${RC_LIBEXECDIR}/cache is not writable!"
 | 
				
			||||||
		if ! yesno "${RC_GOINGDOWN}"; then
 | 
							if ! yesno "${RC_GOINGDOWN}"; then
 | 
				
			||||||
			ewarn "Unable to save deptree cache"
 | 
								ewarn "Unable to save deptree cache"
 | 
				
			||||||
			return 1
 | 
								return 1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								init.d/sysctl.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								init.d/sysctl.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					#!@SBINDIR@/openrc-run
 | 
				
			||||||
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						before bootmisc logger
 | 
				
			||||||
 | 
						keyword -prefix
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						[ -e /etc/sysctl.conf ] || return 0
 | 
				
			||||||
 | 
						local retval=0 var= comments= conf=
 | 
				
			||||||
 | 
						ebegin "Configuring kernel parameters"
 | 
				
			||||||
 | 
						eindent
 | 
				
			||||||
 | 
						for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
 | 
				
			||||||
 | 
							if [ -r "$conf" ]; then
 | 
				
			||||||
 | 
								vebegin "applying $conf"
 | 
				
			||||||
 | 
								while read var comments; do
 | 
				
			||||||
 | 
									case "$var" in
 | 
				
			||||||
 | 
									""|"#"*) continue;;
 | 
				
			||||||
 | 
									esac
 | 
				
			||||||
 | 
									sysctl -w "$var" >/dev/null || retval=1
 | 
				
			||||||
 | 
								done < "$conf"
 | 
				
			||||||
 | 
								veend $retval
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						eoutdent
 | 
				
			||||||
 | 
						eend $retval "Some errors were encountered"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								init.d/sysctl.GNU.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								init.d/sysctl.GNU.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					#!@PREFIX@/sbin/runscript
 | 
				
			||||||
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					#FIXME: Modify for GNU/Hurd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						before bootmisc logger
 | 
				
			||||||
 | 
						keyword -prefix
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						[ -e /etc/sysctl.conf ] || return 0
 | 
				
			||||||
 | 
						local retval=0 var= comments= conf=
 | 
				
			||||||
 | 
						ebegin "Configuring kernel parameters"
 | 
				
			||||||
 | 
						eindent
 | 
				
			||||||
 | 
						for conf in @SYSCONFDIR@/sysctl.conf @SYSCONFDIR@/sysctl.d/*.conf; do
 | 
				
			||||||
 | 
							if [ -r "$conf" ]; then
 | 
				
			||||||
 | 
								vebegin "applying $conf"
 | 
				
			||||||
 | 
								while read var comments; do
 | 
				
			||||||
 | 
									case "$var" in
 | 
				
			||||||
 | 
									""|"#"*) continue;;
 | 
				
			||||||
 | 
									esac
 | 
				
			||||||
 | 
									sysctl -w "$var" >/dev/null || retval=1
 | 
				
			||||||
 | 
								done < "$conf"
 | 
				
			||||||
 | 
								veend $retval
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						eoutdent
 | 
				
			||||||
 | 
						eend $retval "Some errors were encountered"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -100,14 +100,15 @@ mount_misc()
 | 
				
			|||||||
mount_cgroups()
 | 
					mount_cgroups()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	mountinfo -q /sys/fs/cgroup || return 0
 | 
						mountinfo -q /sys/fs/cgroup || return 0
 | 
				
			||||||
	mountinfo -q /sys/fs/cgroup/openrc || return 0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh"
 | 
						if ! mountinfo -q /sys/fs/cgroup/openrc; then
 | 
				
			||||||
	mkdir /sys/fs/cgroup/openrc
 | 
							local agent="@LIBEXECDIR@/sh/cgroup-release-agent.sh"
 | 
				
			||||||
	mount -n -t cgroup \
 | 
							mkdir /sys/fs/cgroup/openrc
 | 
				
			||||||
		-o none,${sysfs_opts},name=openrc,release_agent="$agent" \
 | 
							mount -n -t cgroup \
 | 
				
			||||||
		openrc /sys/fs/cgroup/openrc
 | 
								-o none,${sysfs_opts},name=openrc,release_agent="$agent" \
 | 
				
			||||||
	echo 1 > /sys/fs/cgroup/openrc/notify_on_release
 | 
								openrc /sys/fs/cgroup/openrc
 | 
				
			||||||
 | 
							echo 1 > /sys/fs/cgroup/openrc/notify_on_release
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
 | 
						yesno ${rc_controller_cgroups:-YES} && [ -e /proc/cgroups ] || return 0
 | 
				
			||||||
	while read name hier groups enabled rest; do
 | 
						while read name hier groups enabled rest; do
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,6 +120,9 @@ Set this to "true", "yes" or "1" (case-insensitive) to force the daemon into
 | 
				
			|||||||
the background. This implies the "--make-pidfile" and "--pidfile" option of
 | 
					the background. This implies the "--make-pidfile" and "--pidfile" option of
 | 
				
			||||||
.Xr start-stop-daemon 8
 | 
					.Xr start-stop-daemon 8
 | 
				
			||||||
so the pidfile variable must be set.
 | 
					so the pidfile variable must be set.
 | 
				
			||||||
 | 
					.It Ar chroot
 | 
				
			||||||
 | 
					.Xr start-stop-daemon 8
 | 
				
			||||||
 | 
					will chroot into this path before writing the pid file or starting the daemon.
 | 
				
			||||||
.It Ar pidfile
 | 
					.It Ar pidfile
 | 
				
			||||||
Pidfile to use for the above defined command.
 | 
					Pidfile to use for the above defined command.
 | 
				
			||||||
.It Ar name
 | 
					.It Ar name
 | 
				
			||||||
@@ -131,6 +134,12 @@ timeout in seconds or multiple signal/timeout pairs (like SIGTERM/5).
 | 
				
			|||||||
A list of directories which must exist for the service to start.
 | 
					A list of directories which must exist for the service to start.
 | 
				
			||||||
.It Ar required_files
 | 
					.It Ar required_files
 | 
				
			||||||
A list of files which must exist for the service to start.
 | 
					A list of files which must exist for the service to start.
 | 
				
			||||||
 | 
					.It Ar start_inactive
 | 
				
			||||||
 | 
					Set to yes to have the service marked inactive when it starts. This is
 | 
				
			||||||
 | 
					used along with in_background_fake to support re-entrant services.
 | 
				
			||||||
 | 
					.It Ar in_background_fake
 | 
				
			||||||
 | 
					Space separated list of commands which should always succeed when
 | 
				
			||||||
 | 
					in_background is yes.
 | 
				
			||||||
.El
 | 
					.El
 | 
				
			||||||
.Sh DEPENDENCIES
 | 
					.Sh DEPENDENCIES
 | 
				
			||||||
You should define a
 | 
					You should define a
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Generic definitions
 | 
					# Generic definitions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SFX=		.GNU-kFreeBSD.in
 | 
				
			||||||
 | 
					PKG_PREFIX?=	/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=700
 | 
					CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=700
 | 
				
			||||||
LIBDL=		-Wl,-Bdynamic -ldl
 | 
					LIBDL=		-Wl,-Bdynamic -ldl
 | 
				
			||||||
LIBKVM?=
 | 
					LIBKVM?=
 | 
				
			||||||
include ${MK}/os-BSD.mk
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								mk/os-GNU.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								mk/os-GNU.mk
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					# Copyright (c) 2008 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SFX=		.GNU.in
 | 
				
			||||||
 | 
					PKG_PREFIX?=	/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPPFLAGS+=	-D_BSD_SOURCE -D_XOPEN_SOURCE=700 -DMAXPATHLEN=4096 -DMAX_PATH=4096
 | 
				
			||||||
 | 
					LIBDL=		-Wl,-Bdynamic -ldl
 | 
				
			||||||
@@ -1,11 +1,12 @@
 | 
				
			|||||||
ifeq (${MKTERMCAP},ncurses)
 | 
					ifeq (${MKTERMCAP},ncurses)
 | 
				
			||||||
	LTERMCAP:=	$(shell pkg-config ncurses --libs 2> /dev/null)
 | 
					TERMCAP_CFLAGS:=	$(shell pkg-config ncurses --cflags 2> /dev/null)
 | 
				
			||||||
 | 
					LTERMCAP:=			$(shell pkg-config ncurses --libs 2> /dev/null)
 | 
				
			||||||
ifeq ($(LTERMCAP),)
 | 
					ifeq ($(LTERMCAP),)
 | 
				
			||||||
LIBTERMCAP?=	-lncurses
 | 
					LIBTERMCAP?=	-lncurses
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
LIBTERMCAP?= $(LTERMCAP)
 | 
					LIBTERMCAP?= $(LTERMCAP)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
CPPFLAGS+=	-DHAVE_TERMCAP
 | 
					CPPFLAGS+=	-DHAVE_TERMCAP ${TERMCAP_CFLAGS}
 | 
				
			||||||
LDADD+=		${LIBTERMCAP}
 | 
					LDADD+=		${LIBTERMCAP}
 | 
				
			||||||
else ifeq (${MKTERMCAP},termcap)
 | 
					else ifeq (${MKTERMCAP},termcap)
 | 
				
			||||||
LIBTERMCAP?=	-ltermcap
 | 
					LIBTERMCAP?=	-ltermcap
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										35
									
								
								sh/init.sh.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								sh/init.sh.GNU-kFreeBSD.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					#!@SHELL@
 | 
				
			||||||
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ ! -d /run ]; then
 | 
				
			||||||
 | 
					    ebegin "Creating /run"
 | 
				
			||||||
 | 
					    mkdir -p /run
 | 
				
			||||||
 | 
					    eend $?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -L $RC_SVCDIR ]; then
 | 
				
			||||||
 | 
					    rm $RC_SVCDIR
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ebegin "Mounting /run"
 | 
				
			||||||
 | 
					if ! fstabinfo --mount /run; then
 | 
				
			||||||
 | 
					    mount -t tmpfs -o mode=0755,noexec,nosuid,size=10% tmpfs /run
 | 
				
			||||||
 | 
					    if [ $? != 0 ]; then
 | 
				
			||||||
 | 
					        eerror "Unable to mount tmpfs on /run."
 | 
				
			||||||
 | 
					        eerror "Can't continue."
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					eend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ebegin "Creating $RC_SVCDIR"
 | 
				
			||||||
 | 
					mkdir -p $RC_SVCDIR
 | 
				
			||||||
 | 
					eend $?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
 | 
				
			||||||
 | 
					    cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo sysinit >"$RC_SVCDIR"/softlevel
 | 
				
			||||||
 | 
					exit 0
 | 
				
			||||||
							
								
								
									
										38
									
								
								sh/init.sh.GNU.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								sh/init.sh.GNU.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					#!@SHELL@
 | 
				
			||||||
 | 
					# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
 | 
				
			||||||
 | 
					# Copyright (c) 2014 Svante Signell <svante.signell@gmail.com>
 | 
				
			||||||
 | 
					# Released under the 2-clause BSD license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ ! -d /run ]; then
 | 
				
			||||||
 | 
					    ebegin "Creating /run"
 | 
				
			||||||
 | 
					    mkdir -p /run
 | 
				
			||||||
 | 
					    eend $?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -L $RC_SVCDIR ]; then
 | 
				
			||||||
 | 
					    rm $RC_SVCDIR
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ! mountinfo -q /run; then
 | 
				
			||||||
 | 
					    ebegin "Mounting /run"
 | 
				
			||||||
 | 
					    if ! fstabinfo --mount /run; then
 | 
				
			||||||
 | 
					        mount -t tmpfs -o mode=0755,no-suid,size=10% tmpfs /run
 | 
				
			||||||
 | 
					        if [ $? != 0 ]; then
 | 
				
			||||||
 | 
					            eerror "Unable to mount tmpfs on /run."
 | 
				
			||||||
 | 
					            eerror "Can't continue."
 | 
				
			||||||
 | 
					            exit 1
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    eend
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ebegin "Creating $RC_SVCDIR"
 | 
				
			||||||
 | 
					mkdir -p $RC_SVCDIR
 | 
				
			||||||
 | 
					eend $?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then
 | 
				
			||||||
 | 
					    cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo sysinit >"$RC_SVCDIR"/softlevel
 | 
				
			||||||
 | 
					exit 0
 | 
				
			||||||
@@ -142,12 +142,14 @@ start()
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
	eval start-stop-daemon --start \
 | 
						eval start-stop-daemon --start \
 | 
				
			||||||
		--exec $command \
 | 
							--exec $command \
 | 
				
			||||||
 | 
							${chroot:+--chroot} $chroot \
 | 
				
			||||||
		${procname:+--name} $procname \
 | 
							${procname:+--name} $procname \
 | 
				
			||||||
		${pidfile:+--pidfile} $pidfile \
 | 
							${pidfile:+--pidfile} $pidfile \
 | 
				
			||||||
		$_background $start_stop_daemon_args \
 | 
							$_background $start_stop_daemon_args \
 | 
				
			||||||
		-- $command_args
 | 
							-- $command_args
 | 
				
			||||||
	if eend $? "Failed to start $RC_SVCNAME"; then
 | 
						if eend $? "Failed to start $RC_SVCNAME"; then
 | 
				
			||||||
		service_set_value "command" "${command}"
 | 
							service_set_value "command" "${command}"
 | 
				
			||||||
 | 
							[ -n "${chroot}" ] && service_set_value "chroot" "${chroot}"
 | 
				
			||||||
		[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
 | 
							[ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
 | 
				
			||||||
		[ -n "${procname}" ] && service_set_value "procname" "${procname}"
 | 
							[ -n "${procname}" ] && service_set_value "procname" "${procname}"
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
@@ -163,9 +165,11 @@ start()
 | 
				
			|||||||
stop()
 | 
					stop()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local startcommand="$(service_get_value "command")"
 | 
						local startcommand="$(service_get_value "command")"
 | 
				
			||||||
 | 
						local startchroot="$(service_get_value "chroot")"
 | 
				
			||||||
	local startpidfile="$(service_get_value "pidfile")"
 | 
						local startpidfile="$(service_get_value "pidfile")"
 | 
				
			||||||
	local startprocname="$(service_get_value "procname")"
 | 
						local startprocname="$(service_get_value "procname")"
 | 
				
			||||||
	command="${startcommand:-$command}"
 | 
						command="${startcommand:-$command}"
 | 
				
			||||||
 | 
						chroot="${startchroot:-$chroot}"
 | 
				
			||||||
	pidfile="${startpidfile:-$pidfile}"
 | 
						pidfile="${startpidfile:-$pidfile}"
 | 
				
			||||||
	procname="${startprocname:-$procname}"
 | 
						procname="${startprocname:-$procname}"
 | 
				
			||||||
	[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
 | 
						[ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
 | 
				
			||||||
@@ -174,7 +178,7 @@ stop()
 | 
				
			|||||||
		${retry:+--retry} $retry \
 | 
							${retry:+--retry} $retry \
 | 
				
			||||||
		${command:+--exec} $command \
 | 
							${command:+--exec} $command \
 | 
				
			||||||
		${procname:+--name} $procname \
 | 
							${procname:+--name} $procname \
 | 
				
			||||||
		${pidfile:+--pidfile} $pidfile \
 | 
							${pidfile:+--pidfile} $chroot$pidfile \
 | 
				
			||||||
		${stopsig:+--signal} $stopsig
 | 
							${stopsig:+--signal} $stopsig
 | 
				
			||||||
	eend $? "Failed to stop $RC_SVCNAME"
 | 
						eend $? "Failed to stop $RC_SVCNAME"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -185,6 +189,10 @@ status()
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
yesno $RC_DEBUG && set -x
 | 
					yesno $RC_DEBUG && set -x
 | 
				
			||||||
 | 
					if yesno "${rc_verbose:-$RC_VERBOSE}"; then
 | 
				
			||||||
 | 
						EINFO_VERBOSE=yes
 | 
				
			||||||
 | 
						export EINFO_VERBOSE
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_conf_d=${RC_SERVICE%/*}/../conf.d
 | 
					_conf_d=${RC_SERVICE%/*}/../conf.d
 | 
				
			||||||
# If we're net.eth0 or openvpn.work then load net or openvpn config
 | 
					# If we're net.eth0 or openvpn.work then load net or openvpn config
 | 
				
			||||||
@@ -205,25 +213,29 @@ unset _conf_d
 | 
				
			|||||||
# Load any system overrides
 | 
					# Load any system overrides
 | 
				
			||||||
sourcex -e "@SYSCONFDIR@/rc.conf"
 | 
					sourcex -e "@SYSCONFDIR@/rc.conf"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Apply any ulimit defined
 | 
					for _cmd; do
 | 
				
			||||||
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && ulimit ${rc_ulimit:-$RC_ULIMIT}
 | 
						if [ "$_cmd" != status -a "$_cmd" != describe ]; then
 | 
				
			||||||
 | 
							# Apply any ulimit defined
 | 
				
			||||||
# Set verbose mode
 | 
							[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && \
 | 
				
			||||||
if yesno "${rc_verbose:-$RC_VERBOSE}"; then
 | 
								ulimit ${rc_ulimit:-$RC_ULIMIT}
 | 
				
			||||||
	EINFO_VERBOSE=yes
 | 
							# Apply cgroups settings if defined
 | 
				
			||||||
	export EINFO_VERBOSE
 | 
							if [ "$(command -v cgroup_add_service)" = \
 | 
				
			||||||
fi
 | 
							    "cgroup_add_service" ]
 | 
				
			||||||
 | 
							then
 | 
				
			||||||
# Apply cgroups settings if defined
 | 
								if [ -d /sys/fs/cgroup -a ! -w /sys/fs/cgroup ]; then
 | 
				
			||||||
if [ "$1" = "start" ] ; then
 | 
									eerror "No permission to apply cgroup settings"
 | 
				
			||||||
	if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ]; then
 | 
									break
 | 
				
			||||||
		cgroup_add_service /sys/fs/cgroup/openrc
 | 
								fi
 | 
				
			||||||
		cgroup_add_service /sys/fs/cgroup/systemd/system
 | 
								cgroup_add_service /sys/fs/cgroup/openrc
 | 
				
			||||||
 | 
								cgroup_add_service /sys/fs/cgroup/systemd/system
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							[ "$(command -v cgroup_set_limits)" = \
 | 
				
			||||||
 | 
							    "cgroup_set_limits" ] && \
 | 
				
			||||||
 | 
							    cgroup_set_limits
 | 
				
			||||||
 | 
							break
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
	[ "$(command -v cgroup_set_limits)" = "cgroup_set_limits" ] && \
 | 
					done
 | 
				
			||||||
		cgroup_set_limits
 | 
					 
 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Load our script
 | 
					# Load our script
 | 
				
			||||||
sourcex "$RC_SERVICE"
 | 
					sourcex "$RC_SERVICE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,6 +80,17 @@ _c() {
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_C() {
 | 
				
			||||||
 | 
						# recursively copy a file or directory
 | 
				
			||||||
 | 
						local path=$1 mode=$2 uid=$3 gid=$4 age=$5 arg=$6
 | 
				
			||||||
 | 
						if [ ! -e "$path" ]; then
 | 
				
			||||||
 | 
							dryrun_or_real cp -r "$arg" "$path"
 | 
				
			||||||
 | 
							_restorecon "$path"
 | 
				
			||||||
 | 
							[ $uid != '-' ] && dryrun_or_real chown "$uid" "$path"
 | 
				
			||||||
 | 
							[ $gid != '-' ] && dryrun_or_real chgrp "$gid" "$path"
 | 
				
			||||||
 | 
							[ $mode != '-' ] && dryrun_or_real chmod "$mode" "$path"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_f() {
 | 
					_f() {
 | 
				
			||||||
	# Create a file if it doesn't exist yet
 | 
						# Create a file if it doesn't exist yet
 | 
				
			||||||
@@ -304,6 +315,7 @@ for FILE in $tmpfiles_d ; do
 | 
				
			|||||||
	# But IS allowed when globs are expanded for the x/r/R/z/Z types.
 | 
						# But IS allowed when globs are expanded for the x/r/R/z/Z types.
 | 
				
			||||||
	while read cmd path mode uid gid age arg; do
 | 
						while read cmd path mode uid gid age arg; do
 | 
				
			||||||
		LINENUM=$(( LINENUM+1 ))
 | 
							LINENUM=$(( LINENUM+1 ))
 | 
				
			||||||
 | 
							FORCE=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Unless we have both command and path, skip this line.
 | 
							# Unless we have both command and path, skip this line.
 | 
				
			||||||
		if [ -z "$cmd" -o -z "$path" ]; then
 | 
							if [ -z "$cmd" -o -z "$path" ]; then
 | 
				
			||||||
@@ -311,13 +323,20 @@ for FILE in $tmpfiles_d ; do
 | 
				
			|||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case $cmd in
 | 
							case $cmd in
 | 
				
			||||||
			*!) [ "$BOOT" -eq "1" ] || continue; cmd=${cmd%!} ;;
 | 
								\#*) continue ;;
 | 
				
			||||||
		esac
 | 
							esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while [ ${#cmd} -gt 1 ]; do
 | 
				
			||||||
 | 
								case $cmd in
 | 
				
			||||||
 | 
									*!) cmd=${cmd%!}; [ "$BOOT" -eq "1" ] || continue 2 ;;
 | 
				
			||||||
 | 
									*+) cmd=${cmd%+}; FORCE=1; ;;
 | 
				
			||||||
 | 
									*) warninvalid ; continue 2 ;;
 | 
				
			||||||
 | 
								esac
 | 
				
			||||||
 | 
							done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# whine about invalid entries
 | 
							# whine about invalid entries
 | 
				
			||||||
		case $cmd in
 | 
							case $cmd in
 | 
				
			||||||
			f|F|w|d|D|p|L|c|b|x|X|r|R|z|Z) ;;
 | 
								f|F|w|d|D|p|L|c|C|b|x|X|r|R|z|Z) ;;
 | 
				
			||||||
			\#*) continue ;;
 | 
					 | 
				
			||||||
			*) warninvalid ; continue ;;
 | 
								*) warninvalid ; continue ;;
 | 
				
			||||||
		esac
 | 
							esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -326,7 +345,7 @@ for FILE in $tmpfiles_d ; do
 | 
				
			|||||||
			case "$cmd" in
 | 
								case "$cmd" in
 | 
				
			||||||
				p|f|F) mode=0644 ;;
 | 
									p|f|F) mode=0644 ;;
 | 
				
			||||||
				d|D) mode=0755 ;;
 | 
									d|D) mode=0755 ;;
 | 
				
			||||||
				z|Z|x|r|R|L) ;;
 | 
									C|z|Z|x|r|R|L) ;;
 | 
				
			||||||
			esac
 | 
								esac
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -338,6 +357,13 @@ for FILE in $tmpfiles_d ; do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		[ -n "$EXCLUDE" ] && checkprefix $path $EXCLUDE && continue
 | 
							[ -n "$EXCLUDE" ] && checkprefix $path $EXCLUDE && continue
 | 
				
			||||||
		[ -n "$PREFIX" ] && ! checkprefix $path $PREFIX && continue
 | 
							[ -n "$PREFIX" ] && ! checkprefix $path $PREFIX && continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if [ $FORCE -gt 0 ]; then
 | 
				
			||||||
 | 
								case $cmd in
 | 
				
			||||||
 | 
									p|L|c|b) [ -f "$path" ] && dryrun_or_real rm -f "$path"
 | 
				
			||||||
 | 
								esac
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@"
 | 
							[ "$VERBOSE" -eq "1" ] && echo _$cmd "$@"
 | 
				
			||||||
		_$cmd "$@"
 | 
							_$cmd "$@"
 | 
				
			||||||
		rc=$?
 | 
							rc=$?
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,25 +48,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
 | 
					#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Some libc implemntations don't have these */
 | 
					 | 
				
			||||||
#ifndef TAILQ_CONCAT
 | 
					 | 
				
			||||||
#define TAILQ_CONCAT(head1, head2, field) do {				      \
 | 
					 | 
				
			||||||
		if (!TAILQ_EMPTY(head2)) {				      \
 | 
					 | 
				
			||||||
			*(head1)->tqh_last = (head2)->tqh_first;	      \
 | 
					 | 
				
			||||||
			(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
 | 
					 | 
				
			||||||
			(head1)->tqh_last = (head2)->tqh_last;		      \
 | 
					 | 
				
			||||||
			TAILQ_INIT((head2));				      \
 | 
					 | 
				
			||||||
		}							      \
 | 
					 | 
				
			||||||
	} while (0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TAILQ_FOREACH_SAFE
 | 
					 | 
				
			||||||
#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			      \
 | 
					 | 
				
			||||||
	for ((var) = TAILQ_FIRST((head));				      \
 | 
					 | 
				
			||||||
	     (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		      \
 | 
					 | 
				
			||||||
	     (var) = (tvar))
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __GLIBC__
 | 
					#ifdef __GLIBC__
 | 
				
			||||||
#  if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
 | 
					#  if ! defined (__UCLIBC__) && ! defined (__dietlibc__)
 | 
				
			||||||
#    define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
 | 
					#    define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										846
									
								
								src/includes/queue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										846
									
								
								src/includes/queue.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,846 @@
 | 
				
			|||||||
 | 
					/*	$NetBSD: queue.h,v 1.67 2014/05/17 21:22:56 rmind Exp $	*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 1991, 1993
 | 
				
			||||||
 | 
					 *	The Regents of the University of California.  All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 * 1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 * 2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *    documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 * 3. Neither the name of the University nor the names of its contributors
 | 
				
			||||||
 | 
					 *    may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *    without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
				
			||||||
 | 
					 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
				
			||||||
 | 
					 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
				
			||||||
 | 
					 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	@(#)queue.h	8.5 (Berkeley) 8/20/94
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef	_SYS_QUEUE_H_
 | 
				
			||||||
 | 
					#define	_SYS_QUEUE_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This file defines five types of data structures: singly-linked lists,
 | 
				
			||||||
 | 
					 * lists, simple queues, tail queues, and circular queues.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A singly-linked list is headed by a single forward pointer. The
 | 
				
			||||||
 | 
					 * elements are singly linked for minimum space and pointer manipulation
 | 
				
			||||||
 | 
					 * overhead at the expense of O(n) removal for arbitrary elements. New
 | 
				
			||||||
 | 
					 * elements can be added to the list after an existing element or at the
 | 
				
			||||||
 | 
					 * head of the list.  Elements being removed from the head of the list
 | 
				
			||||||
 | 
					 * should use the explicit macro for this purpose for optimum
 | 
				
			||||||
 | 
					 * efficiency. A singly-linked list may only be traversed in the forward
 | 
				
			||||||
 | 
					 * direction.  Singly-linked lists are ideal for applications with large
 | 
				
			||||||
 | 
					 * datasets and few or no removals or for implementing a LIFO queue.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A list is headed by a single forward pointer (or an array of forward
 | 
				
			||||||
 | 
					 * pointers for a hash table header). The elements are doubly linked
 | 
				
			||||||
 | 
					 * so that an arbitrary element can be removed without a need to
 | 
				
			||||||
 | 
					 * traverse the list. New elements can be added to the list before
 | 
				
			||||||
 | 
					 * or after an existing element or at the head of the list. A list
 | 
				
			||||||
 | 
					 * may only be traversed in the forward direction.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A simple queue is headed by a pair of pointers, one the head of the
 | 
				
			||||||
 | 
					 * list and the other to the tail of the list. The elements are singly
 | 
				
			||||||
 | 
					 * linked to save space, so elements can only be removed from the
 | 
				
			||||||
 | 
					 * head of the list. New elements can be added to the list after
 | 
				
			||||||
 | 
					 * an existing element, at the head of the list, or at the end of the
 | 
				
			||||||
 | 
					 * list. A simple queue may only be traversed in the forward direction.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A tail queue is headed by a pair of pointers, one to the head of the
 | 
				
			||||||
 | 
					 * list and the other to the tail of the list. The elements are doubly
 | 
				
			||||||
 | 
					 * linked so that an arbitrary element can be removed without a need to
 | 
				
			||||||
 | 
					 * traverse the list. New elements can be added to the list before or
 | 
				
			||||||
 | 
					 * after an existing element, at the head of the list, or at the end of
 | 
				
			||||||
 | 
					 * the list. A tail queue may be traversed in either direction.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A circle queue is headed by a pair of pointers, one to the head of the
 | 
				
			||||||
 | 
					 * list and the other to the tail of the list. The elements are doubly
 | 
				
			||||||
 | 
					 * linked so that an arbitrary element can be removed without a need to
 | 
				
			||||||
 | 
					 * traverse the list. New elements can be added to the list before or after
 | 
				
			||||||
 | 
					 * an existing element, at the head of the list, or at the end of the list.
 | 
				
			||||||
 | 
					 * A circle queue may be traversed in either direction, but has a more
 | 
				
			||||||
 | 
					 * complex end of list detection.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * For details on the use of these macros, see the queue(3) manual page.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Include the definition of NULL only on NetBSD because sys/null.h
 | 
				
			||||||
 | 
					 * is not available elsewhere.  This conditional makes the header
 | 
				
			||||||
 | 
					 * portable and it can simply be dropped verbatim into any system.
 | 
				
			||||||
 | 
					 * The caveat is that on other systems some other header
 | 
				
			||||||
 | 
					 * must provide NULL before the macros can be used.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifdef __NetBSD__
 | 
				
			||||||
 | 
					#include <sys/null.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(QUEUEDEBUG)
 | 
				
			||||||
 | 
					# if defined(_KERNEL)
 | 
				
			||||||
 | 
					#  define QUEUEDEBUG_ABORT(...) panic(__VA_ARGS__)
 | 
				
			||||||
 | 
					# else
 | 
				
			||||||
 | 
					#  include <err.h>
 | 
				
			||||||
 | 
					#  define QUEUEDEBUG_ABORT(...) err(1, __VA_ARGS__)
 | 
				
			||||||
 | 
					# endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Singly-linked List definitions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	SLIST_HEAD(name, type)						\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						struct type *slh_first;	/* first element */			\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ NULL }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_ENTRY(type)						\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						struct type *sle_next;	/* next element */			\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Singly-linked List access methods.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	SLIST_FIRST(head)	((head)->slh_first)
 | 
				
			||||||
 | 
					#define	SLIST_END(head)		NULL
 | 
				
			||||||
 | 
					#define	SLIST_EMPTY(head)	((head)->slh_first == NULL)
 | 
				
			||||||
 | 
					#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_FOREACH(var, head, field)					\
 | 
				
			||||||
 | 
						for((var) = (head)->slh_first;					\
 | 
				
			||||||
 | 
						    (var) != SLIST_END(head);					\
 | 
				
			||||||
 | 
						    (var) = (var)->field.sle_next)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_FOREACH_SAFE(var, head, field, tvar)			\
 | 
				
			||||||
 | 
						for ((var) = SLIST_FIRST((head));				\
 | 
				
			||||||
 | 
						    (var) != SLIST_END(head) &&					\
 | 
				
			||||||
 | 
						    ((tvar) = SLIST_NEXT((var), field), 1);			\
 | 
				
			||||||
 | 
						    (var) = (tvar))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Singly-linked List functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	SLIST_INIT(head) do {						\
 | 
				
			||||||
 | 
						(head)->slh_first = SLIST_END(head);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
 | 
				
			||||||
 | 
						(elm)->field.sle_next = (slistelm)->field.sle_next;		\
 | 
				
			||||||
 | 
						(slistelm)->field.sle_next = (elm);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
 | 
				
			||||||
 | 
						(elm)->field.sle_next = (head)->slh_first;			\
 | 
				
			||||||
 | 
						(head)->slh_first = (elm);					\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_REMOVE_AFTER(slistelm, field) do {			\
 | 
				
			||||||
 | 
						(slistelm)->field.sle_next =					\
 | 
				
			||||||
 | 
						    SLIST_NEXT(SLIST_NEXT((slistelm), field), field);		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_REMOVE_HEAD(head, field) do {				\
 | 
				
			||||||
 | 
						(head)->slh_first = (head)->slh_first->field.sle_next;		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SLIST_REMOVE(head, elm, type, field) do {			\
 | 
				
			||||||
 | 
						if ((head)->slh_first == (elm)) {				\
 | 
				
			||||||
 | 
							SLIST_REMOVE_HEAD((head), field);			\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
						else {								\
 | 
				
			||||||
 | 
							struct type *curelm = (head)->slh_first;		\
 | 
				
			||||||
 | 
							while(curelm->field.sle_next != (elm))			\
 | 
				
			||||||
 | 
								curelm = curelm->field.sle_next;		\
 | 
				
			||||||
 | 
							curelm->field.sle_next =				\
 | 
				
			||||||
 | 
							    curelm->field.sle_next->field.sle_next;		\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * List definitions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	LIST_HEAD(name, type)						\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						struct type *lh_first;	/* first element */			\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ NULL }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_ENTRY(type)						\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						struct type *le_next;	/* next element */			\
 | 
				
			||||||
 | 
						struct type **le_prev;	/* address of previous next element */	\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * List access methods.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	LIST_FIRST(head)		((head)->lh_first)
 | 
				
			||||||
 | 
					#define	LIST_END(head)			NULL
 | 
				
			||||||
 | 
					#define	LIST_EMPTY(head)		((head)->lh_first == LIST_END(head))
 | 
				
			||||||
 | 
					#define	LIST_NEXT(elm, field)		((elm)->field.le_next)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_FOREACH(var, head, field)					\
 | 
				
			||||||
 | 
						for ((var) = ((head)->lh_first);				\
 | 
				
			||||||
 | 
						    (var) != LIST_END(head);					\
 | 
				
			||||||
 | 
						    (var) = ((var)->field.le_next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_FOREACH_SAFE(var, head, field, tvar)			\
 | 
				
			||||||
 | 
						for ((var) = LIST_FIRST((head));				\
 | 
				
			||||||
 | 
						    (var) != LIST_END(head) &&					\
 | 
				
			||||||
 | 
						    ((tvar) = LIST_NEXT((var), field), 1);			\
 | 
				
			||||||
 | 
						    (var) = (tvar))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_MOVE(head1, head2) do {					\
 | 
				
			||||||
 | 
						LIST_INIT((head2));						\
 | 
				
			||||||
 | 
						if (!LIST_EMPTY((head1))) {					\
 | 
				
			||||||
 | 
							(head2)->lh_first = (head1)->lh_first;			\
 | 
				
			||||||
 | 
							LIST_INIT((head1));					\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * List functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#if defined(QUEUEDEBUG)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field)			\
 | 
				
			||||||
 | 
						if ((head)->lh_first &&						\
 | 
				
			||||||
 | 
						    (head)->lh_first->field.le_prev != &(head)->lh_first)	\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head),	\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_LIST_OP(elm, field)					\
 | 
				
			||||||
 | 
						if ((elm)->field.le_next &&					\
 | 
				
			||||||
 | 
						    (elm)->field.le_next->field.le_prev !=			\
 | 
				
			||||||
 | 
						    &(elm)->field.le_next)					\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm),		\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);				\
 | 
				
			||||||
 | 
						if (*(elm)->field.le_prev != (elm))				\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm),		\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_LIST_POSTREMOVE(elm, field)				\
 | 
				
			||||||
 | 
						(elm)->field.le_next = (void *)1L;				\
 | 
				
			||||||
 | 
						(elm)->field.le_prev = (void *)1L;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_LIST_OP(elm, field)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_LIST_POSTREMOVE(elm, field)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_INIT(head) do {						\
 | 
				
			||||||
 | 
						(head)->lh_first = LIST_END(head);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_INSERT_AFTER(listelm, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_LIST_OP((listelm), field)				\
 | 
				
			||||||
 | 
						if (((elm)->field.le_next = (listelm)->field.le_next) != 	\
 | 
				
			||||||
 | 
						    LIST_END(head))						\
 | 
				
			||||||
 | 
							(listelm)->field.le_next->field.le_prev =		\
 | 
				
			||||||
 | 
							    &(elm)->field.le_next;				\
 | 
				
			||||||
 | 
						(listelm)->field.le_next = (elm);				\
 | 
				
			||||||
 | 
						(elm)->field.le_prev = &(listelm)->field.le_next;		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_LIST_OP((listelm), field)				\
 | 
				
			||||||
 | 
						(elm)->field.le_prev = (listelm)->field.le_prev;		\
 | 
				
			||||||
 | 
						(elm)->field.le_next = (listelm);				\
 | 
				
			||||||
 | 
						*(listelm)->field.le_prev = (elm);				\
 | 
				
			||||||
 | 
						(listelm)->field.le_prev = &(elm)->field.le_next;		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_INSERT_HEAD(head, elm, field) do {				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field)		\
 | 
				
			||||||
 | 
						if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head))\
 | 
				
			||||||
 | 
							(head)->lh_first->field.le_prev = &(elm)->field.le_next;\
 | 
				
			||||||
 | 
						(head)->lh_first = (elm);					\
 | 
				
			||||||
 | 
						(elm)->field.le_prev = &(head)->lh_first;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_REMOVE(elm, field) do {					\
 | 
				
			||||||
 | 
						QUEUEDEBUG_LIST_OP((elm), field)				\
 | 
				
			||||||
 | 
						if ((elm)->field.le_next != NULL)				\
 | 
				
			||||||
 | 
							(elm)->field.le_next->field.le_prev = 			\
 | 
				
			||||||
 | 
							    (elm)->field.le_prev;				\
 | 
				
			||||||
 | 
						*(elm)->field.le_prev = (elm)->field.le_next;			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_LIST_POSTREMOVE((elm), field)			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LIST_REPLACE(elm, elm2, field) do {				\
 | 
				
			||||||
 | 
						if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)	\
 | 
				
			||||||
 | 
							(elm2)->field.le_next->field.le_prev =			\
 | 
				
			||||||
 | 
							    &(elm2)->field.le_next;				\
 | 
				
			||||||
 | 
						(elm2)->field.le_prev = (elm)->field.le_prev;			\
 | 
				
			||||||
 | 
						*(elm2)->field.le_prev = (elm2);				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_LIST_POSTREMOVE((elm), field)			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Simple queue definitions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	SIMPLEQ_HEAD(name, type)					\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						struct type *sqh_first;	/* first element */			\
 | 
				
			||||||
 | 
						struct type **sqh_last;	/* addr of last next element */		\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ NULL, &(head).sqh_first }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_ENTRY(type)						\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						struct type *sqe_next;	/* next element */			\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Simple queue access methods.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	SIMPLEQ_FIRST(head)		((head)->sqh_first)
 | 
				
			||||||
 | 
					#define	SIMPLEQ_END(head)		NULL
 | 
				
			||||||
 | 
					#define	SIMPLEQ_EMPTY(head)		((head)->sqh_first == SIMPLEQ_END(head))
 | 
				
			||||||
 | 
					#define	SIMPLEQ_NEXT(elm, field)	((elm)->field.sqe_next)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_FOREACH(var, head, field)				\
 | 
				
			||||||
 | 
						for ((var) = ((head)->sqh_first);				\
 | 
				
			||||||
 | 
						    (var) != SIMPLEQ_END(head);					\
 | 
				
			||||||
 | 
						    (var) = ((var)->field.sqe_next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_FOREACH_SAFE(var, head, field, next)			\
 | 
				
			||||||
 | 
						for ((var) = ((head)->sqh_first);				\
 | 
				
			||||||
 | 
						    (var) != SIMPLEQ_END(head) &&				\
 | 
				
			||||||
 | 
						    ((next = ((var)->field.sqe_next)), 1);			\
 | 
				
			||||||
 | 
						    (var) = (next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Simple queue functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	SIMPLEQ_INIT(head) do {						\
 | 
				
			||||||
 | 
						(head)->sqh_first = NULL;					\
 | 
				
			||||||
 | 
						(head)->sqh_last = &(head)->sqh_first;				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\
 | 
				
			||||||
 | 
						if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\
 | 
				
			||||||
 | 
							(head)->sqh_last = &(elm)->field.sqe_next;		\
 | 
				
			||||||
 | 
						(head)->sqh_first = (elm);					\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\
 | 
				
			||||||
 | 
						(elm)->field.sqe_next = NULL;					\
 | 
				
			||||||
 | 
						*(head)->sqh_last = (elm);					\
 | 
				
			||||||
 | 
						(head)->sqh_last = &(elm)->field.sqe_next;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
 | 
				
			||||||
 | 
						if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
 | 
				
			||||||
 | 
							(head)->sqh_last = &(elm)->field.sqe_next;		\
 | 
				
			||||||
 | 
						(listelm)->field.sqe_next = (elm);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_REMOVE_HEAD(head, field) do {				\
 | 
				
			||||||
 | 
						if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
 | 
				
			||||||
 | 
							(head)->sqh_last = &(head)->sqh_first;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do {			\
 | 
				
			||||||
 | 
						if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \
 | 
				
			||||||
 | 
						    == NULL)							\
 | 
				
			||||||
 | 
							(head)->sqh_last = &(elm)->field.sqe_next;		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_REMOVE(head, elm, type, field) do {			\
 | 
				
			||||||
 | 
						if ((head)->sqh_first == (elm)) {				\
 | 
				
			||||||
 | 
							SIMPLEQ_REMOVE_HEAD((head), field);			\
 | 
				
			||||||
 | 
						} else {							\
 | 
				
			||||||
 | 
							struct type *curelm = (head)->sqh_first;		\
 | 
				
			||||||
 | 
							while (curelm->field.sqe_next != (elm))			\
 | 
				
			||||||
 | 
								curelm = curelm->field.sqe_next;		\
 | 
				
			||||||
 | 
							if ((curelm->field.sqe_next =				\
 | 
				
			||||||
 | 
								curelm->field.sqe_next->field.sqe_next) == NULL) \
 | 
				
			||||||
 | 
								    (head)->sqh_last = &(curelm)->field.sqe_next; \
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_CONCAT(head1, head2) do {				\
 | 
				
			||||||
 | 
						if (!SIMPLEQ_EMPTY((head2))) {					\
 | 
				
			||||||
 | 
							*(head1)->sqh_last = (head2)->sqh_first;		\
 | 
				
			||||||
 | 
							(head1)->sqh_last = (head2)->sqh_last;		\
 | 
				
			||||||
 | 
							SIMPLEQ_INIT((head2));					\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SIMPLEQ_LAST(head, type, field)					\
 | 
				
			||||||
 | 
						(SIMPLEQ_EMPTY((head)) ?						\
 | 
				
			||||||
 | 
							NULL :							\
 | 
				
			||||||
 | 
						        ((struct type *)(void *)				\
 | 
				
			||||||
 | 
							((char *)((head)->sqh_last) - offsetof(struct type, field))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Tail queue definitions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	_TAILQ_HEAD(name, type, qual)					\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						qual type *tqh_first;		/* first element */		\
 | 
				
			||||||
 | 
						qual type *qual *tqh_last;	/* addr of last next element */	\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#define TAILQ_HEAD(name, type)	_TAILQ_HEAD(name, struct type,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ TAILQ_END(head), &(head).tqh_first }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	_TAILQ_ENTRY(type, qual)					\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						qual type *tqe_next;		/* next element */		\
 | 
				
			||||||
 | 
						qual type *qual *tqe_prev;	/* address of previous next element */\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#define TAILQ_ENTRY(type)	_TAILQ_ENTRY(struct type,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Tail queue access methods.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	TAILQ_FIRST(head)		((head)->tqh_first)
 | 
				
			||||||
 | 
					#define	TAILQ_END(head)			(NULL)
 | 
				
			||||||
 | 
					#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)
 | 
				
			||||||
 | 
					#define	TAILQ_LAST(head, headname) \
 | 
				
			||||||
 | 
						(*(((struct headname *)((head)->tqh_last))->tqh_last))
 | 
				
			||||||
 | 
					#define	TAILQ_PREV(elm, headname, field) \
 | 
				
			||||||
 | 
						(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
 | 
				
			||||||
 | 
					#define	TAILQ_EMPTY(head)		(TAILQ_FIRST(head) == TAILQ_END(head))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_FOREACH(var, head, field)					\
 | 
				
			||||||
 | 
						for ((var) = ((head)->tqh_first);				\
 | 
				
			||||||
 | 
						    (var) != TAILQ_END(head);					\
 | 
				
			||||||
 | 
						    (var) = ((var)->field.tqe_next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_FOREACH_SAFE(var, head, field, next)			\
 | 
				
			||||||
 | 
						for ((var) = ((head)->tqh_first);				\
 | 
				
			||||||
 | 
						    (var) != TAILQ_END(head) &&					\
 | 
				
			||||||
 | 
						    ((next) = TAILQ_NEXT(var, field), 1); (var) = (next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
 | 
				
			||||||
 | 
						for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));\
 | 
				
			||||||
 | 
						    (var) != TAILQ_END(head);					\
 | 
				
			||||||
 | 
						    (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev)	\
 | 
				
			||||||
 | 
						for ((var) = TAILQ_LAST((head), headname);			\
 | 
				
			||||||
 | 
						    (var) != TAILQ_END(head) && 				\
 | 
				
			||||||
 | 
						    ((prev) = TAILQ_PREV((var), headname, field), 1); (var) = (prev))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Tail queue functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#if defined(QUEUEDEBUG)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)			\
 | 
				
			||||||
 | 
						if ((head)->tqh_first &&					\
 | 
				
			||||||
 | 
						    (head)->tqh_first->field.tqe_prev != &(head)->tqh_first)	\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head),	\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)			\
 | 
				
			||||||
 | 
						if (*(head)->tqh_last != NULL)					\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head),	\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_OP(elm, field)					\
 | 
				
			||||||
 | 
						if ((elm)->field.tqe_next &&					\
 | 
				
			||||||
 | 
						    (elm)->field.tqe_next->field.tqe_prev !=			\
 | 
				
			||||||
 | 
						    &(elm)->field.tqe_next)					\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm),	\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);				\
 | 
				
			||||||
 | 
						if (*(elm)->field.tqe_prev != (elm))				\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm),	\
 | 
				
			||||||
 | 
							    __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field)			\
 | 
				
			||||||
 | 
						if ((elm)->field.tqe_next == NULL &&				\
 | 
				
			||||||
 | 
						    (head)->tqh_last != &(elm)->field.tqe_next)			\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d",\
 | 
				
			||||||
 | 
							    (head), (elm), __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)				\
 | 
				
			||||||
 | 
						(elm)->field.tqe_next = (void *)1L;				\
 | 
				
			||||||
 | 
						(elm)->field.tqe_prev = (void *)1L;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_OP(elm, field)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field)
 | 
				
			||||||
 | 
					#define	QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_INIT(head) do {						\
 | 
				
			||||||
 | 
						(head)->tqh_first = TAILQ_END(head);				\
 | 
				
			||||||
 | 
						(head)->tqh_last = &(head)->tqh_first;				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field)		\
 | 
				
			||||||
 | 
						if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head))\
 | 
				
			||||||
 | 
							(head)->tqh_first->field.tqe_prev =			\
 | 
				
			||||||
 | 
							    &(elm)->field.tqe_next;				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(head)->tqh_last = &(elm)->field.tqe_next;		\
 | 
				
			||||||
 | 
						(head)->tqh_first = (elm);					\
 | 
				
			||||||
 | 
						(elm)->field.tqe_prev = &(head)->tqh_first;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field)		\
 | 
				
			||||||
 | 
						(elm)->field.tqe_next = TAILQ_END(head);			\
 | 
				
			||||||
 | 
						(elm)->field.tqe_prev = (head)->tqh_last;			\
 | 
				
			||||||
 | 
						*(head)->tqh_last = (elm);					\
 | 
				
			||||||
 | 
						(head)->tqh_last = &(elm)->field.tqe_next;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_OP((listelm), field)				\
 | 
				
			||||||
 | 
						if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != 	\
 | 
				
			||||||
 | 
						    TAILQ_END(head))						\
 | 
				
			||||||
 | 
							(elm)->field.tqe_next->field.tqe_prev = 		\
 | 
				
			||||||
 | 
							    &(elm)->field.tqe_next;				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(head)->tqh_last = &(elm)->field.tqe_next;		\
 | 
				
			||||||
 | 
						(listelm)->field.tqe_next = (elm);				\
 | 
				
			||||||
 | 
						(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_OP((listelm), field)				\
 | 
				
			||||||
 | 
						(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
 | 
				
			||||||
 | 
						(elm)->field.tqe_next = (listelm);				\
 | 
				
			||||||
 | 
						*(listelm)->field.tqe_prev = (elm);				\
 | 
				
			||||||
 | 
						(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_REMOVE(head, elm, field) do {				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field)		\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_OP((elm), field)				\
 | 
				
			||||||
 | 
						if (((elm)->field.tqe_next) != TAILQ_END(head))			\
 | 
				
			||||||
 | 
							(elm)->field.tqe_next->field.tqe_prev = 		\
 | 
				
			||||||
 | 
							    (elm)->field.tqe_prev;				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(head)->tqh_last = (elm)->field.tqe_prev;		\
 | 
				
			||||||
 | 
						*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field);			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TAILQ_REPLACE(head, elm, elm2, field) do {                      \
 | 
				
			||||||
 | 
					        if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != 	\
 | 
				
			||||||
 | 
						    TAILQ_END(head))   						\
 | 
				
			||||||
 | 
					                (elm2)->field.tqe_next->field.tqe_prev =                \
 | 
				
			||||||
 | 
					                    &(elm2)->field.tqe_next;                            \
 | 
				
			||||||
 | 
					        else                                                            \
 | 
				
			||||||
 | 
					                (head)->tqh_last = &(elm2)->field.tqe_next;             \
 | 
				
			||||||
 | 
					        (elm2)->field.tqe_prev = (elm)->field.tqe_prev;                 \
 | 
				
			||||||
 | 
					        *(elm2)->field.tqe_prev = (elm2);                               \
 | 
				
			||||||
 | 
						QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field);			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_CONCAT(head1, head2, field) do {				\
 | 
				
			||||||
 | 
						if (!TAILQ_EMPTY(head2)) {					\
 | 
				
			||||||
 | 
							*(head1)->tqh_last = (head2)->tqh_first;		\
 | 
				
			||||||
 | 
							(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;	\
 | 
				
			||||||
 | 
							(head1)->tqh_last = (head2)->tqh_last;			\
 | 
				
			||||||
 | 
							TAILQ_INIT((head2));					\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Singly-linked Tail queue declarations.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	STAILQ_HEAD(name, type)						\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						struct type *stqh_first;	/* first element */		\
 | 
				
			||||||
 | 
						struct type **stqh_last;	/* addr of last next element */	\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ NULL, &(head).stqh_first }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_ENTRY(type)						\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						struct type *stqe_next;	/* next element */			\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Singly-linked Tail queue access methods.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	STAILQ_FIRST(head)	((head)->stqh_first)
 | 
				
			||||||
 | 
					#define	STAILQ_END(head)	NULL
 | 
				
			||||||
 | 
					#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
 | 
				
			||||||
 | 
					#define	STAILQ_EMPTY(head)	(STAILQ_FIRST(head) == STAILQ_END(head))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Singly-linked Tail queue functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	STAILQ_INIT(head) do {						\
 | 
				
			||||||
 | 
						(head)->stqh_first = NULL;					\
 | 
				
			||||||
 | 
						(head)->stqh_last = &(head)->stqh_first;				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
 | 
				
			||||||
 | 
						if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)	\
 | 
				
			||||||
 | 
							(head)->stqh_last = &(elm)->field.stqe_next;		\
 | 
				
			||||||
 | 
						(head)->stqh_first = (elm);					\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
 | 
				
			||||||
 | 
						(elm)->field.stqe_next = NULL;					\
 | 
				
			||||||
 | 
						*(head)->stqh_last = (elm);					\
 | 
				
			||||||
 | 
						(head)->stqh_last = &(elm)->field.stqe_next;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
 | 
				
			||||||
 | 
						if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
 | 
				
			||||||
 | 
							(head)->stqh_last = &(elm)->field.stqe_next;		\
 | 
				
			||||||
 | 
						(listelm)->field.stqe_next = (elm);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_REMOVE_HEAD(head, field) do {				\
 | 
				
			||||||
 | 
						if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
 | 
				
			||||||
 | 
							(head)->stqh_last = &(head)->stqh_first;			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_REMOVE(head, elm, type, field) do {			\
 | 
				
			||||||
 | 
						if ((head)->stqh_first == (elm)) {				\
 | 
				
			||||||
 | 
							STAILQ_REMOVE_HEAD((head), field);			\
 | 
				
			||||||
 | 
						} else {							\
 | 
				
			||||||
 | 
							struct type *curelm = (head)->stqh_first;		\
 | 
				
			||||||
 | 
							while (curelm->field.stqe_next != (elm))			\
 | 
				
			||||||
 | 
								curelm = curelm->field.stqe_next;		\
 | 
				
			||||||
 | 
							if ((curelm->field.stqe_next =				\
 | 
				
			||||||
 | 
								curelm->field.stqe_next->field.stqe_next) == NULL) \
 | 
				
			||||||
 | 
								    (head)->stqh_last = &(curelm)->field.stqe_next; \
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_FOREACH(var, head, field)				\
 | 
				
			||||||
 | 
						for ((var) = ((head)->stqh_first);				\
 | 
				
			||||||
 | 
							(var);							\
 | 
				
			||||||
 | 
							(var) = ((var)->field.stqe_next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_FOREACH_SAFE(var, head, field, tvar)			\
 | 
				
			||||||
 | 
						for ((var) = STAILQ_FIRST((head));				\
 | 
				
			||||||
 | 
						    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);		\
 | 
				
			||||||
 | 
						    (var) = (tvar))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_CONCAT(head1, head2) do {				\
 | 
				
			||||||
 | 
						if (!STAILQ_EMPTY((head2))) {					\
 | 
				
			||||||
 | 
							*(head1)->stqh_last = (head2)->stqh_first;		\
 | 
				
			||||||
 | 
							(head1)->stqh_last = (head2)->stqh_last;		\
 | 
				
			||||||
 | 
							STAILQ_INIT((head2));					\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	STAILQ_LAST(head, type, field)					\
 | 
				
			||||||
 | 
						(STAILQ_EMPTY((head)) ?						\
 | 
				
			||||||
 | 
							NULL :							\
 | 
				
			||||||
 | 
						        ((struct type *)(void *)				\
 | 
				
			||||||
 | 
							((char *)((head)->stqh_last) - offsetof(struct type, field))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _KERNEL
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Circular queue definitions. Do not use. We still keep the macros
 | 
				
			||||||
 | 
					 * for compatibility but because of pointer aliasing issues their use
 | 
				
			||||||
 | 
					 * is discouraged!
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * __launder_type():  We use this ugly hack to work around the the compiler
 | 
				
			||||||
 | 
					 * noticing that two types may not alias each other and elide tests in code.
 | 
				
			||||||
 | 
					 * We hit this in the CIRCLEQ macros when comparing 'struct name *' and
 | 
				
			||||||
 | 
					 * 'struct type *' (see CIRCLEQ_HEAD()).  Modern compilers (such as GCC
 | 
				
			||||||
 | 
					 * 4.8) declare these comparisons as always false, causing the code to
 | 
				
			||||||
 | 
					 * not run as designed.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This hack is only to be used for comparisons and thus can be fully const.
 | 
				
			||||||
 | 
					 * Do not use for assignment.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If we ever choose to change the ABI of the CIRCLEQ macros, we could fix
 | 
				
			||||||
 | 
					 * this by changing the head/tail sentinal values, but see the note above
 | 
				
			||||||
 | 
					 * this one.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static __inline const void * __launder_type(const void *);
 | 
				
			||||||
 | 
					static __inline const void *
 | 
				
			||||||
 | 
					__launder_type(const void *__x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__asm __volatile("" : "+r" (__x));
 | 
				
			||||||
 | 
						return __x;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(QUEUEDEBUG)
 | 
				
			||||||
 | 
					#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field)				\
 | 
				
			||||||
 | 
						if ((head)->cqh_first != CIRCLEQ_ENDC(head) &&			\
 | 
				
			||||||
 | 
						    (head)->cqh_first->field.cqe_prev != CIRCLEQ_ENDC(head))	\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("CIRCLEQ head forw %p %s:%d", (head),	\
 | 
				
			||||||
 | 
							      __FILE__, __LINE__);				\
 | 
				
			||||||
 | 
						if ((head)->cqh_last != CIRCLEQ_ENDC(head) &&			\
 | 
				
			||||||
 | 
						    (head)->cqh_last->field.cqe_next != CIRCLEQ_ENDC(head))	\
 | 
				
			||||||
 | 
							QUEUEDEBUG_ABORT("CIRCLEQ head back %p %s:%d", (head),	\
 | 
				
			||||||
 | 
							      __FILE__, __LINE__);
 | 
				
			||||||
 | 
					#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field)			\
 | 
				
			||||||
 | 
						if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) {		\
 | 
				
			||||||
 | 
							if ((head)->cqh_last != (elm))				\
 | 
				
			||||||
 | 
								QUEUEDEBUG_ABORT("CIRCLEQ elm last %p %s:%d",	\
 | 
				
			||||||
 | 
								    (elm), __FILE__, __LINE__);			\
 | 
				
			||||||
 | 
						} else {							\
 | 
				
			||||||
 | 
							if ((elm)->field.cqe_next->field.cqe_prev != (elm))	\
 | 
				
			||||||
 | 
								QUEUEDEBUG_ABORT("CIRCLEQ elm forw %p %s:%d",	\
 | 
				
			||||||
 | 
								    (elm), __FILE__, __LINE__);			\
 | 
				
			||||||
 | 
						}								\
 | 
				
			||||||
 | 
						if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) {		\
 | 
				
			||||||
 | 
							if ((head)->cqh_first != (elm))				\
 | 
				
			||||||
 | 
								QUEUEDEBUG_ABORT("CIRCLEQ elm first %p %s:%d",	\
 | 
				
			||||||
 | 
								    (elm), __FILE__, __LINE__);			\
 | 
				
			||||||
 | 
						} else {							\
 | 
				
			||||||
 | 
							if ((elm)->field.cqe_prev->field.cqe_next != (elm))	\
 | 
				
			||||||
 | 
								QUEUEDEBUG_ABORT("CIRCLEQ elm prev %p %s:%d",	\
 | 
				
			||||||
 | 
								    (elm), __FILE__, __LINE__);			\
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field)			\
 | 
				
			||||||
 | 
						(elm)->field.cqe_next = (void *)1L;				\
 | 
				
			||||||
 | 
						(elm)->field.cqe_prev = (void *)1L;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field)
 | 
				
			||||||
 | 
					#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field)
 | 
				
			||||||
 | 
					#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_HEAD(name, type)					\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						struct type *cqh_first;		/* first element */		\
 | 
				
			||||||
 | 
						struct type *cqh_last;		/* last element */		\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_ENTRY(type)						\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						struct type *cqe_next;		/* next element */		\
 | 
				
			||||||
 | 
						struct type *cqe_prev;		/* previous element */		\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Circular queue functions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	CIRCLEQ_INIT(head) do {						\
 | 
				
			||||||
 | 
						(head)->cqh_first = CIRCLEQ_END(head);				\
 | 
				
			||||||
 | 
						(head)->cqh_last = CIRCLEQ_END(head);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_HEAD((head), field)				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field)		\
 | 
				
			||||||
 | 
						(elm)->field.cqe_next = (listelm)->field.cqe_next;		\
 | 
				
			||||||
 | 
						(elm)->field.cqe_prev = (listelm);				\
 | 
				
			||||||
 | 
						if ((listelm)->field.cqe_next == CIRCLEQ_ENDC(head))		\
 | 
				
			||||||
 | 
							(head)->cqh_last = (elm);				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(listelm)->field.cqe_next->field.cqe_prev = (elm);	\
 | 
				
			||||||
 | 
						(listelm)->field.cqe_next = (elm);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_HEAD((head), field)				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field)		\
 | 
				
			||||||
 | 
						(elm)->field.cqe_next = (listelm);				\
 | 
				
			||||||
 | 
						(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\
 | 
				
			||||||
 | 
						if ((listelm)->field.cqe_prev == CIRCLEQ_ENDC(head))		\
 | 
				
			||||||
 | 
							(head)->cqh_first = (elm);				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(listelm)->field.cqe_prev->field.cqe_next = (elm);	\
 | 
				
			||||||
 | 
						(listelm)->field.cqe_prev = (elm);				\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_HEAD((head), field)				\
 | 
				
			||||||
 | 
						(elm)->field.cqe_next = (head)->cqh_first;			\
 | 
				
			||||||
 | 
						(elm)->field.cqe_prev = CIRCLEQ_END(head);			\
 | 
				
			||||||
 | 
						if ((head)->cqh_last == CIRCLEQ_ENDC(head))			\
 | 
				
			||||||
 | 
							(head)->cqh_last = (elm);				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(head)->cqh_first->field.cqe_prev = (elm);		\
 | 
				
			||||||
 | 
						(head)->cqh_first = (elm);					\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_HEAD((head), field)				\
 | 
				
			||||||
 | 
						(elm)->field.cqe_next = CIRCLEQ_END(head);			\
 | 
				
			||||||
 | 
						(elm)->field.cqe_prev = (head)->cqh_last;			\
 | 
				
			||||||
 | 
						if ((head)->cqh_first == CIRCLEQ_ENDC(head))			\
 | 
				
			||||||
 | 
							(head)->cqh_first = (elm);				\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(head)->cqh_last->field.cqe_next = (elm);		\
 | 
				
			||||||
 | 
						(head)->cqh_last = (elm);					\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_REMOVE(head, elm, field) do {				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_HEAD((head), field)				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_ELM((head), (elm), field)			\
 | 
				
			||||||
 | 
						if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head))		\
 | 
				
			||||||
 | 
							(head)->cqh_last = (elm)->field.cqe_prev;		\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(elm)->field.cqe_next->field.cqe_prev =			\
 | 
				
			||||||
 | 
							    (elm)->field.cqe_prev;				\
 | 
				
			||||||
 | 
						if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head))		\
 | 
				
			||||||
 | 
							(head)->cqh_first = (elm)->field.cqe_next;		\
 | 
				
			||||||
 | 
						else								\
 | 
				
			||||||
 | 
							(elm)->field.cqe_prev->field.cqe_next =			\
 | 
				
			||||||
 | 
							    (elm)->field.cqe_next;				\
 | 
				
			||||||
 | 
						QUEUEDEBUG_CIRCLEQ_POSTREMOVE((elm), field)			\
 | 
				
			||||||
 | 
					} while (/*CONSTCOND*/0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_FOREACH(var, head, field)				\
 | 
				
			||||||
 | 
						for ((var) = ((head)->cqh_first);				\
 | 
				
			||||||
 | 
							(var) != CIRCLEQ_ENDC(head);				\
 | 
				
			||||||
 | 
							(var) = ((var)->field.cqe_next))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CIRCLEQ_FOREACH_REVERSE(var, head, field)			\
 | 
				
			||||||
 | 
						for ((var) = ((head)->cqh_last);				\
 | 
				
			||||||
 | 
							(var) != CIRCLEQ_ENDC(head);				\
 | 
				
			||||||
 | 
							(var) = ((var)->field.cqe_prev))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Circular queue access methods.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)
 | 
				
			||||||
 | 
					#define	CIRCLEQ_LAST(head)		((head)->cqh_last)
 | 
				
			||||||
 | 
					/* For comparisons */
 | 
				
			||||||
 | 
					#define	CIRCLEQ_ENDC(head)		(__launder_type(head))
 | 
				
			||||||
 | 
					/* For assignments */
 | 
				
			||||||
 | 
					#define	CIRCLEQ_END(head)		((void *)(head))
 | 
				
			||||||
 | 
					#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)
 | 
				
			||||||
 | 
					#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)
 | 
				
			||||||
 | 
					#define	CIRCLEQ_EMPTY(head)						\
 | 
				
			||||||
 | 
					    (CIRCLEQ_FIRST(head) == CIRCLEQ_ENDC(head))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CIRCLEQ_LOOP_NEXT(head, elm, field)				\
 | 
				
			||||||
 | 
						(((elm)->field.cqe_next == CIRCLEQ_ENDC(head))			\
 | 
				
			||||||
 | 
						    ? ((head)->cqh_first)					\
 | 
				
			||||||
 | 
						    : (elm->field.cqe_next))
 | 
				
			||||||
 | 
					#define CIRCLEQ_LOOP_PREV(head, elm, field)				\
 | 
				
			||||||
 | 
						(((elm)->field.cqe_prev == CIRCLEQ_ENDC(head))			\
 | 
				
			||||||
 | 
						    ? ((head)->cqh_last)					\
 | 
				
			||||||
 | 
						    : (elm->field.cqe_prev))
 | 
				
			||||||
 | 
					#endif /* !_KERNEL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif	/* !_SYS_QUEUE_H_ */
 | 
				
			||||||
@@ -48,7 +48,10 @@
 | 
				
			|||||||
# endif
 | 
					# endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__BEGIN_DECLS
 | 
					/* __BEGIN_DECLS */
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*! @brief Color types to use */
 | 
					/*! @brief Color types to use */
 | 
				
			||||||
typedef enum
 | 
					typedef enum
 | 
				
			||||||
@@ -140,5 +143,9 @@ void eoutdentv(void);
 | 
				
			|||||||
/*! @brief Prefix each einfo line with something */
 | 
					/*! @brief Prefix each einfo line with something */
 | 
				
			||||||
void eprefix(const char * EINFO_RESTRICT);
 | 
					void eprefix(const char * EINFO_RESTRICT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__END_DECLS
 | 
					/* __END_DECLS */
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,9 +28,10 @@
 | 
				
			|||||||
 * SUCH DAMAGE.
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "librc.h"
 | 
					#include "librc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__linux__) || defined (__GLIBC__)
 | 
					#if defined(__linux__) || (defined (__FreeBSD_kernel__) && defined(__GLIBC__))
 | 
				
			||||||
static bool
 | 
					static bool
 | 
				
			||||||
pid_is_exec(pid_t pid, const char *exec)
 | 
					pid_is_exec(pid_t pid, const char *exec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -553,16 +554,28 @@ rc_service_daemons_crashed(const char *service)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		fclose(fp);
 | 
							fclose(fp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							char *ch_root = rc_service_value_get(basename_c(service), "chroot");
 | 
				
			||||||
 | 
							char *spidfile = pidfile;
 | 
				
			||||||
 | 
							if (ch_root && pidfile) {
 | 
				
			||||||
 | 
								spidfile = xmalloc(strlen(ch_root) + strlen(pidfile) + 1);
 | 
				
			||||||
 | 
								strcpy(spidfile, ch_root);
 | 
				
			||||||
 | 
								strcat(spidfile, pidfile);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pid = 0;
 | 
							pid = 0;
 | 
				
			||||||
		if (pidfile) {
 | 
							if (spidfile) {
 | 
				
			||||||
			retval = true;
 | 
								retval = true;
 | 
				
			||||||
			if ((fp = fopen(pidfile, "r"))) {
 | 
								if ((fp = fopen(spidfile, "r"))) {
 | 
				
			||||||
				if (fscanf(fp, "%d", &pid) == 1)
 | 
									if (fscanf(fp, "%d", &pid) == 1)
 | 
				
			||||||
					retval = false;
 | 
										retval = false;
 | 
				
			||||||
				fclose(fp);
 | 
									fclose(fp);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			free(pidfile);
 | 
								free(spidfile);
 | 
				
			||||||
			pidfile = NULL;
 | 
								spidfile = NULL;
 | 
				
			||||||
 | 
								if (ch_root) {
 | 
				
			||||||
 | 
									free(pidfile);
 | 
				
			||||||
 | 
									pidfile = NULL;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* We have the pid, so no need to match
 | 
								/* We have the pid, so no need to match
 | 
				
			||||||
			   on exec or name */
 | 
								   on exec or name */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <sys/utsname.h>
 | 
					#include <sys/utsname.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "librc.h"
 | 
					#include "librc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GENDEP          RC_LIBEXECDIR "/sh/gendepends.sh"
 | 
					#define GENDEP          RC_LIBEXECDIR "/sh/gendepends.sh"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@
 | 
				
			|||||||
 * SUCH DAMAGE.
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "librc.h"
 | 
					#include "librc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool
 | 
					bool
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@
 | 
				
			|||||||
 * SUCH DAMAGE.
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "librc.h"
 | 
					#include "librc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RC_STRINGLIST *
 | 
					RC_STRINGLIST *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
					const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "librc.h"
 | 
					#include "librc.h"
 | 
				
			||||||
#ifdef __FreeBSD__
 | 
					#ifdef __FreeBSD__
 | 
				
			||||||
#  include <sys/sysctl.h>
 | 
					#  include <sys/sysctl.h>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,11 +57,13 @@
 | 
				
			|||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BSD
 | 
					#if defined(BSD) && !defined(__GNU__)
 | 
				
			||||||
#include <sys/param.h>
 | 
					#include <sys/param.h>
 | 
				
			||||||
#include <sys/user.h>
 | 
					#include <sys/user.h>
 | 
				
			||||||
#include <sys/sysctl.h>
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
#include <kvm.h>
 | 
					#include <kvm.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,11 +27,13 @@
 | 
				
			|||||||
#define __RC_H__
 | 
					#define __RC_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
#include <sys/queue.h>
 | 
					 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__BEGIN_DECLS
 | 
					/* __BEGIN_DECLS */
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RC_PREFIX "@PREFIX@"
 | 
					#define RC_PREFIX "@PREFIX@"
 | 
				
			||||||
#define RC_SYSCONFDIR		"@SYSCONFDIR@"
 | 
					#define RC_SYSCONFDIR		"@SYSCONFDIR@"
 | 
				
			||||||
@@ -39,7 +41,8 @@ __BEGIN_DECLS
 | 
				
			|||||||
#define RC_LIBEXECDIR           "@LIBEXECDIR@"
 | 
					#define RC_LIBEXECDIR           "@LIBEXECDIR@"
 | 
				
			||||||
#if defined(PREFIX)
 | 
					#if defined(PREFIX)
 | 
				
			||||||
#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
					#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
				
			||||||
#elif defined(__linux__)
 | 
					#elif defined(__linux__) || (defined(__FreeBSD_kernel__) && \
 | 
				
			||||||
 | 
							defined(__GLIBC__)) || defined(__GNU__)
 | 
				
			||||||
#define RC_SVCDIR               "/run/openrc"
 | 
					#define RC_SVCDIR               "/run/openrc"
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
					#define RC_SVCDIR               RC_LIBEXECDIR "/init.d"
 | 
				
			||||||
@@ -74,6 +77,51 @@ __BEGIN_DECLS
 | 
				
			|||||||
#  define RC_LOCAL_CONFDIR      RC_LOCAL_PREFIX "/etc/conf.d"
 | 
					#  define RC_LOCAL_CONFDIR      RC_LOCAL_PREFIX "/etc/conf.d"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _SYS_QUEUE_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * The following are copied directly from our imported queue.h.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * List definitions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	LIST_HEAD(name, type)						\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						struct type *lh_first;	/* first element */			\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ NULL }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	LIST_ENTRY(type)						\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						struct type *le_next;	/* next element */			\
 | 
				
			||||||
 | 
						struct type **le_prev;	/* address of previous next element */	\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Tail queue definitions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define	_TAILQ_HEAD(name, type, qual)					\
 | 
				
			||||||
 | 
					struct name {								\
 | 
				
			||||||
 | 
						qual type *tqh_first;		/* first element */		\
 | 
				
			||||||
 | 
						qual type *qual *tqh_last;	/* addr of last next element */	\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#define TAILQ_HEAD(name, type)	_TAILQ_HEAD(name, struct type,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	TAILQ_HEAD_INITIALIZER(head)					\
 | 
				
			||||||
 | 
						{ TAILQ_END(head), &(head).tqh_first }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	_TAILQ_ENTRY(type, qual)					\
 | 
				
			||||||
 | 
					struct {								\
 | 
				
			||||||
 | 
						qual type *tqe_next;		/* next element */		\
 | 
				
			||||||
 | 
						qual type *qual *tqe_prev;	/* address of previous next element */\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#define TAILQ_ENTRY(type)	_TAILQ_ENTRY(struct type,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* _SYS_QUEUE_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* A doubly linked list using queue(3) for ease of use */
 | 
					/* A doubly linked list using queue(3) for ease of use */
 | 
				
			||||||
typedef struct rc_string {
 | 
					typedef struct rc_string {
 | 
				
			||||||
	char *value;
 | 
						char *value;
 | 
				
			||||||
@@ -563,5 +611,9 @@ bool rc_getfile(const char *, char **, size_t *);
 | 
				
			|||||||
 * we have our own */
 | 
					 * we have our own */
 | 
				
			||||||
ssize_t rc_getline(char **, size_t *, FILE *);
 | 
					ssize_t rc_getline(char **, size_t *, FILE *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__END_DECLS
 | 
					/* __END_DECLS */
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@
 | 
				
			|||||||
 * SUCH DAMAGE.
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int checkpath(int, char **);
 | 
					int checkpath(int, char **);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,6 +70,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,11 +35,12 @@
 | 
				
			|||||||
#  include <sys/ucred.h>
 | 
					#  include <sys/ucred.h>
 | 
				
			||||||
#  include <sys/mount.h>
 | 
					#  include <sys/mount.h>
 | 
				
			||||||
#  define F_FLAGS f_flags
 | 
					#  define F_FLAGS f_flags
 | 
				
			||||||
#elif defined(BSD)
 | 
					#elif defined(BSD) && !defined(__GNU__)
 | 
				
			||||||
#  include <sys/statvfs.h>
 | 
					#  include <sys/statvfs.h>
 | 
				
			||||||
#  define statfs statvfs
 | 
					#  define statfs statvfs
 | 
				
			||||||
#  define F_FLAGS f_flag
 | 
					#  define F_FLAGS f_flag
 | 
				
			||||||
#elif defined (__linux__) || defined (__GLIBC__)
 | 
					#elif defined (__linux__) || (defined(__FreeBSD_kernel__) && \
 | 
				
			||||||
 | 
							defined(__GLIBC__)) || defined(__GNU__)
 | 
				
			||||||
#  include <mntent.h>
 | 
					#  include <mntent.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,6 +54,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -168,7 +170,7 @@ process_mount(RC_STRINGLIST *list, struct args *args,
 | 
				
			|||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BSD
 | 
					#if defined(BSD) && !defined(__GNU__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Translate the mounted options to english
 | 
					/* Translate the mounted options to english
 | 
				
			||||||
 * This is taken directly from FreeBSD mount.c */
 | 
					 * This is taken directly from FreeBSD mount.c */
 | 
				
			||||||
@@ -265,7 +267,8 @@ find_mounts(struct args *args)
 | 
				
			|||||||
	return list;
 | 
						return list;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#elif defined (__linux__) || defined (__GLIBC__)
 | 
					#elif defined (__linux__) || (defined (__FreeBSD_kernel__) && \
 | 
				
			||||||
 | 
							defined(__GLIBC__))
 | 
				
			||||||
static struct mntent *
 | 
					static struct mntent *
 | 
				
			||||||
getmntfile(const char *file)
 | 
					getmntfile(const char *file)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,6 +46,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,7 +44,7 @@
 | 
				
			|||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__linux__) || defined(__GLIBC__)
 | 
					#if defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
 | 
				
			||||||
#  include <pty.h>
 | 
					#  include <pty.h>
 | 
				
			||||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
 | 
					#elif defined(__NetBSD__) || defined(__OpenBSD__)
 | 
				
			||||||
#  include <util.h>
 | 
					#  include <util.h>
 | 
				
			||||||
@@ -54,6 +54,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
#include "rc-logger.h"
 | 
					#include "rc-logger.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,7 @@
 | 
				
			|||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
#include "version.h"
 | 
					#include "version.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,7 @@
 | 
				
			|||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
#include "rc-plugin.h"
 | 
					#include "rc-plugin.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,7 @@
 | 
				
			|||||||
#include <selinux/label.h>
 | 
					#include <selinux/label.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
#include "rc-plugin.h"
 | 
					#include "rc-plugin.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,6 +36,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -57,7 +58,7 @@ static const struct option longopts[] = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
static const char * const longopts_help[] = {
 | 
					static const char * const longopts_help[] = {
 | 
				
			||||||
	"tests if the service exists or not",
 | 
						"tests if the service exists or not",
 | 
				
			||||||
	"if the service exsits then run the command",
 | 
						"if the service exists then run the command",
 | 
				
			||||||
	"list all available services",
 | 
						"list all available services",
 | 
				
			||||||
	"resolve the service name to an init script",
 | 
						"resolve the service name to an init script",
 | 
				
			||||||
	longopts_help_COMMON
 | 
						longopts_help_COMMON
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,6 +36,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,6 +39,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,7 @@ const char rc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-logger.h"
 | 
					#include "rc-logger.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,8 @@
 | 
				
			|||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__linux__) || defined(__GLIBC__)
 | 
					#if defined(__linux__) || (defined(__FreeBSD_kernel__) && \
 | 
				
			||||||
 | 
							defined(__GLIBC__))
 | 
				
			||||||
#  include <pty.h>
 | 
					#  include <pty.h>
 | 
				
			||||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
 | 
					#elif defined(__NetBSD__) || defined(__OpenBSD__)
 | 
				
			||||||
#  include <util.h>
 | 
					#  include <util.h>
 | 
				
			||||||
@@ -61,6 +62,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
#include "rc-plugin.h"
 | 
					#include "rc-plugin.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,18 +74,10 @@ static struct pam_conv conv = { NULL, NULL};
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "builtins.h"
 | 
					#include "builtins.h"
 | 
				
			||||||
#include "einfo.h"
 | 
					#include "einfo.h"
 | 
				
			||||||
 | 
					#include "queue.h"
 | 
				
			||||||
#include "rc.h"
 | 
					#include "rc.h"
 | 
				
			||||||
#include "rc-misc.h"
 | 
					#include "rc-misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Some libc implementations don't define this */
 | 
					 | 
				
			||||||
#ifndef LIST_FOREACH_SAFE
 | 
					 | 
				
			||||||
#define	LIST_FOREACH_SAFE(var, head, field, tvar)			      \
 | 
					 | 
				
			||||||
	for ((var) = LIST_FIRST((head));				      \
 | 
					 | 
				
			||||||
	     (var) && ((tvar) = LIST_NEXT((var), field), 1);		      \
 | 
					 | 
				
			||||||
	     (var) = (tvar))
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct scheduleitem
 | 
					typedef struct scheduleitem
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	enum
 | 
						enum
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user