]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libndb/ndbipinfo.c
vt, ssh: don't send interrupts on window resize
[plan9front.git] / sys / src / libndb / ndbipinfo.c
index bf0f8dd76663b3d08cb9ee00bfe1c139b758fa74..71092d4bc05be4b952d6860629bb8c750e5afd0c 100644 (file)
@@ -114,37 +114,41 @@ prefixlen(uchar *ip)
 }
 
 /*
- *  look through a containing subset
+ *  look through containing subsets
  */
 static Ndbtuple*
 subnet(Ndb *db, uchar *net, Ndbtuple *f, int prefix)
 {
        Ndbs s;
-       Ndbtuple *t, *nt, *xt;
-       char netstr[128];
+       int nprefix;
+       char netstr[64];
        uchar mask[IPaddrlen];
-       int masklen;
+       Ndbtuple *at[128+1], *nt, *xt, *t;
 
-       t = nil;
-       sprint(netstr, "%I", net);
+       memset(at, 0, sizeof(at));
+       snprint(netstr, sizeof(netstr), "%I", net);
        nt = ndbsearch(db, &s, "ip", netstr);
        while(nt != nil){
                xt = ndbfindattr(nt, nt, "ipnet");
-               if(xt){
+               if(xt != nil){
                        xt = ndbfindattr(nt, nt, "ipmask");
-                       if(xt)
-                               parseipmask(mask, xt->val);
-                       else
+                       if(xt == nil || parseipmask(mask, xt->val, isv4(net)) == -1)
                                ipmove(mask, defmask(net));
-                       masklen = prefixlen(mask);
-                       if(masklen <= prefix){
-                               t = ndbconcatenate(t, filter(db, nt, f));
+                       nprefix = prefixlen(mask);
+                       if(nprefix <= prefix && at[nprefix] == nil){
+                               /* remember containing subnet, order by prefix length */
+                               at[nprefix] = nt;
                                nt = nil;
                        }
                }
                ndbfree(nt);
                nt = ndbsnext(&s, "ip", netstr);
        }
+       /* filter subnets, longest prefix first */
+       for(t = nil; prefix >= 0; prefix--){
+               if(at[prefix] != nil)
+                       t = ndbconcatenate(t, filter(db, at[prefix], f));
+       }
        ndbsetmalloctag(t, getcallerpc(&db));
        return t;
 }