This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 946ede865d signal: add siginterrupt implementation
946ede865d is described below

commit 946ede865d0e9e0907e006d51789f4f67cf78e95
Author: fangxinyong <[email protected]>
AuthorDate: Mon Aug 28 20:55:45 2023 +0800

    signal: add siginterrupt implementation
    
    https://pubs.opengroup.org/onlinepubs/9699919799/functions/siginterrupt.html
    
    Signed-off-by: fangxinyong <[email protected]>
---
 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(-)

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 <nuttx/config.h>
+
+#include <signal.h>
+
+/****************************************************************************
+ * 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);
+}

Reply via email to