X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5a9eb1056517b6ee6efa526a3a6b5a21aa802648..c85623f918b8a6c639afc15604414f9b113bb20d:/unix/uxplink.c diff --git a/unix/uxplink.c b/unix/uxplink.c index a005ce6d..2778bc5a 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -4,8 +4,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -70,11 +72,12 @@ struct termios orig_termios; static Backend *back; static void *backhandle; +static Config cfg; /* * Default settings that are specific to pterm. */ -char *platform_default_s(char *name) +char *platform_default_s(const char *name) { if (!strcmp(name, "X11Display")) return getenv("DISPLAY"); @@ -122,7 +125,7 @@ char *platform_default_s(char *name) return NULL; } -int platform_default_i(char *name, int def) +int platform_default_i(const char *name, int def) { if (!strcmp(name, "TermWidth") || !strcmp(name, "TermHeight")) { @@ -133,7 +136,7 @@ int platform_default_i(char *name, int def) return def; } -char *x_get_default(char *key) +char *x_get_default(const char *key) { return NULL; /* this is a stub */ } @@ -208,6 +211,13 @@ int from_backend(void *frontend_handle, int is_stderr, char *data, int len) return osize + esize; } +int signalpipe[2]; + +void sigwinch(int signum) +{ + write(signalpipe[1], "x", 1); +} + /* * Short description of parameters. */ @@ -292,7 +302,8 @@ int main(int argc, char **argv) while (--argc) { char *p = *++argv; if (*p == '-') { - int ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL), 1); + int ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL), + 1, &cfg); if (ret == -2) { fprintf(stderr, "plink: option \"%s\" requires an argument\n", p); @@ -470,7 +481,7 @@ int main(int argc, char **argv) /* * Perform command-line overrides on session configuration. */ - cmdline_run_saved(); + cmdline_run_saved(&cfg); /* * Trim a colon suffix off the hostname if it's there. @@ -520,19 +531,28 @@ int main(int argc, char **argv) if (portnumber != -1) cfg.port = portnumber; + /* + * Set up the pipe we'll use to tell us about SIGWINCH. + */ + if (pipe(signalpipe) < 0) { + perror("pipe"); + exit(1); + } + putty_signal(SIGWINCH, sigwinch); + sk_init(); /* * Start up the connection. */ - logctx = log_init(NULL); + logctx = log_init(NULL, &cfg); { char *error; char *realhost; /* nodelay is only useful if stdin is a terminal device */ int nodelay = cfg.tcp_nodelay && isatty(0); - error = back->init(NULL, &backhandle, cfg.host, cfg.port, + error = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port, &realhost, nodelay); if (error) { fprintf(stderr, "Unable to open connection:\n%s\n", error); @@ -565,6 +585,8 @@ int main(int argc, char **argv) FD_ZERO(&xset); maxfd = 0; + FD_SET_MAX(signalpipe[0], maxfd, rset); + if (connopen && !sending && back->socket(backhandle) != NULL && back->sendok(backhandle) && @@ -610,7 +632,9 @@ int main(int argc, char **argv) FD_SET_MAX(socket, maxfd, xset); } - ret = select(maxfd, &rset, &wset, &xset, NULL); + do { + ret = select(maxfd, &rset, &wset, &xset, NULL); + } while (ret < 0 && errno == EINTR); if (ret < 0) { perror("select"); @@ -632,6 +656,14 @@ int main(int argc, char **argv) select_result(socket, 2); } + if (FD_ISSET(signalpipe[0], &rset)) { + char c[1]; + struct winsize size; + read(signalpipe[0], c, 1); /* ignore its value; it'll be `x' */ + if (ioctl(0, TIOCGWINSZ, (void *)&size) >= 0) + back->size(backhandle, size.ws_col, size.ws_row); + } + if (FD_ISSET(0, &rset)) { char buf[4096]; int ret;