Merge branch 'master' of git://git.dolda2000.com/doldaconnect
[doldaconnect.git] / daemon / fnet-dc.c
index fd7a79d..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;