]> prime8.dev >> repos - ttyd.git/commitdiff
pty: set TERM env for the pty process
authorShuanglei Tao <tsl0922@gmail.com>
Sun, 8 Aug 2021 12:05:34 +0000 (20:05 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Sun, 8 Aug 2021 12:05:34 +0000 (20:05 +0800)
src/protocol.c
src/pty.c
src/pty.h

index e7255c3c27632520768b5d1b0a750e16764a38ca..8aa2021781a2b94b3550ea3671d725d03e66b8c2 100644 (file)
@@ -110,6 +110,7 @@ static bool spawn_process(struct pss_tty *pss, uint16_t columns, uint16_t rows)
   pty_process *process = process_init((void *) pss, server->loop, argv);
   if (columns > 0) process->columns = columns;
   if (rows > 0) process->rows = rows;
+  strncpy(process->term, server->terminal_type, sizeof(process->term));
   if (pty_spawn(process, process_read_cb, process_exit_cb) != 0) {
     lwsl_err("pty_spawn: %d (%s)\n", errno, strerror(errno));
     process_free(process);
index daa34c31f3a4be35ba7f952eada053452340cb94..1a9d17f9edc9d15fab523368fc97cd105bccd848 100644 (file)
--- a/src/pty.c
+++ b/src/pty.c
@@ -334,6 +334,11 @@ int pty_spawn(pty_process *process, pty_read_cb read_cb, pty_exit_cb exit_cb) {
   cmdline = join_args(process->argv);
   if (cmdline == NULL) goto cleanup;
 
+  // TODO: restore env after process creation
+  if (!SetEnvironmentVariable("TERM", process->term)) {
+    print_error("SetEnvironmentVariable");
+  }
+
   if (!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, flags, NULL, NULL, &process->si.StartupInfo, &pi)) {
     print_error("CreateProcessW");
     goto cleanup;
@@ -421,6 +426,7 @@ int pty_spawn(pty_process *process, pty_read_cb read_cb, pty_exit_cb exit_cb) {
     return status;
   } else if (pid == 0) {
     setsid();
+    setenv("TERM", process->term, true);
     int ret = execvp(process->argv[0], process->argv);
     if (ret < 0) {
       perror("execvp failed\n");
index 07f9fc16f0fd9f82191b1e66908a2e851ed434ea..51ff97b4d2515171f4eb75b978b41fa5a57bf9b6 100644 (file)
--- a/src/pty.h
+++ b/src/pty.h
@@ -39,6 +39,7 @@ typedef void (*pty_exit_cb)(void *, pty_process *);
 struct pty_process_ {
   int pid, exit_code, exit_signal;
   uint16_t columns, rows;
+  char term[30];
   bool killed;
 #ifdef _WIN32
   STARTUPINFOEXW si;