Dolda2000 GitWeb
/
doldaconnect.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Be more strict on incoming searches.
[doldaconnect.git]
/
daemon
/
fnet-dc.c
diff --git
a/daemon/fnet-dc.c
b/daemon/fnet-dc.c
index
36ddb14
..
85ba9a0
100644
(file)
--- a/
daemon/fnet-dc.c
+++ b/
daemon/fnet-dc.c
@@
-553,6
+553,8
@@
static char **parseadc(char *args)
state = 3;
else if(*args != ' ')
state = 1;
state = 3;
else if(*args != ' ')
state = 1;
+ else
+ args++;
break;
case 1:
if((*args == ' ') || (*args == 0))
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 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];
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;
termnum = 0;
p2 = p;
done = 0;
+ proper = 0;
while(!done)
{
if((*p2 == 0) || (*p2 == '$'))
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]);
} else {
if((terms[termnum] = icmbstowcs(p, hub->charset)) != NULL) {
wcslower(terms[termnum]);
+ if(wcslen(terms[termnum]) > 1)
+ proper = 1;
termnum++;
}
}
termnum++;
}
}
@@
-1225,12
+1230,15
@@
static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
}
p2++;
}
}
p2++;
}
+ if(!proper)
+ goto out;
node = shareroot->child;
level = 0;
for(i = 0; i < termnum; i++)
tersat[i] = -1;
satisfied = 0;
node = shareroot->child;
level = 0;
for(i = 0; i < termnum; i++)
tersat[i] = -1;
satisfied = 0;
+ matches = 0;
while(1)
{
skipcheck = 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);
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))
}
}
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->direction == TRNSD_DOWN)
requestfile(peer);
} else {
- if(
peer->wcsname == NULL
)
+ if(
(peer->wcsname == NULL) || (peer->transfer != NULL)
)
{
peer->close = 1;
return;
{
peer->close = 1;
return;
@@
-2429,9
+2439,9
@@
static int hubsendchat(struct fnetnode *fn, int public, wchar_t *to, wchar_t *st
return(0);
}
return(0);
}
-static void findsizelimit(struct sexpr *sexpr,
int *min, in
t *max)
+static void findsizelimit(struct sexpr *sexpr,
off_t *min, off_
t *max)
{
{
-
in
t minl, maxl, minr, maxr, retmin, retmax;
+
off_
t minl, maxl, minr, maxr, retmin, retmax;
switch(sexpr->op)
{
switch(sexpr->op)
{
@@
-2475,14
+2485,14
@@
static void findsizelimit(struct sexpr *sexpr, int *min, int *max)
}
case SOP_SIZELT:
retmin = 0;
}
case SOP_SIZELT:
retmin = 0;
- retmax = sexpr->d.
n
- 1;
+ retmax = sexpr->d.
sz
- 1;
break;
case SOP_SIZEEQ:
break;
case SOP_SIZEEQ:
- retmin = sexpr->d.
n
;
- retmax = sexpr->d.
n
;
+ retmin = sexpr->d.
sz
;
+ retmax = sexpr->d.
sz
;
break;
case SOP_SIZEGT:
break;
case SOP_SIZEGT:
- retmin = sexpr->d.
n
+ 1;
+ retmin = sexpr->d.
sz
+ 1;
retmax = -1;
break;
default:
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;
size_t sstrsize, sstrdata;
struct sockaddr *name;
socklen_t namelen;
-
in
t minsize, maxsize;
+
off_
t minsize, maxsize;
struct hash *hash;
hub = fn->data;
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);
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);
} 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);
}
} else {
bufcat(sstr, "F?F?0?1?", 8);
}
@@
-3218,7
+3228,7
@@
static void hubdestroy(struct fnetnode *fn)
struct qcommand *qcmd;
hub = (struct dchub *)fn->data;
struct qcommand *qcmd;
hub = (struct dchub *)fn->data;
-
pu
tsock(hub->sk);
+
qui
tsock(hub->sk);
while((qcmd = ulqcmd(&hub->queue)) != NULL)
freeqcmd(qcmd);
if(hub->supports != NULL)
while((qcmd = ulqcmd(&hub->queue)) != NULL)
freeqcmd(qcmd);
if(hub->supports != NULL)