diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-09-16 12:39:47 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-09-16 12:39:47 +0200 |
commit | a4e444f430b874661f2793d8f9d1daeab60a89b1 (patch) | |
tree | 33ed9966cf0619211b4a0cff84ebd3a9097f78ab /sys/src/libndb | |
parent | 08385e66816940b999a5c433a1feef303cea67e4 (diff) |
libndb: make ndbipinfo() walk ipnet for all matching entries, concatenate and dedup result
Diffstat (limited to 'sys/src/libndb')
-rw-r--r-- | sys/src/libndb/mkfile | 1 | ||||
-rw-r--r-- | sys/src/libndb/ndbgetipaddr.c | 38 | ||||
-rw-r--r-- | sys/src/libndb/ndbipinfo.c | 108 |
3 files changed, 80 insertions, 67 deletions
diff --git a/sys/src/libndb/mkfile b/sys/src/libndb/mkfile index 458f3dd1b..19be22bb4 100644 --- a/sys/src/libndb/mkfile +++ b/sys/src/libndb/mkfile @@ -21,6 +21,7 @@ OFILES=\ ndbparse.$O\ ndbreorder.$O\ ndbsubstitute.$O\ + ndbdedup.$O\ HFILES=\ /sys/include/ndb.h\ diff --git a/sys/src/libndb/ndbgetipaddr.c b/sys/src/libndb/ndbgetipaddr.c index db3fbb018..f34df6b22 100644 --- a/sys/src/libndb/ndbgetipaddr.c +++ b/sys/src/libndb/ndbgetipaddr.c @@ -16,6 +16,7 @@ ndbgetipaddr(Ndb *db, char *val) attr = ipattr(val); if(strcmp(attr, "ip") == 0){ it = ndbnew("ip", val); + it->line = it; ndbsetmalloctag(it, getcallerpc(&db)); return it; } @@ -25,24 +26,29 @@ ndbgetipaddr(Ndb *db, char *val) if(p == nil) return nil; free(p); - - /* remove the non-ip entries */ first = last = nil; - for(; it; it = next){ - next = it->entry; - if(strcmp(it->attr, "ip") == 0){ - if(first == nil) - first = it; - else - last->entry = it; - it->entry = nil; - it->line = first; - last = it; - } else { - it->entry = nil; - ndbfree(it); + do { + /* remove the non-ip entries */ + for(; it != nil; it = next){ + next = it->entry; + if(strcmp(it->attr, "ip") == 0){ + if(first == nil) + first = it; + else { + last->entry = it; + last->line = it; + } + it->entry = nil; + it->line = first; + last = it; + } else { + it->entry = nil; + ndbfree(it); + } } - } + } while((it = ndbsnext(&s, attr, val)) != nil); + + first = ndbdedup(first); ndbsetmalloctag(first, getcallerpc(&db)); return first; diff --git a/sys/src/libndb/ndbipinfo.c b/sys/src/libndb/ndbipinfo.c index 2e491d1d3..bf0f8dd76 100644 --- a/sys/src/libndb/ndbipinfo.c +++ b/sys/src/libndb/ndbipinfo.c @@ -149,67 +149,29 @@ subnet(Ndb *db, uchar *net, Ndbtuple *f, int prefix) return t; } -/* - * fill in all the requested attributes for a system. - * if the system's entry doesn't have all required, - * walk through successively more inclusive networks - * for inherited attributes. - */ -Ndbtuple* -ndbipinfo(Ndb *db, char *attr, char *val, char **alist, int n) +static Ndbtuple* +netinfo(Ndb *db, Ndbtuple *t, char **alist, int n) { - Ndbtuple *t, *nt, *f; - Ndbs s; - char *ipstr; - uchar net[IPaddrlen], ip[IPaddrlen]; + uchar ip[IPaddrlen], net[IPaddrlen]; int prefix, smallestprefix, force; - vlong r; + Ndbtuple *f, *nt; - /* just in case */ - fmtinstall('I', eipfmt); - fmtinstall('M', eipfmt); + nt = ndbfindattr(t, t, "ip"); + if(nt == nil || parseip(ip, nt->val) == -1){ + ndbfree(t); + return nil; + } /* get needed attributes */ f = mkfilter(n, alist); - /* - * first look for a matching entry with an ip address - */ - t = nil; - ipstr = ndbgetvalue(db, &s, attr, val, "ip", &nt); - if(ipstr == nil){ - /* none found, make one up */ - if(strcmp(attr, "ip") != 0) { - ndbfree(f); - return nil; - } - t = ndbnew("ip", val); - t->line = t; - t->entry = nil; - r = parseip(net, val); - if(r == -1) - ndbfree(t); - } else { - /* found one */ - while(nt != nil){ - nt = ndbreorder(nt, s.t); - t = ndbconcatenate(t, nt); - nt = ndbsnext(&s, attr, val); - } - r = parseip(net, ipstr); - free(ipstr); - } - if(r < 0){ - ndbfree(f); - return nil; - } - ipmove(ip, net); t = filter(db, t, f); /* * now go through subnets to fill in any missing attributes */ - if(isv4(net)){ + ipmove(net, ip); + if(isv4(ip)){ prefix = 127; smallestprefix = 100; force = 0; @@ -241,14 +203,58 @@ ndbipinfo(Ndb *db, char *attr, char *val, char **alist, int n) * if there's an unfulfilled ipmask, make one up */ nt = ndbfindattr(f, f, "ipmask"); - if(nt && !(nt->ptr & Fignore)){ + if(nt != nil && !(nt->ptr & Fignore)){ char x[64]; snprint(x, sizeof(x), "%M", defmask(ip)); - t = ndbconcatenate(t, ndbnew("ipmask", x)); + nt = ndbnew("ipmask", x); + nt->line = nt; + nt->entry = nil; + t = ndbconcatenate(t, nt); } ndbfree(f); ndbsetmalloctag(t, getcallerpc(&db)); return t; } + +/* + * fill in all the requested attributes for a system. + * if the system's entry doesn't have all required, + * walk through successively more inclusive networks + * for inherited attributes. + */ +Ndbtuple* +ndbipinfo(Ndb *db, char *attr, char *val, char **alist, int n) +{ + Ndbtuple *t, *nt; + char *ipstr; + Ndbs s; + + /* just in case */ + fmtinstall('I', eipfmt); + fmtinstall('M', eipfmt); + + /* + * first look for a matching entry with an ip address + */ + ipstr = ndbgetvalue(db, &s, attr, val, "ip", &nt); + if(ipstr == nil){ + /* none found, make one up */ + if(strcmp(attr, "ip") != 0) + return nil; + nt = ndbnew("ip", val); + nt->line = nt; + nt->entry = nil; + t = netinfo(db, nt, alist, n); + } else { + /* found one */ + free(ipstr); + t = nil; + do { + nt = ndbreorder(nt, s.t); + t = ndbconcatenate(t, netinfo(db, nt, alist, n)); + } while((nt = ndbsnext(&s, attr, val)) != nil); + } + return ndbdedup(t); +} |