changeset 2053:0d23f740f281

*** empty log message ***
author Jim Meyering <jim@meyering.net>
date Sun, 26 Dec 1999 09:40:16 +0000
parents 3c79d37078c2
children 74ec6f05f1c1
files lib/nanosleep.c
diffstat 1 files changed, 38 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 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);