From 3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41 Mon Sep 17 00:00:00 2001 From: Jerry Jelinek Date: Thu, 15 Oct 2015 16:26:52 -0700 Subject: 6342 want signalfd support Reviewed by: Patrick Mooney Reviewed by: Robert Mustacchi Reviewed by: Igor Kozhukhov Reviewed by: Garrett D'Amore Approved by: Dan McDonald --- usr/src/lib/libc/amd64/Makefile | 1 + usr/src/lib/libc/i386/Makefile.com | 1 + usr/src/lib/libc/port/mapfile-vers | 5 +++ usr/src/lib/libc/port/sys/signalfd.c | 60 ++++++++++++++++++++++++++++++++++++ usr/src/lib/libc/sparc/Makefile.com | 1 + 5 files changed, 68 insertions(+) create mode 100644 usr/src/lib/libc/port/sys/signalfd.c (limited to 'usr/src/lib/libc') 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 +#include +#include +#include +#include + +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 \ -- cgit v1.2.3