X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/3a7c6b9e4145c1f8e123620bd2ee136a89d4f023..203abf9e5d58b7ca053ae30c231c7e7eac8edfb9:/unix/uxpty.c diff --git a/unix/uxpty.c b/unix/uxpty.c index 708e82d6..bdfa5ab1 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -80,7 +80,7 @@ struct pty_tag { int master_fd, slave_fd; void *frontend; char name[FILENAME_MAX]; - int child_pid; + pid_t child_pid; int term_width, term_height; int child_dead, finished; int exit_code; @@ -137,7 +137,7 @@ static int pty_compare_by_pid(void *av, void *bv) static int pty_find_by_pid(void *av, void *bv) { - int a = *(int *)av; + pid_t a = *(pid_t *)av; Pty b = (Pty)bv; if (a < b->child_pid) @@ -167,7 +167,8 @@ static tree234 *ptys_by_pid = NULL; static Pty single_pty = NULL; #ifndef OMIT_UTMP -static int pty_utmp_helper_pid, pty_utmp_helper_pipe; +static pid_t pty_utmp_helper_pid; +static int pty_utmp_helper_pipe; static int pty_stamped_utmp; static struct utmpx utmp_entry; #endif @@ -260,7 +261,8 @@ static void cleanup_utmp(void) static void sigchld_handler(int signum) { - write(pty_signal_pipe[1], "x", 1); + if (write(pty_signal_pipe[1], "x", 1) <= 0) + /* not much we can do about it */; } #ifndef OMIT_UTMP @@ -360,8 +362,10 @@ static void pty_open_master(Pty pty) /* * Set the pty master into non-blocking mode. */ - int i = 1; - ioctl(pty->master_fd, FIONBIO, &i); + int fl; + fl = fcntl(pty->master_fd, F_GETFL); + if (fl != -1 && !(fl & O_NONBLOCK)) + fcntl(pty->master_fd, F_SETFL, fl | O_NONBLOCK); } if (!ptys_by_fd) @@ -627,16 +631,16 @@ int pty_select_result(int fd, int event) if (fd == pty_signal_pipe[0]) { pid_t pid; - int ipid; int status; char c[1]; - read(pty_signal_pipe[0], c, 1); /* ignore its value; it'll be `x' */ + if (read(pty_signal_pipe[0], c, 1) <= 0) + /* ignore error */; + /* ignore its value; it'll be `x' */ do { pid = waitpid(-1, &status, WNOHANG); - ipid = pid; pty = find234(ptys_by_pid, &pid, pty_find_by_pid); if (pty) @@ -822,14 +826,15 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, } /* - * SIGINT and SIGQUIT may have been set to ignored by our - * parent, particularly by things like sh -c 'pterm &' and - * some window managers. SIGCHLD, meanwhile, was blocked - * during pt_main() startup. Reverse all this for our child - * process. + * SIGINT, SIGQUIT and SIGPIPE may have been set to ignored by + * our parent, particularly by things like sh -c 'pterm &' and + * some window or session managers. SIGCHLD, meanwhile, was + * blocked during pt_main() startup. Reverse all this for our + * child process. */ putty_signal(SIGINT, SIG_DFL); putty_signal(SIGQUIT, SIG_DFL); + putty_signal(SIGPIPE, SIG_DFL); block_signal(SIGCHLD, 0); if (pty_argv) execvp(pty_argv[0], pty_argv); @@ -1085,5 +1090,7 @@ Backend pty_backend = { pty_provide_logctx, pty_unthrottle, pty_cfg_info, - 1 + "pty", + -1, + 0 };