From 946ede865d0e9e0907e006d51789f4f67cf78e95 Mon Sep 17 00:00:00 2001 From: fangxinyong Date: Mon, 28 Aug 2023 20:55:45 +0800 Subject: [PATCH] signal: add siginterrupt implementation https://pubs.opengroup.org/onlinepubs/9699919799/functions/siginterrupt.html Signed-off-by: fangxinyong --- include/signal.h | 1 + libs/libc/signal/CMakeLists.txt | 1 + libs/libc/signal/Make.defs | 2 +- libs/libc/signal/sig_interrupt.c | 69 ++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 libs/libc/signal/sig_interrupt.c diff --git a/include/signal.h b/include/signal.h index 84683c3b3b..84ee27e823 100644 --- a/include/signal.h +++ b/include/signal.h @@ -452,6 +452,7 @@ int sigtimedwait(FAR const sigset_t *set, FAR struct siginfo *value, int sigsuspend(FAR const sigset_t *sigmask); int sigwaitinfo(FAR const sigset_t *set, FAR struct siginfo *value); int sigaltstack(FAR const stack_t *ss, FAR stack_t *oss); +int siginterrupt(int signo, int flag); #undef EXTERN #ifdef __cplusplus diff --git a/libs/libc/signal/CMakeLists.txt b/libs/libc/signal/CMakeLists.txt index 177d25c9ac..8edadd42e5 100644 --- a/libs/libc/signal/CMakeLists.txt +++ b/libs/libc/signal/CMakeLists.txt @@ -29,6 +29,7 @@ target_sources( sig_orset.c sig_xorset.c sig_isemptyset.c + sig_interrupt.c sig_hold.c sig_ignore.c sig_ismember.c diff --git a/libs/libc/signal/Make.defs b/libs/libc/signal/Make.defs index 9c9d81f7ba..3b3b229062 100644 --- a/libs/libc/signal/Make.defs +++ b/libs/libc/signal/Make.defs @@ -22,7 +22,7 @@ CSRCS += sig_addset.c sig_delset.c sig_emptyset.c sig_fillset.c CSRCS += sig_nandset.c sig_andset.c sig_orset.c sig_xorset.c -CSRCS += sig_isemptyset.c sig_killpg.c sig_altstack.c +CSRCS += sig_isemptyset.c sig_killpg.c sig_altstack.c sig_interrupt.c CSRCS += sig_hold.c sig_ignore.c sig_ismember.c sig_pause.c sig_psignal.c CSRCS += sig_raise.c sig_relse.c sig_set.c sig_signal.c sig_wait.c diff --git a/libs/libc/signal/sig_interrupt.c b/libs/libc/signal/sig_interrupt.c new file mode 100644 index 0000000000..cc3e0d4306 --- /dev/null +++ b/libs/libc/signal/sig_interrupt.c @@ -0,0 +1,69 @@ +/**************************************************************************** + * libs/libc/signal/sig_interrupt.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: siginterrupt + * + * Description: + * The siginterrupt() function allows signals to interrupt functions + * + * Input Parameters: + * signo - Signal to interrupt functions + * flag - Flag to get restarting signal + * + * Returned Value: + * Upon successful completion, siginterrupt() shall return 0; + * otherwise, -1 shall be returned and errno set to indicate the error. + * + * EINVAL - The signo argument is invalid. + ****************************************************************************/ + +int siginterrupt(int signo, int flag) +{ + struct sigaction act; + + if (sigaction(signo, NULL, &act) < 0) + { + return ERROR; + } + + if (flag) + { + act.sa_flags &= ~SA_RESTART; + } + else + { + act.sa_flags |= SA_RESTART; + } + + return sigaction(signo, &act, NULL); +}