mirror of
https://github.com/tsl0922/ttyd.git
synced 2025-12-23 04:14:18 +01:00
protocol: set the pty file descriptor non blocking
This commit is contained in:
@@ -187,24 +187,25 @@ thread_run_command(void *args) {
|
||||
int pty;
|
||||
fd_set des_set;
|
||||
pid_t pid = forkpty(&pty, NULL, NULL, NULL);
|
||||
|
||||
switch (pid) {
|
||||
case -1: /* error */
|
||||
lwsl_err("forkpty, error: %d (%s)\n", errno, strerror(errno));
|
||||
break;
|
||||
case 0: /* child */
|
||||
if (setenv("TERM", server->terminal_type, true) < 0) {
|
||||
perror("setenv");
|
||||
if (pid < 0) { /* error */
|
||||
lwsl_err("forkpty failed: %d (%s)\n", errno, strerror(errno));
|
||||
pthread_exit((void *) 1);
|
||||
}
|
||||
} else if (pid == 0) { /* child */
|
||||
setenv("TERM", server->terminal_type, true);
|
||||
// Don't pass the web socket onto child processes
|
||||
close(lws_get_socket_fd(client->wsi));
|
||||
if (execvp(argv[0], argv) < 0) {
|
||||
perror("execvp");
|
||||
pthread_exit((void *) 1);
|
||||
perror("execvp failed\n");
|
||||
_exit(-errno);
|
||||
}
|
||||
break;
|
||||
default: /* parent */
|
||||
}
|
||||
|
||||
// set the pty file descriptor non blocking
|
||||
int status_flags = fcntl(pty, F_GETFL);
|
||||
if (status_flags != -1) {
|
||||
fcntl(pty, F_SETFL, status_flags | O_NONBLOCK);
|
||||
}
|
||||
|
||||
lwsl_notice("started process, pid: %d\n", pid);
|
||||
client->pid = pid;
|
||||
client->pty = pty;
|
||||
@@ -236,8 +237,6 @@ thread_run_command(void *args) {
|
||||
|
||||
if (client->pty_len <= 0) break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
pthread_exit((void *) 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user