summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libc/amd64/Makefile1
-rw-r--r--usr/src/lib/libc/i386/Makefile.com1
-rw-r--r--usr/src/lib/libc/port/mapfile-vers5
-rw-r--r--usr/src/lib/libc/port/sys/signalfd.c60
-rw-r--r--usr/src/lib/libc/sparc/Makefile.com1
5 files changed, 68 insertions, 0 deletions
diff --git a/usr/src/lib/libc/amd64/Makefile b/usr/src/lib/libc/amd64/Makefile
index dbda6c0c31..a968fa45f7 100644
--- a/usr/src/lib/libc/amd64/Makefile
+++ b/usr/src/lib/libc/amd64/Makefile
@@ -902,6 +902,7 @@ PORTSYS= \
sidsys.o \
siginterrupt.o \
signal.o \
+ signalfd.o \
sigpending.o \
sigstack.o \
stat.o \
diff --git a/usr/src/lib/libc/i386/Makefile.com b/usr/src/lib/libc/i386/Makefile.com
index 4ebd6473a9..c0f74678f8 100644
--- a/usr/src/lib/libc/i386/Makefile.com
+++ b/usr/src/lib/libc/i386/Makefile.com
@@ -942,6 +942,7 @@ PORTSYS= \
sidsys.o \
siginterrupt.o \
signal.o \
+ signalfd.o \
sigpending.o \
sigstack.o \
stat.o \
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers
index f7f6e6a137..d62c86b364 100644
--- a/usr/src/lib/libc/port/mapfile-vers
+++ b/usr/src/lib/libc/port/mapfile-vers
@@ -93,6 +93,11 @@ $if _x86 && _ELF64
$add amd64
$endif
+SYMBOL_VERSION ILLUMOS_0.18 { # signalfd
+ protected:
+ signalfd;
+} ILLUMOS_0.17;
+
SYMBOL_VERSION ILLUMOS_0.17 { # glob(3C) LFS
$if lf64
protected:
diff --git a/usr/src/lib/libc/port/sys/signalfd.c b/usr/src/lib/libc/port/sys/signalfd.c
new file mode 100644
index 0000000000..0080c52bdf
--- /dev/null
+++ b/usr/src/lib/libc/port/sys/signalfd.c
@@ -0,0 +1,60 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2015, Joyent, Inc.
+ */
+
+#include <sys/signalfd.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+int
+signalfd(int fd, const sigset_t *mask, int flags)
+{
+ int origfd = fd;
+
+ if (fd == -1) {
+ int oflags = O_RDONLY;
+
+ if (flags & ~(SFD_NONBLOCK | SFD_CLOEXEC)) {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ if (flags & SFD_NONBLOCK)
+ oflags |= O_NONBLOCK;
+
+ if (flags & SFD_CLOEXEC)
+ oflags |= O_CLOEXEC;
+
+ if ((fd = open("/dev/signalfd", oflags)) < 0)
+ return (-1);
+ }
+
+ if (ioctl(fd, SIGNALFDIOC_MASK, mask) != 0) {
+ if (origfd == -1) {
+ int old = errno;
+ (void) close(fd);
+ errno = old;
+ }
+ /*
+ * Trying to modify an existing sigfd so if this failed
+ * it's because it's not a valid fd or not a sigfd. ioctl
+ * returns the correct errno for these cases.
+ */
+ return (-1);
+ }
+
+ return (fd);
+}
diff --git a/usr/src/lib/libc/sparc/Makefile.com b/usr/src/lib/libc/sparc/Makefile.com
index 2228bc848a..dc50cf3b38 100644
--- a/usr/src/lib/libc/sparc/Makefile.com
+++ b/usr/src/lib/libc/sparc/Makefile.com
@@ -976,6 +976,7 @@ PORTSYS= \
sidsys.o \
siginterrupt.o \
signal.o \
+ signalfd.o \
sigpending.o \
sigstack.o \
stat.o \