X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffnet-dc.c;h=ec19a5632913dbc0ecff932f54e7f333bfa5d174;hb=d5cef543a8e21b3ef73e49c2d066042b3d655b68;hp=1be50d69cbe40756c2db7206bf5672b6db03fa7a;hpb=f24d5cfb211a782a3b1e4040c629dc1c92a0c8c8;p=doldaconnect.git diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index 1be50d6..ec19a56 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -536,7 +536,9 @@ static char **parseadc(char *args) } else if(*args == '\\') { addtobuf(buf, '\\'); } + args++; state = 1; + break; } } if(buf != NULL) @@ -1473,7 +1475,8 @@ static void cmd_direction(struct socket *sk, struct dcpeer *peer, char *cmd, cha freedcpeer(peer); return; } - requestfile(peer); + if(peer->direction == TRNSD_DOWN) + requestfile(peer); } else { if(peer->wcsname == NULL) { @@ -2051,8 +2054,9 @@ static void handletthl(struct dcpeer *peer) { pushtigertree(&peer->tth, peer->inbuf); memmove(peer->inbuf, peer->inbuf + 24, peer->inbufdata -= 24); + peer->curread += 24; } - if((peer->curread += 24) >= peer->totalsize) + if(peer->curread >= peer->totalsize) { peer->state = PEER_CMD; synctigertree(&peer->tth); @@ -2110,6 +2114,12 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char * goto out; } startdl(peer); + if(peer->inbufdata > 0) + { + sockpushdata(sk, peer->inbuf, peer->inbufdata); + peer->inbufdata = 0; + transread(sk, peer); + } } else { /* We certainly didn't request this...*/ freedcpeer(peer); @@ -2137,6 +2147,12 @@ static void cmd_sending(struct socket *sk, struct dcpeer *peer, char *cmd, char return; } startdl(peer); + if(peer->inbufdata > 0) + { + sockpushdata(sk, peer->inbuf, peer->inbufdata); + peer->inbufdata = 0; + transread(sk, peer); + } } /* @@ -2967,15 +2983,15 @@ static void peerread(struct socket *sk, struct dcpeer *peer) newqcmd(&peer->queue, peer->inbuf); for(cmd = peercmds; cmd->handler != NULL; cmd++) { - if(!memcmp(peer->inbuf, cmd->name, strlen(cmd->name)) && (peer->inbuf[strlen(cmd->name)] == 0)) + if(!memcmp(peer->inbuf, cmd->name, strlen(cmd->name)) && ((peer->inbuf[strlen(cmd->name)] == ' ') || (peer->inbuf[strlen(cmd->name)] == '|'))) break; } + memmove(peer->inbuf, p, peer->inbufdata -= p - peer->inbuf); if(cmd->stop) { peer->state = PEER_STOP; break; } - memmove(peer->inbuf, p, peer->inbufdata -= p - peer->inbuf); } } else if(peer->state == PEER_TTHL) { handletthl(peer);