Merge branch 'socket' into transsock
authorFredrik Tolf <fredrik@dolda2000.com>
Fri, 21 Mar 2008 20:30:19 +0000 (21:30 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Fri, 21 Mar 2008 20:30:19 +0000 (21:30 +0100)
Conflicts:

daemon/transfer.c
daemon/transfer.h

1  2 
daemon/transfer.c

diff --combined daemon/transfer.c
@@@ -126,19 -126,22 +126,19 @@@ struct transfer *newtransfer(void
      return(new);
  }
  
 -void transferattach(struct transfer *transfer, struct transferiface *iface, void *data)
 +void transferattach(struct transfer *transfer, struct socket *dpipe)
  {
 -    if(transfer->iface != NULL)
 -      transferdetach(transfer);
 -    transfer->iface = iface;
 -    transfer->ifacedata = data;
 +    transferdetach(transfer);
 +    getsock(transfer->datapipe = dpipe);
  }
  
  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);
 +      putsock(transfer->datapipe);
      }
 +    transfer->datapipe = NULL;
  }
  
  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);
@@@ -165,7 -168,7 +165,7 @@@ struct transfer *hasupload(struct fnet 
      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;
      
      transfer->dir = TRNSD_UP;
      if(fn != NULL)
        getfnetnode(transfer->fn = fn);
 -    transferattach(transfer, iface, data);
 +    transferattach(transfer, dpipe);
      linktransfer(transfer);
      bumptransfer(transfer);
      return(transfer);
@@@ -199,7 -202,8 +199,7 @@@ void resettransfer(struct transfer *tra
  {
      if(transfer->dir == TRNSD_DOWN)
      {
 -      if(transfer->iface != NULL)
 -          transferdetach(transfer);
 +      transferdetach(transfer);
        killfilter(transfer);
        transfersetstate(transfer, TRNS_WAITING);
        transfersetactivity(transfer, L"reset");
@@@ -228,33 -232,19 +228,33 @@@ static void transexpire(int cancelled, 
        transfer->timeout = 0;
  }
  
 -static void transferread(struct socket *sk, struct transfer *transfer)
 +static void localread(struct socket *sk, struct transfer *transfer)
  {
 -    if((sockgetdatalen(sk) > 0) && (transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
 -      transfer->iface->gotdata(transfer, transfer->ifacedata);
 +    void *buf;
 +    size_t blen;
 +    
 +    if(transfer->datapipe != NULL) {
 +      buf = sockgetinbuf(sk, &blen);
 +      sockqueue(transfer->datapipe, buf, blen);
 +      if(sockqueuesize(transfer->datapipe) >= 65536)
 +          sockblock(sk, 1);
 +      else
 +          sockblock(sk, 0);
 +    } else {
 +      if(sockgetdatalen(sk) >= 65536)
 +          sockblock(sk, 1);
 +    }
  }
  
 -static void transferwrite(struct socket *sk, struct transfer *transfer)
 +static void localwrite(struct socket *sk, struct transfer *transfer)
  {
 -    if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL))
 -      transfer->iface->wantdata(transfer, transfer->ifacedata);
 +    void *buf;
 +    size_t blen;
 +    
 +    
  }
  
 -static void transfererr(struct socket *sk, int errno, struct transfer *transfer)
 +static void localerr(struct socket *sk, int errno, struct transfer *transfer)
  {
      if((transfer->iface != NULL) && (transfer->iface->endofdata != NULL))
        transfer->iface->endofdata(transfer, transfer->ifacedata);
@@@ -284,9 -274,9 +284,9 @@@ void transferendofdata(struct transfer 
      }
  }
  
- size_t transferdatasize(struct transfer *transfer)
+ ssize_t transferdatasize(struct transfer *transfer)
  {
-     return(sockqueuesize(transfer->localend));
+     return(sockqueueleft(transfer->localend));
  }
  
  void *transfergetdata(struct transfer *transfer, size_t *size)
      
      if(transfer->localend == NULL)
        return(NULL);
-     sockblock(transfer->localend, 0);
      time(&transfer->activity);
      if((buf = sockgetinbuf(transfer->localend, size)) == NULL)
        return(NULL);
@@@ -319,7 -308,6 +318,6 @@@ void transferprepul(struct transfer *tr
      transfersetsize(transfer, size);
      transfer->curpos = start;
      transfer->endpos = end;
-     sockblock(lesk, 1);
      transfersetlocalend(transfer, lesk);
  }
  
@@@ -334,7 -322,7 +332,7 @@@ void transferstartul(struct transfer *t
      transfersetstate(transfer, TRNS_MAIN);
      socksettos(sk, confgetint("transfer", "ultos"));
      if(transfer->localend != NULL)
-       sockblock(transfer->localend, 0);
+       transferread(transfer->localend, transfer);
  }
  
  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)
@@@ -724,7 -712,7 +722,7 @@@ int forkfilter(struct transfer *transfe
       * the fd, and thus it closes it. Until I can find out whyever the
       * kernel gives a POLLIN on the fd (if I can at all...), I'll just
       * set ignread on insock for now. */
-     sockblock(insock, 1);
+ /*     sockblock(insock, 1); */
      transfer->filter = pid;
      transfersetlocalend(transfer, insock);
      getsock(transfer->filterout = outsock);