Merge branch 'socket' into transsock
authorFredrik Tolf <fredrik@dolda2000.com>
Fri, 17 Oct 2008 23:12:36 +0000 (01:12 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Fri, 17 Oct 2008 23:12:36 +0000 (01:12 +0200)
daemon/filenet.c
daemon/fnet-dc.c
daemon/net.c
daemon/net.h
daemon/transfer.c
daemon/transfer.h

index da83a09..64870d2 100644 (file)
@@ -176,7 +176,6 @@ static void conncb(struct socket *sk, int err, struct fnetnode *data)
     data->fnet->connect(data, sk);
     data->connected = 1;
     putfnetnode(data);
-    putsock(sk);
 }
 
 static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data)
@@ -186,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 828e6d0..348a53a 100644 (file)
@@ -122,6 +122,7 @@ struct dcpeer
     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 */
@@ -139,7 +140,6 @@ struct dcpeer
 };
 
 static struct fnet dcnet;
-static struct transferiface dctransfer;
 static struct socket *udpsock = NULL;
 static struct lport *tcpsock = NULL;
 static struct dcpeer *peers = NULL;
@@ -150,6 +150,7 @@ static char *xmllistname = 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);
@@ -1322,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;
@@ -1339,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);
 }
@@ -1622,14 +1622,14 @@ static void cmd_direction(struct socket *sk, struct dcpeer *peer, char *cmd, cha
                peer->close = 1;
                return;
            }
-           transfer = newupload(peer->fn, &dcnet, peer->wcsname, &dctransfer, peer);
+           transfer = newupload(peer->fn, &dcnet, peer->wcsname, (peer->trpipe = mktrpipe(peer))->back);
        } else {
            if((transfer = finddownload(peer->wcsname)) == NULL)
            {
                peer->close = 1;
                return;
            }
-           transferattach(transfer, &dctransfer, peer);
+           transferattach(transfer, (peer->trpipe = mktrpipe(peer))->back);
            transfersetstate(transfer, TRNS_HS);
        }
        transfersetnick(transfer, peer->wcsname);
@@ -1674,10 +1674,10 @@ static void cmd_peerlock(struct socket *sk, struct dcpeer *peer, char *cmd, char
                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))->back);
        } else {
            peer->direction = TRNSD_DOWN;
-           transferattach(transfer, &dctransfer, peer);
+           transferattach(transfer, (peer->trpipe = mktrpipe(peer))->back);
            transfersetstate(transfer, TRNS_HS);
        }
        transfersetnick(transfer, peer->wcsname);
@@ -1714,6 +1714,7 @@ static void startul(struct dcpeer *peer)
     peer->state = PEER_TRNS;
     transferstartul(peer->transfer, peer->sk);
     peer->sk->writecb = (void (*)(struct socket *, void *))transwrite;
+    transwrite(peer->sk, peer);
 }
 
 static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
@@ -2675,13 +2676,6 @@ static struct command peercmds[] =
 };
 #undef cc
 
-static void dctransdetach(struct transfer *transfer, struct dcpeer *peer)
-{
-    CBUNREG(transfer, trans_filterout, peer);
-    peer->transfer = NULL;
-    peer->close = 1;
-}
-
 static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
 {
     int ret;
@@ -2694,7 +2688,7 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
     {
        if(sockqueueleft(peer->sk) > 0)
        {
-           if((buf = transfergetdata(transfer, &bufsize)) != NULL)
+           if((buf = sockgetinbuf(peer->trpipe, &bufsize)) != NULL)
            {
                if(peer->compress == CPRS_NONE)
                {
@@ -2757,45 +2751,35 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
     }
 }
 
-static void dctransendofdata(struct transfer *transfer, struct dcpeer *peer)
-{
-    peer->state = PEER_SYNC;
-    dctransgotdata(transfer, peer);
-}
-
 static void transread(struct socket *sk, struct dcpeer *peer)
 {
     void *buf;
     size_t bufsize;
-    struct transfer *transfer;
     
-    if(transferdatasize(peer->transfer) < 0)
+    if(sockqueueleft(peer->trpipe) < 0)
        return;
-    if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
-       return;
-    if(peer->transfer == NULL)
+    if((buf = sockgetinbuf(sk, &bufsize)) != NULL)
     {
+       if(peer->transfer == NULL)
+       {
+           free(buf);
+           freedcpeer(peer);
+           return;
+       }
+       sockqueue(peer->trpipe, buf, bufsize);
        free(buf);
-       freedcpeer(peer);
-       return;
     }
-    transferputdata(peer->transfer, buf, bufsize);
-    free(buf);
     if(peer->transfer->curpos >= peer->transfer->size)
     {
-       transfer = peer->transfer;
-       transferdetach(transfer);
-       transferendofdata(transfer);
+       closesock(peer->trpipe);
+       quitsock(peer->trpipe);
+       peer->trpipe = NULL;
+       peer->transfer = NULL;
+       peer->close = 1;
        return;
     }
 }
 
-static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
-{
-    if(transferdatasize(transfer) > 0)
-       transread(peer->sk, peer);
-}
-
 static void transerr(struct socket *sk, int err, struct dcpeer *peer)
 {
     struct transfer *transfer;
@@ -2805,8 +2789,11 @@ static void transerr(struct socket *sk, int err, struct dcpeer *peer)
        freedcpeer(peer);
        return;
     }
-    transferdetach(transfer);
-    transferendofdata(transfer);
+    closesock(peer->trpipe);
+    quitsock(peer->trpipe);
+    peer->trpipe = NULL;
+    peer->transfer = NULL;
+    peer->close = 1;
 }
 
 static void transwrite(struct socket *sk, struct dcpeer *peer)
@@ -2821,6 +2808,35 @@ static void transwrite(struct socket *sk, struct dcpeer *peer)
     dctransgotdata(peer->transfer, peer);
 }
 
+static void trpiperead(struct socket *sk, struct dcpeer *peer)
+{
+    dctransgotdata(peer->transfer, peer);
+}
+
+static void trpipewrite(struct socket *sk, struct dcpeer *peer)
+{
+    transread(peer->sk, peer);
+}
+
+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);
+}
+
+static struct socket *mktrpipe(struct dcpeer *peer)
+{
+    struct socket *sk;
+    
+    sk = netsockpipe();
+    sk->data = peer;
+    sk->readcb = (void (*)(struct socket *, void *))trpiperead;
+    sk->writecb = (void (*)(struct socket *, void *))trpipewrite;
+    sk->errcb = (void (*)(struct socket *, int, void *))trpipeerr;
+    return(sk);
+}
+
 static void udpread(struct socket *sk, void *data)
 {
     char *buf, *p, *p2, *hashbuf;
@@ -3122,8 +3138,13 @@ 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)
@@ -3209,14 +3230,6 @@ static void hubkill(struct fnetnode *fn)
     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",
@@ -3238,6 +3251,9 @@ static void peerread(struct socket *sk, struct dcpeer *peer)
     if(peer->state == PEER_CMD) {
        if((peer->queue.size > 50) || (peer->inbufdata > 65536))
            return;
+    } else if(peer->state == PEER_TTHL) {
+    } else {
+       return;
     }
     if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
        return;
@@ -3284,7 +3300,6 @@ static void peerconnect(struct socket *sk, int err, struct fnetnode *fn)
     if(err != 0)
     {
        putfnetnode(fn);
-       putsock(sk);
        return;
     }
     hub = fn->data;
@@ -3296,7 +3311,6 @@ static void peerconnect(struct socket *sk, int err, struct fnetnode *fn)
     sk->errcb = (void (*)(struct socket *, int, void *))peererror;
     sk->data = peer;
     socksettos(sk, confgetint("fnet", "fnptos"));
-    putsock(sk);
     peer->timeout = timercallback(ntime() + 180, (void (*)(int, void *))peertimeout, peer);
     sendmynick(peer);
     sendpeerlock(peer);
index 240855a..86bc552 100644 (file)
@@ -238,6 +238,15 @@ static void sksetstate(struct socket *sk, int state)
     sk->back->state = state;
 }
 
+struct socket *netsockpipe(void)
+{
+    struct socket *sk;
+    
+    sk = sockpair(0);
+    sksetstate(sk, SOCK_EST);
+    return(sk);
+}
+
 static void closeufd(struct ufd *ufd)
 {
     if(ufd->fd != -1)
@@ -353,10 +362,41 @@ void getsock(struct socket *sk)
     sk->refcount++;
 }
 
+static void sockdebug(int level, struct socket *sk, char *format, ...)
+{
+    va_list args;
+    char *tb;
+    
+    if((sk->dbgnm == NULL) || (level > sk->dbglvl))
+       return;
+    va_start(args, format);
+    tb = vsprintf2(format, args);
+    va_end(args);
+    fprintf(stderr, "%s: %s\n", sk->dbgnm, tb);
+    free(tb);
+}
+
+void socksetdebug(struct socket *sk, int level, char *nm, ...)
+{
+    va_list args;
+    char *tb;
+    
+    va_start(args, nm);
+    tb = vsprintf2(nm, args);
+    va_end(args);
+    sk->dbgnm = sprintf2("%s (f)", tb);
+    sk->back->dbgnm = sprintf2("%s (b)", tb);
+    free(tb);
+    sk->dbglvl = level;
+    sk->back->dbglvl = level;
+    sockdebug(1, sk, "enabled debugging");
+}
+
 static void freesock(struct socket *sk)
 {
     struct dgrambuf *buf;
     
+    sockdebug(1, sk, "freeing socket");
     if(sk->dgram) {
        while((buf = sk->buf.d.f) != NULL) {
            sk->buf.d.f = buf->next;
@@ -366,6 +406,8 @@ static void freesock(struct socket *sk)
        if(sk->buf.s.buf != NULL)
            free(sk->buf.s.buf);
     }
+    if(sk->dbgnm != NULL)
+       free(sk->dbgnm);
     free(sk);
     numsocks--;
 }
@@ -385,6 +427,14 @@ void putsock(struct socket *sk)
     }
 }
 
+void quitsock(struct socket *sk)
+{
+    sk->readcb = NULL;
+    sk->writecb = NULL;
+    sk->errcb = NULL;
+    putsock(sk);
+}
+
 static void linksock(struct scons **list, struct socket *sk)
 {
     struct scons *sc;
@@ -463,6 +513,7 @@ void *sockgetinbuf(struct socket *sk, size_t *size)
        if((sk->buf.s.buf == NULL) || (sk->buf.s.datasize == 0))
        {
            *size = 0;
+           sockdebug(2, sk, "read 0 bytes", *size);
            return(NULL);
        }
        buf = sk->buf.s.buf;
@@ -471,6 +522,7 @@ void *sockgetinbuf(struct socket *sk, size_t *size)
        sk->buf.s.bufsize = sk->buf.s.datasize = 0;
        sockread(sk);
     }
+    sockdebug(2, sk, "read %zi bytes", *size);
     return(buf);
 }
 
@@ -480,6 +532,7 @@ void sockqueue(struct socket *sk, void *data, size_t size)
     struct sockaddr *remote;
     socklen_t remotelen;
     
+    sockdebug(2, sk, "queued %zi bytes", size);
     if(size == 0)
        return;
     if(sk->state == SOCK_STL)
@@ -740,6 +793,7 @@ static int sockflush(struct ufd *ufd)
 
 void closesock(struct socket *sk)
 {
+    sockdebug(1, sk, "closed");
     sksetstate(sk, SOCK_STL);
     if(sk->back->eos == 0)
        sk->back->eos = 1;
@@ -766,6 +820,18 @@ size_t sockgetdatalen(struct socket *sk)
 /*     return(sockgetdatalen(sk->back)); */
 /* } */
 
+size_t socktqueuesize(struct socket *sk)
+{
+    size_t ret;
+    
+    ret = 0;
+    while(1) {
+       ret += sockgetdatalen(sk->back);
+       if((sk = sk->back->pnext) == NULL)
+           return(ret);
+    }
+}
+
 ssize_t sockqueueleft(struct socket *sk)
 {
     return(sk->back->maxbuf - sockgetdatalen(sk->back));
@@ -941,6 +1007,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);
@@ -1012,10 +1080,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);
index 24e7ca5..be0156e 100644 (file)
@@ -66,6 +66,8 @@ struct socket
     void (*writecb)(struct socket *sk, void *data);
     struct ufd *ufd;
     void *data;
+    char *dbgnm;
+    int dbglvl;
 };
 
 struct lport {
@@ -77,6 +79,7 @@ struct lport {
 
 void putsock(struct socket *sk);
 void getsock(struct socket *sk);
+struct socket *netsockpipe(void);
 struct lport *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct lport *, struct socket *, void *), void *data);
 struct lport *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct lport *, struct socket *, void *), void *data);
 struct lport *netcstcplisten(int port, int local, void (*func)(struct lport *, struct socket *, void *), void *data);
@@ -86,6 +89,7 @@ void freedgbuf(struct dgrambuf *dg);
 void sockqueue(struct socket *sk, void *data, size_t size);
 void sockerror(struct socket *sk, int en);
 /* size_t sockqueuesize(struct socket *sk); */
+size_t socktqueuesize(struct socket *sk);
 ssize_t sockqueueleft(struct socket *sk);
 int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data);
 struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen);
@@ -108,5 +112,7 @@ void sockpushdata(struct socket *sk, void *buf, size_t size);
 int sockpeeraddr(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf);
 int getucred(struct socket *sk, uid_t *uid, gid_t *gid);
 int sockfamily(struct socket *sk);
+void quitsock(struct socket *sk);
+void socksetdebug(struct socket *sk, int level, char *nm, ...);
 
 #endif
index 1e674e6..893953d 100644 (file)
@@ -126,22 +126,90 @@ struct transfer *newtransfer(void)
     return(new);
 }
 
-void transferattach(struct transfer *transfer, struct transferiface *iface, void *data)
+static void localread(struct socket *sk, struct transfer *transfer)
 {
-    if(transfer->iface != NULL)
-       transferdetach(transfer);
-    transfer->iface = iface;
-    transfer->ifacedata = data;
+    void *buf;
+    size_t blen;
+    
+    if((transfer->datapipe != NULL) && (sockqueueleft(transfer->datapipe) > 0)) {
+       buf = sockgetinbuf(sk, &blen);
+       if((transfer->endpos >= 0) && (transfer->curpos + blen > transfer->endpos))
+           blen = transfer->endpos - transfer->curpos;
+       sockqueue(transfer->datapipe, buf, blen);
+       free(buf);
+       time(&transfer->activity);
+       transfer->curpos += blen;
+       bytesupload += blen;
+       CBCHAINDOCB(transfer, trans_p, transfer);
+    }
+}
+
+static void dataread(struct socket *sk, struct transfer *transfer)
+{
+    void *buf;
+    size_t blen;
+    
+    if((transfer->localend != NULL) && (sockqueueleft(transfer->localend) > 0)) {
+       buf = sockgetinbuf(sk, &blen);
+       if((transfer->endpos >= 0) && (transfer->curpos + blen > transfer->endpos))
+           blen = transfer->endpos - transfer->curpos;
+       sockqueue(transfer->localend, buf, blen);
+       free(buf);
+       transfer->curpos += blen;
+       bytesdownload += blen;
+       CBCHAINDOCB(transfer, trans_p, transfer);
+    }
+}
+
+static void localwrite(struct socket *sk, struct transfer *transfer)
+{
+    if(transfer->datapipe != NULL)
+       dataread(transfer->datapipe, transfer);
+}
+
+static void datawrite(struct socket *sk, struct transfer *transfer)
+{
+    if(transfer->localend != NULL)
+       localread(transfer->localend, transfer);
+}
+
+static void localerr(struct socket *sk, int errno, struct transfer *transfer)
+{
+    if(transfer->datapipe != NULL)
+       closesock(transfer->datapipe);
+}
+
+static void dataerr(struct socket *sk, int errno, struct transfer *transfer)
+{
+    if(transfer->curpos >= transfer->size) {
+       transfersetstate(transfer, TRNS_DONE);
+       if(transfer->localend != NULL) {
+           closesock(transfer->localend);
+           quitsock(transfer->localend);
+           transfer->localend = NULL;
+       }
+    } else {
+       resettransfer(transfer);
+    }
+}
+
+void transferattach(struct transfer *transfer, struct socket *dpipe)
+{
+    transferdetach(transfer);
+    getsock(transfer->datapipe = dpipe);
+    dpipe->readcb = (void (*)(struct socket *, void *))dataread;
+    dpipe->writecb = (void (*)(struct socket *, void *))datawrite;
+    dpipe->errcb = (void (*)(struct socket *, int, void *))dataerr;
+    dpipe->data = transfer;
 }
 
 void transferdetach(struct transfer *transfer)
 {
-    if(transfer->iface != NULL)
-    {
-       transfer->iface->detach(transfer, transfer->ifacedata);
-       transfer->iface = NULL;
-       transfer->ifacedata = NULL;
+    if(transfer->datapipe != NULL) {
+       closesock(transfer->datapipe);
+       quitsock(transfer->datapipe);
     }
+    transfer->datapipe = NULL;
 }
 
 struct transfer *finddownload(wchar_t *peerid)
@@ -150,7 +218,7 @@ struct transfer *finddownload(wchar_t *peerid)
 
     for(transfer = transfers; transfer != NULL; transfer = transfer->next)
     {
-       if((transfer->dir == TRNSD_DOWN) && (transfer->iface == NULL) && !wcscmp(peerid, transfer->peerid))
+       if((transfer->dir == TRNSD_DOWN) && (transfer->datapipe == NULL) && !wcscmp(peerid, transfer->peerid))
            break;
     }
     return(transfer);
@@ -168,7 +236,7 @@ struct transfer *hasupload(struct fnet *fnet, wchar_t *peerid)
     return(transfer);
 }
 
-struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct transferiface *iface, void *data)
+struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct socket *dpipe)
 {
     struct transfer *transfer;
     
@@ -182,7 +250,7 @@ struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nick
     transfer->dir = TRNSD_UP;
     if(fn != NULL)
        getfnetnode(transfer->fn = fn);
-    transferattach(transfer, iface, data);
+    transferattach(transfer, dpipe);
     linktransfer(transfer);
     bumptransfer(transfer);
     return(transfer);
@@ -202,8 +270,7 @@ void resettransfer(struct transfer *transfer)
 {
     if(transfer->dir == TRNSD_DOWN)
     {
-       if(transfer->iface != NULL)
-           transferdetach(transfer);
+       transferdetach(transfer);
        killfilter(transfer);
        transfersetstate(transfer, TRNS_WAITING);
        transfersetactivity(transfer, L"reset");
@@ -232,77 +299,6 @@ static void transexpire(int cancelled, struct transfer *transfer)
        transfer->timeout = 0;
 }
 
-static void transferread(struct socket *sk, struct transfer *transfer)
-{
-    if((sockgetdatalen(sk) > 0) && (transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
-       transfer->iface->gotdata(transfer, transfer->ifacedata);
-}
-
-static void transferwrite(struct socket *sk, struct transfer *transfer)
-{
-    if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL))
-       transfer->iface->wantdata(transfer, transfer->ifacedata);
-}
-
-static void transfererr(struct socket *sk, int errno, struct transfer *transfer)
-{
-    if((transfer->iface != NULL) && (transfer->iface->endofdata != NULL))
-       transfer->iface->endofdata(transfer, transfer->ifacedata);
-}
-
-void transferputdata(struct transfer *transfer, void *buf, size_t size)
-{
-    time(&transfer->activity);
-    sockqueue(transfer->localend, buf, size);
-    transfer->curpos += size;
-    bytesdownload += size;
-    CBCHAINDOCB(transfer, trans_p, transfer);
-}
-
-void transferendofdata(struct transfer *transfer)
-{
-    if(transfer->curpos >= transfer->size)
-    {
-       transfersetstate(transfer, TRNS_DONE);
-       transfer->localend->readcb = NULL;
-       transfer->localend->writecb = NULL;
-       transfer->localend->errcb = NULL;
-       putsock(transfer->localend);
-       transfer->localend = NULL;
-    } else {
-       resettransfer(transfer);
-    }
-}
-
-ssize_t transferdatasize(struct transfer *transfer)
-{
-    return(sockqueueleft(transfer->localend));
-}
-
-void *transfergetdata(struct transfer *transfer, size_t *size)
-{
-    void *buf;
-    
-    if(transfer->localend == NULL)
-       return(NULL);
-    time(&transfer->activity);
-    if((buf = sockgetinbuf(transfer->localend, size)) == NULL)
-       return(NULL);
-    if((transfer->endpos >= 0) && (transfer->curpos + *size >= transfer->endpos))
-    {
-       if((*size = transfer->endpos - transfer->curpos) == 0) {
-           free(buf);
-           buf = NULL;
-       } else {
-           buf = srealloc(buf, *size);
-       }
-    }
-    transfer->curpos += *size;
-    bytesupload += *size;
-    CBCHAINDOCB(transfer, trans_p, transfer);
-    return(buf);
-}
-
 void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk)
 {
     transfersetsize(transfer, size);
@@ -322,7 +318,7 @@ void transferstartul(struct transfer *transfer, struct socket *sk)
     transfersetstate(transfer, TRNS_MAIN);
     socksettos(sk, confgetint("transfer", "ultos"));
     if(transfer->localend != NULL)
-       transferread(transfer->localend, transfer);
+       localread(transfer->localend, transfer);
 }
 
 void transfersetlocalend(struct transfer *transfer, struct socket *sk)
@@ -331,9 +327,9 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk)
        putsock(transfer->localend);
     getsock(transfer->localend = sk);
     sk->data = transfer;
-    sk->readcb = (void (*)(struct socket *, void *))transferread;
-    sk->writecb = (void (*)(struct socket *, void *))transferwrite;
-    sk->errcb = (void (*)(struct socket *, int, void *))transfererr;
+    sk->readcb = (void (*)(struct socket *, void *))localread;
+    sk->writecb = (void (*)(struct socket *, void *))localwrite;
+    sk->errcb = (void (*)(struct socket *, int, void *))localerr;
 }
 
 static int tryreq(struct transfer *transfer)
@@ -730,6 +726,7 @@ static int run(void)
 {
     struct transfer *transfer, *next;
     
+    /*
     for(transfer = transfers; transfer != NULL; transfer = transfer->next)
     {
        if((transfer->endpos >= 0) && (transfer->state == TRNS_MAIN) && (transfer->localend != NULL) && (transfer->localend->state == SOCK_EST) && (transfer->curpos >= transfer->endpos))
@@ -739,6 +736,7 @@ static int run(void)
            closesock(transfer->localend);
        }
     }
+    */
     for(transfer = transfers; transfer != NULL; transfer = next)
     {
        next = transfer->next;
index 4678254..aa3e837 100644 (file)
 #define TRNSE_NOTFOUND 1
 #define TRNSE_NOSLOTS 2
 
-struct transfer;
-
-struct transferiface
-{
-    void (*detach)(struct transfer *transfer, void *data);
-    void (*gotdata)(struct transfer *transfer, void *data);
-    void (*endofdata)(struct transfer *transfer, void *data);
-    void (*wantdata)(struct transfer *transfer, void *data);
-};
-
 struct transfer
 {
     struct transfer *next, *prev;
@@ -68,15 +58,13 @@ struct transfer
     time_t timeout, activity, lastreq;
     wchar_t *actdesc;
     struct fnet *fnet;
-    struct transferiface *iface;
     wchar_t *peerid, *peernick;
     wchar_t *path;
     uid_t owner;
     int state, dir, error;
     off_t size, curpos, endpos;
     struct fnetnode *fn;
-    void *ifacedata;
-    struct socket *localend;
+    struct socket *localend, *datapipe;
     struct wcspair *args;
     pid_t filter;
     struct authhandle *auth;
@@ -99,22 +87,18 @@ int slotsleft(void);
 void bumptransfer(struct transfer *transfer);
 struct transfer *findtransfer(int id);
 struct transfer *hasupload(struct fnet *fnet, wchar_t *peerid);
-struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct transferiface *iface, void *data);
+struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct socket *dpipe);
 void transfersetnick(struct transfer *transfer, wchar_t *newnick);
 void transfersetpath(struct transfer *transfer, wchar_t *newpath);
 void transfersetstate(struct transfer *transfer, int newstate);
 void transfersetsize(struct transfer *transfer, off_t newsize);
 void transferseterror(struct transfer *transfer, int error);
 void transfersetactivity(struct transfer *transfer, wchar_t *desc);
-void transferattach(struct transfer *transfer, struct transferiface *iface, void *data);
+void transferattach(struct transfer *transfer, struct socket *dpipe);
 void transferdetach(struct transfer *transfer);
 void resettransfer(struct transfer *transfer);
 void transfersetlocalend(struct transfer *transfer, struct socket *sk);
-void *transfergetdata(struct transfer *transfer, size_t *size);
 int forkfilter(struct transfer *transfer);
-void transferputdata(struct transfer *transfer, void *buf, size_t size);
-ssize_t transferdatasize(struct transfer *transfer);
-void transferendofdata(struct transfer *transfer);
 void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk);
 void transferstartul(struct transfer *transfer, struct socket *sk);
 void transfersethash(struct transfer *transfer, struct hash *hash);