From: Fredrik Tolf Date: Sun, 8 Jun 2008 17:11:19 +0000 (+0200) Subject: Fixed up the netcsconn fix. X-Git-Tag: 1.3~15 X-Git-Url: http://dolda2000.com/gitweb/?p=doldaconnect.git;a=commitdiff_plain;h=8d7a1e880011bbb660895f022a9f250f3cfda391 Fixed up the netcsconn fix. --- 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);