1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include <ndb.h>
5219b2ee8SDavid du Colombier #include <ndbhf.h>
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier /*
8219b2ee8SDavid du Colombier * search for a tuple that has the given 'attr=val' and also 'rattr=x'.
9219b2ee8SDavid du Colombier * copy 'x' into 'buf' and return the whole tuple.
10219b2ee8SDavid du Colombier *
11219b2ee8SDavid du Colombier * return 0 if not found.
12219b2ee8SDavid du Colombier */
1357837e0bSDavid du Colombier char*
csgetvalue(char * netroot,char * attr,char * val,char * rattr,Ndbtuple ** pp)1457837e0bSDavid du Colombier csgetvalue(char *netroot, char *attr, char *val, char *rattr, Ndbtuple **pp)
15219b2ee8SDavid du Colombier {
16219b2ee8SDavid du Colombier Ndbtuple *t, *first, *last;
177dd7cddfSDavid du Colombier int n, linefound;
18219b2ee8SDavid du Colombier char line[1024];
197dd7cddfSDavid du Colombier int fd;
2057837e0bSDavid du Colombier int oops = 0;
2157837e0bSDavid du Colombier char *rv;
22219b2ee8SDavid du Colombier
2357837e0bSDavid du Colombier if(pp)
2457837e0bSDavid du Colombier *pp = nil;
2557837e0bSDavid du Colombier rv = nil;
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier if(netroot)
287dd7cddfSDavid du Colombier snprint(line, sizeof(line), "%s/cs", netroot);
297dd7cddfSDavid du Colombier else
307dd7cddfSDavid du Colombier strcpy(line, "/net/cs");
317dd7cddfSDavid du Colombier fd = open(line, ORDWR);
32219b2ee8SDavid du Colombier if(fd < 0)
33219b2ee8SDavid du Colombier return 0;
347dd7cddfSDavid du Colombier seek(fd, 0, 0);
3559cc4ca5SDavid du Colombier snprint(line, sizeof(line), "!%s=%s %s=*", attr, val, rattr);
367dd7cddfSDavid du Colombier if(write(fd, line, strlen(line)) < 0){
377dd7cddfSDavid du Colombier close(fd);
387dd7cddfSDavid du Colombier return 0;
397dd7cddfSDavid du Colombier }
40219b2ee8SDavid du Colombier seek(fd, 0, 0);
41219b2ee8SDavid du Colombier
42219b2ee8SDavid du Colombier first = last = 0;
43219b2ee8SDavid du Colombier linefound = 0;
44219b2ee8SDavid du Colombier for(;;){
45219b2ee8SDavid du Colombier n = read(fd, line, sizeof(line)-2);
46219b2ee8SDavid du Colombier if(n <= 0)
47219b2ee8SDavid du Colombier break;
48219b2ee8SDavid du Colombier line[n] = '\n';
49219b2ee8SDavid du Colombier line[n+1] = 0;
50219b2ee8SDavid du Colombier
51219b2ee8SDavid du Colombier t = _ndbparseline(line);
52219b2ee8SDavid du Colombier if(t == 0)
53219b2ee8SDavid du Colombier continue;
54219b2ee8SDavid du Colombier if(first)
55219b2ee8SDavid du Colombier last->entry = t;
56219b2ee8SDavid du Colombier else
57219b2ee8SDavid du Colombier first = t;
58219b2ee8SDavid du Colombier last = t;
59219b2ee8SDavid du Colombier
60219b2ee8SDavid du Colombier while(last->entry)
61219b2ee8SDavid du Colombier last = last->entry;
62219b2ee8SDavid du Colombier
63219b2ee8SDavid du Colombier for(; t; t = t->entry){
6457837e0bSDavid du Colombier if(linefound == 0){
6595a264b3SDavid du Colombier if(strcmp(rattr, t->attr) == 0){
66219b2ee8SDavid du Colombier linefound = 1;
6757837e0bSDavid du Colombier rv = strdup(t->val);
6857837e0bSDavid du Colombier }
6957837e0bSDavid du Colombier }
70219b2ee8SDavid du Colombier }
71219b2ee8SDavid du Colombier }
72219b2ee8SDavid du Colombier close(fd);
737dd7cddfSDavid du Colombier
7457837e0bSDavid du Colombier if(oops){
7557837e0bSDavid du Colombier werrstr("buffer too short");
7657837e0bSDavid du Colombier ndbfree(first);
7757837e0bSDavid du Colombier return nil;
7857837e0bSDavid du Colombier }
7957837e0bSDavid du Colombier
8057837e0bSDavid du Colombier if(pp){
81a9f680aeSDavid du Colombier setmalloctag(first, getcallerpc(&netroot));
8257837e0bSDavid du Colombier *pp = first;
8357837e0bSDavid du Colombier } else
8457837e0bSDavid du Colombier ndbfree(first);
8557837e0bSDavid du Colombier
8657837e0bSDavid du Colombier return rv;
87219b2ee8SDavid du Colombier }
8895a264b3SDavid du Colombier
8995a264b3SDavid du Colombier Ndbtuple*
csgetval(char * netroot,char * attr,char * val,char * rattr,char * buf)9095a264b3SDavid du Colombier csgetval(char *netroot, char *attr, char *val, char *rattr, char *buf)
9195a264b3SDavid du Colombier {
9257837e0bSDavid du Colombier Ndbtuple *t;
9357837e0bSDavid du Colombier char *p;
9457837e0bSDavid du Colombier
9557837e0bSDavid du Colombier p = csgetvalue(netroot, attr, val, rattr, &t);
9657837e0bSDavid du Colombier if(p == nil){
9757837e0bSDavid du Colombier if(buf != nil)
9857837e0bSDavid du Colombier *buf = 0;
9957837e0bSDavid du Colombier } else {
10057837e0bSDavid du Colombier if(buf != nil){
10157837e0bSDavid du Colombier strncpy(buf, p, Ndbvlen-1);
10257837e0bSDavid du Colombier buf[Ndbvlen-1] = 0;
10357837e0bSDavid du Colombier }
10457837e0bSDavid du Colombier free(p);
10557837e0bSDavid du Colombier }
106*1a4050f5SDavid du Colombier ndbsetmalloctag(t, getcallerpc(&netroot));
10757837e0bSDavid du Colombier return t;
10895a264b3SDavid du Colombier }
109