- (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@
diff --git a/ChangeLog b/ChangeLog
index c985a7b..984c170 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -30,7 +30,12 @@
      explicitly disable conch options that could interfere with the test
  - (dtucker) [sftp-server.c] Bug #1447: fall back to racy rename if link
    returns EXDEV.  Patch from Mike Garrison, ok djm@
-h
+ - (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@
+
 20080702
  - (dtucker) OpenBSD CVS Sync
     - djm@cvs.openbsd.org 2008/06/30 08:05:59
@@ -4565,4 +4570,4 @@
    OpenServer 6 and add osr5bigcrypt support so when someone migrates
    passwords between UnixWare and OpenServer they will still work. OK dtucker@
 
-$Id: ChangeLog,v 1.5057 2008/07/04 07:11:30 dtucker Exp $
+$Id: ChangeLog,v 1.5058 2008/07/04 13:10:49 djm Exp $
diff --git a/atomicio.c b/atomicio.c
index 575bf89..bb44c32 100644
--- a/atomicio.c
+++ b/atomicio.c
@@ -63,11 +63,7 @@
 		case -1:
 			if (errno == EINTR)
 				continue;
-#ifdef EWOULDBLOCK
 			if (errno == EAGAIN || errno == EWOULDBLOCK) {
-#else
-			if (errno == EAGAIN) {
-#endif
 				(void)poll(&pfd, 1, -1);
 				continue;
 			}
@@ -109,11 +105,7 @@
 		case -1:
 			if (errno == EINTR)
 				continue;
-#ifdef EWOULDBLOCK
 			if (errno == EAGAIN || errno == EWOULDBLOCK) {
-#else
-			if (errno == EAGAIN) {
-#endif
 				(void)poll(&pfd, 1, -1);
 				continue;
 			}
diff --git a/channels.c b/channels.c
index 7f0aaad..ac5134b 100644
--- a/channels.c
+++ b/channels.c
@@ -1494,7 +1494,8 @@
 	if (c->rfd != -1 && (force || FD_ISSET(c->rfd, readset))) {
 		errno = 0;
 		len = read(c->rfd, buf, sizeof(buf));
-		if (len < 0 && (errno == EINTR || (errno == EAGAIN && !force)))
+		if (len < 0 && (errno == EINTR ||
+		    ((errno == EAGAIN || errno == EWOULDBLOCK) && !force)))
 			return 1;
 #ifndef PTY_ZEROREAD
 		if (len <= 0) {
@@ -1565,7 +1566,8 @@
 			c->local_consumed += dlen + 4;
 			len = write(c->wfd, buf, dlen);
 			xfree(data);
-			if (len < 0 && (errno == EINTR || errno == EAGAIN))
+			if (len < 0 && (errno == EINTR || errno == EAGAIN ||
+			    errno == EWOULDBLOCK))
 				return 1;
 			if (len <= 0) {
 				if (c->type != SSH_CHANNEL_OPEN)
@@ -1583,7 +1585,8 @@
 #endif
 
 		len = write(c->wfd, buf, dlen);
-		if (len < 0 && (errno == EINTR || errno == EAGAIN))
+		if (len < 0 &&
+		    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
 			return 1;
 		if (len <= 0) {
 			if (c->type != SSH_CHANNEL_OPEN) {
@@ -1635,7 +1638,8 @@
 			    buffer_len(&c->extended));
 			debug2("channel %d: written %d to efd %d",
 			    c->self, len, c->efd);
-			if (len < 0 && (errno == EINTR || errno == EAGAIN))
+			if (len < 0 && (errno == EINTR || errno == EAGAIN ||
+			    errno == EWOULDBLOCK))
 				return 1;
 			if (len <= 0) {
 				debug2("channel %d: closing write-efd %d",
@@ -1650,8 +1654,8 @@
 			len = read(c->efd, buf, sizeof(buf));
 			debug2("channel %d: read %d from efd %d",
 			    c->self, len, c->efd);
-			if (len < 0 && (errno == EINTR ||
-			    (errno == EAGAIN && !c->detach_close)))
+			if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
+			    errno == EWOULDBLOCK) && !c->detach_close)))
 				return 1;
 			if (len <= 0) {
 				debug2("channel %d: closing read-efd %d",
@@ -1675,7 +1679,8 @@
 	/* Monitor control fd to detect if the slave client exits */
 	if (c->ctl_fd != -1 && FD_ISSET(c->ctl_fd, readset)) {
 		len = read(c->ctl_fd, buf, sizeof(buf));
-		if (len < 0 && (errno == EINTR || errno == EAGAIN))
+		if (len < 0 &&
+		    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
 			return 1;
 		if (len <= 0) {
 			debug2("channel %d: ctl read<=0", c->self);
diff --git a/clientloop.c b/clientloop.c
index 6dc8708..ba2f0b7 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -663,7 +663,8 @@
 		 * There is a kernel bug on Solaris that causes select to
 		 * sometimes wake up even though there is no data available.
 		 */
-		if (len < 0 && (errno == EAGAIN || errno == EINTR))
+		if (len < 0 &&
+		    (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
 			len = 0;
 
 		if (len < 0) {
@@ -1129,7 +1130,8 @@
 	if (FD_ISSET(fileno(stdin), readset)) {
 		/* Read as much as possible. */
 		len = read(fileno(stdin), buf, sizeof(buf));
-		if (len < 0 && (errno == EAGAIN || errno == EINTR))
+		if (len < 0 &&
+		    (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
 			return;		/* we'll try again later */
 		if (len <= 0) {
 			/*
@@ -1186,7 +1188,8 @@
 		len = write(fileno(stdout), buffer_ptr(&stdout_buffer),
 		    buffer_len(&stdout_buffer));
 		if (len <= 0) {
-			if (errno == EINTR || errno == EAGAIN)
+			if (errno == EINTR || errno == EAGAIN ||
+			    errno == EWOULDBLOCK)
 				len = 0;
 			else {
 				/*
@@ -1210,7 +1213,8 @@
 		len = write(fileno(stderr), buffer_ptr(&stderr_buffer),
 		    buffer_len(&stderr_buffer));
 		if (len <= 0) {
-			if (errno == EINTR || errno == EAGAIN)
+			if (errno == EINTR || errno == EAGAIN ||
+			    errno == EWOULDBLOCK)
 				len = 0;
 			else {
 				/*
diff --git a/defines.h b/defines.h
index a2fda99..a8203eb 100644
--- a/defines.h
+++ b/defines.h
@@ -25,7 +25,7 @@
 #ifndef _DEFINES_H
 #define _DEFINES_H
 
-/* $Id: defines.h,v 1.150 2008/06/13 00:28:57 dtucker Exp $ */
+/* $Id: defines.h,v 1.151 2008/07/04 13:10:49 djm Exp $ */
 
 
 /* Constants */
@@ -734,4 +734,8 @@
 # endif
 #endif
 
+#ifndef EWOULDBLOCK
+# define EWOULDBLOCK EAGAIN
+#endif
+
 #endif /* _DEFINES_H */
diff --git a/includes.h b/includes.h
index 9fcf1b0..f1b47f6 100644
--- a/includes.h
+++ b/includes.h
@@ -149,6 +149,8 @@
 # include <sys/syslog.h>
 #endif
 
+#include <errno.h>
+
 /*
  * On HP-UX 11.11, shadow.h and prot.h provide conflicting declarations
  * of getspnam when _INCLUDE__STDC__ is defined, so we unset it here.
diff --git a/packet.c b/packet.c
index 90ad5ff..ff22be6 100644
--- a/packet.c
+++ b/packet.c
@@ -956,7 +956,8 @@
 			if ((ret = select(connection_in + 1, setp, NULL,
 			    NULL, timeoutp)) >= 0)
 				break;
-		   	if (errno != EAGAIN && errno != EINTR)
+		   	if (errno != EAGAIN && errno != EINTR &&
+			    errno != EWOULDBLOCK)
 				break;
 			if (packet_timeout_ms == -1)
 				continue;
@@ -1475,7 +1476,7 @@
 	if (len > 0) {
 		len = write(connection_out, buffer_ptr(&output), len);
 		if (len <= 0) {
-			if (errno == EAGAIN)
+			if (errno == EAGAIN || errno == EWOULDBLOCK)
 				return;
 			else
 				fatal("Write failed: %.100s", strerror(errno));
@@ -1516,7 +1517,8 @@
 			if ((ret = select(connection_out + 1, NULL, setp,
 			    NULL, timeoutp)) >= 0)
 				break;
-		   	if (errno != EAGAIN && errno != EINTR)
+		   	if (errno != EAGAIN && errno != EINTR &&
+			    errno != EWOULDBLOCK)
 				break;
 			if (packet_timeout_ms == -1)
 				continue;
diff --git a/scp.c b/scp.c
index 46433a6..9f8b7a1 100644
--- a/scp.c
+++ b/scp.c
@@ -474,7 +474,7 @@
 		if (r < 0) {
 			if (errno == EINTR)
 				continue;
-			if (errno == EAGAIN) {
+			if (errno == EAGAIN || errno == EWOULDBLOCK) {
 				(void)poll(&pfd, 1, -1); /* Ignore errors */
 				continue;
 			}
diff --git a/serverloop.c b/serverloop.c
index bd6f82d..77d9dee 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -400,7 +400,8 @@
 				return;
 			cleanup_exit(255);
 		} else if (len < 0) {
-			if (errno != EINTR && errno != EAGAIN) {
+			if (errno != EINTR && errno != EAGAIN &&
+			    errno != EWOULDBLOCK) {
 				verbose("Read error from remote host "
 				    "%.100s: %.100s",
 				    get_remote_ipaddr(), strerror(errno));
@@ -418,8 +419,8 @@
 	if (!fdout_eof && FD_ISSET(fdout, readset)) {
 		errno = 0;
 		len = read(fdout, buf, sizeof(buf));
-		if (len < 0 && (errno == EINTR ||
-		    (errno == EAGAIN && !child_terminated))) {
+		if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
+		    errno == EWOULDBLOCK) && !child_terminated))) {
 			/* do nothing */
 #ifndef PTY_ZEROREAD
 		} else if (len <= 0) {
@@ -437,8 +438,8 @@
 	if (!fderr_eof && FD_ISSET(fderr, readset)) {
 		errno = 0;
 		len = read(fderr, buf, sizeof(buf));
-		if (len < 0 && (errno == EINTR ||
-		    (errno == EAGAIN && !child_terminated))) {
+		if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
+		    errno == EWOULDBLOCK) && !child_terminated))) {
 			/* do nothing */
 #ifndef PTY_ZEROREAD
 		} else if (len <= 0) {
@@ -469,7 +470,8 @@
 		data = buffer_ptr(&stdin_buffer);
 		dlen = buffer_len(&stdin_buffer);
 		len = write(fdin, data, dlen);
-		if (len < 0 && (errno == EINTR || errno == EAGAIN)) {
+		if (len < 0 &&
+		    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)) {
 			/* do nothing */
 		} else if (len <= 0) {
 			if (fdin != fdout)
diff --git a/sftp-client.c b/sftp-client.c
index 42bf0c8..5e39aa7 100644
--- a/sftp-client.c
+++ b/sftp-client.c
@@ -1223,7 +1223,8 @@
 			len = 0;
 		else do
 			len = read(local_fd, data, conn->transfer_buflen);
-		while ((len == -1) && (errno == EINTR || errno == EAGAIN));
+		while ((len == -1) &&
+		    (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
 
 		if (len == -1)
 			fatal("Couldn't read from \"%s\": %s", local_path,
diff --git a/ssh-agent.c b/ssh-agent.c
index b1c65fa..9123cfe 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -961,7 +961,8 @@
 					    buffer_ptr(&sockets[i].output),
 					    buffer_len(&sockets[i].output));
 					if (len == -1 && (errno == EAGAIN ||
-					    errno == EINTR))
+					    errno == EINTR ||
+					    errno == EWOULDBLOCK))
 						continue;
 					break;
 				} while (1);
@@ -975,7 +976,8 @@
 				do {
 					len = read(sockets[i].fd, buf, sizeof(buf));
 					if (len == -1 && (errno == EAGAIN ||
-					    errno == EINTR))
+					    errno == EINTR ||
+					    errno == EWOULDBLOCK))
 						continue;
 					break;
 				} while (1);
diff --git a/ssh-keyscan.c b/ssh-keyscan.c
index 304fcfd..d810777 100644
--- a/ssh-keyscan.c
+++ b/ssh-keyscan.c
@@ -656,7 +656,7 @@
 	memcpy(e, read_wait, read_wait_nfdset * sizeof(fd_mask));
 
 	while (select(maxfd, r, NULL, e, &seltime) == -1 &&
-	    (errno == EAGAIN || errno == EINTR))
+	    (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
 		;
 
 	for (i = 0; i < maxfd; i++) {
diff --git a/sshd.c b/sshd.c
index c952f7a..a6620a0 100644
--- a/sshd.c
+++ b/sshd.c
@@ -1096,7 +1096,8 @@
 			*newsock = accept(listen_socks[i],
 			    (struct sockaddr *)&from, &fromlen);
 			if (*newsock < 0) {
-				if (errno != EINTR && errno != EWOULDBLOCK)
+				if (errno != EINTR && errno != EAGAIN &&
+				    errno != EWOULDBLOCK)
 					error("accept: %.100s", strerror(errno));
 				continue;
 			}