struct timer *timeout;
struct qcmdqueue queue;
struct transfer *transfer;
+ struct socket *trpipe;
int state;
int ptclose; /* Close after transfer is complete */
int accepted; /* If false, we connected, otherwise, we accepted */
};
static struct fnet dcnet;
-static struct transferiface dctransfer;
static struct socket *udpsock = NULL;
static struct lport *tcpsock = NULL;
static struct dcpeer *peers = NULL;
static char *xmlbz2listname = NULL;
static struct timer *listwritetimer = NULL;
+static struct socket *mktrpipe(struct dcpeer *peer);
static void peerconnect(struct socket *sk, int err, struct fnetnode *fn);
static void freedcpeer(struct dcpeer *peer);
static void transread(struct socket *sk, struct dcpeer *peer);
peer->close = 1;
return;
}
- transfer = newupload(peer->fn, &dcnet, peer->wcsname, &dctransfer, peer);
+ transfer = newupload(peer->fn, &dcnet, peer->wcsname, peer->trpipe = mktrpipe(peer));
} else {
if((transfer = finddownload(peer->wcsname)) == NULL)
{
peer->close = 1;
return;
}
- transferattach(transfer, &dctransfer, peer);
+ transferattach(transfer, peer->trpipe = mktrpipe(peer));
transfersetstate(transfer, TRNS_HS);
}
transfersetnick(transfer, peer->wcsname);
return;
}
peer->direction = TRNSD_UP;
- transfer = newupload(peer->fn, &dcnet, peer->wcsname, &dctransfer, peer);
+ transfer = newupload(peer->fn, &dcnet, peer->wcsname, peer->trpipe = mktrpipe(peer));
} else {
peer->direction = TRNSD_DOWN;
- transferattach(transfer, &dctransfer, peer);
+ transferattach(transfer, peer->trpipe = mktrpipe(peer));
transfersetstate(transfer, TRNS_HS);
}
transfersetnick(transfer, peer->wcsname);
};
#undef cc
+static struct socket *mktrpipe(struct dcpeer *peer)
+{
+ struct socket *sk;
+
+ sk = netsockpipe();
+ sk->data = peer;
+ return(sk);
+}
+
static void dctransdetach(struct transfer *transfer, struct dcpeer *peer)
{
CBUNREG(transfer, trans_filterout, peer);
peer->next->prev = peer->prev;
if(peer->prev != NULL)
peer->prev->next = peer->next;
+ if(peer->trpipe != NULL) {
+ closesock(peer->trpipe);
+ putsock(peer->trpipe);
+ }
if(peer->transfer != NULL)
{
if(peer->transfer->dir == TRNSD_UP)
closesock(hub->sk);
}
-static struct transferiface dctransfer =
-{
- .detach = (void (*)(struct transfer *, void *))dctransdetach,
- .gotdata = (void (*)(struct transfer *, void *))dctransgotdata,
- .endofdata = (void (*)(struct transfer *, void *))dctransendofdata,
- .wantdata = (void (*)(struct transfer *, void *))dcwantdata
-};
-
static struct fnet dcnet =
{
.name = L"dc",