notify_remote_exit(pty_frontend);
int pty_select_result(int fd, int event){    char buf[4096];    int ret;    int finished = FALSE;    if (fd == pty_master_fd && event == 1) {	ret = read(pty_master_fd, buf, sizeof(buf));	/*	 * Clean termination condition is that either ret == 0, or ret	 * < 0 and errno == EIO. Not sure why the latter, but it seems	 * to happen. Boo.	 */	if (ret == 0 || (ret < 0 && errno == EIO)) {	    /*	     * We assume a clean exit if the pty has closed but the	     * actual child process hasn't. The only way I can	     * imagine this happening is if it detaches itself from	     * the pty and goes daemonic - in which case the	     * expected usage model would precisely _not_ be for	     * the pterm window to hang around!	     */	    finished = TRUE;	    if (!pty_child_dead)		pty_exit_code = 0;	} else if (ret < 0) {	    perror("read pty master");	    exit(1);	} else if (ret > 0) {	    from_backend(pty_frontend, 0, buf, ret);	}    } else if (fd == pty_signal_pipe[0]) {	pid_t pid;	int status;	char c[1];	read(pty_signal_pipe[0], c, 1); /* ignore its value; it'll be `x' */	do {	    pid = waitpid(-1, &status, WNOHANG);	    if (pid == pty_child_pid &&		(WIFEXITED(status) || WIFSIGNALED(status))) {		/*		 * The primary child process died. We could keep		 * the terminal open for remaining subprocesses to		 * output to, but conventional wisdom seems to feel		 * that that's the Wrong Thing for an xterm-alike,		 * so we bail out now (though we don't necessarily		 * _close_ the window, depending on the state of		 * Close On Exit). This would be easy enough to		 * change or make configurable if necessary.		 */		pty_exit_code = status;		pty_child_dead = TRUE;		finished = TRUE;	    }	} while(pid > 0);    }    if (finished && !pty_finished) {	uxsel_del(pty_master_fd);	pty_close();	pty_master_fd = -1;	pty_finished = TRUE;	/*	 * This is a slight layering-violation sort of hack: only	 * if we're not closing on exit (COE is set to Never, or to	 * Only On Clean and it wasn't a clean exit) do we output a	 * `terminated' message.	 */	if (pty_cfg.close_on_exit == FORCE_OFF ||	    (pty_cfg.close_on_exit == AUTO && pty_exit_code != 0)) {	    char message[512];	    if (WIFEXITED(pty_exit_code))		sprintf(message, "\r\n[pterm: process terminated with exit"			" code %d]\r\n", WEXITSTATUS(pty_exit_code));	    else if (WIFSIGNALED(pty_exit_code))#ifdef HAVE_NO_STRSIGNAL		sprintf(message, "\r\n[pterm: process terminated on signal"			" %d]\r\n", WTERMSIG(pty_exit_code));#else		sprintf(message, "\r\n[pterm: process terminated on signal"			" %d (%.400s)]\r\n", WTERMSIG(pty_exit_code),			strsignal(WTERMSIG(pty_exit_code)));#endif	    from_backend(pty_frontend, 0, message, strlen(message));	}    }    return !finished;}