X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxpty.c;h=2e165cf2e9451e8d71f2d9dddeeac10197378eed;hb=46c00b0f381f48a9992e43e014e104015952e9da;hp=b54ed417efaa2993cf547a14ff83eb47c20e70ea;hpb=be93024bf21ee33065a724209f8419d43fe81923;p=PuTTY.git diff --git a/unix/uxpty.c b/unix/uxpty.c index b54ed417..2e165cf2 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -275,8 +275,10 @@ static void fatal_sig_handler(int signum) static int pty_open_slave(Pty pty) { - if (pty->slave_fd < 0) + if (pty->slave_fd < 0) { pty->slave_fd = open(pty->name, O_RDWR); + cloexec(pty->slave_fd); + } return pty->slave_fd; } @@ -307,6 +309,8 @@ static void pty_open_master(Pty pty) strcpy(pty->name, master_name); pty->name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */ + cloexec(pty->master_fd); + if (pty_open_slave(pty) >= 0 && access(pty->name, R_OK | W_OK) == 0) goto got_one; @@ -346,6 +350,8 @@ static void pty_open_master(Pty pty) exit(1); } + cloexec(pty->master_fd); + pty->name[FILENAME_MAX-1] = '\0'; strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1); #endif @@ -408,6 +414,8 @@ void pty_pre_init(void) perror("pterm: pipe"); exit(1); } + cloexec(pipefd[0]); + cloexec(pipefd[1]); pid = fork(); if (pid < 0) { perror("pterm: fork"); @@ -749,7 +757,6 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, } if (pid == 0) { - int i; /* * We are the child. */ @@ -765,18 +772,16 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, dup2(slavefd, 0); dup2(slavefd, 1); dup2(slavefd, 2); + close(slavefd); setsid(); #ifdef TIOCSCTTY - ioctl(slavefd, TIOCSCTTY, 1); + ioctl(0, TIOCSCTTY, 1); #endif pgrp = getpid(); - tcsetpgrp(slavefd, pgrp); + tcsetpgrp(0, pgrp); setpgid(pgrp, pgrp); close(open(pty->name, O_WRONLY, 0)); setpgid(pgrp, pgrp); - /* Close everything _else_, for tidiness. */ - for (i = 3; i < 1024; i++) - close(i); { char *term_env_var = dupprintf("TERM=%s", cfg->termtype); putenv(term_env_var); @@ -857,14 +862,20 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, add234(ptys_by_pid, pty); } - if (pty_signal_pipe[0] < 0 && pipe(pty_signal_pipe) < 0) { - perror("pipe"); - exit(1); + if (pty_signal_pipe[0] < 0) { + if (pipe(pty_signal_pipe) < 0) { + perror("pipe"); + exit(1); + } + cloexec(pty_signal_pipe[0]); + cloexec(pty_signal_pipe[1]); } pty_uxsel_setup(pty); *backend_handle = pty; + *realhost = dupprintf("\0"); + return NULL; } @@ -1006,10 +1017,10 @@ static const struct telnet_special *pty_get_specials(void *handle) return NULL; } -static Socket pty_socket(void *handle) +static int pty_connected(void *handle) { /* Pty pty = (Pty)handle; */ - return NULL; /* shouldn't ever be needed */ + return TRUE; } static int pty_sendok(void *handle) @@ -1066,7 +1077,7 @@ Backend pty_backend = { pty_size, pty_special, pty_get_specials, - pty_socket, + pty_connected, pty_exitcode, pty_sendok, pty_ldisc, @@ -1074,5 +1085,7 @@ Backend pty_backend = { pty_provide_logctx, pty_unthrottle, pty_cfg_info, + "pty", + -1, 1 };