diff options
| -rw-r--r-- | Makefile.in | 1 | ||||
| -rw-r--r-- | include/sys/signalfd.h | 86 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/Makefile.in | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/signalfd.c | 38 | 
4 files changed, 127 insertions, 2 deletions
| 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 <signal.h> +#include <stdint.h> + + +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 <uclibc@uclibc.org> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include <sys/syscall.h> +#include <signal.h> +#include <sys/signalfd.h> + +#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 +} | 
