X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxpty.c;h=79a60f3c139c4fbc75517f9f9392c0d8a73db4be;hb=af1460d6e5044a3344aaacd15c91cfdcb58578e7;hp=b67a6dad37f5fc633031d02017ce612463ae626b;hpb=69737b24b56d7f7befc27e473f8a61a7e32af5b6;p=PuTTY.git diff --git a/unix/uxpty.c b/unix/uxpty.c index b67a6dad..79a60f3c 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -395,6 +395,14 @@ static void pty_open_master(Pty pty) add234(ptys_by_fd, pty); } +static Pty new_pty_struct(void) +{ + Pty pty = snew(struct pty_tag); + pty->conf = NULL; + bufchain_init(&pty->output_data); + return pty; +} + /* * Pre-initialisation. This is here to get around the fact that GTK * doesn't like being run in setuid/setgid programs (probably @@ -419,9 +427,7 @@ void pty_pre_init(void) int pipefd[2]; #endif - pty = single_pty = snew(struct pty_tag); - pty->conf = NULL; - bufchain_init(&pty->output_data); + pty = single_pty = new_pty_struct(); /* set the child signal handler straight away; it needs to be set * before we ever fork. */ @@ -740,7 +746,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, pty = single_pty; assert(pty->conf == NULL); } else { - pty = snew(struct pty_tag); + pty = new_pty_struct(); pty->master_fd = pty->slave_fd = -1; #ifndef OMIT_UTMP pty_stamped_utmp = FALSE; @@ -757,18 +763,6 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, if (pty->master_fd < 0) pty_open_master(pty); - /* - * Set the backspace character to be whichever of ^H and ^? is - * specified by bksp_is_delete. - */ - { - struct termios attrs; - tcgetattr(pty->master_fd, &attrs); - attrs.c_cc[VERASE] = conf_get_int(conf, CONF_bksp_is_delete) - ? '\177' : '\010'; - tcsetattr(pty->master_fd, TCSANOW, &attrs); - } - #ifndef OMIT_UTMP /* * Stamp utmp (that is, tell the utmp helper process to do so), @@ -809,6 +803,8 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, } if (pid == 0) { + struct termios attrs; + /* * We are the child. */ @@ -831,6 +827,34 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, #endif pgrp = getpid(); tcsetpgrp(0, pgrp); + + /* + * Set up configuration-dependent termios settings on the new + * pty. Linux would have let us do this on the pty master + * before we forked, but that fails on OS X, so we do it here + * instead. + */ + if (tcgetattr(0, &attrs) == 0) { + /* + * 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(0, TCSANOW, &attrs); + } + setpgid(pgrp, pgrp); { int ptyfd = open(pty->name, O_WRONLY, 0); @@ -998,6 +1022,8 @@ static void pty_free(void *handle) del234(ptys_by_pid, pty); del234(ptys_by_fd, pty); + bufchain_clear(&pty->output_data); + conf_free(pty->conf); pty->conf = NULL; @@ -1192,6 +1218,7 @@ Backend pty_backend = { pty_provide_logctx, pty_unthrottle, pty_cfg_info, + NULL /* test_for_upstream */, "pty", -1, 0