From 8e36b7ce609efb05ecfba3e055a8eef7d8873a15 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Fri, 10 Oct 2008 17:10:26 +0000 Subject: - add signalfd() --- Makefile.in | 1 + include/sys/signalfd.h | 86 +++++++++++++++++++++++++++++++++++ libc/sysdeps/linux/common/Makefile.in | 4 +- libc/sysdeps/linux/common/signalfd.c | 38 ++++++++++++++++ 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 include/sys/signalfd.h create mode 100644 libc/sysdeps/linux/common/signalfd.c diff --git a/Makefile.in b/Makefile.in index e843a6133..e698c6466 100644 --- a/Makefile.in +++ b/Makefile.in @@ -314,6 +314,7 @@ ifneq ($(UCLIBC_LINUX_SPECIFIC),y) $(RM) $(PREFIX)$(DEVEL_PREFIX)include/sys/inotify.h $(RM) $(PREFIX)$(DEVEL_PREFIX)include/sys/perm.h $(RM) $(PREFIX)$(DEVEL_PREFIX)include/sys/personality.h + $(RM) $(PREFIX)$(DEVEL_PREFIX)include/sys/signalfd.h endif ifneq ($(UCLIBC_SV4_DEPRECATED),y) # Remove ustat.h since deprecated SV4 support was disabled upon request diff --git a/include/sys/signalfd.h b/include/sys/signalfd.h new file mode 100644 index 000000000..8cee17c5f --- /dev/null +++ b/include/sys/signalfd.h @@ -0,0 +1,86 @@ +/* Copyright (C) 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_SIGNALFD_H +#define _SYS_SIGNALFD_H 1 + +#define __need_sigset_t +#include +#include + + +struct signalfd_siginfo +{ + uint32_t ssi_signo; + int32_t ssi_errno; + int32_t ssi_code; + uint32_t ssi_pid; + uint32_t ssi_uid; + int32_t ssi_fd; + uint32_t ssi_tid; + uint32_t ssi_band; + uint32_t ssi_overrun; + uint32_t ssi_trapno; + int32_t ssi_status; + int32_t ssi_int; + uint64_t ssi_ptr; + uint64_t ssi_utime; + uint64_t ssi_stime; + uint64_t ssi_addr; + uint8_t __pad[48]; +}; + +/* Flags for signalfd. */ +#if defined __sparc__ || defined __sparc64__ +enum + { + SFD_CLOEXEC = 0x400000, +# define SFD_CLOEXEC SFD_CLOEXEC + SFD_NONBLOCK = 0x4000 +# define SFD_NONBLOCK SFD_NONBLOCK + }; + +#elif defined __alpha__ +enum + { + SFD_CLOEXEC = 010000000, +# define SFD_CLOEXEC SFD_CLOEXEC + SFD_NONBLOCK = 04 +# define SFD_NONBLOCK SFD_NONBLOCK + }; + +#else +enum + { + SFD_CLOEXEC = 02000000, +# define SFD_CLOEXEC SFD_CLOEXEC + SFD_NONBLOCK = 04000 +# define SFD_NONBLOCK SFD_NONBLOCK + }; +#endif + +__BEGIN_DECLS + +/* Request notification for delivery of signals in MASK to be + performed using descriptor FD.*/ +extern int signalfd (int __fd, const sigset_t *__mask, int __flags) + __nonnull ((2)) __THROW; + +__END_DECLS + +#endif /* sys/signalfd.h */ diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in index d9c3116e9..521e561fd 100644 --- a/libc/sysdeps/linux/common/Makefile.in +++ b/libc/sysdeps/linux/common/Makefile.in @@ -34,8 +34,8 @@ CSRC := $(filter-out inotify.c ioperm.c iopl.c madvise.c \ modify_ldt.c personality.c prctl.c readahead.c reboot.c \ remap_file_pages.c sched_getaffinity.c sched_setaffinity.c \ sendfile64.c sendfile.c setfsgid.c setfsuid.c setresuid.c \ - splice.c vmsplice.c tee.c swapoff.c swapon.c sync_file_range.c \ - sysctl.c sysinfo.c uselib.c vhangup.c,$(CSRC)) + splice.c vmsplice.c tee.c signalfd.c swapoff.c swapon.c \ + sync_file_range.c sysctl.c sysinfo.c uselib.c vhangup.c,$(CSRC)) endif ifneq ($(UCLIBC_BSD_SPECIFIC),y) diff --git a/libc/sysdeps/linux/common/signalfd.c b/libc/sysdeps/linux/common/signalfd.c new file mode 100644 index 000000000..e134a6fa9 --- /dev/null +++ b/libc/sysdeps/linux/common/signalfd.c @@ -0,0 +1,38 @@ +/* vi: set sw=4 ts=4: */ +/* + * signalfd() for uClibc + * + * Copyright (C) 2008 Bernhard Reutner-Fischer + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include +#include +#include + +#if defined __NR_signalfd4 +#define __NR___syscall_signalfd4 __NR_signalfd4 +static __inline__ _syscall4(int, __syscall_signalfd4, int, fd, + const sigset_t *, mask, size_t, sizemask, int, flags); +#elif defined __NR_signalfd +#define __NR___syscall_signalfd __NR_signalfd4 +static __inline__ _syscall3(int, __syscall_signalfd, int, fd, + const sigset_t *, mask, size_t, sizemask); +#endif + +int signalfd (int fd, const sigset_t *mask, int flags) +{ +#if defined __NR___syscall_signalfd4 + return __syscall_signalfd4(fd, mask, _NSIG / 8, flags); +#elif defined __NR___syscall_signalfd + if (flags != 0) { + __set_errno(EINVAL); + return 1; + } + return __syscall_signalfd(fd, mask, _NSIG / 8); +#elif defined __UCLIBC_HAS_STUBS__ + __set_errno(ENOSYS); + return -1; +#endif +} -- cgit v1.2.3