+ goto select_loop_end;
+ }
+ else if (dwBytes)
+
+ {
+ GNUNET_CONTAINER_slist_add (handles_read,
+ GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+ &h, sizeof (HANDLE));
+ retcode++;
+ }
+ }
+ GNUNET_CONTAINER_slist_iter_destroy (i);
+ }
+
+ /* Poll for faulty pipes */
+ if (efds)
+
+ {
+ struct GNUNET_CONTAINER_SList_Iterator *i;
+ for (i = GNUNET_CONTAINER_slist_begin (efds->handles);
+ GNUNET_CONTAINER_slist_end (i) != GNUNET_YES;
+ GNUNET_CONTAINER_slist_next (i))
+
+ {
+ HANDLE h;
+ DWORD dwBytes;
+ h = *(HANDLE *) GNUNET_CONTAINER_slist_get (i, NULL);
+ if (!PeekNamedPipe (h, NULL, 0, NULL, &dwBytes, NULL))
+
+ {
+ GNUNET_CONTAINER_slist_add (handles_except,
+ GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+ &h, sizeof (HANDLE));
+ retcode++;
+ }
+ }
+ GNUNET_CONTAINER_slist_iter_destroy (i);
+ }
+
+ if (wfds)
+ {
+ GNUNET_CONTAINER_slist_append (handles_write, wfds->handles);
+ retcode += GNUNET_CONTAINER_slist_count (wfds->handles);
+ }
+
+ /* Check for closed sockets */
+ for (i = 0; i < nfds; i++)
+
+ {
+ if (SAFE_FD_ISSET (i, &sock_read))
+
+ {
+ struct sockaddr addr;
+ int len;
+ if (getpeername (i, &addr, &len) == SOCKET_ERROR)
+
+ {
+ int err, len;
+ len = sizeof (err);
+ if (getsockopt
+ (i, SOL_SOCKET, SO_ERROR, (char *) &err, &len) == 0
+ && err == WSAENOTCONN)
+
+ {
+ if (!SAFE_FD_ISSET (i, &aread))
+
+ {
+ FD_SET (i, &aread);
+ retcode++;
+ }
+ }
+ }
+ }
+ }
+ select_loop_end:
+ if (retcode == 0 && nfds == 0)
+ Sleep (GNUNET_MIN (100, limit - GetTickCount ()));