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