} else if(fd >= 0) {
if((wbuf = adc2path(argv[1])) != NULL)
transfersetpath(peer->transfer, wbuf);
+ free(wbuf);
peer->transfer->flags.b.minislot = 1;
}
if(fd < 0)
if((peer->state == PEER_TRNS) || (peer->state == PEER_SYNC))
{
- if(sockqueuesize(peer->sk) < 65536)
+ if(sockqueueleft(peer->sk) > 0)
{
if((buf = transfergetdata(transfer, &bufsize)) != NULL)
{
dctransgotdata(transfer, peer);
}
-static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
-{
- if(transferdatasize(transfer) < 65536)
- sockblock(peer->sk, 0);
-}
-
static void transread(struct socket *sk, struct dcpeer *peer)
{
void *buf;
size_t bufsize;
struct transfer *transfer;
+ if(transferdatasize(peer->transfer) < 0)
+ return;
if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
return;
if(peer->transfer == NULL)
transferendofdata(transfer);
return;
}
- if(transferdatasize(peer->transfer) > 65535)
- sockblock(sk, 1);
+}
+
+static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
+{
+ if(transferdatasize(transfer) > 0)
+ transread(peer->sk, peer);
}
static void transerr(struct socket *sk, int err, struct dcpeer *peer)
if((hub->sk != NULL) && addreq(addrbuf, (struct sockaddr *)&hubaddr))
{
myfn = fn;
+ free(addrbuf);
break;
}
free(addrbuf);
char *p, *p2;
hub = (struct dchub *)fn->data;
+ if(hub->queue.size > 1000)
+ return;
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
if(hub->inbufdata > 500000) /* Discard possible malicious data */
p = p2;
}
memmove(hub->inbuf, p, hub->inbufdata -= p - hub->inbuf);
- if(hub->queue.size > 1000)
- sockblock(sk, 1);
}
static void huberr(struct socket *sk, int err, struct fnetnode *fn)
size_t datalen, cnlen;
struct command *cmd;
+ if(peer->state == PEER_CMD) {
+ if((peer->queue.size > 50) || (peer->inbufdata > 65536))
+ return;
+ }
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
sizebuf2(peer->inbuf, peer->inbufdata + datalen, 1);
{
peer->state = PEER_STOP;
break;
- } else {
- if(peer->queue.size > 50)
- sockblock(sk, 1);
}
}
} else if(peer->state == PEER_TTHL) {
handletthl(peer);
}
- if(peer->inbufdata > 500000)
- sockblock(sk, 1);
}
static void peererror(struct socket *sk, int err, struct dcpeer *peer)
quota--;
}
if(hub->queue.size < 1000)
- sockblock(hub->sk, 0);
+ hubread(hub->sk, fn);
if(quota < 1)
break;
}
quota--;
}
if((peer->queue.size < 50) && (peer->inbufdata < 500000))
- sockblock(peer->sk, 0);
+ peerread(peer->sk, peer);
if(quota < 1)
break;
}