X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffnet-dc.c;h=a74be23642ba2865e1c1d620e328b00c55ed53a2;hb=870bf4ad94f25073621c15dba5b5d4b2d4434963;hp=b07a56a53c3b6190f2bdd5a0c42cb26eaa5c144c;hpb=1c4b02cdc35b2482047e97c0bc1f4d7c1e69eaea;p=doldaconnect.git diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index b07a56a..a74be23 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -945,7 +945,7 @@ static void cmd_myinfo(struct socket *sk, struct fnetnode *fn, char *cmd, char * *p2 = 0; if((buf = icmbstowcs(p, DCCHARSET)) == NULL) return; - if((wcslen(buf) > 0) && (buf[wcslen(buf) - 1] == L'>') && ((wp = wcschr(buf, L'<')) != NULL)) + if((wcslen(buf) > 0) && (buf[wcslen(buf) - 1] == L'>') && ((wp = wcsrchr(buf, L'<')) != NULL)) { buf[wcslen(buf) - 1] = L'\0'; *(wp++) = L'\0'; @@ -2456,10 +2456,10 @@ static int hubsearch(struct fnetnode *fn, struct search *srch, struct srchfnnlis if(minsize != 0) { sizebuf2(sstr, sstrdata + 32, 1); - snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?F?%i?1?", minsize); + sstrdata += snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?F?%i?1?", minsize); } else if(maxsize != -1) { sizebuf2(sstr, sstrdata + 32, 1); - snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?T?%i?1?", maxsize); + sstrdata += snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?T?%i?1?", maxsize); } else { bufcat(sstr, "F?F?0?1?", 8); } @@ -2647,6 +2647,7 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer) endcompress(peer); transfersetstate(transfer, TRNS_HS); socksettos(peer->sk, confgetint("fnet", "fnptos")); + transfer->flags.b.minislot = 0; peer->sk->writecb = NULL; } } @@ -2723,6 +2724,7 @@ static void udpread(struct socket *sk, void *data) char *buf, *p, *p2, *hashbuf; size_t buflen, hashlen; char *nick, *filename, *hubname; + struct sockaddr_in hubaddr; int size, slots; struct fnetnode *fn, *myfn; struct dchub *hub; @@ -2782,6 +2784,27 @@ static void udpread(struct socket *sk, void *data) return; } *p2 = 0; + p = p2 + 2; + if((p2 = strchr(p, ':')) == NULL) + { + free(buf); + return; + } + *(p2++) = 0; + hubaddr.sin_family = AF_INET; + if(!inet_aton(p, &hubaddr.sin_addr)) + { + free(buf); + return; + } + p = p2; + if((p2 = strchr(p, ')')) == NULL) + { + free(buf); + return; + } + *p2 = 0; + hubaddr.sin_port = htons(atoi(p)); if((wnick = icmbstowcs(nick, DCCHARSET)) == NULL) { free(buf); @@ -2821,6 +2844,17 @@ static void udpread(struct socket *sk, void *data) } } } + if(myfn == NULL) + { + for(fn = fnetnodes; fn != NULL; fn = fn->next) + { + if((fn->fnet == &dcnet) && addreq(fn->sk->remote, (struct sockaddr *)&hubaddr)) + { + myfn = fn; + break; + } + } + } sr = newsrchres(&dcnet, wfile, wnick); if(sr->peernick != NULL) free(sr->peernick);