- tv.tv_sec = timeout;
- tv.tv_usec = 0;
- FD_ZERO(&readset);
- FD_SET(server_socket, &readset);
- nfound = select(server_socket+1, (SELECT_ARG_TYPE *)&readset, NULL, NULL, &tv);
- if(nfound <= 0 || !FD_ISSET(server_socket, &readset)) {
- save_errno = errno;
- if(nfound < 0) {
- dbprintf(("%s: stream_accept: select() failed: %s\n",
- debug_prefix_time(NULL),
- strerror(save_errno)));
- } else if(nfound == 0) {
- dbprintf(("%s: stream_accept: timeout after %d second%s\n",
- debug_prefix_time(NULL),
- timeout,
- (timeout == 1) ? "" : "s"));
- save_errno = ENOENT; /* ??? */
- } else if (!FD_ISSET(server_socket, &readset)) {
- int i;
-
- for(i = 0; i < server_socket + 1; i++) {
- if(FD_ISSET(i, &readset)) {
- dbprintf(("%s: stream_accept: got fd %d instead of %d\n",
- debug_prefix_time(NULL),
+ do {
+ ntries++;
+ memset(&tv, 0, SIZEOF(tv));
+ tv.tv_sec = timeout;
+ memset(&readset, 0, SIZEOF(readset));
+ FD_ZERO(&readset);
+ FD_SET(server_socket, &readset);
+ nfound = select(server_socket+1, &readset, NULL, NULL, &tv);
+ if(nfound <= 0 || !FD_ISSET(server_socket, &readset)) {
+ save_errno = errno;
+ if(nfound < 0) {
+ dbprintf(_("stream_accept: select() failed: %s\n"),
+ strerror(save_errno));
+ } else if(nfound == 0) {
+ dbprintf(plural(_("stream_accept: timeout after %d second\n"),
+ _("stream_accept: timeout after %d seconds\n"),
+ timeout),
+ timeout);
+ errno = ETIMEDOUT;
+ return -1;
+ } else if (!FD_ISSET(server_socket, &readset)) {
+ int i;
+
+ for(i = 0; i < server_socket + 1; i++) {
+ if(FD_ISSET(i, &readset)) {
+ dbprintf(_("stream_accept: got fd %d instead of %d\n"),