Binaural synthesis (confbridge): Adds utils/conf_bridge_binaural_hrir_importer
[asterisk/asterisk.git] / utils / astcanary.c
index eea2289..9432c57 100644 (file)
  * at the top of the source tree.
  */
 
+/*** MODULEINFO
+       <support_level>core</support_level>
+ ***/
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/time.h>
@@ -25,6 +29,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 
 /*!\brief
  * At one time, canaries were carried along with coal miners down
@@ -87,9 +92,25 @@ static const char explanation[] =
 int main(int argc, char *argv[])
 {
        int fd;
+       pid_t parent;
+
+       if (argc < 3) {
+               fprintf(stderr, "Usage: %s <monitor-filename> <ppid>\n", argv[0]);
+               exit(1);
+       }
+
        /* Run at normal priority */
        setpriority(PRIO_PROCESS, 0, 0);
-       for (; getppid() != 1;) {
+
+       /*!\note
+        * See http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_265
+        * for a justification of this approach.  The PPID after the creator dies in Linux and
+        * most other Unix-like systems will be 1, but this is not strictly the case.  The POSIX
+        * specification allows it to be an implementation-defined system process.  However, it
+        * most certainly will not be the original parent PID, which makes the following code
+        * POSIX-compliant.
+        */
+       for (parent = atoi(argv[2]); parent == getppid() ;) {
                /* Update the modification times (checked from Asterisk) */
                if (utime(argv[1], NULL)) {
                        /* Recreate the file if it doesn't exist */
@@ -108,7 +129,7 @@ int main(int argc, char *argv[])
                sleep(5);
        }
 
-       /* Reached if asterisk (our parent process) dies - its chldren are inherited by the init process (pid is 1). */
+       /* Exit when the parent dies */
        return 0;
 }