From 56e5b2db28757ed9b09f15c66e5b13eae241d4e6 Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 1 Nov 2002 13:36:48 +0000 Subject: [PATCH] Improve handling of oobinline sockets; Plink in telnet mode now doesn't hang when you hit ^C, which is nice. I think a better solution would involve nonblocking sockets; as it stands it's a little dependent on what may be quirks of the Linux socket layer. git-svn-id: svn://svn.tartarus.org/sgt/putty@2175 cda61777-01e9-0310-a592-d414129be87e --- unix/uxnet.c | 8 +++++--- unix/uxplink.c | 9 +++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/unix/uxnet.c b/unix/uxnet.c index 44b09c1d..2c9c7f17 100644 --- a/unix/uxnet.c +++ b/unix/uxnet.c @@ -810,10 +810,12 @@ int select_result(int fd, int event) /* * If we reach here, this is an oobinline socket, which - * means we should set s->oobpending and then fall through - * to the read case. + * means we should set s->oobpending and then deal with it + * when we get called for the readability event (which + * should also occur). */ s->oobpending = TRUE; + break; case 1: /* readable; also acceptance */ if (s->listener) { /* @@ -864,7 +866,7 @@ int select_result(int fd, int event) } else atmark = 1; - ret = recv(s->s, buf, sizeof(buf), 0); + ret = recv(s->s, buf, s->oobpending ? 1 : sizeof(buf), 0); noise_ultralight(ret); if (ret < 0) { if (errno == EWOULDBLOCK) { diff --git a/unix/uxplink.c b/unix/uxplink.c index 453a9f41..dab69475 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -532,12 +532,17 @@ int main(int argc, char **argv) for (i = 0; i < skcount; i++) { socket = sklist[i]; + /* + * We must process exceptional notifications before + * ordinary readability ones, or we may go straight + * past the urgent marker. + */ + if (FD_ISSET(socket, &xset)) + select_result(socket, 4); if (FD_ISSET(socket, &rset)) select_result(socket, 1); if (FD_ISSET(socket, &wset)) select_result(socket, 2); - if (FD_ISSET(socket, &xset)) - select_result(socket, 4); } if (FD_ISSET(0, &rset)) { -- 2.11.0