xref: /plan9/sys/src/libndb/csgetval.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <bio.h>
4*219b2ee8SDavid du Colombier #include <ndb.h>
5*219b2ee8SDavid du Colombier #include <ndbhf.h>
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier /*
8*219b2ee8SDavid du Colombier  *  search for a tuple that has the given 'attr=val' and also 'rattr=x'.
9*219b2ee8SDavid du Colombier  *  copy 'x' into 'buf' and return the whole tuple.
10*219b2ee8SDavid du Colombier  *
11*219b2ee8SDavid du Colombier  *  return 0 if not found.
12*219b2ee8SDavid du Colombier  */
13*219b2ee8SDavid du Colombier Ndbtuple*
14*219b2ee8SDavid du Colombier csgetval(char *attr, char *val, char *rattr, char *buf)
15*219b2ee8SDavid du Colombier {
16*219b2ee8SDavid du Colombier 	Ndbtuple *t, *first, *last;
17*219b2ee8SDavid du Colombier 	int n, fd, linefound;
18*219b2ee8SDavid du Colombier 	char line[1024];
19*219b2ee8SDavid du Colombier 
20*219b2ee8SDavid du Colombier 	buf[0] = 0;
21*219b2ee8SDavid du Colombier 	fd = open("/net/cs", ORDWR);
22*219b2ee8SDavid du Colombier 	if(fd < 0)
23*219b2ee8SDavid du Colombier 		return 0;
24*219b2ee8SDavid du Colombier 	fprint(fd, "!%s=%s", attr, val);
25*219b2ee8SDavid du Colombier 	seek(fd, 0, 0);
26*219b2ee8SDavid du Colombier 
27*219b2ee8SDavid du Colombier 	first = last = 0;
28*219b2ee8SDavid du Colombier 	linefound = 0;
29*219b2ee8SDavid du Colombier 	for(;;){
30*219b2ee8SDavid du Colombier 		n = read(fd, line, sizeof(line)-2);
31*219b2ee8SDavid du Colombier 		if(n <= 0)
32*219b2ee8SDavid du Colombier 			break;
33*219b2ee8SDavid du Colombier 		line[n] = '\n';
34*219b2ee8SDavid du Colombier 		line[n+1] = 0;
35*219b2ee8SDavid du Colombier 
36*219b2ee8SDavid du Colombier 		t = _ndbparseline(line);
37*219b2ee8SDavid du Colombier 		if(t == 0)
38*219b2ee8SDavid du Colombier 			continue;
39*219b2ee8SDavid du Colombier 		if(first)
40*219b2ee8SDavid du Colombier 			last->entry = t;
41*219b2ee8SDavid du Colombier 		else
42*219b2ee8SDavid du Colombier 			first = t;
43*219b2ee8SDavid du Colombier 		last = t;
44*219b2ee8SDavid du Colombier 
45*219b2ee8SDavid du Colombier 		while(last->entry)
46*219b2ee8SDavid du Colombier 			last = last->entry;
47*219b2ee8SDavid du Colombier 
48*219b2ee8SDavid du Colombier 		for(; t; t = t->entry){
49*219b2ee8SDavid du Colombier 			if(buf[0] == 0 || linefound == 0)
50*219b2ee8SDavid du Colombier 				if(strcmp(rattr, t->attr) == 0)
51*219b2ee8SDavid du Colombier 					strcpy(buf, t->val);
52*219b2ee8SDavid du Colombier 			if(linefound == 0)
53*219b2ee8SDavid du Colombier 				if(strcmp(attr, t->attr) == 0)
54*219b2ee8SDavid du Colombier 					linefound = 1;
55*219b2ee8SDavid du Colombier 		}
56*219b2ee8SDavid du Colombier 	}
57*219b2ee8SDavid du Colombier 	close(fd);
58*219b2ee8SDavid du Colombier 	return first;
59*219b2ee8SDavid du Colombier }
60