diff options
Diffstat (limited to 'src/interface.c')
-rw-r--r-- | src/interface.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/interface.c b/src/interface.c index fd33382e8..fac7af771 100644 --- a/src/interface.c +++ b/src/interface.c @@ -393,21 +393,28 @@ int doIOForInterfaces() { struct timeval tv; int i; int selret; - int fdmax = 0; + int fdmax; tv.tv_sec = 1; tv.tv_usec = 0; - addInterfacesReadyToReadAndListenSocketToFdSet(&rfds,&fdmax); - addInterfacesForBufferFlushToFdSet(&wfds,&fdmax); + while(1) { + fdmax = 0; - while((selret = select(fdmax+1,&rfds,&wfds,NULL,&tv))) { - getConnections(&rfds); - if(selret<0 && errno==EINTR) break; - else if(selret<0) { + addInterfacesReadyToReadAndListenSocketToFdSet(&rfds,&fdmax); + addInterfacesForBufferFlushToFdSet(&wfds,&fdmax); + + selret = select(fdmax+1,&rfds,&wfds,NULL,&tv); + + if(selret == 0 || (selret<0 && errno==EINTR)) break; + + if(selret<0) { closeNextErroredInterface(); continue; } + + getConnections(&rfds); + for(i=0;i<interface_max_connections;i++) { if(interfaces[i].open && FD_ISSET(interfaces[i].fd,&rfds)) { if(COMMAND_RETURN_KILL==interfaceReadInput(&(interfaces[i]))) { @@ -420,11 +427,9 @@ int doIOForInterfaces() { interfaces[i].lastTime = time(NULL); } } + tv.tv_sec = 0; tv.tv_usec = 0; - fdmax = 0; - addInterfacesReadyToReadAndListenSocketToFdSet(&rfds,&fdmax); - addInterfacesForBufferFlushToFdSet(&wfds,&fdmax); } return 1; |