projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
cc11b42
)
fix signalfd not to ignore flags
author
Rich Felker
<dalias@aerifal.cx>
Mon, 8 Apr 2013 03:19:00 +0000
(23:19 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Mon, 8 Apr 2013 03:19:00 +0000
(23:19 -0400)
also include fallback code for broken kernels that don't support the
flags. as usual, the fallback has a race condition that can leak file
descriptors.
src/linux/signalfd.c
patch
|
blob
|
history
diff --git
a/src/linux/signalfd.c
b/src/linux/signalfd.c
index
94de362
..
da6bced
100644
(file)
--- a/
src/linux/signalfd.c
+++ b/
src/linux/signalfd.c
@@
-1,8
+1,19
@@
#include <sys/signalfd.h>
#include <signal.h>
#include <sys/signalfd.h>
#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
#include "syscall.h"
int signalfd(int fd, const sigset_t *sigs, int flags)
{
#include "syscall.h"
int signalfd(int fd, const sigset_t *sigs, int flags)
{
- return syscall(SYS_signalfd, fd, sigs, _NSIG/8);
+ int ret = __syscall(SYS_signalfd4, fd, sigs, _NSIG/8, flags);
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+ ret = __syscall(SYS_signalfd, fd, sigs, _NSIG/8);
+ if (ret >= 0) {
+ if (flags & SFD_CLOEXEC)
+ __syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
+ if (flags & SFD_NONBLOCK)
+ __syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK);
+ }
+ return __syscall_ret(ret);
}
}