Compare commits

...

6 Commits

Author SHA1 Message Date
William Hubbs
900d54b0fc release openrc-0.6.8 2010-12-07 22:32:44 -06:00
William Hubbs
84750f5722 bug 232347: fix netmount to respect _netdev option
The _netdev option in fstab on linux systems indicates
that a filesystem should only be mounted if the network is available.

This commit fixes netmount to support this.
2010-12-07 11:54:03 -06:00
Robin H. Johnson
f8f03bdbbf Bug #345281: If wpa_supplicant is built w/ USE=dbus, we need to start after DBus is up. 2010-12-06 02:54:21 +00:00
Robin Johnson
80d5f7d27b fix selinux context for rc-svcdir (bug #347503) 2010-12-03 23:49:34 -06:00
William Hubbs
449080e145 release openrc-0.6.7 2010-12-03 14:51:30 -06:00
Thomas Pfaff
062223a5df Avoid race condition in runscript (bug #319865)
Under normal conditions, runscript creates one child and waits for its
termination, which is signaled by a pipe write from the SIGCHLD
sighandler.

When running killprocs however more than one SIGHCLD signal is generated, at
least on all of my amd64 boxes running on real hardware and in vmware.

When the first SIGCHLD occurs svc_exec leaves the loop and closes the pipe.
Subsequent SIGCHLDs during the close can lead to a race condition and create an
EBADF error in the pipe write (pipe is closed but the file handle is still !=
-1).

We avoid this by blocking SIGHCHLD during the pipe close.
2010-12-03 14:01:28 -06:00
5 changed files with 50 additions and 9 deletions

View File

@@ -1,3 +1,3 @@
NAME= openrc
VERSION= 0.6.6
VERSION= 0.6.8
PKG= ${NAME}-${VERSION}

View File

@@ -43,7 +43,7 @@ start()
local myneed= myuse= pmap="portmap" nfsmounts=
[ -x @SYSCONFDIR@/init.d/rpcbind ] && pmap="rpcbind"
local x= fs=
local x= fs= rc=
for x in $net_fs_list; do
case "$x" in
nfs|nfs4)
@@ -65,7 +65,12 @@ start()
ebegin "Mounting network filesystems"
mount -at $fs
ewend $? "Could not mount all network filesystems"
rc=$?
if [ "$RC_UNAME" = Linux ]; then
mount -a -O _netdev
rc=$?
fi
ewend $rc "Could not mount all network filesystems"
return 0
}
@@ -93,5 +98,9 @@ stop()
retval=$?
eoutdent
if [ "$RC_UNAME" = Linux ]; then
umount -a -O _netdev
retval=$?
fi
eend $retval "Failed to unmount network filesystems"
}

View File

@@ -3,10 +3,14 @@
wpa_supplicant_depend()
{
if [ -x /usr/sbin/wpa_supplicant ]; then
program start /usr/sbin/wpa_supplicant
else
program start /sbin/wpa_supplicant
wpas=/usr/sbin/wpa_supplicant
[ -x ${wpas} ] || wpas=/sbin/wpa_supplicant
if [ -x ${wpas} ]; then
program start ${wpas}
# bug 345281: if wpa_supplicant is built w/ USE=dbus, we need to start
# dbus before we can start wpa_supplicant.
${wpas} -h |grep DBus -sq
[ $? -eq 0 ] && need dbus
fi
after macnet plug
before interface

View File

@@ -6,6 +6,17 @@
# This basically mounts $RC_SVCDIR as a ramdisk.
# The tricky part is finding something our kernel supports
# tmpfs and ramfs are easy, so force one or the other.
svcdir_restorecon()
{
local rc=0
if [ -x /usr/sbin/selinuxenabled -a -c /selinux/null ] &&
selinuxenabled; then
restorecon $RC_SVCDIR
rc=$?
fi
return $rc
}
mount_svcdir()
{
# mount from fstab if we can
@@ -16,8 +27,12 @@ mount_svcdir()
# Some buggy kernels report tmpfs even when not present :(
if grep -Eq "[[:space:]]+tmpfs$" /proc/filesystems; then
mount -n -t tmpfs $fsopts,mode=755,size=${svcsize}k \
rc-svcdir "$RC_SVCDIR" && return 0
local tmpfsopts="${fsopts},mode=755,size=${svcsize}k"
mount -n -t tmpfs $tmpfsopts rc-svcdir "$RC_SVCDIR"
if [ $? -eq 0 ]; then
svcdir_restorecon
[ $? -eq 0 ] && return 0
fi
fi
if grep -Eq "[[:space:]]+ramfs$" /proc/filesystems; then
@@ -38,6 +53,10 @@ mount_svcdir()
fi
mount -n -t "$fs" $fsopts rc-svcdir "$RC_SVCDIR"
if [ $? -eq 0 ]; then
svcdir_restorecon
[ $? -eq 0 ] && return 0
fi
}
. "$RC_LIBEXECDIR"/sh/functions.sh

View File

@@ -350,6 +350,8 @@ svc_exec(const char *arg1, const char *arg2)
size_t bytes;
bool prefixed = false;
int slave_tty;
sigset_t sigchldmask;
sigset_t oldmask;
/* Setup our signal pipe */
if (pipe(signal_pipe) == -1)
@@ -439,10 +441,17 @@ svc_exec(const char *arg1, const char *arg2)
}
free(buffer);
sigemptyset (&sigchldmask);
sigaddset (&sigchldmask, SIGCHLD);
sigprocmask (SIG_BLOCK, &sigchldmask, &oldmask);
close(signal_pipe[0]);
close(signal_pipe[1]);
signal_pipe[0] = signal_pipe[1] = -1;
sigprocmask (SIG_SETMASK, &oldmask, NULL);
if (master_tty >= 0) {
/* Why did we do this? */
/* signal (SIGWINCH, SIG_IGN); */