From 96e6579454d896c92b04926766fc14c98fdf9249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 8 Sep 2005 12:26:16 +0000 Subject: [PATCH] added a libroot sigsuspend, kernel support isn't implemented (fixed partly bug #48) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14129 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/ksignal.h | 1 + headers/private/kernel/syscalls.h | 7 +++--- src/system/kernel/signal.c | 13 +++++++++++ src/system/libroot/posix/signal/Jamfile | 1 + src/system/libroot/posix/signal/sigsuspend.c | 23 ++++++++++++++++++++ 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/system/libroot/posix/signal/sigsuspend.c 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; +} +