Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <ndb.h>5 #include <ndbhf.h>7 /*8 * search for a tuple that has the given 'attr=val' and also 'rattr=x'.9 * copy 'x' into 'buf' and return the whole tuple.10 *11 * return 0 if not found.12 */13 char*14 csgetvalue(char *netroot, char *attr, char *val, char *rattr, Ndbtuple **pp)15 {16 Ndbtuple *t, *first, *last;17 int n, linefound;18 char line[1024];19 int fd;20 int oops = 0;21 char *rv;23 if(pp)24 *pp = nil;25 rv = nil;27 if(netroot)28 snprint(line, sizeof(line), "%s/cs", netroot);29 else30 strcpy(line, "/net/cs");31 fd = open(line, ORDWR);32 if(fd < 0)33 return 0;34 seek(fd, 0, 0);35 snprint(line, sizeof(line), "!%s=%s %s=*", attr, val, rattr);36 if(write(fd, line, strlen(line)) < 0){37 close(fd);38 return 0;39 }40 seek(fd, 0, 0);42 first = last = 0;43 linefound = 0;44 for(;;){45 n = read(fd, line, sizeof(line)-2);46 if(n <= 0)47 break;48 line[n] = '\n';49 line[n+1] = 0;51 t = _ndbparseline(line);52 if(t == 0)53 continue;54 if(first)55 last->entry = t;56 else57 first = t;58 last = t;60 while(last->entry)61 last = last->entry;63 for(; t; t = t->entry){64 if(linefound == 0){65 if(strcmp(rattr, t->attr) == 0){66 linefound = 1;67 rv = strdup(t->val);68 }69 }70 }71 }72 close(fd);74 if(oops){75 werrstr("buffer too short");76 ndbfree(first);77 return nil;78 }80 if(pp){81 setmalloctag(first, getcallerpc(&netroot));82 *pp = first;83 } else84 ndbfree(first);86 return rv;87 }89 Ndbtuple*90 csgetval(char *netroot, char *attr, char *val, char *rattr, char *buf)91 {92 Ndbtuple *t;93 char *p;95 p = csgetvalue(netroot, attr, val, rattr, &t);96 if(p == nil){97 if(buf != nil)98 *buf = 0;99 } else {100 if(buf != nil){101 strncpy(buf, p, Ndbvlen-1);102 buf[Ndbvlen-1] = 0;103 }104 free(p);105 }106 return t;107 }