/*
* Dolda Connect - Modular multiuser Direct Connect-style client
- * Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ * Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
return(NULL);
if((transfer->endpos >= 0) && (transfer->curpos + *size >= transfer->endpos))
{
- *size = transfer->endpos - transfer->curpos;
- buf = srealloc(buf, *size);
+ if((*size = transfer->endpos - transfer->curpos) == 0) {
+ free(buf);
+ buf = NULL;
+ } else {
+ buf = srealloc(buf, *size);
+ }
}
transfer->curpos += *size;
bytesupload += *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;
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");
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;
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);
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));
{
argv = NULL;
argvsize = argvdata = 0;
- buf = sprintf2("%i", transfer->size);
+ buf = sprintf2("%ji", (intmax_t)transfer->size);
addtobuf(argv, filtername);
addtobuf(argv, filename);
addtobuf(argv, buf);