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)
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;
}
new->refcount = 1;
new->state = -1;
new->dgram = dgram;
+ new->maxbuf = 65536;
numsocks++;
return(new);
}
return(ret);
}
-size_t sockqueuesize(struct socket *sk)
+/* size_t sockqueuesize(struct socket *sk) */
+/* { */
+/* return(sockgetdatalen(sk->back)); */
+/* } */
+
+ssize_t sockqueueleft(struct socket *sk)
{
- return(sockgetdatalen(sk->back));
+ return(sk->back->maxbuf - sockgetdatalen(sk->back));
}
/*
for(maxfd = 0, ufd = ufds; ufd != NULL; ufd = ufd->next) {
if(ufd->fd < 0)
continue;
- if(!ufd->ignread)
+ if(!ufd->ignread && ((ufd->sk == NULL) || (sockqueueleft(ufd->sk) > 0)))
FD_SET(ufd->fd, &rfds);
if(ufd->sk != NULL) {
if(sockgetdatalen(ufd->sk) > 0)
return(0);
}
-void sockblock(struct socket *sk, int block)
-{
- struct ufd *ufd;
+/* void sockblock(struct socket *sk, int block) */
+/* { */
+/* struct ufd *ufd; */
- ufd = getskufd(sk);
- ufd->ignread = block;
-}
+/* ufd = getskufd(sk); */
+/* ufd->ignread = block; */
+/* } */
int sockfamily(struct socket *sk)
{
int state;
int dgram;
int eos;
+ size_t maxbuf;
struct socket *back, *pnext;
union
{
void freedgbuf(struct dgrambuf *dg);
void sockqueue(struct socket *sk, void *data, size_t size);
void sockerror(struct socket *sk, int en);
-size_t sockqueuesize(struct socket *sk);
+/* size_t sockqueuesize(struct socket *sk); */
+ssize_t sockqueueleft(struct socket *sk);
int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data);
struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen);
struct socket *netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen);
char *formataddress(struct sockaddr *arg, socklen_t arglen);
char *formatsockpeer(struct socket *sk);
void sockpushdata(struct socket *sk, void *buf, size_t size);
-void sockblock(struct socket *sk, int block);
+/* void sockblock(struct socket *sk, int block); */
int sockpeeraddr(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf);
int getucred(struct socket *sk, uid_t *uid, gid_t *gid);
int sockfamily(struct socket *sk);
static void transferread(struct socket *sk, struct transfer *transfer)
{
- if(sockgetdatalen(sk) >= 65536)
- sockblock(sk, 1);
- if((transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
+ if((sockgetdatalen(sk) > 0) && (transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
transfer->iface->gotdata(transfer, transfer->ifacedata);
}
size_t transferdatasize(struct transfer *transfer)
{
- return(sockqueuesize(transfer->localend));
+ return(sockqueueleft(transfer->localend));
}
void *transfergetdata(struct transfer *transfer, size_t *size)
if(transfer->localend == NULL)
return(NULL);
- 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;
- sockblock(lesk, 1);
transfersetlocalend(transfer, lesk);
}
transfersetstate(transfer, TRNS_MAIN);
socksettos(sk, confgetint("transfer", "ultos"));
if(transfer->localend != NULL)
- sockblock(transfer->localend, 0);
+ transferread(transfer->localend, transfer);
}
void transfersetlocalend(struct transfer *transfer, struct socket *sk)
* 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. */
- sockblock(insock, 1);
+/* sockblock(insock, 1); */
transfer->filter = pid;
transfersetlocalend(transfer, insock);
getsock(transfer->filterout = outsock);