- ret = recv(s, buf, sizeof(buf), 0);
- if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
- return 1;
- if (ret < 0) /* any _other_ error */
- return -10000-WSAGetLastError();
- if (ret == 0) {
- s = INVALID_SOCKET;
- return 0; /* can't happen, in theory */
- }
-#if 0
- if (in_synch) {
- BOOL i;
- if (ioctlsocket (s, SIOCATMARK, &i) < 0) {
- return -20000-WSAGetLastError();
- }
- if (i)
- in_synch = FALSE;
+ case FD_CLOSE:
+ {
+ int clear_of_oob = 1;
+
+ /* Don't check for error return; some shims don't support
+ * this ioctl.
+ */
+ ioctlsocket (s, SIOCATMARK, &clear_of_oob);
+
+ in_synch = !clear_of_oob;
+
+ do {
+ ret = recv(s, buf, sizeof(buf), 0);
+ if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
+ return 1;
+ if (ret < 0) { /* any _other_ error */
+ closesocket(s);
+ s = INVALID_SOCKET;
+ return -10000-WSAGetLastError();
+ }
+ if (ret == 0) {
+ s = INVALID_SOCKET;
+ return 0;
+ }
+ do_telnet_read (buf, ret);
+ } while (in_synch);