-/* Ascii representation of subnets */
-
-subnet_t *str2net(char *subnetstr)
-{
- int i, l;
- subnet_t *subnet;
- unsigned short int x[6];
-cp
- subnet = new_subnet();
-cp
- if(sscanf(subnetstr, "%hu.%hu.%hu.%hu/%d",
- &x[0],
- &x[1],
- &x[2],
- &x[3],
- &subnet->net.ipv4.masklength) == 5)
- {
- subnet->type = SUBNET_IPV4;
- subnet->net.ipv4.address = (((((x[0] << 8) + x[1]) << 8) + x[2]) << 8) + x[3];
- subnet->net.ipv4.mask = ~((1 << (32 - subnet->net.ipv4.masklength)) - 1);
- return subnet;
- }
-
- if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d",
- &subnet->net.ipv6.address.x[0],
- &subnet->net.ipv6.address.x[1],
- &subnet->net.ipv6.address.x[2],
- &subnet->net.ipv6.address.x[3],
- &subnet->net.ipv6.address.x[4],
- &subnet->net.ipv6.address.x[5],
- &subnet->net.ipv6.address.x[6],
- &subnet->net.ipv6.address.x[7],
- &subnet->net.ipv6.masklength) == 9)
- {
- subnet->type = SUBNET_IPV6;
- for(l = subnet->net.ipv6.masklength, i = 0; i < 8; l -= 16, i++)
- {
- subnet->net.ipv6.address.x[i] = htons(subnet->net.ipv6.address.x[i]);
- if(l >= 16)
- subnet->net.ipv6.mask.x[i] = 65535;
- else if (l > 0)
- subnet->net.ipv6.mask.x[i] = htons(65536 - (1 << l));
- else
- subnet->net.ipv6.mask.x[i] = 0;
- }
- return subnet;
- }
-
- if(sscanf(subnetstr, "%hu.%hu.%hu.%hu",
- &x[0],
- &x[1],
- &x[2],
- &x[3]) == 4)
- {
- subnet->type = SUBNET_IPV4;
- subnet->net.ipv4.address = (((((x[0] << 8) + x[1]) << 8) + x[2]) << 8) + x[3];
- subnet->net.ipv4.mask = ~0;
- subnet->net.ipv4.masklength = 32;
- return subnet;
- }
-
- if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
- &subnet->net.ipv6.address.x[0],
- &subnet->net.ipv6.address.x[1],
- &subnet->net.ipv6.address.x[2],
- &subnet->net.ipv6.address.x[3],
- &subnet->net.ipv6.address.x[4],
- &subnet->net.ipv6.address.x[5],
- &subnet->net.ipv6.address.x[6],
- &subnet->net.ipv6.address.x[7]) == 8)
- {
- subnet->type = SUBNET_IPV6;
- subnet->net.ipv6.masklength = 128;
- for(l = subnet->net.ipv6.masklength, i = 0; i < 8; l -= 16, i++)
- {
- subnet->net.ipv6.address.x[i] = htons(subnet->net.ipv6.address.x[i]);
- if(l >= 16)
- subnet->net.ipv6.mask.x[i] = 65535;
- else if (l > 0)
- subnet->net.ipv6.mask.x[i] = htons(65536 - (1 << l));
- else
- subnet->net.ipv6.mask.x[i] = 0;
- }
- return subnet;
- }
-
- if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx",
- &x[0],
- &x[1],
- &x[2],
- &x[3],
- &x[4],
- &x[5]) == 6)
- {
- subnet->type = SUBNET_MAC;
- subnet->net.mac.address.x[0] = x[0];
- subnet->net.mac.address.x[1] = x[1];
- subnet->net.mac.address.x[2] = x[2];
- subnet->net.mac.address.x[3] = x[3];
- subnet->net.mac.address.x[4] = x[4];
- subnet->net.mac.address.x[5] = x[5];
- return subnet;
- }
-
- free(subnet);
- return NULL;