char *inbuf;
size_t inbufdata, inbufsize;
off_t curread, totalsize;
char *inbuf;
size_t inbufdata, inbufsize;
off_t curread, totalsize;
if((buf = path2nmdc(peer->transfer->path, DCCHARSET)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = path2nmdc(peer->transfer->path, DCCHARSET)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = getadcid(peer)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = getadcid(peer)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if(forkfilter(peer->transfer))
{
flog(LOG_WARNING, "could not fork filter for transfer %i: %s", peer->transfer->id, strerror(errno));
if(forkfilter(peer->transfer))
{
flog(LOG_WARNING, "could not fork filter for transfer %i: %s", peer->transfer->id, strerror(errno));
return;
}
CBREG(peer->transfer, trans_filterout, (int (*)(struct transfer *, wchar_t *, wchar_t *, void *))trresumecb, NULL, peer);
return;
}
CBREG(peer->transfer, trans_filterout, (int (*)(struct transfer *, wchar_t *, wchar_t *, void *))trresumecb, NULL, peer);
if((buf = getadcid(peer)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = getadcid(peer)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = path2nmdc(peer->transfer->path, "UTF-8")) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = path2nmdc(peer->transfer->path, "UTF-8")) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
return;
}
qstrf(peer->sk, "$UGetBlock %ji %ji %s|", (intmax_t)peer->transfer->curpos, (intmax_t)(peer->transfer->size - peer->transfer->curpos), buf);
return;
}
qstrf(peer->sk, "$UGetBlock %ji %ji %s|", (intmax_t)peer->transfer->curpos, (intmax_t)(peer->transfer->size - peer->transfer->curpos), buf);
if((buf = path2nmdc(peer->transfer->path, DCCHARSET)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
if((buf = path2nmdc(peer->transfer->path, DCCHARSET)) == NULL)
{
transferseterror(peer->transfer, TRNSE_NOTFOUND);
return;
}
qstrf(peer->sk, "$Get %s$%ji|", buf, (intmax_t)peer->transfer->curpos + 1);
return;
}
qstrf(peer->sk, "$Get %s$%ji|", buf, (intmax_t)peer->transfer->curpos + 1);
return;
}
transfer = newupload(peer->fn, &dcnet, peer->wcsname, &dctransfer, peer);
} else {
if((transfer = finddownload(peer->wcsname)) == NULL)
{
return;
}
transfer = newupload(peer->fn, &dcnet, peer->wcsname, &dctransfer, peer);
} else {
if((transfer = finddownload(peer->wcsname)) == NULL)
{
{
transfersetsize(peer->transfer, size);
transfer = peer->transfer;
{
transfersetsize(peer->transfer, size);
transfer = peer->transfer;
}
static void cmd_maxedout(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
}
static void cmd_maxedout(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
return;
}
if(((fd = openfilelist(args)) < 0) && (errno != 0))
{
qstr(sk, "$Error Could not send file list|");
return;
}
if(((fd = openfilelist(args)) < 0) && (errno != 0))
{
qstr(sk, "$Error Could not send file list|");
if((node = resdcpath(args, DCCHARSET, '\\')) == NULL)
{
qstrf(sk, "$Error File not in share|");
if((node = resdcpath(args, DCCHARSET, '\\')) == NULL)
{
qstrf(sk, "$Error File not in share|");
return;
}
if((fd = opensharecache(node)) < 0)
{
qstrf(sk, "$Error %s|", strerror(errno));
return;
}
if((fd = opensharecache(node)) < 0)
{
qstrf(sk, "$Error %s|", strerror(errno));
close(fd);
flog(LOG_WARNING, "could not stat file %ls: %s", node->name, strerror(errno));
qstrf(sk, "$Error|");
close(fd);
flog(LOG_WARNING, "could not stat file %ls: %s", node->name, strerror(errno));
qstrf(sk, "$Error|");
return;
}
if((offset != 0) && (lseek(fd, offset, SEEK_SET) < 0))
{
close(fd);
qstrf(sk, "$Error Offset out of range|");
return;
}
if((offset != 0) && (lseek(fd, offset, SEEK_SET) < 0))
{
close(fd);
qstrf(sk, "$Error Offset out of range|");
} else if(!strcmp(argv[0], "file")) {
if(start != peer->transfer->curpos)
{
} else if(!strcmp(argv[0], "file")) {
if(start != peer->transfer->curpos)
{
goto out;
}
if(start + numbytes != peer->transfer->size)
{
transfersetsize(peer->transfer, start + numbytes);
goto out;
}
if(start + numbytes != peer->transfer->size)
{
transfersetsize(peer->transfer, start + numbytes);
return;
}
numbytes = strtoll(args, NULL, 10);
if(peer->transfer->size - peer->transfer->curpos != numbytes)
{
transfersetsize(peer->transfer, peer->transfer->curpos + numbytes);
return;
}
numbytes = strtoll(args, NULL, 10);
if(peer->transfer->size - peer->transfer->curpos != numbytes)
{
transfersetsize(peer->transfer, peer->transfer->curpos + numbytes);
static void dctransdetach(struct transfer *transfer, struct dcpeer *peer)
{
CBUNREG(transfer, trans_filterout, peer);
static void dctransdetach(struct transfer *transfer, struct dcpeer *peer)
{
CBUNREG(transfer, trans_filterout, peer);
hub = (struct dchub *)fn->data;
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
hub = (struct dchub *)fn->data;
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
sizebuf2(hub->inbuf, hub->inbufdata + datalen, 1);
memcpy(hub->inbuf + hub->inbufdata, newbuf, datalen);
free(newbuf);
sizebuf2(hub->inbuf, hub->inbufdata + datalen, 1);
memcpy(hub->inbuf + hub->inbufdata, newbuf, datalen);
free(newbuf);
- newqcmd(&hub->queue, hub->inbuf);
- memmove(hub->inbuf, p, hub->inbufdata -= p - hub->inbuf);
- datalen = hub->inbufdata;
- p = hub->inbuf;
+ newqcmd(&hub->queue, p);
+ datalen -= p2 - p;
+ p = p2;
peer->transfer->close = 1;
if(peer->transfer->dir == TRNSD_DOWN)
resettransfer(peer->transfer);
peer->transfer->close = 1;
if(peer->transfer->dir == TRNSD_DOWN)
resettransfer(peer->transfer);
static struct transferiface dctransfer =
{
.detach = (void (*)(struct transfer *, void *))dctransdetach,
static struct transferiface dctransfer =
{
.detach = (void (*)(struct transfer *, void *))dctransdetach,