17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <ndb.h>
57dd7cddfSDavid du Colombier #include <ndbhf.h>
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier /*
87dd7cddfSDavid du Colombier * look up the ip attributes 'list' for an entry that has the
97dd7cddfSDavid du Colombier * given 'attr=val' and a 'ip=' tuples.
107dd7cddfSDavid du Colombier *
117dd7cddfSDavid du Colombier * return nil if not found.
127dd7cddfSDavid du Colombier */
137dd7cddfSDavid du Colombier Ndbtuple*
csipinfo(char * netroot,char * attr,char * val,char ** list,int n)147dd7cddfSDavid du Colombier csipinfo(char *netroot, char *attr, char *val, char **list, int n)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier Ndbtuple *t, *first, *last;
177dd7cddfSDavid du Colombier int i;
187dd7cddfSDavid du Colombier char line[1024];
197dd7cddfSDavid du Colombier int fd;
207dd7cddfSDavid du Colombier char *p, *e;
217dd7cddfSDavid du Colombier
227dd7cddfSDavid du Colombier if(netroot)
237dd7cddfSDavid du Colombier snprint(line, sizeof(line), "%s/cs", netroot);
247dd7cddfSDavid du Colombier else
257dd7cddfSDavid du Colombier strcpy(line, "/net/cs");
267dd7cddfSDavid du Colombier fd = open(line, ORDWR);
277dd7cddfSDavid du Colombier if(fd < 0)
287dd7cddfSDavid du Colombier return 0;
297dd7cddfSDavid du Colombier seek(fd, 0, 0);
307dd7cddfSDavid du Colombier e = line + sizeof(line);
317dd7cddfSDavid du Colombier p = seprint(line, e, "!ipinfo %s=%s", attr, val);
327dd7cddfSDavid du Colombier for(i = 0; i < n; i++){
337dd7cddfSDavid du Colombier if(*list == nil)
347dd7cddfSDavid du Colombier break;
357dd7cddfSDavid du Colombier p = seprint(p, e, " %s", *list++);
367dd7cddfSDavid du Colombier }
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier if(write(fd, line, strlen(line)) < 0){
397dd7cddfSDavid du Colombier close(fd);
407dd7cddfSDavid du Colombier return 0;
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier seek(fd, 0, 0);
437dd7cddfSDavid du Colombier
447dd7cddfSDavid du Colombier first = last = 0;
457dd7cddfSDavid du Colombier for(;;){
467dd7cddfSDavid du Colombier n = read(fd, line, sizeof(line)-2);
477dd7cddfSDavid du Colombier if(n <= 0)
487dd7cddfSDavid du Colombier break;
497dd7cddfSDavid du Colombier line[n] = '\n';
507dd7cddfSDavid du Colombier line[n+1] = 0;
517dd7cddfSDavid du Colombier
527dd7cddfSDavid du Colombier t = _ndbparseline(line);
537dd7cddfSDavid du Colombier if(t == 0)
547dd7cddfSDavid du Colombier continue;
557dd7cddfSDavid du Colombier if(first)
567dd7cddfSDavid du Colombier last->entry = t;
577dd7cddfSDavid du Colombier else
587dd7cddfSDavid du Colombier first = t;
597dd7cddfSDavid du Colombier last = t;
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier while(last->entry)
627dd7cddfSDavid du Colombier last = last->entry;
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier close(fd);
657dd7cddfSDavid du Colombier
66*1a4050f5SDavid du Colombier ndbsetmalloctag(first, getcallerpc(&netroot));
677dd7cddfSDavid du Colombier return first;
687dd7cddfSDavid du Colombier }
69