Compare commits
33 Commits
0.34.7
...
openrc-0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9f6e2a6c8 | ||
|
|
e1a4aef3e5 | ||
|
|
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.4
|
||||||
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"
|
||||||
@@ -62,14 +47,7 @@ stop()
|
|||||||
eindent
|
eindent
|
||||||
fs=
|
fs=
|
||||||
for x in $net_fs_list $extra_net_fs_list; do
|
for x in $net_fs_list $extra_net_fs_list; do
|
||||||
case "$x" in
|
fs="$fs${fs:+|}$x"
|
||||||
nfs|nfs4)
|
|
||||||
continue
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
fs="$fs${fs:+|}$x"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
done
|
||||||
[ -n "$fs" ] && fs="^($fs)$"
|
[ -n "$fs" ] && fs="^($fs)$"
|
||||||
do_unmount umount ${fs:+--fstype-regex} $fs --netdev
|
do_unmount umount ${fs:+--fstype-regex} $fs --netdev
|
||||||
|
|||||||
@@ -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,24 +213,28 @@ 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