]> prime8.dev >> repos - ttyd.git/commitdiff
Add support for the --max-clients option
authorShuanglei Tao <tsl0922@gmail.com>
Thu, 6 Apr 2017 13:24:19 +0000 (21:24 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Thu, 6 Apr 2017 13:45:07 +0000 (21:45 +0800)
README.md
man/ttyd.1
man/ttyd.man.md
src/http.c
src/protocol.c
src/server.c
src/server.h

index 850cac157aabe2cd0abd380ba2034c2670cd9381..9d70ec736450e28559880a6566d6db3e1441c9d3 100644 (file)
--- a/README.md
+++ b/README.md
@@ -88,6 +88,7 @@ OPTIONS:
     --readonly, -R          Do not allow clients to write to the TTY
     --client-option, -t     Send option to client (format: key=value), repeat to add more options
     --check-origin, -O      Do not allow websocket connection from different origin
+    --max-clients, -m       Maximum clients to support (default: 0, no limit)
     --once, -o              Accept only one client and exit on disconnection
     --browser, -B           Open terminal with the default system browser
     --index, -I             Custom index.html path
index b481ed0393f5fc2f9f54053535c550e88a9fc97c..c6a25463bbb6815a2f24d033c49caf939a71111f 100644 (file)
@@ -72,6 +72,10 @@ Cross platform: macOS, Linux, FreeBSD, OpenWrt/LEDE, Windows
 \-O, \-\-check\-origin
       Do not allow websocket connection from different origin
 
+.PP
+\-m, \-\-max\-clients
+      Maximum clients to support (default: 0, no limit)
+
 .PP
 \-o, \-\-once
       Accept only one client and exit on disconnection
index 1a7f3bab1a531dc73f3910a4d26e57e480293fd1..b09aac1a6ac4018d2afc07b18245f1ffb6ed02b8 100644 (file)
@@ -51,6 +51,9 @@ ttyd 1 "September 2016" ttyd "User Manual"
   -O, --check-origin
       Do not allow websocket connection from different origin
 
+  -m, --max-clients
+      Maximum clients to support (default: 0, no limit)
+
   -o, --once
       Accept only one client and exit on disconnection
 
index e704bed2cb4ca5bea1947ea7ae96c46c4543f4fd..7c6dc943318b16d3e8a178cccd935de753b9dcba 100644 (file)
@@ -61,7 +61,7 @@ callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, voi
             }
 
             lws_get_peer_addresses(wsi, lws_get_socket_fd(wsi), name, sizeof(name), rip, sizeof(rip));
-            lwsl_notice("HTTP %s - %s (%s)\n", in, rip, name);
+            lwsl_notice("HTTP %s - %s (%s)\n", (char *) in, rip, name);
 
             switch (check_auth(wsi)) {
                 case 0:
index 15a82ab2ae177335780787557aed90683503f79d..35128e7c857d844e694220ba941dc0601d4f7fdf 100644 (file)
@@ -188,6 +188,10 @@ callback_tty(struct lws *wsi, enum lws_callback_reasons reason,
                 lwsl_warn("refuse to serve WS client due to the --once option.\n");
                 return 1;
             }
+            if (server->max_clients > 0 && server->client_count == server->max_clients) {
+                lwsl_warn("refuse to serve WS client due to the --max-clients option.\n");
+                return 1;
+            }
             if (lws_hdr_copy(wsi, buf, sizeof(buf), WSI_TOKEN_GET_URI) <= 0 || strcmp(buf, WS_PATH)) {
                 lwsl_warn("refuse to serve WS client for illegal ws path: %s\n", buf);
                 return 1;
index d863df68d910aa71b91f8589191b61c90a70d818..50838a3d7e7c78d6fba71ee1b01e73c10626ba5a 100644 (file)
@@ -35,6 +35,7 @@ static const struct option options[] = {
         {"ssl-ca",       required_argument, NULL, 'A'},
         {"readonly",     no_argument,       NULL, 'R'},
         {"check-origin", no_argument,       NULL, 'O'},
+        {"max-clients",  required_argument, NULL, 'm'},
         {"once",         no_argument,       NULL, 'o'},
         {"browser",      no_argument,       NULL, 'B'},
         {"debug",        required_argument, NULL, 'd'},
@@ -42,7 +43,7 @@ static const struct option options[] = {
         {"help",         no_argument,       NULL, 'h'},
         {NULL,           0,                 0,     0}
 };
-static const char *opt_string = "p:i:c:u:g:s:r:I:aSC:K:A:Rt:OoBd:vh";
+static const char *opt_string = "p:i:c:u:g:s:r:I:aSC:K:A:Rt:Om:oBd:vh";
 
 void print_help() {
     fprintf(stderr, "ttyd is a tool for sharing terminal over the web\n\n"
@@ -62,6 +63,7 @@ void print_help() {
                     "    --readonly, -R          Do not allow clients to write to the TTY\n"
                     "    --client-option, -t     Send option to client (format: key=value), repeat to add more options\n"
                     "    --check-origin, -O      Do not allow websocket connection from different origin\n"
+                    "    --max-clients, -m       Maximum clients to support (default: 0, no limit)\n"
                     "    --once, -o              Accept only one client and exit on disconnection\n"
                     "    --browser, -B           Open terminal with the default system browser\n"
                     "    --index, -I             Custom index.html path\n"
@@ -251,6 +253,9 @@ main(int argc, char **argv) {
             case 'O':
                 server->check_origin = true;
                 break;
+            case 'm':
+                server->max_clients = atoi(optarg);
+                break;
             case 'o':
                 server->once = true;
                 break;
@@ -418,6 +423,8 @@ main(int argc, char **argv) {
         lwsl_notice("  check origin: true\n");
     if (server->readonly)
         lwsl_notice("  readonly: true\n");
+    if (server->max_clients > 0)
+        lwsl_notice("  max clients: %d\n", server->max_clients);
     if (server->once)
         lwsl_notice("  once: true\n");
     if (server->index != NULL) {
index 0ba7ab2f4486f72fb0bd4aa1eb9e7d37bdb9da53..93dac07c82b38222e7d71289a1ab3dd06919d4fb 100644 (file)
@@ -110,6 +110,7 @@ struct tty_server {
     char *sig_name;                           // human readable signal string
     bool readonly;                            // whether not allow clients to write to the TTY
     bool check_origin;                        // whether allow websocket connection from different origin
+    int max_clients;                          // maximum clients to support
     bool once;                                // whether accept only one client and exit on disconnection
     char *socket_path;                        // UNIX domain socket path
     pthread_mutex_t lock;