nff catch signals
authorLaurent Mazet <mazet@softndesign.org>
Wed, 22 Jan 2025 22:15:55 +0000 (23:15 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Wed, 22 Jan 2025 22:15:55 +0000 (23:15 +0100)
fm.c

diff --git a/fm.c b/fm.c
index f8c141363c522c2a8445d3d254c73577b1f23d1b..4d51125d7d5f8ce6d69367c630e3b03d69a33887 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -39,6 +39,7 @@ window_t *windir[MAXPANELS] = {0};
 window_t *winelem[MAXPANELS] = {0};
 window_t *winmenu = NULL;
 window_t *winscreen = NULL;
+list_t *list[MAXPANELS] = {0};
 
 char *help =
     "alt Menu functions\n"
@@ -69,18 +70,35 @@ int usage (int ret)
     return ret;
 }
 
-int emergency_stop = 0;
-void dostop (int sig)
+void dostop (__attribute__((unused)) int sig)
 {
-    if (askwindow (" Restart (Y/N) ", winscreen, "Yy", "Nn") == 1) {
-        emergency_stop = 1;
+    static int end = 0;
+    if (!end) {
+        end = (sig == 1);
+    }
+
+    if (end || (askwindow (" Quit (Y/N) ", winscreen, "Yy", "Nn") == 1)) {
+        if (winscreen) {
+            endwin ();
+        }
+
+        int i;
+        for (i = 0; i < MAXPANELS; i++) {
+            free (dirname[i]);
+            freelist (list[i]);
+            freewindow (windir[i]);
+            freewindow (winelem[i]);
+        }
+        freewindow (winmenu);
+        freewindow (winscreen);
+
+        exit (sig > 0);
     }
 }
 
 /* main function */
 int main (int argc, char *argv[])
 {
-    int rc = 1;
     int i;
 
     /* get basename */
@@ -201,7 +219,6 @@ int main (int argc, char *argv[])
     int index_s[MAXPANELS] = {0};
     int index_x[MAXPANELS] = {0};
     int index_y[MAXPANELS] = {0};
-    list_t *list[MAXPANELS] = {0};
     int page[MAXPANELS] = {0};
 
     /* catch signals */
@@ -210,7 +227,7 @@ int main (int argc, char *argv[])
 #endif
     signal (SIGABRT, &dostop);
     signal (SIGSEGV, &dostop);
-    signal (SIGTERM, &dostop);
+//    signal (SIGTERM, &dostop);
 
     /* event loop */
     int stop = 0;
@@ -228,8 +245,7 @@ int main (int argc, char *argv[])
                 if (list[i] == NULL) {
                     endwin ();
                     VERBOSE (ERROR, fprintf (stderr, "can't read directory '%s'\n", (dirname[i]) ? dirname[i] : "."));
-                    rc = 1;
-                    goto end;
+                    dostop (-1);
                 }
             }
 
@@ -247,10 +263,6 @@ int main (int argc, char *argv[])
         }
 
         int ch = getch ();
-        if (emergency_stop) {
-            stop = 1;
-            continue;
-        }
         switch (ch) {
         case '\n':
         case '\r':
@@ -443,7 +455,7 @@ int main (int argc, char *argv[])
                 free (string);
                 break;
             case ALT_Q: /* quit */
-                if (askwindow (" Restart (Y/N) ", winscreen, "Yy", "Nn") == 1) {
+                if (askwindow (" Quit (Y/N) ", winscreen, "Yy", "Nn") == 1) {
                     stop = 1;
                 }
                 break;
@@ -534,19 +546,8 @@ int main (int argc, char *argv[])
         }
     }
 
-    endwin ();
-
-end:
-    for (i = 0; i < MAXPANELS; i++) {
-        free (dirname[i]);
-        freelist (list[i]);
-        freewindow (windir[i]);
-        freewindow (winelem[i]);
-    }
-    freewindow (winmenu);
-    freewindow (winscreen);
-
-    return rc;
+    dostop (0);
+    return 0;
 }
 
 /* test: fm.exe -d 2>&1 | grep 'no directory name' */