]> prime8.dev >> repos - ttyd.git/commitdiff
Add support for the --client-option option
authorShuanglei Tao <tsl0922@gmail.com>
Sat, 29 Oct 2016 13:56:45 +0000 (21:56 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Sun, 30 Oct 2016 03:02:57 +0000 (11:02 +0800)
README.md
src/protocol.c
src/server.c
src/server.h

index 80d80839243f1aba062db836b4e7ad8a8d555d78..4d2ee540450330e5cbb197a9bac1da2637470372 100644 (file)
--- a/README.md
+++ b/README.md
@@ -65,6 +65,7 @@ OPTIONS:
     --signal, -s            Signal to send to the command when exit it (default: SIGHUP)
     --reconnect, -r         Time to reconnect for the client in seconds (default: 10)
     --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
     --once, -o              Accept only one client and exit on disconnection
     --ssl, -S               Enable ssl
index d7b5c6fe1c760f7484a40296e144e0de15499755..2ea254be2b448783a4266b74292684ba41dadd09 100644 (file)
@@ -34,7 +34,11 @@ send_initial_message(struct lws *wsi) {
     if (lws_write(wsi, p, (size_t) n, LWS_WRITE_TEXT) < n) {
         return -1;
     }
-
+    // client preferences
+    n = sprintf((char *) p, "%c%s", SET_PREFERENCES, server->prefs_json);
+    if (lws_write(wsi, p, (size_t) n, LWS_WRITE_TEXT) < n) {
+        return -1;
+    }
     return 0;
 }
 
@@ -54,6 +58,7 @@ parse_window_size(const char *json) {
         return NULL;
     }
     rows = json_object_get_int(o);
+    json_object_put(obj);
 
     struct winsize *size = t_malloc(sizeof(struct winsize));
     memset(size, 0, sizeof(struct winsize));
index 465d22767cdffe2e1f28afbba5b03ffb64fe9a22..86a72cb33674ecd667008ec1bc641ddb307d46ab 100644 (file)
@@ -41,7 +41,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:aSC:K:A:ROod:vh";
+static const char *opt_string = "p:i:c:u:g:s:r:aSC:K:A:Rt:Ood:vh";
 
 void print_help() {
     fprintf(stderr, "ttyd is a tool for sharing terminal over the web\n\n"
@@ -58,6 +58,7 @@ void print_help() {
                     "    --signal, -s            Signal to send to the command when exit it (default: SIGHUP)\n"
                     "    --reconnect, -r         Time to reconnect for the client in seconds (default: 10)\n"
                     "    --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"
                     "    --once, -o              Accept only one client and exit on disconnection\n"
                     "    --ssl, -S               Enable ssl\n"
@@ -193,6 +194,8 @@ main(int argc, char **argv) {
     char key_path[1024] = "";
     char ca_path[1024] = "";
 
+    struct json_object *client_prefs = json_object_new_object();
+
     // parse command line options
     int c;
     while ((c = getopt_long(start, argv, opt_string, options, NULL)) != -1) {
@@ -274,11 +277,28 @@ main(int argc, char **argv) {
                 break;
             case '?':
                 break;
+            case 't':
+                optind--;
+                for(;optind < start && *argv[optind] != '-'; optind++){
+                    char *option =strdup(optarg);
+                    char *key = strsep(&option, "=");
+                    if (key == NULL) {
+                        fprintf(stderr, "ttyd: invalid client option: %s, format: key=value\n", optarg);
+                        return -1;
+                    }
+                    char *value = strsep(&option, "=");
+                    t_free(option);
+                    struct json_object *obj = json_tokener_parse(value);
+                    json_object_object_add(client_prefs, key, obj != NULL ? obj : json_object_new_string(value));
+                }
+                break;
             default:
                 print_help();
                 return -1;
         }
     }
+    server->prefs_json = strdup(json_object_to_json_string(client_prefs));
+    json_object_put(client_prefs);
 
     if (server->command == NULL || strlen(server->command) == 0) {
         fprintf(stderr, "ttyd: missing start command\n");
@@ -360,6 +380,7 @@ main(int argc, char **argv) {
     if (server->credential != NULL)
         t_free(server->credential);
     t_free(server->command);
+    t_free(server->prefs_json);
     int i = 0;
     do {
         t_free(server->argv[i++]);
index b61077c15e2ec02c34c74a07554f5697a0438efa..eb1235ab0cdbde97d0b3a01b6479d2972927b3e4 100644 (file)
@@ -67,6 +67,7 @@ struct tty_client {
 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
     int reconnect;                            // reconnect timeout
     char *command;                            // full command line