blob: 9a2dac53b6fe848841278c1283327d4e018db8a0 [file] [log] [blame]
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
#include <stdlib.h>
#include <stdio.h>
#include <parlib/parlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <iplib/iplib.h>
#include <ndblib/ndb.h>
/*
* look up the ip attributes 'list' for an entry that has the
* given 'attr=val' and a 'ip=' tuples.
*
* return NULL if not found.
*/
struct ndbtuple*
csipinfo(char *netroot, char *attr, char *val, char **list, int n)
{
struct ndbtuple *t, *first, *last;
int i;
char line[1024];
int fd;
char *p, *e;
int left,amt;
if(netroot)
snprintf(line, sizeof(line), "%s/cs", netroot);
else
strcpy(line, "/net/cs");
fd = open(line, O_RDWR);
if(fd < 0)
return 0;
lseek(fd, 0, 0);
left = sizeof(line);
amt = snprintf(line, left, "!ipinfo %s=%s", attr, val);
if(amt < 0)
return 0;
left -= amt;
for(i = 0; i < n; i++){
if(*list == NULL)
break;
amt = snprintf(p, left, " %s", *list++);
if(amt < 0)
return 0;
left -= amt;
}
if(write(fd, line, strlen(line)) < 0){
close(fd);
return 0;
}
lseek(fd, 0, 0);
first = last = 0;
for(;;){
n = read(fd, line, sizeof(line)-2);
if(n <= 0)
break;
line[n] = '\n';
line[n+1] = 0;
t = _ndbparseline(line);
if(t == 0)
continue;
if(first)
last->entry = t;
else
first = t;
last = t;
while(last->entry)
last = last->entry;
}
close(fd);
ndbsetmalloctag(first, getcallerpc(&netroot));
return first;
}