Implemented aborting on exit of child process of --gnokiid
[gnokii.git] / gnokii / gnokii.c
index 9b94644..e6692ab 100644 (file)
@@ -20,6 +20,8 @@
 #include <ctype.h>
 #include <time.h>
 #include <sys/stat.h>
+#include <limits.h>
+#include <errno.h>
 
 #ifdef UCLINUX
 /* <getopt.h> or "getopt.h" would include insufficient getopt.h from uClinux */
@@ -1280,7 +1282,7 @@ int main(int argc, char *argv[])
 
     for(i = 2; i < argc; i++)
       nargv[i-2] = argv[i];
-               nargv[argc] = NULL;     /* required by gnokiid() for execv(3) */
+               nargv[argc-2] = NULL;   /* required by gnokiid() for execv(3) */
        
     if(checkargs(c, gals, nargc)) {
 
@@ -4117,6 +4119,12 @@ int monitormode(int argc, char *argv[])
 
 #ifdef UCLINUX
 
+static void gnokiid_SIGCHLD(int signo)
+{
+       fprintf (stderr, _("Child process exited, aborting...\n"));
+       exit(2);
+}
+
 static int gnokiid(int argc, char *argv[])
 {
        bool    DebugMode;  /* When true, run in debug mode */
@@ -4152,15 +4160,15 @@ static int gnokiid(int argc, char *argv[])
 #ifdef DEBUG
                fprintf (stderr, _("Spawning gnokiid startup child process \"%s\"...\n"), *argv);
 #endif
-               /* default action for SIGCHLD is SIG_IGN, should be OK */
+               signal(SIGCHLD,gnokiid_SIGCHLD);
                errno=0;
                switch (vfork()) {
                        case -1: /* vfork() failure */
-                               fprintf (stderr, _("vfork() failed! (%m)\n"));
+                               fprintf (stderr, _("vfork() failed! (%s)\n"),strerror(errno));
                                return -1;
                        case 0: /* child */
                                execv(*argv,argv);
-                               fprintf (stderr, _("Spawn of child process failed! (%m)\n"));
+                               fprintf (stderr, _("Spawn of child process failed! (%s)\n"),strerror(errno));
                                _exit(9);
                                break;
                        default: /* parent */