check for prctl, poll parent PID if not present
authorArtem Baguinski <artm@v2.nl>
Wed, 14 Dec 2011 21:14:03 +0000 (22:14 +0100)
committerAndy Green <andy.green@linaro.org>
Fri, 20 Jul 2012 02:04:45 +0000 (10:04 +0800)
this allows forking code to be used on non-linux systems

configure.ac
lib/libwebsockets.c
lib/private-libwebsockets.h

index 93dc7f4..3980b2d 100644 (file)
@@ -112,7 +112,7 @@ AM_CONDITIONAL(NOPING, test x$noping = xyes)
 
 
 # Checks for header files.
-AC_CHECK_HEADERS([zlib.h fcntl.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h])
+AC_CHECK_HEADERS([zlib.h fcntl.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h sys/prctl.h])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_TYPE_SIZE_T
index 06f5c06..7680817 100644 (file)
@@ -3021,14 +3021,28 @@ libwebsockets_fork_service_loop(struct libwebsocket_context *context)
                return 0;
        }
 
+#ifdef HAVE_SYS_PRCTL_H
        /* we want a SIGHUP when our parent goes down */
        prctl(PR_SET_PDEATHSIG, SIGHUP);
+#endif
 
        /* in this forked process, sit and service websocket connections */
 
-       while (1)
+       while (1) {
                if (libwebsocket_service(context, 1000))
                        return -1;
+#ifndef HAVE_SYS_PRCTL_H
+/*
+ * on systems without prctl() (i.e. anything but linux) we can notice that our
+ * parent is dead if getppid() returns 1. FIXME apparently this is not true for
+ * solaris, could remember ppid right after fork and wait for it to change.
+ */
+
+        if (getppid() == 1)
+            break;
+#endif
+    }
+
 
        return 0;
 }
index 2f682db..3c9776f 100644 (file)
 #include <sys/types.h>
 #include <sys/socket.h>
 #ifndef LWS_NO_FORK
+#ifdef HAVE_SYS_PRCTL_H
 #include <sys/prctl.h>
 #endif
+#endif
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <arpa/inet.h>