diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-06-03 08:11:56 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-06-03 08:11:56 +0000 |
commit | 4cc4b30426c5e5a0ecf912791e3f27312438d10e (patch) | |
tree | 81c31f4bde953f135d9e63582b162c17cc173f10 /libc/signal | |
parent | 1f124eb0280a5009f1265a9dca49fdb0d95b845e (diff) |
- adds several config-options to allow for turning off certain features
like
o UCLIBC_HAS_GNU_ERROR
o UCLIBC_HAS_BSD_ERR
o UCLIBC_HAS_PTY
o UCLIBC_HAS_GETPT (1)
o UCLIBC_SYSCALL_STUBS
o UCLIBC_SYSCALL_STUB_WARNING
o UCLIBC_LINUX_SPECIFIC (2)
o UCLIBC_BSD_SPECIFIC (3)
o UCLIBC_NTP_LEGACY (4)
o UCLIBC_SV4_DEPRECATED (5)
o UCLIBC_HAVE_REALTIME (6)
o UCLIBC_HAVE_ADVANCED_REALTIME (7)
o UCLIBC_HAVE_EPOLL (8)
o UCLIBC_HAVE_XATTR (9)
o UCLIBC_HAVE_PROFILING (10)
(1) make non-standard getpt optional and implement standard posix_openpt
(2) fstatfs(), inotify_*(), ioperm(), iopl(), madvise(), modify_ldt(),
personality()
ppoll(), setresuid()
(3) mincore(), getdomainname(), setdomainname()
(4) ntp_adjtime(), ntp_gettime() aliases
(5) ustat() [use statfs(2) in your code instead]
(6) All marked as "(REALTIME)" in SUSv3
(7) All marked as "(ADVANCED REALTIME)" in SUSv3
(8) epoll_create(), epoll_ctl(), epoll_wait()
(9) all Extended Attributes
(10) helpers for gcc's -finstrument-functions
- Fixes _dl_exit()
- Implements sleep(3) for !UCLIBC_HAVE_REALTIME
- Implements usleep(3) for !UCLIBC_HAVE_REALTIME
- adds #warning about incorrect posix_fadvise{,64}()
- removes unused and unwanted uselib()
Net outcome is that an allnoconfig with HAVE_SHARED is now about 88k instead
of formerly 130k.
Diffstat (limited to 'libc/signal')
-rw-r--r-- | libc/signal/Makefile.in | 13 | ||||
-rw-r--r-- | libc/signal/sigwait.c | 62 |
2 files changed, 71 insertions, 4 deletions
diff --git a/libc/signal/Makefile.in b/libc/signal/Makefile.in index 8429d2ef6..4451d6622 100644 --- a/libc/signal/Makefile.in +++ b/libc/signal/Makefile.in @@ -6,10 +6,15 @@ # CSRC := allocrtsig.c killpg.c raise.c sigaction.c sigaddset.c sigandset.c \ - sigblock.c sigdelset.c sigempty.c sigfillset.c siggetmask.c sighold.c \ - sigignore.c sigintr.c sigisempty.c sigismem.c sigjmp.c signal.c \ - sigorset.c sigpause.c sigrelse.c sigset.c sigsetmask.c sigsetops.c \ - sysv_signal.c sigwait.c + sigblock.c sigdelset.c sigempty.c sigfillset.c siggetmask.c \ + sigintr.c sigisempty.c sigismem.c sigjmp.c signal.c \ + sigorset.c sigpause.c sigsetmask.c sigsetops.c sigwait.c +ifeq ($(UCLIBC_HAS_OBSOLETE_BSD_SIGNAL),y) +CSRC += sighold.c sigignore.c sigrelse.c sigset.c +endif +ifeq ($(UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL),y) +CSRC += sysv_signal.c +endif ifneq ($(strip $(ARCH_OBJS)),) CSRC := $(filter-out $(notdir $(ARCH_OBJS:.o=.c)),$(CSRC)) diff --git a/libc/signal/sigwait.c b/libc/signal/sigwait.c index 8ff2541a0..99832f809 100644 --- a/libc/signal/sigwait.c +++ b/libc/signal/sigwait.c @@ -22,6 +22,7 @@ #include <signal.h> #include <string.h> +#if defined __UCLIBC_HAS_REALTIME__ libc_hidden_proto(sigwaitinfo) int __sigwait (const sigset_t *set, int *sig) attribute_hidden; @@ -34,6 +35,67 @@ int __sigwait (const sigset_t *set, int *sig) } return 1; } +#else /* __UCLIBC_HAS_REALTIME__ */ +/* variant without REALTIME extensions */ +libc_hidden_proto(sigfillset) +libc_hidden_proto(sigaction) +libc_hidden_proto(sigsuspend) + +static int was_sig; /* obviously not thread-safe */ +static void ignore_signal(int sig) +{ + was_sig = sig; +} +int __sigwait (const sigset_t *set, int *sig) attribute_hidden; +int __sigwait (const sigset_t *set, int *sig) +{ + sigset_t tmp_mask; + struct sigaction saved[NSIG]; + struct sigaction action; + int save_errno; + int this; + + /* Prepare set. */ + sigfillset (&tmp_mask); + + /* Unblock all signals in the SET and register our nice handler. */ + action.sa_handler = ignore_signal; + action.sa_flags = 0; + sigfillset (&action.sa_mask); /* Block all signals for handler. */ + + /* Make sure we recognize error conditions by setting WAS_SIG to a + value which does not describe a legal signal number. */ + was_sig = -1; + + for (this = 1; this < NSIG; ++this) + if (__sigismember (set, this)) + { + /* Unblock this signal. */ + __sigdelset (&tmp_mask, this); + + /* Register temporary action handler. */ + if (sigaction (this, &action, &saved[this]) != 0) + goto restore_handler; + } + + /* Now we can wait for signals. */ + sigsuspend (&tmp_mask); + + restore_handler: + save_errno = errno; + + while (--this >= 1) + if (__sigismember (set, this)) + /* We ignore errors here since we must restore all handlers. */ + sigaction (this, &saved[this], NULL); + + __set_errno (save_errno); + + /* Store the result and return. */ + *sig = was_sig; + return was_sig == -1 ? -1 : 0; +} +#endif /* __UCLIBC_HAS_REALTIME__ */ libc_hidden_proto(sigwait) weak_alias(__sigwait,sigwait) libc_hidden_def(sigwait) |