Moved the post-done transfer reset responsibility to transfer.c.
[doldaconnect.git] / daemon / fnet-dc.c
index b34ed3a..f8b7606 100644 (file)
@@ -738,7 +738,6 @@ static void requestfile(struct dcpeer *peer)
            peer->close = 1;
            return;
        }
-       CBREG(peer->transfer, trans_filterout, (int (*)(struct transfer *, wchar_t *, wchar_t *, void *))trresumecb, NULL, peer);
        return;
     }
     if(supports(peer, "adcget"))
@@ -872,7 +871,7 @@ static void cmd_hubname(struct socket *sk, struct fnetnode *fn, char *cmd, char
     struct dchub *hub;
     
     hub = fn->data;
-    if(hub->nativename == NULL)
+    if(hub->nativename != NULL)
        free(hub->nativename);
     hub->nativename = sstrdup(args);
     buf = icmbstowcs(args, hub->charset);
@@ -1634,6 +1633,7 @@ static void cmd_direction(struct socket *sk, struct dcpeer *peer, char *cmd, cha
        }
        transfersetnick(transfer, peer->wcsname);
        peer->transfer = transfer;
+       CBREG(peer->transfer, trans_filterout, (int (*)(struct transfer *, wchar_t *, wchar_t *, void *))trresumecb, NULL, peer);
        if(peer->extended)
            sendsupports(peer);
        qstrf(sk, "$Direction %s %i|", (peer->direction == TRNSD_UP)?"Upload":"Download", rand() % 10000);
@@ -1682,6 +1682,7 @@ static void cmd_peerlock(struct socket *sk, struct dcpeer *peer, char *cmd, char
        }
        transfersetnick(transfer, peer->wcsname);
        peer->transfer = transfer;
+       CBREG(peer->transfer, trans_filterout, (int (*)(struct transfer *, wchar_t *, wchar_t *, void *))trresumecb, NULL, peer);
        qstrf(sk, "$Direction %s %i|", (peer->direction == TRNSD_UP)?"Upload":"Download", rand() % 10000);
        qstrf(sk, "$Key %s|", key);
        free(key);
@@ -2118,6 +2119,7 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char *
     } else if(fd >= 0) {
        if((wbuf = adc2path(argv[1])) != NULL)
            transfersetpath(peer->transfer, wbuf);
+       free(wbuf);
        peer->transfer->flags.b.minislot = 1;
     }
     if(fd < 0)
@@ -2734,7 +2736,7 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
                }
                if(peer->ptclose)
                {
-                   freedcpeer(peer);
+                   peer->close = 1;
                } else {
                    if(peer->timeout == NULL)
                        peer->timeout = timercallback(ntime() + 180, (void (*)(int, void *))peertimeout, peer);
@@ -2750,6 +2752,15 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
     }
 }
 
+static void peerdetach(struct dcpeer *peer)
+{
+    CBUNREG(peer->transfer, trans_filterout, peer);
+    closesock(peer->trpipe);
+    quitsock(peer->trpipe);
+    peer->trpipe = NULL;
+    peer->transfer = NULL;
+}
+
 static void transread(struct socket *sk, struct dcpeer *peer)
 {
     void *buf;
@@ -2770,10 +2781,7 @@ static void transread(struct socket *sk, struct dcpeer *peer)
     }
     if(peer->transfer->curpos >= peer->transfer->size)
     {
-       closesock(peer->trpipe);
-       quitsock(peer->trpipe);
-       peer->trpipe = NULL;
-       peer->transfer = NULL;
+       peerdetach(peer);
        peer->close = 1;
        return;
     }
@@ -2788,10 +2796,7 @@ static void transerr(struct socket *sk, int err, struct dcpeer *peer)
        freedcpeer(peer);
        return;
     }
-    closesock(peer->trpipe);
-    quitsock(peer->trpipe);
-    peer->trpipe = NULL;
-    peer->transfer = NULL;
+    peerdetach(peer);
     peer->close = 1;
 }
 
@@ -2821,7 +2826,9 @@ static void trpipeerr(struct socket *sk, int errno, struct dcpeer *peer)
 {
     peer->state = PEER_SYNC;
     dctransgotdata(peer->transfer, peer);
-    CBUNREG(peer->transfer, trans_filterout, peer);
+    peerdetach(peer);
+    if(peer->state != PEER_CMD)
+       peer->close = 1;
 }
 
 static struct socket *mktrpipe(struct dcpeer *peer)
@@ -2829,7 +2836,6 @@ static struct socket *mktrpipe(struct dcpeer *peer)
     struct socket *sk;
     
     sk = netsockpipe();
-    socksetdebug(sk, 2, "trpipe");
     sk->data = peer;
     sk->readcb = (void (*)(struct socket *, void *))trpiperead;
     sk->writecb = (void (*)(struct socket *, void *))trpipewrite;
@@ -3113,8 +3119,6 @@ static struct dcpeer *newdcpeer(struct socket *sk)
     
     new = smalloc(sizeof(*new));
     memset(new, 0, sizeof(*new));
-    new->transfer = NULL;
-    socksetdebug(sk, 2, "peersock");
     getsock(sk);
     new->sk = sk;
     if(confgetint("dc", "dcppemu"))
@@ -3139,18 +3143,8 @@ static void freedcpeer(struct dcpeer *peer)
        peer->next->prev = peer->prev;
     if(peer->prev != NULL)
        peer->prev->next = peer->next;
-    if(peer->trpipe != NULL) {
-       closesock(peer->trpipe);
-       quitsock(peer->trpipe);
-    }
     if(peer->transfer != NULL)
-    {
-       CBUNREG(peer->transfer, trans_filterout, peer);
-       if(peer->transfer->dir == TRNSD_UP)
-           peer->transfer->close = 1;
-       if(peer->transfer->dir == TRNSD_DOWN)
-           resettransfer(peer->transfer);
-    }
+       peerdetach(peer);
     if(peer->timeout != NULL)
        canceltimer(peer->timeout);
     if(peer->sk->data == peer)