summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1999-12-26 09:40:16 +0000
committerJim Meyering <jim@meyering.net>1999-12-26 09:40:16 +0000
commitbff644dff2de356fa3c2a99456216caf5c3e9ee0 (patch)
tree8f9f8918de489cf0573d909999d8fe07dfc5178b
parentc3a36c262d8af12176ebd5f10dc6f7ff9a743f97 (diff)
downloadgnulib-bff644dff2de356fa3c2a99456216caf5c3e9ee0.tar.gz
*** empty log message ***
-rw-r--r--lib/nanosleep.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/lib/nanosleep.c b/lib/nanosleep.c
index b833c01f4a..b51f648c7a 100644
--- a/lib/nanosleep.c
+++ b/lib/nanosleep.c
@@ -18,8 +18,9 @@
/* written by Jim Meyering */
#include <config.h>
-
+#include <stdio.h>
#include <sys/types.h>
+#include <signal.h>
#include <time.h>
/* FIXME: is including both like this kosher? */
@@ -27,6 +28,26 @@
static interrupted;
+/* Handle SIGCONT. */
+
+static void
+sighandler (int sig)
+{
+#ifdef SA_INTERRUPT
+ struct sigaction sigact;
+
+ sigact.sa_handler = SIG_DFL;
+ sigemptyset (&sigact.sa_mask);
+ sigact.sa_flags = 0;
+ sigaction (sig, &sigact, NULL);
+#else
+ signal (sig, SIG_DFL);
+#endif
+
+ suspended = 1;
+ kill (getpid (), sig);
+}
+
/* Sleep for USEC microseconds. */
static void
@@ -42,10 +63,25 @@ int
nanosleep (const struct timespec *requested_delay,
struct timespec *remaining_delay)
{
+#ifdef SA_INTERRUPT
+ struct sigaction oldact, newact;
+#endif
+
interrupted = 0;
/* set up sig handler -- but maybe only do this the first time? */
- /* FIXME */
+#ifdef SA_INTERRUPT
+ newact.sa_handler = sighandler;
+ sigemptyset (&newact.sa_mask);
+ newact.sa_flags = 0;
+
+ sigaction (SIGCONT, NULL, &oldact);
+ if (oldact.sa_handler != SIG_IGN)
+ sigaction (SIGCONT, &newact, NULL);
+#else
+ if (signal (SIGCONT, SIG_IGN) != SIG_IGN)
+ signal (SIGCONT, sighandler);
+#endif
usleep (requested_delay);