summaryrefslogtreecommitdiff
path: root/serverloop.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2008-07-04 23:10:49 +1000
committerDamien Miller <djm@mindrot.org>2008-07-04 23:10:49 +1000
commitd8968adb5faef58508bb5e7dab7cdbaf5b0e90d5 (patch)
tree33357b9d71f2d3e72b8383e2b3771773914425f4 /serverloop.c
parentb01bac109bd2fc6b3093fe4aeb31a125be8f2a4e (diff)
- (djm) [atomicio.c channels.c clientloop.c defines.h includes.h]
[packet.c scp.c serverloop.c sftp-client.c ssh-agent.c ssh-keyscan.c] [sshd.c] Explicitly handle EWOULDBLOCK wherever we handle EAGAIN, on some platforms (HP nonstop) it is a distinct errno; bz#1467 reported by sconeu AT yahoo.com; ok dtucker@
Diffstat (limited to 'serverloop.c')
-rw-r--r--serverloop.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/serverloop.c b/serverloop.c
index bd6f82dc1..77d9dee75 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -400,7 +400,8 @@ process_input(fd_set *readset)
400 return; 400 return;
401 cleanup_exit(255); 401 cleanup_exit(255);
402 } else if (len < 0) { 402 } else if (len < 0) {
403 if (errno != EINTR && errno != EAGAIN) { 403 if (errno != EINTR && errno != EAGAIN &&
404 errno != EWOULDBLOCK) {
404 verbose("Read error from remote host " 405 verbose("Read error from remote host "
405 "%.100s: %.100s", 406 "%.100s: %.100s",
406 get_remote_ipaddr(), strerror(errno)); 407 get_remote_ipaddr(), strerror(errno));
@@ -418,8 +419,8 @@ process_input(fd_set *readset)
418 if (!fdout_eof && FD_ISSET(fdout, readset)) { 419 if (!fdout_eof && FD_ISSET(fdout, readset)) {
419 errno = 0; 420 errno = 0;
420 len = read(fdout, buf, sizeof(buf)); 421 len = read(fdout, buf, sizeof(buf));
421 if (len < 0 && (errno == EINTR || 422 if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
422 (errno == EAGAIN && !child_terminated))) { 423 errno == EWOULDBLOCK) && !child_terminated))) {
423 /* do nothing */ 424 /* do nothing */
424#ifndef PTY_ZEROREAD 425#ifndef PTY_ZEROREAD
425 } else if (len <= 0) { 426 } else if (len <= 0) {
@@ -437,8 +438,8 @@ process_input(fd_set *readset)
437 if (!fderr_eof && FD_ISSET(fderr, readset)) { 438 if (!fderr_eof && FD_ISSET(fderr, readset)) {
438 errno = 0; 439 errno = 0;
439 len = read(fderr, buf, sizeof(buf)); 440 len = read(fderr, buf, sizeof(buf));
440 if (len < 0 && (errno == EINTR || 441 if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
441 (errno == EAGAIN && !child_terminated))) { 442 errno == EWOULDBLOCK) && !child_terminated))) {
442 /* do nothing */ 443 /* do nothing */
443#ifndef PTY_ZEROREAD 444#ifndef PTY_ZEROREAD
444 } else if (len <= 0) { 445 } else if (len <= 0) {
@@ -469,7 +470,8 @@ process_output(fd_set *writeset)
469 data = buffer_ptr(&stdin_buffer); 470 data = buffer_ptr(&stdin_buffer);
470 dlen = buffer_len(&stdin_buffer); 471 dlen = buffer_len(&stdin_buffer);
471 len = write(fdin, data, dlen); 472 len = write(fdin, data, dlen);
472 if (len < 0 && (errno == EINTR || errno == EAGAIN)) { 473 if (len < 0 &&
474 (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)) {
473 /* do nothing */ 475 /* do nothing */
474 } else if (len <= 0) { 476 } else if (len <= 0) {
475 if (fdin != fdout) 477 if (fdin != fdout)