Carefully handle the signal, exit gracefully
authorNeutron Soutmun <neo.neutron@gmail.com>
Wed, 3 Dec 2008 12:59:07 +0000 (19:59 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Wed, 3 Dec 2008 12:59:07 +0000 (19:59 +0700)
2008-12-03  Neutron Soutmun <neo.neutron@gmail.com>

* src/rahunasd.c: Fix the malfunction rh_sighandler(), handle only SIGTERM and
  adjust the code to let the program really exit gracefully.

ChangeLog
src/rahunasd.c

index 448bb2b..b39f2ab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2008-12-03  Neutron Soutmun <neo.neutron@gmail.com>
 
+       * src/rahunasd.c: Fix the malfunction rh_sighandler(), handle only SIGTERM and
+         adjust the code to let the program really exit gracefully.
+
+2008-12-03  Neutron Soutmun <neo.neutron@gmail.com>
+
        * src/rahunasd.c: Fix the worst case that the pid < 0 (fail) is parsed into 
          the rh_sighandler() which the program must ignore this trigger.
 
index 742633d..e6ebfe1 100644 (file)
@@ -153,16 +153,15 @@ void rh_sighandler(int sig)
 {
   switch (sig) {
     case SIGTERM:
-    case SIGKILL:
       if (pid == 0) {
         rh_exit();
-        syslog(LOG_NOTICE, "Exit Gracefully", pid);
         exit(EXIT_SUCCESS);
-      }
-
-      if (pid > 0) {
+      } else if (pid > 0) {
         syslog(LOG_NOTICE, "Kill Child PID %d", pid);
-        kill(pid, SIGKILL);
+        kill(pid, SIGTERM);
+      } else {
+        syslog(LOG_ERR, "Invalid PID");
+        exit(EXIT_FAILURE);
       }
       break;
   }
@@ -241,7 +240,6 @@ size_t expired_check(void *data)
 
 void rh_exit()
 {
-  syslog(LOG_ALERT, "Child Exiting ..");
   rh_task_stopservice(map);
   rh_task_cleanup();
   rh_closelog(rh_config.log_file);
@@ -294,19 +292,23 @@ watch_child(char *argv[])
 
 
   while(1) {
-
-    if ((pid = fork()) == 0) {
+    pid = fork();
+    if (pid == 0) {
       /* child */
       prog = strdup(argv[0]);
       argv[0] = strdup("(rahunasd)");
       execvp(prog, argv);
       syslog(LOG_ALERT, "execvp failed");
+    } else if (pid < 0) {
+      syslog(LOG_ERR, "Could not fork the child process");   
+      exit(EXIT_FAILURE);
     }
   
+    /* parent */
     syslog(LOG_NOTICE, "RahuNASd Parent: child process %d started", pid);   
 
     time(&start);
-    /* parent */
+
     pid = waitpid(-1, &status, 0);
     time(&stop);
 
@@ -332,10 +334,10 @@ watch_child(char *argv[])
       exit(EXIT_FAILURE);
     }
   
-  
-    if (WIFEXITED(status))
-      if (WEXITSTATUS(status) == 0)
+    if (WIFEXITED(status) && (WEXITSTATUS(status) == 0)) {
+        syslog(LOG_NOTICE, "Exit Gracefully");
         exit(EXIT_SUCCESS);
+    }
     
     sleep(3);
   }
@@ -353,10 +355,7 @@ int main(int argc, char **argv)
   GNetXmlRpcServer *server = NULL;
   GMainLoop* main_loop     = NULL;
 
-   
-
   signal(SIGTERM, rh_sighandler);
-  signal(SIGKILL, rh_sighandler);
 
   watch_child(argv);