X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fplaintcp.c;h=7d36a1d537bb2d01fae6f49960d3560512dd6574;hb=8e9ec020b45b2f43b0f44249037da82470a5446f;hp=321be41d35380015a9ccd024435a42bff6726876;hpb=470938bdc9149ae9c7befd0cd983f46fcc056192;p=ashd.git diff --git a/src/plaintcp.c b/src/plaintcp.c index 321be41..7d36a1d 100644 --- a/src/plaintcp.c +++ b/src/plaintcp.c @@ -65,7 +65,7 @@ int listensock4(int port) close(fd); return(-1); } - if(listen(fd, 16) < 0) { + if(listen(fd, 128) < 0) { close(fd); return(-1); } @@ -90,7 +90,7 @@ int listensock6(int port) close(fd); return(-1); } - if(listen(fd, 16) < 0) { + if(listen(fd, 128) < 0) { close(fd); return(-1); } @@ -168,13 +168,14 @@ 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; struct sockaddr_storage name; socklen_t namelen; while(1) { namelen = sizeof(name); - block(tcp->fd, EV_READ, 0); + 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)); @@ -186,6 +187,10 @@ static void listenloop(struct muth *muth, va_list args) 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) @@ -215,7 +220,7 @@ void handleplain(int argc, char **argp, char **argv) omalloc(tcp); tcp->fd = fd; tcp->sport = port; - mustart(listenloop, tcp); + bufadd(listeners, mustart(listenloop, tcp)); if((fd = listensock4(port)) < 0) { if(errno != EADDRINUSE) { flog(LOG_ERR, "could not listen on IPv4 (port %i): %s", port, strerror(errno)); @@ -225,6 +230,6 @@ void handleplain(int argc, char **argp, char **argv) omalloc(tcp); tcp->fd = fd; tcp->sport = port; - mustart(listenloop, tcp); + bufadd(listeners, mustart(listenloop, tcp)); } }