From 74fa73bac6e4a151a8423e76efc3b1f2e3262ade Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 1 Nov 2007 18:03:36 +0000 Subject: [PATCH] Patch by Vasilis Kaoutsis: Implemented sigignore(). Small changes by myself. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22789 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/posix/signal.h | 1 + src/system/libroot/posix/signal/Jamfile | 1 + src/system/libroot/posix/signal/sigignore.cpp | 37 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 src/system/libroot/posix/signal/sigignore.cpp diff --git a/headers/posix/signal.h b/headers/posix/signal.h index 8ef1e9a575..70b139d3b5 100644 --- a/headers/posix/signal.h +++ b/headers/posix/signal.h @@ -163,6 +163,7 @@ int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signo); int sigdelset(sigset_t *set, int signo); int sigismember(const sigset_t *set, int signo); +int sigignore(int signo); const char *strsignal(int sig); diff --git a/src/system/libroot/posix/signal/Jamfile b/src/system/libroot/posix/signal/Jamfile index f3fffb2ee3..02d491b617 100644 --- a/src/system/libroot/posix/signal/Jamfile +++ b/src/system/libroot/posix/signal/Jamfile @@ -10,6 +10,7 @@ MergeObject posix_signal.o : set_signal_stack.c sigaction.c sigaltstack.c + sigignore.cpp signal.c sigpending.c sigprocmask.c diff --git a/src/system/libroot/posix/signal/sigignore.cpp b/src/system/libroot/posix/signal/sigignore.cpp new file mode 100644 index 0000000000..40313868fb --- /dev/null +++ b/src/system/libroot/posix/signal/sigignore.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2007, Vasilis Kaoutsis, kaoutsis@sch.gr + * Distributed under the terms of the MIT License. + */ + + +#include +#include + +#include + + +int +sigignore(int signal) +{ + // check for invalid signals or for signals + // that can not be ignored (SIGKILL, SIGSTOP) + if (signal <= 0 || signal >= NSIG || signal == SIGKILL + || signal == SIGSTOP) { + errno = EINVAL; + return -1; + } + + struct sigaction ignoreSignalAction; + // create an action to ignore the signal + + // request that the signal will be ignored + // by the handler of the action + ignoreSignalAction.sa_handler = SIG_IGN; + ignoreSignalAction.sa_flags = 0; + + // In case of SIGCHLD the specification requires SA_NOCLDWAIT behavior. + if (signal == SIGCHLD) + ignoreSignalAction.sa_flags |= SA_NOCLDWAIT; + + return sigaction(signal, &ignoreSignalAction, NULL); +}