]> prime8.dev >> repos - ttyd.git/commitdiff
server: remove sys/queue dep
authorShuanglei Tao <tsl0922@gmail.com>
Sat, 30 Nov 2019 08:17:04 +0000 (16:17 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Sat, 30 Nov 2019 09:25:27 +0000 (17:25 +0800)
src/protocol.c
src/server.c
src/server.h

index 2e09347f6181e0d1870ffeb393cb1a706cd3d1fe..504aad6333afd37e659b4ca7066e1780c0586913 100644 (file)
@@ -6,7 +6,6 @@
 #include <fcntl.h>
 #include <errno.h>
 #include <sys/ioctl.h>
-#include <sys/queue.h>
 
 #if defined(__OpenBSD__) || defined(__APPLE__)
 #include <util.h>
@@ -106,42 +105,25 @@ check_host_origin(struct lws *wsi) {
     return len > 0 && strcasecmp(buf, host_buf) == 0;
 }
 
-void
-tty_client_remove(struct tty_client *client) {
-    struct tty_client *iterator;
-    LIST_FOREACH(iterator, &server->clients, list) {
-        if (iterator == client) {
-            LIST_REMOVE(iterator, list);
-            server->client_count--;
-            break;
-        }
-    }
-}
-
 void
 tty_client_destroy(struct tty_client *client) {
-    if (!client->running || client->pid <= 0)
+    if (client->pid <= 0)
         goto cleanup;
 
-    client->running = false;
-
     // kill process (group) and free resource
     int pgid = getpgid(client->pid);
     int pid = pgid > 0 ? -pgid : client->pid;
-    lwsl_notice("sending %s (%d) to process (group) %d\n", server->sig_name, server->sig_code, pid);
     if (kill(pid, server->sig_code) != 0) {
+        if (errno == ESRCH)
+            goto cleanup;
         lwsl_err("kill: %d, errno: %d (%s)\n", pid, errno, strerror(errno));
     }
-    pid_t 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", client->exit_status, pid_out);
-    }
-    close(client->pty);
 
 cleanup:
     uv_read_stop((uv_stream_t *) &client->pipe);
 
+    close(client->pty);
+
     // free the buffer
     if (client->buffer != NULL)
         free(client->buffer);
@@ -151,9 +133,6 @@ cleanup:
     for (int i = 0; i < client->argc; i++) {
         free(client->args[i]);
     }
-
-    // remove from client list
-    tty_client_remove(client);
 }
 
 void
@@ -224,7 +203,6 @@ spawn_process(struct tty_client *client) {
     lwsl_notice("started process, pid: %d\n", pid);
     client->pid = pid;
     client->pty = pty;
-    client->running = true;
     if (client->size.ws_row > 0 && client->size.ws_col > 0)
         ioctl(client->pty, TIOCSWINSZ, &client->size);
 
@@ -265,7 +243,6 @@ callback_tty(struct lws *wsi, enum lws_callback_reasons reason,
             break;
 
         case LWS_CALLBACK_ESTABLISHED:
-            client->running = false;
             client->initialized = false;
             client->initial_cmd_index = 0;
             client->authenticated = false;
@@ -286,7 +263,6 @@ callback_tty(struct lws *wsi, enum lws_callback_reasons reason,
                 }
             }
 
-            LIST_INSERT_HEAD(&server->clients, client, list);
             server->client_count++;
 
             lws_hdr_copy(wsi, buf, sizeof(buf), WSI_TOKEN_GET_URI);
@@ -416,6 +392,7 @@ callback_tty(struct lws *wsi, enum lws_callback_reasons reason,
             break;
 
         case LWS_CALLBACK_CLOSED:
+            server->client_count--;
             lwsl_notice("WS closed from %s, clients: %d\n", client->address, server->client_count);
             tty_client_destroy(client);
             if (server->once && server->client_count == 0) {
index e36db38beba8c284080b40ba7be9f7e70952cada..fb7d0900dcdf75efbc5f5eefeede44169eceda50 100644 (file)
@@ -109,7 +109,6 @@ tty_server_new(int argc, char **argv, int start) {
     ts = xmalloc(sizeof(struct tty_server));
 
     memset(ts, 0, sizeof(struct tty_server));
-    LIST_INIT(&ts->clients);
     ts->client_count = 0;
     ts->sig_code = SIGHUP;
     sprintf(ts->terminal_type, "%s", "xterm-256color");
@@ -188,14 +187,6 @@ signal_cb(uv_signal_t *watcher, int signum) {
             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;
-                    }
-                }
             }
             return;
         default:
index 18dbfe4dd94d07d1e4a18605ebd9a2578c16212d..8a4fde058332c786eb4acf028cd581efc02612eb 100644 (file)
@@ -1,6 +1,5 @@
 #include <stdbool.h>
 #include <sys/ioctl.h>
-#include <sys/queue.h>
 #include <uv.h>
 
 // client message
@@ -21,7 +20,6 @@ extern struct lws_context *context;
 extern struct tty_server *server;
 
 struct tty_client {
-    bool running;
     bool initialized;
     int initial_cmd_index;
     bool authenticated;
@@ -41,8 +39,6 @@ struct tty_client {
     ssize_t pty_len;
 
     uv_pipe_t pipe;
-
-    LIST_ENTRY(tty_client) list;
 };
 
 struct pss_http {
@@ -53,7 +49,6 @@ struct pss_http {
 };
 
 struct tty_server {
-    LIST_HEAD(client, tty_client) clients;    // client list
     int client_count;                         // client count
     char *prefs_json;                         // client preferences
     char *credential;                         // encoded basic auth credential