X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/2f825e594b561fe718078046687ebd6fc2ec0ebe..f7397dc65858f1105d78930fa530c9d829a03336:/unix/uxplink.c diff --git a/unix/uxplink.c b/unix/uxplink.c index c1117e43..a1dac9ad 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -27,14 +27,19 @@ void *logctx; +static struct termios orig_termios; + void fatalbox(char *p, ...) { + struct termios cf; va_list ap; + premsg(&cf); fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); + postmsg(&cf); if (logctx) { log_free(logctx); logctx = NULL; @@ -43,12 +48,15 @@ void fatalbox(char *p, ...) } void modalfatalbox(char *p, ...) { + struct termios cf; va_list ap; + premsg(&cf); fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); + postmsg(&cf); if (logctx) { log_free(logctx); logctx = NULL; @@ -57,12 +65,15 @@ void modalfatalbox(char *p, ...) } void connection_fatal(void *frontend, char *p, ...) { + struct termios cf; va_list ap; + premsg(&cf); fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); + postmsg(&cf); if (logctx) { log_free(logctx); logctx = NULL; @@ -71,17 +82,19 @@ void connection_fatal(void *frontend, char *p, ...) } void cmdline_error(char *p, ...) { + struct termios cf; va_list ap; + premsg(&cf); fprintf(stderr, "plink: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); + postmsg(&cf); exit(1); } -static int local_tty = 0; /* do we have a local tty? */ -static struct termios orig_termios; +static int local_tty = FALSE; /* do we have a local tty? */ static Backend *back; static void *backhandle; @@ -106,7 +119,7 @@ int platform_default_i(const char *name, int def) if (!strcmp(name, "TermWidth") || !strcmp(name, "TermHeight")) { struct winsize size; - if (ioctl(0, TIOCGWINSZ, (void *)&size) >= 0) + if (ioctl(STDIN_FILENO, TIOCGWINSZ, (void *)&size) >= 0) return (!strcmp(name, "TermWidth") ? size.ws_col : size.ws_row); } return def; @@ -180,7 +193,7 @@ void ldisc_update(void *frontend, int echo, int edit) */ mode.c_iflag = (mode.c_iflag | INPCK | PARMRK) & ~IGNPAR; - tcsetattr(0, TCSANOW, &mode); + tcsetattr(STDIN_FILENO, TCSANOW, &mode); } /* Helper function to extract a special character from a termios. */ @@ -366,7 +379,7 @@ char *get_ttymode(void *frontend, const char *mode) void cleanup_termios(void) { if (local_tty) - tcsetattr(0, TCSANOW, &orig_termios); + tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios); } bufchain stdout_data, stderr_data; @@ -374,7 +387,7 @@ bufchain stdout_data, stderr_data; void try_output(int is_stderr) { bufchain *chain = (is_stderr ? &stderr_data : &stdout_data); - int fd = (is_stderr ? 2 : 1); + int fd = (is_stderr ? STDERR_FILENO : STDOUT_FILENO); void *senddata; int sendlen, ret; @@ -385,7 +398,7 @@ void try_output(int is_stderr) ret = write(fd, senddata, sendlen); if (ret > 0) bufchain_consume(chain, ret); - else if (ret < 0 && errno != EWOULDBLOCK) { + else if (ret < 0) { perror(is_stderr ? "stderr: write" : "stdout: write"); exit(1); } @@ -398,10 +411,10 @@ int from_backend(void *frontend_handle, int is_stderr, if (is_stderr) { bufchain_add(&stderr_data, data, len); - try_output(1); + try_output(TRUE); } else { bufchain_add(&stdout_data, data, len); - try_output(0); + try_output(FALSE); } osize = bufchain_size(&stdout_data); @@ -582,7 +595,9 @@ int main(int argc, char **argv) default_protocol = PROT_SSH; default_port = 22; - flags = FLAG_STDERR; + flags = FLAG_STDERR | FLAG_STDERR_TTY; + + stderr_tty_init(); /* * Process the command line. */ @@ -880,26 +895,9 @@ int main(int argc, char **argv) * fails, because we know we aren't necessarily running in a * console. */ - local_tty = (tcgetattr(0, &orig_termios) == 0); + local_tty = (tcgetattr(STDIN_FILENO, &orig_termios) == 0); atexit(cleanup_termios); ldisc_update(NULL, 1, 1); - - { - int fl; - /* - * Make sure that stdout/err are non-blocking. - */ - if ((fl = fcntl(1, F_GETFL)) == -1 || - fcntl(1, F_SETFL, fl | O_NONBLOCK) == -1) { - perror("stdout"); - exit(1); - } - if ((fl = fcntl(2, F_GETFL)) == -1 || - fcntl(2, F_SETFL, fl | O_NONBLOCK) == -1) { - perror("stderr"); - exit(1); - } - } sending = FALSE; now = GETTICKCOUNT(); @@ -921,17 +919,17 @@ int main(int argc, char **argv) back->sendok(backhandle) && back->sendbuffer(backhandle) < MAX_STDIN_BACKLOG) { /* If we're OK to send, then try to read from stdin. */ - FD_SET_MAX(0, maxfd, rset); + FD_SET_MAX(STDIN_FILENO, maxfd, rset); } if (bufchain_size(&stdout_data) > 0) { /* If we have data for stdout, try to write to stdout. */ - FD_SET_MAX(1, maxfd, wset); + FD_SET_MAX(STDOUT_FILENO, maxfd, wset); } if (bufchain_size(&stderr_data) > 0) { /* If we have data for stderr, try to write to stderr. */ - FD_SET_MAX(2, maxfd, wset); + FD_SET_MAX(STDERR_FILENO, maxfd, wset); } /* Count the currently active fds. */ @@ -1028,12 +1026,12 @@ int main(int argc, char **argv) back->size(backhandle, size.ws_col, size.ws_row); } - if (FD_ISSET(0, &rset)) { + if (FD_ISSET(STDIN_FILENO, &rset)) { char buf[4096]; int ret; if (connopen && back->connected(backhandle)) { - ret = read(0, buf, sizeof(buf)); + ret = read(STDIN_FILENO, buf, sizeof(buf)); if (ret < 0) { perror("stdin: read"); exit(1); @@ -1049,12 +1047,12 @@ int main(int argc, char **argv) } } - if (FD_ISSET(1, &wset)) { - try_output(0); + if (FD_ISSET(STDOUT_FILENO, &wset)) { + try_output(FALSE); } - if (FD_ISSET(2, &wset)) { - try_output(1); + if (FD_ISSET(STDERR_FILENO, &wset)) { + try_output(TRUE); } if ((!connopen || !back->connected(backhandle)) &&