X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxpty.c;h=e504b7050a8d28f9adc1aedba0421c18b62fb05a;hb=a063e522970946bf7d5dc052079d7773c0dee76d;hp=4a606efda87e4f40df787777303c918c5d974fda;hpb=1d21346d4c4fe0610c68c2a2424429978798207d;p=PuTTY.git diff --git a/unix/uxpty.c b/unix/uxpty.c index 4a606efd..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); @@ -746,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); } @@ -808,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); @@ -842,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; @@ -946,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; }