1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ndb.h>
5 #include <ndbhf.h>
6 
7 /*
8  *  look up the ip attributes 'list' for an entry that has the
9  *  given 'attr=val' and a 'ip=' tuples.
10  *
11  *  return nil if not found.
12  */
13 Ndbtuple*
csipinfo(char * netroot,char * attr,char * val,char ** list,int n)14 csipinfo(char *netroot, char *attr, char *val, char **list, int n)
15 {
16 	Ndbtuple *t, *first, *last;
17 	int i;
18 	char line[1024];
19 	int fd;
20 	char *p, *e;
21 
22 	if(netroot)
23 		snprint(line, sizeof(line), "%s/cs", netroot);
24 	else
25 		strcpy(line, "/net/cs");
26 	fd = open(line, ORDWR);
27 	if(fd < 0)
28 		return 0;
29 	seek(fd, 0, 0);
30 	e = line + sizeof(line);
31 	p = seprint(line, e, "!ipinfo %s=%s", attr, val);
32 	for(i = 0; i < n; i++){
33 		if(*list == nil)
34 			break;
35 		p = seprint(p, e, " %s", *list++);
36 	}
37 
38 	if(write(fd, line, strlen(line)) < 0){
39 		close(fd);
40 		return 0;
41 	}
42 	seek(fd, 0, 0);
43 
44 	first = last = 0;
45 	for(;;){
46 		n = read(fd, line, sizeof(line)-2);
47 		if(n <= 0)
48 			break;
49 		line[n] = '\n';
50 		line[n+1] = 0;
51 
52 		t = _ndbparseline(line);
53 		if(t == 0)
54 			continue;
55 		if(first)
56 			last->entry = t;
57 		else
58 			first = t;
59 		last = t;
60 
61 		while(last->entry)
62 			last = last->entry;
63 	}
64 	close(fd);
65 
66 	setmalloctag(first, getcallerpc(&netroot));
67 	return first;
68 }
69