X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fssl-gnutls.c;h=0d4dd220fd61488e3a58722fa802518b85702cfd;hb=4dc7f716a7b4be064ecf86f6e1444b7b39dfdfe7;hp=d4862d4d8535c822143081d5feada70dbe5b30e5;hpb=aa06d1b36cfaa0610205cf49003277e6a12c874b;p=ashd.git diff --git a/src/ssl-gnutls.c b/src/ssl-gnutls.c index d4862d4..0d4dd22 100644 --- a/src/ssl-gnutls.c +++ b/src/ssl-gnutls.c @@ -359,13 +359,14 @@ out: static void listenloop(struct muth *muth, va_list args) { vavar(struct sslport *, pd); - int ns; + int i, ns; struct sockaddr_storage name; socklen_t namelen; while(1) { namelen = sizeof(name); - block(pd->fd, EV_READ, 0); + if(block(pd->fd, EV_READ, 0) == 0) + goto out; ns = accept(pd->fd, (struct sockaddr *)&name, &namelen); if(ns < 0) { flog(LOG_ERR, "accept: %s", strerror(errno)); @@ -377,6 +378,10 @@ static void listenloop(struct muth *muth, va_list args) out: close(pd->fd); free(pd); + for(i = 0; i < listeners.d; i++) { + if(listeners.b[i] == muth) + bufdel(listeners, i); + } } static gnutls_dh_params_t dhparams(void) @@ -606,7 +611,7 @@ void handlegnussl(int argc, char **argp, char **argv) pd->sport = port; pd->creds = creds; pd->ncreds = ncreds.b; - mustart(listenloop, pd); + bufadd(listeners, mustart(listenloop, pd)); if((fd = listensock4(port)) < 0) { if(errno != EADDRINUSE) { flog(LOG_ERR, "could not listen on IPv4 port (port %i): %s", port, strerror(errno)); @@ -617,7 +622,7 @@ void handlegnussl(int argc, char **argp, char **argv) pd->fd = fd; pd->sport = port; pd->creds = creds; - mustart(listenloop, pd); + bufadd(listeners, mustart(listenloop, pd)); } }