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