Check hub addresses for sources hubs.
[doldaconnect.git] / daemon / fnet-dc.c
index 350255e..1e4406c 100644 (file)
@@ -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);
        }
@@ -2724,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;
@@ -2783,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 + 1) = 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);
@@ -2822,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);