From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/libndb/csgetval.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 sys/src/libndb/csgetval.c (limited to 'sys/src/libndb/csgetval.c') diff --git a/sys/src/libndb/csgetval.c b/sys/src/libndb/csgetval.c new file mode 100755 index 000000000..6fa4217df --- /dev/null +++ b/sys/src/libndb/csgetval.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include + +/* + * search for a tuple that has the given 'attr=val' and also 'rattr=x'. + * copy 'x' into 'buf' and return the whole tuple. + * + * return 0 if not found. + */ +char* +csgetvalue(char *netroot, char *attr, char *val, char *rattr, Ndbtuple **pp) +{ + Ndbtuple *t, *first, *last; + int n, linefound; + char line[1024]; + int fd; + int oops = 0; + char *rv; + + if(pp) + *pp = nil; + rv = nil; + + if(netroot) + snprint(line, sizeof(line), "%s/cs", netroot); + else + strcpy(line, "/net/cs"); + fd = open(line, ORDWR); + if(fd < 0) + return 0; + seek(fd, 0, 0); + snprint(line, sizeof(line), "!%s=%s %s=*", attr, val, rattr); + if(write(fd, line, strlen(line)) < 0){ + close(fd); + return 0; + } + seek(fd, 0, 0); + + first = last = 0; + linefound = 0; + for(;;){ + n = read(fd, line, sizeof(line)-2); + if(n <= 0) + break; + line[n] = '\n'; + line[n+1] = 0; + + t = _ndbparseline(line); + if(t == 0) + continue; + if(first) + last->entry = t; + else + first = t; + last = t; + + while(last->entry) + last = last->entry; + + for(; t; t = t->entry){ + if(linefound == 0){ + if(strcmp(rattr, t->attr) == 0){ + linefound = 1; + rv = strdup(t->val); + } + } + } + } + close(fd); + + if(oops){ + werrstr("buffer too short"); + ndbfree(first); + return nil; + } + + if(pp){ + setmalloctag(first, getcallerpc(&netroot)); + *pp = first; + } else + ndbfree(first); + + return rv; +} + +Ndbtuple* +csgetval(char *netroot, char *attr, char *val, char *rattr, char *buf) +{ + Ndbtuple *t; + char *p; + + p = csgetvalue(netroot, attr, val, rattr, &t); + if(p == nil){ + if(buf != nil) + *buf = 0; + } else { + if(buf != nil){ + strncpy(buf, p, Ndbvlen-1); + buf[Ndbvlen-1] = 0; + } + free(p); + } + ndbsetmalloctag(t, getcallerpc(&netroot)); + return t; +} -- cgit v1.2.3