--- ./src/nrpe.c.orig 2013-09-06 17:27:13.000000000 +0200 +++ ./src/nrpe.c 2013-10-05 17:15:33.000000000 +0200 @@ -30,6 +30,8 @@ #include "utils.h" #include "acl.h" +#include + #ifdef HAVE_SSL #include "../include/dh.h" #endif @@ -100,7 +102,9 @@ int use_src=FALSE; /* Define parameter for SRC option */ +#ifdef HAVE_SSL void complete_SSL_shutdown( SSL *); +#endif int main(int argc, char **argv){ @@ -969,8 +973,14 @@ continue; /* socket is nonblocking and we don't have a connection yet */ - if(errno==EAGAIN) + if(errno==EAGAIN) { + struct pollfd pfd; + + pfd.fd = sock; + pfd.events = POLLIN; + poll(&pfd,1,-1); continue; + } /* fix for HP-UX 11.0 - just retry */ if(errno==ENOBUFS) @@ -1207,9 +1217,13 @@ if(result==STATE_OK && use_ssl==TRUE){ if((ssl=SSL_new(ctx))!=NULL){ SSL_set_fd(ssl,sock); + int n = 0; /* keep attempting the request if needed */ - while(((rc=SSL_accept(ssl))!=1) && (SSL_get_error(ssl,rc)==SSL_ERROR_WANT_READ)); + while( ((rc=SSL_accept(ssl))!=1) && (SSL_get_error(ssl,rc)==SSL_ERROR_WANT_READ) && n <= 600){ + usleep(100000); + n++; + } if(rc!=1){ syslog(LOG_ERR,"Error: Could not complete SSL handshake. %d\n",SSL_get_error(ssl,rc)); @@ -1796,6 +1810,7 @@ return OK; } +#ifdef HAVE_SSL void complete_SSL_shutdown( SSL *ssl) { /* @@ -1816,6 +1831,7 @@ if( SSL_shutdown( ssl)) break; } } +#endif /* bail if daemon is running as root */ int check_privileges(void){