summaryrefslogtreecommitdiff
path: root/usr.bin/ssh
diff options
context:
space:
mode:
authorMarkus Friedl <markus@cvs.openbsd.org>2001-05-11 14:59:57 +0000
committerMarkus Friedl <markus@cvs.openbsd.org>2001-05-11 14:59:57 +0000
commite437b8bccf6e9a388c53a9133195c8b2e9794592 (patch)
tree9dd40f7a5ae57d08233415ea7014775530c2b6db /usr.bin/ssh
parent2147301a74e84856cae75f53d8f7e0809763bdfe (diff)
add unset_nonblock for stdout/err flushing in client_loop().
Diffstat (limited to 'usr.bin/ssh')
-rw-r--r--usr.bin/ssh/clientloop.c27
-rw-r--r--usr.bin/ssh/misc.c29
-rw-r--r--usr.bin/ssh/misc.h5
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);