Properly parse search size expressions as off_t, not int.
[doldaconnect.git] / daemon / search.c
index 1aec9c0..633e07e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Dolda Connect - Modular multiuser Direct Connect-style client
- *  Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ *  Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -139,6 +139,19 @@ static struct wcslist *newsl(struct wcslist **list, wchar_t *str)
     return(ln);
 }
 
+static int wcsexists(wchar_t *h, wchar_t *n)
+{
+    size_t hl = wcslen(h), nl = wcslen(n);
+    wchar_t lh[hl + 1], ln[nl + 1];
+    int i;
+    
+    for(i = 0; i <= hl; i++)
+       lh[i] = towlower(h[i]);
+    for(i = 0; i <= nl; i++)
+       ln[i] = towlower(n[i]);
+    return(wcsstr(lh, ln) != NULL);
+}
+
 static void slmerge1(struct wcslist **list, wchar_t *str)
 {
     size_t len;
@@ -651,7 +664,7 @@ struct sexpr *parsesexpr(int argc, wchar_t **argv)
                    sexpr->op = SOP_SIZEEQ;
                else
                    sexpr->op = SOP_SIZEGT;
-               sexpr->d.n = wcstol(tok2->d.str + 2, NULL, 0);
+               sexpr->d.sz = wcstoll(tok2->d.str + 2, NULL, 0);
                sexpr->cost = 0;
                getsexpr(tok->d.se = sexpr);
                freetok(tok2);
@@ -1085,9 +1098,7 @@ static int srisvalid(struct srchres *sr, struct sexpr *sexpr)
        free(buf);
        return(!ret);
     case SOP_LINKRE:
-       p = sr->filename;
-       if(sr->fnet->filebasename != NULL)
-           p = sr->fnet->filebasename(p);
+       p = fnfilebasename(sr->filename);
        if((buf = icwcstombs(p, "UTF-8")) == NULL)
            return(0);
        ret = regexec(&sexpr->d.re.cre, buf, 0, NULL, 0);
@@ -1096,16 +1107,14 @@ static int srisvalid(struct srchres *sr, struct sexpr *sexpr)
     case SOP_NAMESS:
        return(wcsexists(sr->filename, sexpr->d.s));
     case SOP_LINKSS:
-       p = sr->filename;
-       if(sr->fnet->filebasename != NULL)
-           p = sr->fnet->filebasename(p);
+       p = fnfilebasename(sr->filename);
        return(wcsexists(p, sexpr->d.s));
     case SOP_SIZELT:
-       return(sr->size < sexpr->d.n);
+       return(sr->size < sexpr->d.sz);
     case SOP_SIZEEQ:
-       return(sr->size == sexpr->d.n);
+       return(sr->size == sexpr->d.sz);
     case SOP_SIZEGT:
-       return(sr->size > sexpr->d.n);
+       return(sr->size > sexpr->d.sz);
     case SOP_HASHIS:
        if(sr->hash == NULL)
            return(0);