xref: /plan9/sys/src/libip/readipifc.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <ctype.h>
4*7dd7cddfSDavid du Colombier #include <ip.h>
5*7dd7cddfSDavid du Colombier 
6*7dd7cddfSDavid du Colombier static char*
7*7dd7cddfSDavid du Colombier _nexttoken(char *p, char *buf, int len)
8*7dd7cddfSDavid du Colombier {
9*7dd7cddfSDavid du Colombier 	int c;
10*7dd7cddfSDavid du Colombier 
11*7dd7cddfSDavid du Colombier 	while(isspace(*p))
12*7dd7cddfSDavid du Colombier 		p++;
13*7dd7cddfSDavid du Colombier 	for(;;p++){
14*7dd7cddfSDavid du Colombier 		c = *p;
15*7dd7cddfSDavid du Colombier 		if(isspace(c) || c == 0)
16*7dd7cddfSDavid du Colombier 			break;
17*7dd7cddfSDavid du Colombier 		if(len <= 1)
18*7dd7cddfSDavid du Colombier 			continue;
19*7dd7cddfSDavid du Colombier 		*buf++ = c;
20*7dd7cddfSDavid du Colombier 		len--;
21*7dd7cddfSDavid du Colombier 	}
22*7dd7cddfSDavid du Colombier 	*buf = 0;
23*7dd7cddfSDavid du Colombier 	return p;
24*7dd7cddfSDavid du Colombier }
25*7dd7cddfSDavid du Colombier 
26*7dd7cddfSDavid du Colombier static Ipifc**
27*7dd7cddfSDavid du Colombier _insertifc(Ipifc **l, char *device, int mtu, uchar *ip, uchar *mask, uchar *ipnet, int index)
28*7dd7cddfSDavid du Colombier {
29*7dd7cddfSDavid du Colombier 	Ipifc *ifc;
30*7dd7cddfSDavid du Colombier 
31*7dd7cddfSDavid du Colombier 	/* get next ipifc */
32*7dd7cddfSDavid du Colombier 	ifc = *l;
33*7dd7cddfSDavid du Colombier 	if(ifc == nil){
34*7dd7cddfSDavid du Colombier 		ifc = malloc(sizeof(Ipifc));
35*7dd7cddfSDavid du Colombier 		if(ifc == nil)
36*7dd7cddfSDavid du Colombier 			return l;
37*7dd7cddfSDavid du Colombier 		ifc->next = nil;
38*7dd7cddfSDavid du Colombier 		*l = ifc;
39*7dd7cddfSDavid du Colombier 	}
40*7dd7cddfSDavid du Colombier 
41*7dd7cddfSDavid du Colombier 	/* add to list */
42*7dd7cddfSDavid du Colombier 	strncpy(ifc->dev, device, sizeof(ifc->dev));
43*7dd7cddfSDavid du Colombier 	ifc->dev[sizeof(ifc->dev)-1] = 0;
44*7dd7cddfSDavid du Colombier 	ifc->mtu = mtu;
45*7dd7cddfSDavid du Colombier 	ifc->index = index;
46*7dd7cddfSDavid du Colombier 	ipmove(ifc->ip, ip);
47*7dd7cddfSDavid du Colombier 	ipmove(ifc->mask, mask);
48*7dd7cddfSDavid du Colombier 	ipmove(ifc->net, ipnet);
49*7dd7cddfSDavid du Colombier 	l = &ifc->next;
50*7dd7cddfSDavid du Colombier 
51*7dd7cddfSDavid du Colombier 	return l;
52*7dd7cddfSDavid du Colombier }
53*7dd7cddfSDavid du Colombier 
54*7dd7cddfSDavid du Colombier static Ipifc**
55*7dd7cddfSDavid du Colombier _readipifc(char *file, Ipifc **l, int index)
56*7dd7cddfSDavid du Colombier {
57*7dd7cddfSDavid du Colombier 	int i, n, fd;
58*7dd7cddfSDavid du Colombier 	char buf[4*1024];
59*7dd7cddfSDavid du Colombier 	char device[64];
60*7dd7cddfSDavid du Colombier 	char token[64];
61*7dd7cddfSDavid du Colombier 	uchar ip[IPaddrlen];
62*7dd7cddfSDavid du Colombier 	uchar ipnet[IPaddrlen];
63*7dd7cddfSDavid du Colombier 	uchar mask[IPaddrlen];
64*7dd7cddfSDavid du Colombier 	int mtu;
65*7dd7cddfSDavid du Colombier 	char *p;
66*7dd7cddfSDavid du Colombier 
67*7dd7cddfSDavid du Colombier 	/* read the file */
68*7dd7cddfSDavid du Colombier 	fd = open(file, OREAD);
69*7dd7cddfSDavid du Colombier 	if(fd < 0)
70*7dd7cddfSDavid du Colombier 		return l;
71*7dd7cddfSDavid du Colombier 	n = 0;
72*7dd7cddfSDavid du Colombier 	while((i = read(fd, buf+n, sizeof(buf)-1-n)) > 0 && n < sizeof(buf) - 1)
73*7dd7cddfSDavid du Colombier 		n += i;
74*7dd7cddfSDavid du Colombier 	buf[n] = 0;
75*7dd7cddfSDavid du Colombier 	close(fd);
76*7dd7cddfSDavid du Colombier 
77*7dd7cddfSDavid du Colombier 	/* get device and mtu */
78*7dd7cddfSDavid du Colombier 	p = _nexttoken(buf, device, sizeof(device));
79*7dd7cddfSDavid du Colombier 	if(*device == 0)
80*7dd7cddfSDavid du Colombier 		return l;
81*7dd7cddfSDavid du Colombier 	p = _nexttoken(p, token, sizeof(token));
82*7dd7cddfSDavid du Colombier 	if(*token == 0)
83*7dd7cddfSDavid du Colombier 		return l;
84*7dd7cddfSDavid du Colombier 	mtu = atoi(token);
85*7dd7cddfSDavid du Colombier 
86*7dd7cddfSDavid du Colombier 	for(i = 0; i < n; i++){
87*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
88*7dd7cddfSDavid du Colombier 		if(*token == 0)
89*7dd7cddfSDavid du Colombier 			break;
90*7dd7cddfSDavid du Colombier 		parseip(ip, token);
91*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
92*7dd7cddfSDavid du Colombier 		if(*token == 0)
93*7dd7cddfSDavid du Colombier 			break;
94*7dd7cddfSDavid du Colombier 		parseipmask(mask, token);
95*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
96*7dd7cddfSDavid du Colombier 		if(*token == 0)
97*7dd7cddfSDavid du Colombier 			break;
98*7dd7cddfSDavid du Colombier 		parseip(ipnet, token);
99*7dd7cddfSDavid du Colombier 
100*7dd7cddfSDavid du Colombier 		/* dump counts */
101*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
102*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
103*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
104*7dd7cddfSDavid du Colombier 		p = _nexttoken(p, token, sizeof(token));
105*7dd7cddfSDavid du Colombier 
106*7dd7cddfSDavid du Colombier 		l = _insertifc(l, device, mtu, ip, mask, ipnet, index);
107*7dd7cddfSDavid du Colombier 	}
108*7dd7cddfSDavid du Colombier 
109*7dd7cddfSDavid du Colombier 	// make sure we have at least one entry to go with the device
110*7dd7cddfSDavid du Colombier 	if(i == 0)
111*7dd7cddfSDavid du Colombier 		l = _insertifc(l, device, mtu, IPnoaddr, IPnoaddr, IPnoaddr, index);
112*7dd7cddfSDavid du Colombier 
113*7dd7cddfSDavid du Colombier 	return l;
114*7dd7cddfSDavid du Colombier }
115*7dd7cddfSDavid du Colombier 
116*7dd7cddfSDavid du Colombier Ipifc*
117*7dd7cddfSDavid du Colombier readipifc(char *net, Ipifc *ifc)
118*7dd7cddfSDavid du Colombier {
119*7dd7cddfSDavid du Colombier 	int fd, i, n;
120*7dd7cddfSDavid du Colombier 	Dir dir[32];
121*7dd7cddfSDavid du Colombier 	char directory[128];
122*7dd7cddfSDavid du Colombier 	char buf[128];
123*7dd7cddfSDavid du Colombier 	Ipifc **l, *nifc, *nnifc;
124*7dd7cddfSDavid du Colombier 
125*7dd7cddfSDavid du Colombier 	l = &ifc;
126*7dd7cddfSDavid du Colombier 
127*7dd7cddfSDavid du Colombier 	if(net == 0)
128*7dd7cddfSDavid du Colombier 		net = "/net";
129*7dd7cddfSDavid du Colombier 	snprint(directory, sizeof(directory), "%s/ipifc", net);
130*7dd7cddfSDavid du Colombier 	fd = open(directory, OREAD);
131*7dd7cddfSDavid du Colombier 	if(fd < 0)
132*7dd7cddfSDavid du Colombier 		goto out;
133*7dd7cddfSDavid du Colombier 
134*7dd7cddfSDavid du Colombier 	for(;;){
135*7dd7cddfSDavid du Colombier 		n = dirread(fd, dir, sizeof(dir));
136*7dd7cddfSDavid du Colombier 		if(n <= 0)
137*7dd7cddfSDavid du Colombier 			break;
138*7dd7cddfSDavid du Colombier 		n /= sizeof(Dir);
139*7dd7cddfSDavid du Colombier 		for(i = 0; i < n; i++){
140*7dd7cddfSDavid du Colombier 			if(strcmp(dir[i].name, "clone") == 0)
141*7dd7cddfSDavid du Colombier 				continue;
142*7dd7cddfSDavid du Colombier 			snprint(buf, sizeof(buf), "%s/%s/status", directory, dir[i].name);
143*7dd7cddfSDavid du Colombier 			l = _readipifc(buf, l, atoi(dir[i].name));
144*7dd7cddfSDavid du Colombier 		}
145*7dd7cddfSDavid du Colombier 	}
146*7dd7cddfSDavid du Colombier 	close(fd);
147*7dd7cddfSDavid du Colombier 
148*7dd7cddfSDavid du Colombier out:
149*7dd7cddfSDavid du Colombier 	for(nifc = *l; nifc != nil; nifc = nnifc){
150*7dd7cddfSDavid du Colombier 		nnifc = nifc->next;
151*7dd7cddfSDavid du Colombier 		free(nifc);
152*7dd7cddfSDavid du Colombier 	}
153*7dd7cddfSDavid du Colombier 	*l = nil;
154*7dd7cddfSDavid du Colombier 
155*7dd7cddfSDavid du Colombier 	return ifc;
156*7dd7cddfSDavid du Colombier }
157