csipinfo.c (1174B)
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* 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 }