From 7359ad28320e3bdf80f405988cd265eb7f707c6b Mon Sep 17 00:00:00 2001
From: Per Cederqvist <ceder@lysator.liu.se>
Date: Sun, 13 Jul 2003 11:07:42 +0000
Subject: [PATCH] (use_sa_restart): New static variable. (sig_on_signal): Add
 SA_RESTART if appropriate. (oop_signal_new): Don't just blindly set
 FD_CLOEXEC and 	O_NONBLOCK.  Read the old settings first.
 (oop_signal_use_sa_restart): New function.

Signed-off-by: Magnus Holmgren <magnus@kibibyte.se>
---
 oop.h    | 1 +
 signal.c | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/oop.h b/oop.h
index 2ab7c67..6a27e70 100644
--- a/oop.h
+++ b/oop.h
@@ -120,4 +120,5 @@ oop_adapter_signal *oop_signal_new(oop_source *);
 void oop_signal_delete(oop_adapter_signal *);
 oop_source *oop_signal_source(oop_adapter_signal *);
 
+void oop_signal_use_sa_restart(void);
 #endif
diff --git a/signal.c b/signal.c
index 421ddae..9314adc 100644
--- a/signal.c
+++ b/signal.c
@@ -35,6 +35,7 @@ struct oop_adapter_signal {
 };
 
 static struct oop_adapter_signal *sig_owner[OOP_NUM_SIGNALS];
+static int use_sa_restart = 0;
 
 static oop_adapter_signal *verify_source(oop_source *source) {
 	oop_adapter_signal * const s = (oop_adapter_signal *) source;
@@ -137,6 +138,7 @@ static void sig_on_signal(oop_source *source,int sig,
 #ifdef SA_NODEFER
 		act.sa_flags &= ~SA_NODEFER;
 #endif
+		if (use_sa_restart) act.sa_flags |= SA_RESTART;
 		sigaction(sig,&act,NULL);
 	}
 }
@@ -220,3 +222,10 @@ void oop_signal_delete(oop_adapter_signal *s) {
 oop_source *oop_signal_source(oop_adapter_signal *s) {
 	return &s->oop;
 }
+
+void oop_signal_use_sa_restart(void) {
+	int i;
+	for (i = 0; i < OOP_NUM_SIGNALS; ++i)
+		assert(NULL == sig_owner[i] && "signal handler already registered");
+	use_sa_restart = 1;
+}
-- 
GitLab