#include <sys/ioctl.h>
#include "putty.h"
-#include "terminal.h"
#ifndef FALSE
#define FALSE 0
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;
+static int pty_exit_code;
#ifndef OMIT_UTMP
static struct utmp utmp_entry;
#endif
char **pty_argv;
-int pty_child_is_dead(void)
-{
- return pty_child_dead;
-}
-
-static void pty_size(void);
-
static void setup_utmp(char *ttyname, char *location)
{
#ifndef OMIT_UTMP
pid_t pid;
int status;
pid = waitpid(-1, &status, WNOHANG);
- if (pid == pty_child_pid && (WIFEXITED(status) || WIFSIGNALED(status)))
- pty_child_dead = TRUE;
+ if (pid == pty_child_pid && (WIFEXITED(status) || WIFSIGNALED(status))) {
+ pty_exit_code = status;
+ pty_child_dead = TRUE;
+ }
}
static void fatal_sig_handler(int signum)
int slavefd;
pid_t pid, pgrp;
+ pty_term_width = cfg.width;
+ pty_term_height = cfg.height;
+
if (pty_master_fd < 0)
pty_open_master();
*/
static int pty_send(char *buf, int len)
{
+ if (pty_master_fd < 0)
+ return 0; /* ignore all writes if fd closed */
+
while (len > 0) {
int ret = write(pty_master_fd, buf, len);
if (ret < 0) {
return 0;
}
+void pty_close(void)
+{
+ if (pty_master_fd >= 0) {
+ close(pty_master_fd);
+ pty_master_fd = -1;
+ }
+ close(pty_utmp_helper_pipe); /* this causes utmp to be cleaned up */
+}
+
/*
* Called to query the current socket sendability status.
*/
/*
* 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)term->rows;
- size.ws_col = (unsigned short)term->cols;
- size.ws_xpixel = (unsigned short) term->cols * font_dimension(0);
- size.ws_ypixel = (unsigned short) term->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;
}
static int pty_exitcode(void)
{
- /* Shouldn't ever be required */
- return 0;
+ if (!pty_child_dead)
+ return -1; /* not dead yet */
+ else
+ return pty_exit_code;
}
Backend pty_backend = {