]> prime8.dev >> repos - ttyd.git/commitdiff
terminal: set the pty fd non blocking
authorShuanglei Tao <tsl0922@gmail.com>
Thu, 5 Dec 2019 15:19:34 +0000 (23:19 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Thu, 5 Dec 2019 15:19:34 +0000 (23:19 +0800)
src/protocol.c
src/terminal.c
src/utils.c
src/utils.h

index 692a638df73811bf27b88d0a97800a08bd1da2d5..4445b39eaa5acda61ca65e18028e98be0e208713 100644 (file)
@@ -175,6 +175,10 @@ spawn_process(struct pss_tty *pss) {
 
     uv_signal_start(&pss->watcher, child_cb, SIGCHLD);
 
+    // ensure the lws socket fd close-on-exec
+    fd_set_cloexec(lws_get_socket_fd(pss->wsi));
+
+    // create process with pseudo-tty
     pss->pid = pty_fork(&pss->pty, argv[0], argv, server->terminal_type);
     if (pss->pid < 0) {
         lwsl_err("pty_fork: %d (%s)\n", errno, strerror(errno));
index b0e53c202b4243a113fcc03c1742800304b5ab51..3992ffbd687ec96496189c3516fb69f6c443f632 100644 (file)
@@ -14,6 +14,8 @@
 #include <pty.h>
 #endif
 
+#include "utils.h"
+
 pid_t
 pty_fork(int *pty, const char *file, char *const argv[], const char *term) {
     pid_t pid = forkpty(pty, NULL, NULL, NULL);
@@ -29,11 +31,13 @@ pty_fork(int *pty, const char *file, char *const argv[], const char *term) {
         }
     }
 
-    // set the file descriptor close-on-exec
-    int status_flags = fcntl(*pty, F_GETFL);
-    if (status_flags != -1) {
-        fcntl(*pty, F_SETFD, status_flags | FD_CLOEXEC);
+    // set the file descriptor non blocking
+    int flags = fcntl(*pty, F_GETFL);
+    if (flags != -1) {
+        fcntl(*pty, F_SETFD, flags | O_NONBLOCK);
     }
+    // set the file descriptor close-on-exec
+    fd_set_cloexec(*pty);
 
     return pid;
 }
index 7203cdd35a58649a0dff29d8a435b9974bc46f9b..4348f6fdc24302e0f7b12e80fe2723f23591c602 100644 (file)
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <signal.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <sys/wait.h>
 
 #ifdef __linux__
@@ -85,6 +86,14 @@ get_sig(const char *sig_name) {
     return atoi(sig_name);
 }
 
+bool
+fd_set_cloexec(const int fd) {
+    int flags = fcntl(fd, F_GETFD);
+    if (flags < 0)
+        return false;
+    return (flags & FD_CLOEXEC) == 0 || fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != -1;
+}
+
 int
 wait_proc(pid_t in, pid_t *out) {
     int stat = 0, pid;
index 72cfce2d152451889c01feca95ee6f43888cd594..42477d32cfe4780707ea4c1e5e0d219d3d5f0eb0 100644 (file)
@@ -25,6 +25,10 @@ get_sig_name(int sig, char *buf, size_t len);
 int
 get_sig(const char *sig_name);
 
+// Set the given file descriptor close-on-exec
+bool
+fd_set_cloexec(const int fd);
+
 // waitpid with WNOHANG and return the status
 int
 wait_proc(pid_t in, pid_t *out);