static void killfilter(struct transfer *transfer);
+unsigned long long bytesupload = 0;
+unsigned long long bytesdownload = 0;
struct transfer *transfers = NULL;
int numtransfers = 0;
GCBCHAIN(newtransfercb, struct transfer *);
free(transfer->filterbuf);
if(transfer->hash != NULL)
freehash(transfer->hash);
+ if(transfer->exitstatus != NULL)
+ free(transfer->exitstatus);
if(transfer->localend != NULL)
{
transfer->localend->readcb = NULL;
time(&transfer->activity);
sockqueue(transfer->localend, buf, size);
transfer->curpos += size;
+ bytesdownload += size;
CBCHAINDOCB(transfer, trans_p, transfer);
}
buf = srealloc(buf, *size);
}
transfer->curpos += *size;
+ bytesupload += *size;
CBCHAINDOCB(transfer, trans_p, transfer);
return(buf);
}
}
}
if(peer != NULL)
+ {
+ time(&transfer->lastreq);
return(fn->fnet->reqconn(peer));
+ }
return(1);
}
return(NULL);
}
+static void handletranscmd(struct transfer *transfer, wchar_t *cmd, wchar_t *arg)
+{
+ if(!wcscmp(cmd, L"status")) {
+ if(arg == NULL)
+ arg = L"";
+ if(transfer->exitstatus != NULL)
+ free(transfer->exitstatus);
+ transfer->exitstatus = swcsdup(arg);
+ }
+}
+
static void filterread(struct socket *sk, struct transfer *transfer)
{
char *buf, *p, *p2;
return;
bufcat(transfer->filterbuf, buf, bufsize);
free(buf);
- if((p = memchr(transfer->filterbuf, '\n', transfer->filterbufdata)) != NULL)
+ while((p = memchr(transfer->filterbuf, '\n', transfer->filterbufdata)) != NULL)
{
*(p++) = 0;
if((p2 = strchr(transfer->filterbuf, ' ')) != NULL)
if(p2 != NULL)
{
if((arg = icmbstowcs(p2, NULL)) == NULL)
- flog(LOG_WARNING, "filter sent a string which could not be converted into the local charset: %s: %s", transfer->filterbuf, strerror(errno));
+ flog(LOG_WARNING, "filter sent a string which could not be converted into the local charset: %s: %s", p2, strerror(errno));
}
+ handletranscmd(transfer, cmd, arg);
CBCHAINDOCB(transfer, trans_filterout, transfer, cmd, arg);
if(arg != NULL)
free(arg);
static void filterexit(pid_t pid, int status, void *data)
{
struct transfer *transfer;
+ struct fnet *fnet;
+ wchar_t *peerid;
for(transfer = transfers; transfer != NULL; transfer = transfer->next)
{
{
transfer->filter = -1;
killfilter(transfer);
+ fnet = transfer->fnet;
+ peerid = swcsdup(transfer->peerid);
if(WEXITSTATUS(status))
- {
resettransfer(transfer);
- } else {
+ else
freetransfer(transfer);
- }
+ trytransferbypeer(fnet, peerid);
+ free(peerid);
break;
}
}