Fixed HTTP-client query-string handling bug.
[doldaconnect.git] / daemon / fnet-dc.c
index afd13b3..85ba9a0 100644 (file)
@@ -553,6 +553,8 @@ static char **parseadc(char *args)
                state = 3;
            else if(*args != ' ')
                state = 1;
+           else
+               args++;
            break;
        case 1:
            if((*args == ' ') || (*args == 0))
@@ -1123,7 +1125,7 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
     int minsize, maxsize;
     int dotth;
     size_t buflen;
-    int termnum, satisfied, skipcheck;
+    int termnum, satisfied, matches, skipcheck, proper;
     int level, tersat[32];
     wchar_t *terms[32], *lname;
     char hashtth[24];
@@ -1192,6 +1194,7 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
     termnum = 0;
     p2 = p;
     done = 0;
+    proper = 0;
     while(!done)
     {
        if((*p2 == 0) || (*p2 == '$'))
@@ -1215,6 +1218,8 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
                } else {
                    if((terms[termnum] = icmbstowcs(p, hub->charset)) != NULL) {
                        wcslower(terms[termnum]);
+                       if(wcslen(terms[termnum]) > 1)
+                           proper = 1;
                        termnum++;
                    }
                }
@@ -1225,12 +1230,15 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
        }
        p2++;
     }
+    if(!proper)
+       goto out;
     
     node = shareroot->child;
     level = 0;
     for(i = 0; i < termnum; i++)
        tersat[i] = -1;
     satisfied = 0;
+    matches = 0;
     while(1)
     {
        skipcheck = 0;
@@ -1277,6 +1285,8 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
                    qstrf(dsk, "%s%s\005%ji%s%s%s", prefix, buf, (intmax_t)node->size, infix, hub->nativename, postfix);
                }
                free(buf);
+               if(++matches >= 20)
+                   break;
            }
        }
        if((!skipcheck && (satisfied == termnum)) || (node->child == NULL))
@@ -1616,7 +1626,7 @@ static void cmd_direction(struct socket *sk, struct dcpeer *peer, char *cmd, cha
        if(peer->direction == TRNSD_DOWN)
            requestfile(peer);
     } else {
-       if(peer->wcsname == NULL)
+       if((peer->wcsname == NULL) || (peer->transfer != NULL))
        {
            peer->close = 1;
            return;
@@ -2429,9 +2439,9 @@ static int hubsendchat(struct fnetnode *fn, int public, wchar_t *to, wchar_t *st
     return(0);
 }
 
-static void findsizelimit(struct sexpr *sexpr, int *min, int *max)
+static void findsizelimit(struct sexpr *sexpr, off_t *min, off_t *max)
 {
-    int minl, maxl, minr, maxr, retmin, retmax;
+    off_t minl, maxl, minr, maxr, retmin, retmax;
     
     switch(sexpr->op)
     {
@@ -2475,14 +2485,14 @@ static void findsizelimit(struct sexpr *sexpr, int *min, int *max)
        }
     case SOP_SIZELT:
        retmin = 0;
-       retmax = sexpr->d.n - 1;
+       retmax = sexpr->d.sz - 1;
        break;
     case SOP_SIZEEQ:
-       retmin = sexpr->d.n;
-       retmax = sexpr->d.n;
+       retmin = sexpr->d.sz;
+       retmax = sexpr->d.sz;
        break;
     case SOP_SIZEGT:
-       retmin = sexpr->d.n + 1;
+       retmin = sexpr->d.sz + 1;
        retmax = -1;
        break;
     default:
@@ -2533,7 +2543,7 @@ static int hubsearch(struct fnetnode *fn, struct search *srch, struct srchfnnlis
     size_t sstrsize, sstrdata;
     struct sockaddr *name;
     socklen_t namelen;
-    int minsize, maxsize;
+    off_t minsize, maxsize;
     struct hash *hash;
     
     hub = fn->data;
@@ -2566,10 +2576,10 @@ static int hubsearch(struct fnetnode *fn, struct search *srch, struct srchfnnlis
        if(minsize != 0)
        {
            sizebuf2(sstr, sstrdata + 32, 1);
-           sstrdata += snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?F?%i?1?", minsize);
+           sstrdata += snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?F?%ji?1?", (intmax_t)minsize);
        } else if(maxsize != -1) {
            sizebuf2(sstr, sstrdata + 32, 1);
-           sstrdata += snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?T?%i?1?", maxsize);
+           sstrdata += snprintf(sstr + sstrdata, sstrsize - sstrdata, "T?T?%ji?1?", (intmax_t)maxsize);
        } else {
            bufcat(sstr, "F?F?0?1?", 8);
        }
@@ -2762,6 +2772,7 @@ static void peerdetach(struct dcpeer *peer)
 {
     CBUNREG(peer->transfer, trans_filterout, peer);
     CBUNREG(peer->transfer, trans_destroy, peer);
+    peer->trpipe->pnext = NULL;
     closesock(peer->trpipe);
     quitsock(peer->trpipe);
     peer->trpipe = NULL;
@@ -2828,6 +2839,7 @@ static void transwrite(struct socket *sk, struct dcpeer *peer)
        return;
     }
     dctransgotdata(peer->transfer, peer);
+    sockread(peer->trpipe);
 }
 
 static void trpiperead(struct socket *sk, struct dcpeer *peer)
@@ -2854,6 +2866,7 @@ static struct socket *mktrpipe(struct dcpeer *peer)
     struct socket *sk;
     
     sk = netsockpipe();
+    sk->pnext = peer->sk;
     sk->data = peer;
     sk->readcb = (void (*)(struct socket *, void *))trpiperead;
     sk->writecb = (void (*)(struct socket *, void *))trpipewrite;
@@ -3215,7 +3228,7 @@ static void hubdestroy(struct fnetnode *fn)
     struct qcommand *qcmd;
     
     hub = (struct dchub *)fn->data;
-    putsock(hub->sk);
+    quitsock(hub->sk);
     while((qcmd = ulqcmd(&hub->queue)) != NULL)
        freeqcmd(qcmd);
     if(hub->supports != NULL)