+ bool_t ready = FALSE;
+ struct timeval delta, start, tv, tmp1, tmp2;
+
+ delta = wait_per_try;
+ gettimeofday(&start, NULL);
+ do
+ {
+ FD_COPY(&svc_fdset, &readfds);
+ FD_SET(sock, &readfds);
+ tv = delta;
+ switch( select(max(svc_maxfd, sock) + 1, &readfds, (fd_set*)NULL, (fd_set*)NULL, &tv) ) {
+ case -1:
+ if( errno != EINTR )
+ goto fatal_err;
+ gettimeofday(&tmp1, NULL);
+ timersub(&tmp1, &start, &tmp2);
+ timersub(&wait_per_try, &tmp2, &tmp1);
+ if( tmp1.tv_sec < 0 || !timerisset(&tmp1) )
+ goto fatal_err;
+ delta = tmp1;
+ continue;
+ case 0:
+ goto fatal_err;
+ default:
+ if(!FD_ISSET(sock, &readfds)) {
+ svc_getreqset(&readfds);
+ gettimeofday(&tmp1, NULL);
+ timersub(&tmp1, &start, &tmp2);
+ timersub(&wait_per_try, &tmp2, &tmp1);
+ if( tmp1.tv_sec < 0 || !timerisset(&tmp1) )
+ goto fatal_err;
+ delta = tmp1;