static int connect_nonb(int sockfd, const struct sockaddr *addr, socklen_t addrlen, int msec) { int flags, n, error; socklen_t len; fd_set rset, wset; struct timeval tval; flags = setnonblock(sockfd); error = 0; if ((n = connect(sockfd, addr, addrlen)) < 0) { #if (!(defined(WIN32) || defined(_WIN32))) if (errno != EINPROGRESS) return -1; #endif } fprintf(stderr, "connect end\n"); if (n == 0) goto done; /* connect completed immediately */ FD_ZERO(&rset); FD_SET(sockfd, &rset); wset = rset; tval.tv_sec = msec / 1000; tval.tv_usec = msec % 1000; fprintf(stderr, "start select\n"); if ( (n = select(sockfd + 1, &rset, &wset, NULL, msec ? &tval : NULL)) == 0) { #if (!(defined(WIN32) || defined(_WIN32))) errno = ETIMEDOUT; #endif return -1; } fprintf(stderr, "end select\n"); if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) { len = sizeof(error); if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) /* Solaris pending error */ return -1; } else { fprintf(stderr, "select error: sockfd not set"); return -1; } done: /* restore file status flags */ restoreflags(sockfd, flags); if (error) { #if (!(defined(WIN32) || defined(_WIN32))) errno = error; #endif return -1; } return 0; }
void dex32_restoreints(DWORD flags) { restoreflags(flags); ;};