First attempt at replacing sockblock with autoblocking.
[doldaconnect.git] / daemon / transfer.c
index e2fe54e..b4765ae 100644 (file)
@@ -26,6 +26,7 @@
 #include <grp.h>
 #include <errno.h>
 #include <sys/wait.h>
+#include <stdint.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -233,9 +234,7 @@ static void transexpire(int cancelled, struct transfer *transfer)
 
 static void transferread(struct socket *sk, struct transfer *transfer)
 {
-    if(sockgetdatalen(sk) >= 65536)
-       sk->ignread = 1;
-    if((transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
+    if((sockgetdatalen(sk) > 0) && (transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
        transfer->iface->gotdata(transfer, transfer->ifacedata);
 }
 
@@ -277,7 +276,7 @@ void transferendofdata(struct transfer *transfer)
 
 size_t transferdatasize(struct transfer *transfer)
 {
-    return(sockqueuesize(transfer->localend));
+    return(sockqueueleft(transfer->localend));
 }
 
 void *transfergetdata(struct transfer *transfer, size_t *size)
@@ -286,7 +285,6 @@ void *transfergetdata(struct transfer *transfer, size_t *size)
     
     if(transfer->localend == NULL)
        return(NULL);
-    transfer->localend->ignread = 0;
     time(&transfer->activity);
     if((buf = sockgetinbuf(transfer->localend, size)) == NULL)
        return(NULL);
@@ -305,12 +303,11 @@ void *transfergetdata(struct transfer *transfer, size_t *size)
     return(buf);
 }
 
-void transferprepul(struct transfer *transfer, size_t size, size_t start, size_t end, struct socket *lesk)
+void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk)
 {
     transfersetsize(transfer, size);
     transfer->curpos = start;
     transfer->endpos = end;
-    lesk->ignread = 1;
     transfersetlocalend(transfer, lesk);
 }
 
@@ -325,7 +322,7 @@ void transferstartul(struct transfer *transfer, struct socket *sk)
     transfersetstate(transfer, TRNS_MAIN);
     socksettos(sk, confgetint("transfer", "ultos"));
     if(transfer->localend != NULL)
-       transfer->localend->ignread = 0;
+       transferread(transfer->localend, transfer);
 }
 
 void transfersetlocalend(struct transfer *transfer, struct socket *sk)
@@ -461,7 +458,7 @@ void transfersetnick(struct transfer *transfer, wchar_t *newnick)
     CBCHAINDOCB(transfer, trans_ac, transfer, L"nick");
 }
 
-void transfersetsize(struct transfer *transfer, int newsize)
+void transfersetsize(struct transfer *transfer, off_t newsize)
 {
     transfer->size = newsize;
     CBCHAINDOCB(transfer, trans_ac, transfer, L"size");
@@ -605,7 +602,7 @@ static void filterexit(pid_t pid, int status, void *data)
 
 int forkfilter(struct transfer *transfer)
 {
-    char *filtername, *filename, *peerid, *buf;
+    char *filtername, *filename, *peerid, *buf, *p;
     wchar_t *wfilename;
     struct passwd *pwent;
     pid_t pid;
@@ -616,9 +613,7 @@ int forkfilter(struct transfer *transfer)
     struct wcspair *ta;
     char *rec, *val;
 
-    wfilename = transfer->path;
-    if(transfer->fnet->filebasename != NULL)
-       wfilename = transfer->fnet->filebasename(wfilename);
+    wfilename = fnfilebasename(transfer->path);
     if(transfer->auth == NULL)
     {
        flog(LOG_WARNING, "tried to fork filter for transfer with NULL authhandle (tranfer %i)", transfer->id);
@@ -661,6 +656,12 @@ int forkfilter(struct transfer *transfer)
        peerid = sprintf2("utf8-%s", buf);
        free(buf);
     }
+    for(p = filename; *p; p++) {
+       if(*p == '/')
+           *p = '_';
+       else if((p == filename) && (*p == '.'))
+           *p = '_';
+    }
     if((pid = forksess(transfer->owner, transfer->auth, filterexit, NULL, FD_PIPE, 0, O_WRONLY, &inpipe, FD_PIPE, 1, O_RDONLY, &outpipe, FD_FILE, 2, O_RDWR, "/dev/null", FD_END)) < 0)
     {
        flog(LOG_WARNING, "could not fork session for filter for transfer %i: %s", transfer->id, strerror(errno));
@@ -670,7 +671,7 @@ int forkfilter(struct transfer *transfer)
     {
        argv = NULL;
        argvsize = argvdata = 0;
-       buf = sprintf2("%zi", transfer->size);
+       buf = sprintf2("%ji", (intmax_t)transfer->size);
        addtobuf(argv, filtername);
        addtobuf(argv, filename);
        addtobuf(argv, buf);
@@ -711,7 +712,7 @@ int forkfilter(struct transfer *transfer)
      * 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. */
-    insock->ignread = 1;
+/*     sockblock(insock, 1); */
     transfer->filter = pid;
     transfersetlocalend(transfer, insock);
     getsock(transfer->filterout = outsock);