#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#include <ndb.h> | |
#include <ndbhf.h> | |
/* | |
* 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); | |
} | |
return t; | |
} |