Add SIGTERM signalhandler
authorbetacentauri <betacentauri@arcor.de>
Sat, 25 Apr 2015 11:03:12 +0000 (13:03 +0200)
committerlittlesat <littlesat99@yahoo.com>
Sun, 26 Apr 2015 18:31:44 +0000 (20:31 +0200)
Catch signal and stop e2 in a proper way.
This also writes config and EPG data to the disk.

Signed-off-by: littlesat <littlesat99@yahoo.com>

main/enigma.cpp

index 8fb7e61..d8633ac 100644 (file)
@@ -126,6 +126,48 @@ public:
 
 int exit_code;
 
+void quitMainloop(int exitCode)
+{
+       FILE *f = fopen("/proc/stb/fp/was_timer_wakeup", "w");
+       if (f)
+       {
+               fprintf(f, "%d", 0);
+               fclose(f);
+       }
+       else
+       {
+               int fd = open("/dev/dbox/fp0", O_WRONLY);
+               if (fd >= 0)
+               {
+                       if (ioctl(fd, 10 /*FP_CLEAR_WAKEUP_TIMER*/) < 0)
+                               eDebug("FP_CLEAR_WAKEUP_TIMER failed (%m)");
+                       close(fd);
+               }
+               else
+                       eDebug("open /dev/dbox/fp0 for wakeup timer clear failed!(%m)");
+       }
+       exit_code = exitCode;
+       eApp->quit(0);
+}
+
+static void sigterm_handler(int num)
+{
+       quitMainloop(128 + num);
+}
+
+void catchTermSignal()
+{
+       struct sigaction act;
+
+       act.sa_handler = sigterm_handler;
+       act.sa_flags = SA_RESTART;
+
+       if (sigemptyset(&act.sa_mask) == -1)
+               perror("sigemptyset");
+       if (sigaction(SIGTERM, &act, 0) == -1)
+               perror("SIGTERM");
+}
+
 int main(int argc, char **argv)
 {
 #ifdef MEMLEAK_CHECK
@@ -228,6 +270,7 @@ int main(int argc, char **argv)
        printf("executing main\n");
 
        bsodCatchSignals();
+       catchTermSignal();
 
        setIoPrio(IOPRIO_CLASS_BE, 3);
 
@@ -269,47 +312,9 @@ eApplication *getApplication()
        return eApp;
 }
 
-void quitMainloop(int exitCode)
-{
-       FILE *f = fopen("/proc/stb/fp/was_timer_wakeup", "w");
-       if (f)
-       {
-               fprintf(f, "%d", 0);
-               fclose(f);
-       }
-       else
-       {
-               int fd = open("/dev/dbox/fp0", O_WRONLY);
-               if (fd >= 0)
-               {
-                       if (ioctl(fd, 10 /*FP_CLEAR_WAKEUP_TIMER*/) < 0)
-                               eDebug("FP_CLEAR_WAKEUP_TIMER failed (%m)");
-                       close(fd);
-               }
-               else
-                       eDebug("open /dev/dbox/fp0 for wakeup timer clear failed!(%m)");
-       }
-       exit_code = exitCode;
-       eApp->quit(0);
-}
-
-static void sigterm_handler(int num)
-{
-       quitMainloop(128 + num);
-}
-
 void runMainloop()
 {
-       struct sigaction act;
-
-       act.sa_handler = sigterm_handler;
-       act.sa_flags = SA_RESTART;
-
-       if (sigemptyset(&act.sa_mask) == -1)
-               perror("sigemptyset");
-       if (sigaction(SIGTERM, &act, 0) == -1)
-               perror("SIGTERM");
-
+       catchTermSignal();
        eApp->runLoop();
 }