X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fplaintcp.c;h=05921660a16c8c6bf94a0deb34405fbb077050ca;hb=51893006c3f6a5dbae8b5bee6672165124b4e44c;hp=fb4c6ceb01dbb0de6b1f5de1b477b4d4d6c6b351;hpb=cac13158ac4fdd8b7682f16f879796e9c4e339ff;p=ashd.git diff --git a/src/plaintcp.c b/src/plaintcp.c index fb4c6ce..0592166 100644 --- a/src/plaintcp.c +++ b/src/plaintcp.c @@ -168,25 +168,39 @@ void servetcp(struct muth *muth, va_list args) static void listenloop(struct muth *muth, va_list args) { vavar(struct tcpport *, tcp); - int ns; + int i, ns, n; struct sockaddr_storage name; socklen_t namelen; + fcntl(tcp->fd, F_SETFL, fcntl(tcp->fd, F_GETFL) | O_NONBLOCK); while(1) { namelen = sizeof(name); if(block(tcp->fd, EV_READ, 0) == 0) goto out; - ns = accept(tcp->fd, (struct sockaddr *)&name, &namelen); - if(ns < 0) { - flog(LOG_ERR, "accept: %s", strerror(errno)); - goto out; + n = 0; + while(1) { + ns = accept(tcp->fd, (struct sockaddr *)&name, &namelen); + if(ns < 0) { + if(errno == EAGAIN) + break; + if(errno == ECONNABORTED) + continue; + flog(LOG_ERR, "accept: %s", strerror(errno)); + goto out; + } + mustart(servetcp, ns, name, tcp); + if(++n >= 100) + break; } - mustart(servetcp, ns, name, tcp); } out: close(tcp->fd); free(tcp); + for(i = 0; i < listeners.d; i++) { + if(listeners.b[i] == muth) + bufdel(listeners, i); + } } void handleplain(int argc, char **argp, char **argv)