static int pty_stamped_utmp = 0;
static int pty_child_pid;
static int pty_utmp_helper_pid, pty_utmp_helper_pipe;
+static int pty_term_width, pty_term_height;
static sig_atomic_t pty_child_dead;
#ifndef OMIT_UTMP
static struct utmp utmp_entry;
return pty_child_dead;
}
-static void pty_size(void);
-
static void setup_utmp(char *ttyname, char *location)
{
#ifndef OMIT_UTMP
close(pipefd[0]);
pty_utmp_helper_pid = pid;
pty_utmp_helper_pipe = pipefd[1];
+ signal(SIGCHLD, sigchld_handler);
}
#endif
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
-static char *pty_init(char *host, int port, char **realhost, int nodelay)
+static char *pty_init(void *frontend,
+ char *host, int port, char **realhost, int nodelay)
{
int slavefd;
pid_t pid, pgrp;
+ pty_term_width = cfg.width;
+ pty_term_height = cfg.height;
+
if (pty_master_fd < 0)
pty_open_master();
}
close(pty_master_fd);
- close(0);
- close(1);
- close(2);
fcntl(slavefd, F_SETFD, 0); /* don't close on exec */
dup2(slavefd, 0);
dup2(slavefd, 1);
sprintf(term_env_var, "TERM=%s", cfg.termtype);
putenv(term_env_var);
}
+ /*
+ * SIGINT and SIGQUIT may have been set to ignored by our
+ * parent, particularly by things like sh -c 'pterm &' and
+ * some window managers. Reverse this for our child process.
+ */
+ signal(SIGINT, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
if (pty_argv)
execvp(pty_argv[0], pty_argv);
else {
/*
* Called to set the size of the window
*/
-static void pty_size(void)
+static void pty_size(int width, int height)
{
struct winsize size;
- size.ws_row = (unsigned short)rows;
- size.ws_col = (unsigned short)cols;
- size.ws_xpixel = (unsigned short) cols * font_dimension(0);
- size.ws_ypixel = (unsigned short) rows * font_dimension(1);
+ pty_term_width = width;
+ pty_term_height = height;
+
+ size.ws_row = (unsigned short)pty_term_height;
+ size.ws_col = (unsigned short)pty_term_width;
+ size.ws_xpixel = (unsigned short) pty_term_width * font_dimension(0);
+ size.ws_ypixel = (unsigned short) pty_term_height * font_dimension(1);
ioctl(pty_master_fd, TIOCSWINSZ, (void *)&size);
return;
}