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