plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

csipinfo.c (1174B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 #include <ndb.h>
      5 #include <ndbhf.h>
      6 
      7 /*
      8  *  look up the ip attributes 'list' for an entry that has the
      9  *  given 'attr=val' and a 'ip=' tuples.
     10  *
     11  *  return nil if not found.
     12  */
     13 Ndbtuple*
     14 csipinfo(char *netroot, char *attr, char *val, char **list, int n)
     15 {
     16 	Ndbtuple *t, *first, *last;
     17 	int i;
     18 	char line[1024];
     19 	int fd;
     20 	char *p, *e;
     21 
     22 	if(netroot)
     23 		snprint(line, sizeof(line), "%s/cs", netroot);
     24 	else
     25 		strcpy(line, "/net/cs");
     26 	fd = open(line, ORDWR);
     27 	if(fd < 0)
     28 		return 0;
     29 	seek(fd, 0, 0);
     30 	e = line + sizeof(line);
     31 	p = seprint(line, e, "!ipinfo %s=%s", attr, val);
     32 	for(i = 0; i < n; i++){
     33 		if(*list == nil)
     34 			break;
     35 		p = seprint(p, e, " %s", *list++);
     36 	}
     37 
     38 	if(write(fd, line, strlen(line)) < 0){
     39 		close(fd);
     40 		return 0;
     41 	}
     42 	seek(fd, 0, 0);
     43 
     44 	first = last = 0;
     45 	for(;;){
     46 		n = read(fd, line, sizeof(line)-2);
     47 		if(n <= 0)
     48 			break;
     49 		line[n] = '\n';
     50 		line[n+1] = 0;
     51 
     52 		t = _ndbparseline(line);
     53 		if(t == 0)
     54 			continue;
     55 		if(first)
     56 			last->entry = t;
     57 		else
     58 			first = t;
     59 		last = t;
     60 
     61 		while(last->entry)
     62 			last = last->entry;
     63 	}
     64 	close(fd);
     65 
     66 	setmalloctag(first, getcallerpc(&netroot));
     67 	return first;
     68 }