1 #include <stdbool.h>
2 #include <uv.h>
3 
4 #include "queue.h"
5 
6 // client message
7 #define INPUT '0'
8 #define RESIZE_TERMINAL '1'
9 #define PAUSE '2'
10 #define RESUME '3'
11 #define JSON_DATA '{'
12 
13 // server message
14 #define OUTPUT '0'
15 #define SET_WINDOW_TITLE '1'
16 #define SET_PREFERENCES '2'
17 
18 #define MAX_READ_RETRY 2
19 
20 // url paths
21 struct endpoints {
22   char *ws;
23   char *index;
24   char *token;
25   char *parent;
26 };
27 
28 extern volatile bool force_exit;
29 extern struct lws_context *context;
30 extern struct server *server;
31 extern struct endpoints endpoints;
32 
33 typedef enum { STATE_INIT, STATE_PAUSE, STATE_KILL, STATE_EXIT } proc_state;
34 
35 struct pss_http {
36   char path[128];
37   char *buffer;
38   char *ptr;
39   size_t len;
40 };
41 
42 struct pty_proc {
43   char **args;
44   int argc;
45 
46   pid_t pid;
47   int status;
48   proc_state state;
49 
50   int pty;
51   char *pty_buffer;
52   ssize_t pty_len;
53   int err_count;
54 
55   uv_pipe_t pipe;
56 
57   LIST_ENTRY(pty_proc) entry;
58 };
59 
60 struct pss_tty {
61   bool initialized;
62   int initial_cmd_index;
63   bool authenticated;
64   char address[50];
65   char path[20];
66 
67   struct lws *wsi;
68   char *buffer;
69   size_t len;
70 
71   struct pty_proc *proc;
72 };
73 
74 struct server {
75   int client_count;        // client count
76   char *prefs_json;        // client preferences
77   char *credential;        // encoded basic auth credential
78   char *index;             // custom index.html
79   char *command;           // full command line
80   char **argv;             // command with arguments
81   int argc;                // command + arguments count
82   int sig_code;            // close signal
83   char sig_name[20];       // human readable signal string
84   bool url_arg;            // allow client to send cli arguments in URL
85   bool readonly;           // whether not allow clients to write to the TTY
86   bool check_origin;       // whether allow websocket connection from different origin
87   int max_clients;         // maximum clients to support
88   bool once;               // whether accept only one client and exit on disconnection
89   char socket_path[255];   // UNIX domain socket path
90   char terminal_type[30];  // terminal type to report
91 
92   uv_loop_t *loop;      // the libuv event loop
93   uv_signal_t watcher;  // SIGCHLD watcher
94 
95   LIST_HEAD(proc, pty_proc) procs;  // started process list
96 };
97