Fixed up the netcsconn fix.
authorFredrik Tolf <fredrik@dolda2000.com>
Sun, 8 Jun 2008 17:11:19 +0000 (19:11 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Sun, 8 Jun 2008 17:11:19 +0000 (19:11 +0200)
daemon/filenet.c
daemon/fnet-dc.c
daemon/net.c

index 6b9b4fc..64870d2 100644 (file)
@@ -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));
     }
 }
 
index 8f83123..f48d63d 100644 (file)
@@ -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);
 }
index 6561ae9..121050c 100644 (file)
@@ -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);