- int type;
- subnet_t *subnet;
-cp
- if(sscanf(subnetstr, "%d,", &type) != 1)
- return NULL;
-
- subnet = new_subnet();
-
- switch(type)
- {
- case SUBNET_MAC:
- if(sscanf(subnetstr, "%d,%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &subnet->type,
- &subnet->net.mac.address.x[0],
- &subnet->net.mac.address.x[1],
- &subnet->net.mac.address.x[2],
- &subnet->net.mac.address.x[3],
- &subnet->net.mac.address.x[4],
- &subnet->net.mac.address.x[5]) != 7)
- {
- free_subnet(subnet);
- return NULL;
- }
- break;
- case SUBNET_IPV4:
- if(sscanf(subnetstr, "%d,%lx/%lx", &subnet->type, &subnet->net.ipv4.address, &subnet->net.ipv4.mask) != 3)
- {
- free_subnet(subnet);
- return NULL;
- }
- break;
- case SUBNET_IPV6:
- if(sscanf(subnetstr, "%d,%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &subnet->type,
- &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.mask.x[0],
- &subnet->net.ipv6.mask.x[1],
- &subnet->net.ipv6.mask.x[2],
- &subnet->net.ipv6.mask.x[3],
- &subnet->net.ipv6.mask.x[4],
- &subnet->net.ipv6.mask.x[5],
- &subnet->net.ipv6.mask.x[6],
- &subnet->net.ipv6.mask.x[7]) != 17)
- {
- free_subnet(subnet);
- return NULL;
- }
- break;
- break;
- default:
- free_subnet(subnet);
- return NULL;
- }
-cp
- return subnet;
+ 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;