X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxpty.c;h=84f36ef87bef2c5062829933dd5d48c77c0b11f5;hb=89da2ddf564a93414ee9ab2df3f053608094e417;hp=99ff6386d01e5a3053a4dece83ddad6be6d338c2;hpb=bbc9709b48515954f2f3eb631d1a6bea960bda18;p=PuTTY.git diff --git a/unix/uxpty.c b/unix/uxpty.c index 99ff6386..84f36ef8 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 @@ -713,8 +706,8 @@ static void pty_uxsel_setup(Pty pty) * freed by the caller. */ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, - char *host, int port, char **realhost, int nodelay, - int keepalive) + const char *host, int port, char **realhost, + int nodelay, int keepalive) { int slavefd; pid_t pid, pgrp; @@ -725,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; @@ -806,7 +800,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); @@ -818,7 +812,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", @@ -940,7 +938,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, *backend_handle = pty; - *realhost = dupprintf("\0"); + *realhost = dupstr(""); return NULL; } @@ -967,7 +965,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) @@ -1000,7 +1008,7 @@ static void pty_try_write(Pty pty) /* * Called to send data down the pty. */ -static int pty_send(void *handle, char *buf, int len) +static int pty_send(void *handle, const char *buf, int len) { Pty pty = (Pty)handle;