X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxpty.c;h=e504b7050a8d28f9adc1aedba0421c18b62fb05a;hb=a063e522970946bf7d5dc052079d7773c0dee76d;hp=7ea7131c9d173da1bb8ac4240cf0c195874348ed;hpb=a9eb51b7d42c6733b07e4cbaebc0112073e63b4a;p=PuTTY.git diff --git a/unix/uxpty.c b/unix/uxpty.c index 7ea7131c..e504b705 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -373,15 +373,7 @@ static void pty_open_master(Pty pty) strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1); #endif - { - /* - * Set the pty master into non-blocking mode. - */ - int fl; - fl = fcntl(pty->master_fd, F_GETFL); - if (fl != -1 && !(fl & O_NONBLOCK)) - fcntl(pty->master_fd, F_SETFL, fl | O_NONBLOCK); - } + nonblock(pty->master_fd); if (!ptys_by_fd) ptys_by_fd = newtree234(pty_compare_by_fd); @@ -411,6 +403,7 @@ void pty_pre_init(void) #endif pty = single_pty = snew(struct pty_tag); + pty->conf = NULL; bufchain_init(&pty->output_data); /* set the child signal handler straight away; it needs to be set @@ -633,6 +626,7 @@ int pty_real_select_result(Pty pty, int event, int status) if (close_on_exit == FORCE_OFF || (close_on_exit == AUTO && pty->exit_code != 0)) { char message[512]; + message[0] = '\0'; if (WIFEXITED(pty->exit_code)) sprintf(message, "\r\n[pterm: process terminated with exit" " code %d]\r\n", WEXITSTATUS(pty->exit_code)); @@ -724,6 +718,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, if (single_pty) { pty = single_pty; + assert(pty->conf == NULL); } else { pty = snew(struct pty_tag); pty->master_fd = pty->slave_fd = -1; @@ -743,14 +738,29 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, pty_open_master(pty); /* - * Set the backspace character to be whichever of ^H and ^? is - * specified by bksp_is_delete. + * Set up configuration-dependent termios settings on the new pty. */ { struct termios attrs; tcgetattr(pty->master_fd, &attrs); + + /* + * Set the backspace character to be whichever of ^H and ^? is + * specified by bksp_is_delete. + */ attrs.c_cc[VERASE] = conf_get_int(conf, CONF_bksp_is_delete) ? '\177' : '\010'; + + /* + * Set the IUTF8 bit iff the character set is UTF-8. + */ +#ifdef IUTF8 + if (frontend_is_utf8(frontend)) + attrs.c_iflag |= IUTF8; + else + attrs.c_iflag &= ~IUTF8; +#endif + tcsetattr(pty->master_fd, TCSANOW, &attrs); } @@ -805,7 +815,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, } close(pty->master_fd); - fcntl(slavefd, F_SETFD, 0); /* don't close on exec */ + noncloexec(slavefd); dup2(slavefd, 0); dup2(slavefd, 1); dup2(slavefd, 2); @@ -817,7 +827,11 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, pgrp = getpid(); tcsetpgrp(0, pgrp); setpgid(pgrp, pgrp); - close(open(pty->name, O_WRONLY, 0)); + { + int ptyfd = open(pty->name, O_WRONLY, 0); + if (ptyfd >= 0) + close(ptyfd); + } setpgid(pgrp, pgrp); { char *term_env_var = dupprintf("TERM=%s", @@ -835,6 +849,19 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, * environment in place. */ } + { + /* + * In case we were invoked with a --display argument that + * doesn't match DISPLAY in our actual environment, we + * should set DISPLAY for processes running inside the + * terminal to match the display the terminal itself is + * on. + */ + const char *x_display = get_x_display(pty->frontend); + char *x_display_env_var = dupprintf("DISPLAY=%s", x_display); + putenv(x_display_env_var); + /* As above, we don't free this. */ + } #endif { char *key, *val; @@ -939,7 +966,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, *backend_handle = pty; - *realhost = dupprintf("\0"); + *realhost = dupstr(""); return NULL; } @@ -966,7 +993,17 @@ static void pty_free(void *handle) del234(ptys_by_pid, pty); del234(ptys_by_fd, pty); - sfree(pty); + conf_free(pty->conf); + pty->conf = NULL; + + if (pty == single_pty) { + /* + * Leave this structure around in case we need to Restart + * Session. + */ + } else { + sfree(pty); + } } static void pty_try_write(Pty pty)