From 8d7a1e880011bbb660895f022a9f250f3cfda391 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sun, 8 Jun 2008 19:11:19 +0200 Subject: [PATCH] Fixed up the netcsconn fix. --- daemon/filenet.c | 2 +- daemon/fnet-dc.c | 3 +-- daemon/net.c | 12 +++++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/daemon/filenet.c b/daemon/filenet.c index 6b9b4fc..64870d2 100644 --- a/daemon/filenet.c +++ b/daemon/filenet.c @@ -185,7 +185,7 @@ static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data) killfnetnode(data); putfnetnode(data); } else { - netcsconn(addr, addrlen, (void (*)(struct socket *, int, void *))conncb, data); + putsock(netcsconn(addr, addrlen, (void (*)(struct socket *, int, void *))conncb, data)); } } diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index 8f83123..f48d63d 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -1323,7 +1323,6 @@ static void cmd_connecttome(struct socket *sk, struct fnetnode *fn, char *cmd, c { char *p; struct dchub *hub; - struct socket *newsk; struct sockaddr_in addr; hub = fn->data; @@ -1340,7 +1339,7 @@ static void cmd_connecttome(struct socket *sk, struct fnetnode *fn, char *cmd, c addr.sin_port = htons(atoi(p)); if(!inet_aton(args, &addr.sin_addr)) return; - newsk = netcsconn((struct sockaddr *)&addr, sizeof(addr), (void (*)(struct socket *, int, void *))peerconnect, fn); + putsock(netcsconn((struct sockaddr *)&addr, sizeof(addr), (void (*)(struct socket *, int, void *))peerconnect, fn)); getfnetnode(fn); hubhandleaction(sk, fn, cmd, args); } diff --git a/daemon/net.c b/daemon/net.c index 6561ae9..121050c 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -1003,6 +1003,8 @@ struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)( memcpy(sk->ufd->d.s.remote = smalloc(addrlen), addr, sk->ufd->d.s.remotelen = addrlen); sk->back->conncb = func; sk->back->data = data; + getsock(sk->back); + putsock(sk); if(!connect(sk->ufd->fd, addr, addrlen)) { sksetstate(sk, SOCK_EST); @@ -1074,10 +1076,18 @@ static void runbatches(void) static void cleansocks(void) { struct ufd *ufd, *next; + int dead; for(ufd = ufds; ufd != NULL; ufd = next) { next = ufd->next; - if(ufd->sk && ((ufd->fd < 0) || (sockgetdatalen(ufd->sk) == 0))) { + if(ufd->sk) { + dead = (ufd->fd < 0); + if(ufd->sk->state == SOCK_STL) + dead = 1; + if((ufd->sk->state == SOCK_EST) && (sockgetdatalen(ufd->sk) == 0)) + dead = 1; + if(!dead) + continue; if(ufd->sk->eos == 1) { ufd->sk->eos = 2; closeufd(ufd); -- 2.11.0