]> prime8.dev >> repos - ttyd.git/commitdiff
src: fix exit code check on linux
authorShuanglei Tao <tsl0922@gmail.com>
Sun, 15 Sep 2019 11:06:47 +0000 (19:06 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Sun, 15 Sep 2019 11:07:02 +0000 (19:07 +0800)
src/protocol.c
src/server.c
src/server.h

index 108284fe3c4fe9280ee3a678002e805caf3ddc87..ce496c7d3232c5bf1d4825a4b86c504b5656823c 100644 (file)
@@ -133,9 +133,9 @@ tty_client_destroy(struct tty_client *client) {
         lwsl_err("kill: %d, errno: %d (%s)\n", pid, errno, strerror(errno));
     }
     pid_t pid_out;
-    int status = wait_proc(client->pid, &pid_out);
+    client->exit_status = wait_proc(client->pid, &pid_out);
     if (pid_out > 0) {
-        lwsl_notice("process exited with code %d, pid: %d\n", status, pid_out);
+        lwsl_notice("process exited with code %d, pid: %d\n", client->exit_status, pid_out);
     }
     close(client->pty);
 
@@ -196,7 +196,14 @@ spawn_process(struct tty_client *client) {
 
 void
 tty_client_poll(struct tty_client *client) {
-    if (!client->running || client->state == STATE_READY) return;
+    if (client->pid <= 0 || client->state == STATE_READY) return;
+
+    if (!client->running) {
+        memset(client->pty_buffer, 0, sizeof(client->pty_buffer));
+        client->pty_len = client->exit_status;
+        client->state = STATE_READY;
+        return;
+    }
 
     fd_set des_set;
     FD_ZERO (&des_set);
@@ -372,9 +379,7 @@ callback_tty(struct lws *wsi, enum lws_callback_reasons reason,
                             return -1;
                         }
                     }
-                    if (spawn_process(client) != 0) {
-                        return 1;
-                    }
+                    if (spawn_process(client) != 0) return 1;
                     break;
                 default:
                     lwsl_warn("ignored unknown message type: %c\n", command);
index 4e903749e00367f00e9603ea10a64a2ea3168455..9757736a94b5a73b68ba8ac82cdf397918bd099b 100644 (file)
@@ -186,6 +186,14 @@ sigchld_handler() {
     int status = wait_proc(-1, &pid);
     if (pid > 0) {
         lwsl_notice("process exited with code %d, pid: %d\n", status, pid);
+        struct tty_client *iterator;
+        LIST_FOREACH(iterator, &server->clients, list) {
+            if (iterator->pid == pid) {
+                iterator->running = false;
+                iterator->exit_status = status;
+                break;
+            }
+        }
     }
 }
 
index 1539435216d05f606da1ff17639d329243ec7f76..84ca065113eca2e45bcf853a74018cf73aca94fc 100644 (file)
@@ -44,6 +44,7 @@ struct tty_client {
 
     int pid;
     int pty;
+    int exit_status;
     enum pty_state state;
     char pty_buffer[LWS_PRE + 1 + BUF_SIZE];
     ssize_t pty_len;