- 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;
+ int i, l;
+ subnet_t *subnet;
+ uint16_t x[8];
+
+ cp();
+
+ subnet = new_subnet();
+
+ if(sscanf(subnetstr, "%hu.%hu.%hu.%hu/%d",
+ &x[0], &x[1], &x[2], &x[3], &l) == 5) {
+ subnet->type = SUBNET_IPV4;
+ subnet->net.ipv4.prefixlength = l;
+
+ for(i = 0; i < 4; i++)
+ subnet->net.ipv4.address.x[i] = x[i];
+
+ return subnet;
+ }
+
+ if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d",
+ &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
+ &l) == 9) {
+ subnet->type = SUBNET_IPV6;
+ subnet->net.ipv6.prefixlength = l;
+
+ for(i = 0; i < 8; i++)
+ subnet->net.ipv6.address.x[i] = htons(x[i]);
+
+ 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.prefixlength = 32;
+
+ for(i = 0; i < 4; i++)
+ subnet->net.ipv4.address.x[i] = x[i];
+
+ return subnet;
+ }
+
+ if(sscanf(subnetstr, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
+ &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7]) == 8) {
+ subnet->type = SUBNET_IPV6;
+ subnet->net.ipv6.prefixlength = 128;
+
+ for(i = 0; i < 8; i++)
+ subnet->net.ipv6.address.x[i] = htons(x[i]);
+
+ 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;
+
+ for(i = 0; i < 6; i++)
+ subnet->net.mac.address.x[i] = x[i];
+
+ return subnet;
+ }
+
+ free(subnet);
+
+ return NULL;