xref: /plan9/sys/src/libndb/csgetval.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
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