diff --git a/headers/private/kernel/ksignal.h b/headers/private/kernel/ksignal.h index 77a4840a15..733864d7d2 100644 --- a/headers/private/kernel/ksignal.h +++ b/headers/private/kernel/ksignal.h @@ -29,6 +29,7 @@ extern int _user_send_signal(pid_t tid, uint sig); extern int _user_sigprocmask(int how, const sigset_t *set, sigset_t *oldSet); extern int _user_sigaction(int sig, const struct sigaction *action, struct sigaction *oldAction); extern bigtime_t _user_set_alarm(bigtime_t time, uint32 mode); +extern int _user_sigsuspend(const sigset_t *mask); #ifdef __cplusplus } // extern "C" diff --git a/headers/private/kernel/syscalls.h b/headers/private/kernel/syscalls.h index 39e32864fc..44662dd478 100644 --- a/headers/private/kernel/syscalls.h +++ b/headers/private/kernel/syscalls.h @@ -99,10 +99,11 @@ extern status_t _kern_get_next_team_info(int32 *cookie, team_info *info); extern status_t _kern_get_team_usage_info(team_id team, int32 who, team_usage_info *info, size_t size); // signal functions -extern int _kern_send_signal(pid_t tid, uint sig); -extern int _kern_sigprocmask(int how, const sigset_t *set, sigset_t *oldSet); -extern int _kern_sigaction(int sig, const struct sigaction *action, struct sigaction *oldAction); +extern int _kern_send_signal(pid_t tid, uint sig); +extern int _kern_sigprocmask(int how, const sigset_t *set, sigset_t *oldSet); +extern int _kern_sigaction(int sig, const struct sigaction *action, struct sigaction *oldAction); extern bigtime_t _kern_set_alarm(bigtime_t time, uint32 mode); +extern int _kern_sigsuspend(const sigset_t *mask); // image functions extern image_id _kern_register_image(image_info *info, size_t size); diff --git a/src/system/kernel/signal.c b/src/system/kernel/signal.c index cab85f97ad..69b07d07c7 100644 --- a/src/system/kernel/signal.c +++ b/src/system/kernel/signal.c @@ -598,3 +598,16 @@ _user_sigaction(int signal, const struct sigaction *userAction, struct sigaction return status; } + +int +_user_sigsuspend(const sigset_t *mask) { + sigset_t set; + if (mask == NULL) + return B_BAD_VALUE; + + if (user_memcpy(&set, mask, sizeof(sigset_t)) < B_OK) + return B_BAD_ADDRESS; + + // Todo : implement + return EINVAL; +} diff --git a/src/system/libroot/posix/signal/Jamfile b/src/system/libroot/posix/signal/Jamfile index dfc599dafc..c1676924d8 100644 --- a/src/system/libroot/posix/signal/Jamfile +++ b/src/system/libroot/posix/signal/Jamfile @@ -8,6 +8,7 @@ KernelMergeObject posix_signal.o : signal.c sigprocmask.c sigset.c + sigsuspend.c strsignal.c : -fPIC -DPIC ; diff --git a/src/system/libroot/posix/signal/sigsuspend.c b/src/system/libroot/posix/signal/sigsuspend.c new file mode 100644 index 0000000000..35e7c0f35e --- /dev/null +++ b/src/system/libroot/posix/signal/sigsuspend.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2005, Haiku Project. All rights reserved. + * Distributed under the terms of the Haiku license. + * + * Author(s): + * Jérôme Duval + */ + +#include +#include +#include + +int +sigsuspend(const sigset_t *mask) +{ + int err = _kern_sigsuspend(mask); + if (err < B_OK) { + errno = err; + return -1; + } + return 0; +} +