X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffnet-dc.c;h=a7188b1da2e5743fd250a6cdf1a3355fb7a02d17;hb=f00d7432f56d7e4e8690d8392dffd63317759d33;hp=7175259fc2399bca02d6c047ecee8e0067927a3d;hpb=c9b3ad74a6f7fbf4559b055824cf85106cf45c1a;p=doldaconnect.git diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index 7175259..a7188b1 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -106,7 +106,7 @@ struct dchub char *inbuf; size_t inbufdata, inbufsize; struct qcommand *queue; - int extended, isop; + int extended; char *nativename; char *nativenick; }; @@ -136,7 +136,7 @@ struct dcpeer int extended; int direction; /* Using the constants from transfer.h */ int compress; - int hascurpos, notthl; + int hascurpos, fetchingtthl, notthl; struct tigertreehash tth; void *cprsdata; char *key; @@ -676,6 +676,7 @@ static void requestfile(struct dcpeer *peer) sendadc(peer->sk, "0"); sendadc(peer->sk, "-1"); qstr(peer->sk, "|"); + peer->fetchingtthl = 1; return; } } @@ -729,23 +730,30 @@ static void sendmyinfo(struct socket *sk, struct fnetnode *fn) struct dchub *hub; char *buf; struct fnetnode *cfn; - int numhubs; + int hn1, hn2, hn3; hub = fn->data; qstrf(sk, "$MyINFO $ALL %s ", hub->nativenick); buf = tr(icswcstombs(confgetstr("dc", "desc"), DCCHARSET, "Charset_conv_failure"), "$_|_"); qstrf(sk, "%s", buf); - numhubs = 0; + hn1 = hn2 = hn3 = 0; for(cfn = fnetnodes; cfn != NULL; cfn = cfn->next) { if((cfn->state == FNN_EST) || (cfn->state == FNN_HS)) - numhubs++; + { + if(cfn->regstatus == FNNS_OP) + hn3++; + else if(cfn->regstatus == FNNS_REG) + hn2++; + else + hn1++; + } } - qstrf(sk, "<%s V:%s,M:%c,H:%i/0/0,S:%i>", + qstrf(sk, "<%s V:%s,M:%c,H:%i/%i/%i,S:%i>", DCIDTAG, DCIDTAGV, (tcpsock == NULL)?'P':'A', - numhubs, + hn1, hn2, hn3, confgetint("transfer", "slots") ); qstrf(sk, "$ $"); @@ -1445,6 +1453,7 @@ static void cmd_getpass(struct socket *sk, struct fnetnode *fn, char *cmd, char } qstrf(sk, "$MyPass %s|", mbspw); free(mbspw); + fn->regstatus = FNNS_REG; hubhandleaction(sk, fn, cmd, args); } @@ -1453,7 +1462,7 @@ static void cmd_logedin(struct socket *sk, struct fnetnode *fn, char *cmd, char struct dchub *hub; hub = fn->data; - hub->isop = 1; + fn->regstatus = FNNS_OP; hubhandleaction(sk, fn, cmd, args); } @@ -1607,6 +1616,7 @@ static void startul(struct dcpeer *peer) static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, char *args) { int size; + struct transfer *transfer; if(peer->transfer == NULL) { @@ -1617,7 +1627,9 @@ static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, ch if(peer->transfer->size != size) { transfersetsize(peer->transfer, size); + transfer = peer->transfer; freedcpeer(peer); + trytransferbypeer(transfer->fnet, transfer->peerid); return; } startdl(peer); @@ -1626,6 +1638,13 @@ static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, ch static void cmd_error(struct socket *sk, struct dcpeer *peer, char *cmd, char *args) { + if(peer->fetchingtthl) + { + peer->fetchingtthl = 0; + peer->notthl = 1; + requestfile(peer); + return; + } if((peer->transfer != NULL) && (peer->transfer->dir == TRNSD_DOWN)) { transferseterror(peer->transfer, TRNSE_NOTFOUND); @@ -1759,15 +1778,10 @@ static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *arg } else if(fd >= 0) { if((buf2 = icsmbstowcs(args, DCCHARSET, NULL)) != NULL) transfersetpath(peer->transfer, buf2); + peer->transfer->flags.b.minislot = 1; } if(fd < 0) { - if(slotsleft() < 1) - { - qstr(sk, "$MaxedOut|"); - freedcpeer(peer); - return; - } if((node = resdcpath(args, DCCHARSET, '\\')) == NULL) { qstrf(sk, "$Error File not in share|"); @@ -1795,6 +1809,13 @@ static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *arg freedcpeer(peer); return; } + if(sb.st_size < 65536) + peer->transfer->flags.b.minislot = 1; + if(!peer->transfer->flags.b.minislot && (slotsleft() < 1)) { + qstr(sk, "$MaxedOut|"); + freedcpeer(peer); + return; + } if((offset != 0) && (lseek(fd, offset, SEEK_SET) < 0)) { close(fd); @@ -1898,14 +1919,10 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char } else if(fd >= 0) { if((buf2 = icsmbstowcs(args, charset, NULL)) != NULL) transfersetpath(peer->transfer, buf2); + peer->transfer->flags.b.minislot = 1; } if(fd < 0) { - if(slotsleft() < 1) - { - qstr(sk, "$MaxedOut|"); - return; - } if((node = resdcpath(p, charset, '\\')) == NULL) { qstr(sk, "$Error File not in cache|"); @@ -1930,6 +1947,12 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char qstr(sk, "$Error|"); return; } + if(sb.st_size < 65536) + peer->transfer->flags.b.minislot = 1; + if(!peer->transfer->flags.b.minislot && (slotsleft() < 1)) { + qstr(sk, "$MaxedOut|"); + return; + } if((start != 0) && ((start >= sb.st_size) || (lseek(fd, start, SEEK_SET) < 0))) { close(fd); @@ -1982,14 +2005,10 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char * } else if(fd >= 0) { if((wbuf = icsmbstowcs(argv[1], "UTF-8", NULL)) != NULL) transfersetpath(peer->transfer, wbuf); + peer->transfer->flags.b.minislot = 1; } if(fd < 0) { - if(slotsleft() < 1) - { - qstr(sk, "$MaxedOut|"); - goto out; - } if(!strncmp(argv[1], "TTH/", 4)) { if((node = findbytth(argv[1] + 4)) == NULL) @@ -2029,6 +2048,12 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char * qstr(sk, "$Error|"); goto out; } + if(sb.st_size < 65536) + peer->transfer->flags.b.minislot = 1; + if(!peer->transfer->flags.b.minislot && (slotsleft() < 1)) { + qstr(sk, "$MaxedOut|"); + goto out; + } if((start != 0) && ((start >= sb.st_size) || (lseek(fd, start, SEEK_SET) < 0))) { qstr(sk, "$Error Offset out of range|"); @@ -2133,6 +2158,7 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char * peer->state = PEER_TTHL; peer->totalsize = numbytes; peer->curread = 0; + peer->fetchingtthl = 0; inittigertree(&peer->tth); handletthl(peer); } else if(!strcmp(argv[0], "file")) {