xref: /plan9/sys/src/libndb/csipinfo.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
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