diff options
author | Markus Friedl <markus@cvs.openbsd.org> | 2001-05-11 14:59:57 +0000 |
---|---|---|
committer | Markus Friedl <markus@cvs.openbsd.org> | 2001-05-11 14:59:57 +0000 |
commit | e437b8bccf6e9a388c53a9133195c8b2e9794592 (patch) | |
tree | 9dd40f7a5ae57d08233415ea7014775530c2b6db | |
parent | 2147301a74e84856cae75f53d8f7e0809763bdfe (diff) |
add unset_nonblock for stdout/err flushing in client_loop().
-rw-r--r-- | usr.bin/ssh/clientloop.c | 27 | ||||
-rw-r--r-- | usr.bin/ssh/misc.c | 29 | ||||
-rw-r--r-- | usr.bin/ssh/misc.h | 5 |
3 files changed, 49 insertions, 12 deletions
diff --git a/usr.bin/ssh/clientloop.c b/usr.bin/ssh/clientloop.c index b2b7debc8f4..ba957fe478c 100644 --- a/usr.bin/ssh/clientloop.c +++ b/usr.bin/ssh/clientloop.c @@ -59,7 +59,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: clientloop.c,v 1.69 2001/05/08 19:17:31 markus Exp $"); +RCSID("$OpenBSD: clientloop.c,v 1.70 2001/05/11 14:59:55 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -935,22 +935,35 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) snprintf(buf, sizeof buf, "Connection to %.64s closed.\r\n", host); buffer_append(&stderr_buffer, buf, strlen(buf)); } + + /* restore blocking io */ + if (!isatty(fileno(stdin))) + unset_nonblock(fileno(stdin)); + if (!isatty(fileno(stdout))) + unset_nonblock(fileno(stdout)); + if (!isatty(fileno(stderr))) + unset_nonblock(fileno(stderr)); + /* Output any buffered data for stdout. */ - if (buffer_len(&stdout_buffer) > 0) { - len = atomicio(write, fileno(stdout), buffer_ptr(&stdout_buffer), + while (buffer_len(&stdout_buffer) > 0) { + len = write(fileno(stdout), buffer_ptr(&stdout_buffer), buffer_len(&stdout_buffer)); - if (len != buffer_len(&stdout_buffer)) + if (len <= 0) { error("Write failed flushing stdout buffer."); + break; + } buffer_consume(&stdout_buffer, len); stdout_bytes += len; } /* Output any buffered data for stderr. */ - if (buffer_len(&stderr_buffer) > 0) { - len = atomicio(write, fileno(stderr), buffer_ptr(&stderr_buffer), + while (buffer_len(&stderr_buffer) > 0) { + len = write(fileno(stderr), buffer_ptr(&stderr_buffer), buffer_len(&stderr_buffer)); - if (len != buffer_len(&stderr_buffer)) + if (len <= 0) { error("Write failed flushing stderr buffer."); + break; + } buffer_consume(&stderr_buffer, len); stderr_bytes += len; } diff --git a/usr.bin/ssh/misc.c b/usr.bin/ssh/misc.c index 36363514f83..19487bea9b6 100644 --- a/usr.bin/ssh/misc.c +++ b/usr.bin/ssh/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.7 2001/05/08 19:45:24 mouring Exp $ */ +/* $OpenBSD: misc.c,v 1.8 2001/05/11 14:59:56 markus Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -25,7 +25,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: misc.c,v 1.7 2001/05/08 19:45:24 mouring Exp $"); +RCSID("$OpenBSD: misc.c,v 1.8 2001/05/11 14:59:56 markus Exp $"); #include "misc.h" #include "log.h" @@ -50,13 +50,14 @@ void set_nonblock(int fd) { int val; + val = fcntl(fd, F_GETFL, 0); if (val < 0) { error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno)); return; } if (val & O_NONBLOCK) { - debug("fd %d IS O_NONBLOCK", fd); + debug2("fd %d is O_NONBLOCK", fd); return; } debug("fd %d setting O_NONBLOCK", fd); @@ -67,6 +68,28 @@ set_nonblock(int fd) fd, strerror(errno)); } +void +unset_nonblock(int fd) +{ + int val; + + val = fcntl(fd, F_GETFL, 0); + if (val < 0) { + error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno)); + return; + } + if (!(val & O_NONBLOCK)) { + debug2("fd %d is not O_NONBLOCK", fd); + return; + } + debug("fd %d setting O_NONBLOCK", fd); + val &= ~O_NONBLOCK; + if (fcntl(fd, F_SETFL, val) == -1) + if (errno != ENODEV) + error("fcntl(%d, F_SETFL, O_NONBLOCK): %s", + fd, strerror(errno)); +} + /* Characters considered whitespace in strsep calls. */ #define WHITESPACE " \t\r\n" diff --git a/usr.bin/ssh/misc.h b/usr.bin/ssh/misc.h index 16545ce660e..4f02f4ebaa5 100644 --- a/usr.bin/ssh/misc.h +++ b/usr.bin/ssh/misc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.h,v 1.6 2001/05/08 19:45:24 mouring Exp $ */ +/* $OpenBSD: misc.h,v 1.7 2001/05/11 14:59:56 markus Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -17,8 +17,9 @@ char *chop(char *s); /* return next token in configuration line */ char *strdelim(char **s); -/* set filedescriptor to non-blocking */ +/* set/unset filedescriptor to non-blocking */ void set_nonblock(int fd); +void unset_nonblock(int fd); struct passwd * pwcopy(struct passwd *pw); |