diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-10-15 16:26:52 -0700 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2015-11-16 09:44:54 -0800 |
commit | 3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41 (patch) | |
tree | 7c90a77f5265b35f475932b34c933c63b5664a4e /usr/src/lib/libc/port/sys/signalfd.c | |
parent | f9eb9fdf196b6ed476e4ffc69cecd8b0da3cb7e7 (diff) | |
download | illumos-gate-3d729aecc03ea6ebb9bd5d56b8dccd24f57daa41.tar.gz |
6342 want signalfd support
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src/lib/libc/port/sys/signalfd.c')
-rw-r--r-- | usr/src/lib/libc/port/sys/signalfd.c | 60 |
1 files changed, 60 insertions, 0 deletions
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); +} |