#include <grp.h>
#include <errno.h>
#include <sys/wait.h>
+#include <stdint.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
static void transferread(struct socket *sk, struct transfer *transfer)
{
if(sockgetdatalen(sk) >= 65536)
- sk->ignread = 1;
+ sockblock(sk, 1);
if((transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
transfer->iface->gotdata(transfer, transfer->ifacedata);
}
if(transfer->localend == NULL)
return(NULL);
- transfer->localend->ignread = 0;
+ sockblock(transfer->localend, 0);
time(&transfer->activity);
if((buf = sockgetinbuf(transfer->localend, size)) == NULL)
return(NULL);
transfersetsize(transfer, size);
transfer->curpos = start;
transfer->endpos = end;
- lesk->ignread = 1;
+ sockblock(lesk, 1);
transfersetlocalend(transfer, lesk);
}
transfersetstate(transfer, TRNS_MAIN);
socksettos(sk, confgetint("transfer", "ultos"));
if(transfer->localend != NULL)
- transfer->localend->ignread = 0;
+ sockblock(transfer->localend, 0);
}
void transfersetlocalend(struct transfer *transfer, struct socket *sk)
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));
* 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);