Don't print subnet prefix lengths and weights for one-host subnets.
authorEtienne Dechamps <etienne@edechamps.fr>
Sat, 5 Jul 2014 18:02:02 +0000 (19:02 +0100)
committerEtienne Dechamps <etienne@edechamps.fr>
Sat, 5 Jul 2014 19:00:50 +0000 (20:00 +0100)
This commit suppresses subnet prefix length output (/xx) for subnets
that only contain one address (/32 for IPv4, /128 for IPv6). It also
suppresses weight information if the subnet is using the default
weight. This improves readability of net2str() output in the majority
of cases.

src/subnet_parse.c

index 5fac415..b6e209b 100644 (file)
@@ -27,6 +27,9 @@
 #include "utils.h"
 #include "xalloc.h"
 
+/* Changing this default will affect ADD_SUBNET messages - beware of inconsistencies between versions */
+static const int DEFAULT_WEIGHT = 10;
+
 /* Subnet mask handling */
 
 int maskcmp(const void *va, const void *vb, int masklen) {
@@ -185,7 +188,7 @@ bool str2net(subnet_t *subnet, const char *subnetstr) {
        strncpy(str, subnetstr, sizeof(str));
        int consumed;
 
-       int weight = 10;
+       int weight = DEFAULT_WEIGHT;
        char *weight_separator = strchr(str, '#');
        if (weight_separator) {
                char *weight_str = weight_separator + 1;
@@ -306,9 +309,11 @@ bool net2str(char *netstr, int len, const subnet_t *subnet) {
                return false;
        }
 
+       int result;
+       int prefixlength = -1;
        switch (subnet->type) {
                case SUBNET_MAC:
-                       snprintf(netstr, len, "%02hx:%02hx:%02hx:%02hx:%02hx:%02hx#%d",
+                       result = snprintf(netstr, len, "%02hx:%02hx:%02hx:%02hx:%02hx:%02hx",
                                         subnet->net.mac.address.x[0],
                                         subnet->net.mac.address.x[1],
                                         subnet->net.mac.address.x[2],
@@ -319,17 +324,18 @@ bool net2str(char *netstr, int len, const subnet_t *subnet) {
                        break;
 
                case SUBNET_IPV4:
-                       snprintf(netstr, len, "%hu.%hu.%hu.%hu/%d#%d",
+                       result = snprintf(netstr, len, "%hu.%hu.%hu.%hu",
                                         subnet->net.ipv4.address.x[0],
                                         subnet->net.ipv4.address.x[1],
                                         subnet->net.ipv4.address.x[2],
-                                        subnet->net.ipv4.address.x[3],
-                                        subnet->net.ipv4.prefixlength,
-                                        subnet->weight);
+                                        subnet->net.ipv4.address.x[3]);
+                       prefixlength = subnet->net.ipv4.prefixlength;
+                       if (prefixlength == 32)
+                               prefixlength = -1;
                        break;
 
                case SUBNET_IPV6:
-                       snprintf(netstr, len, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%d#%d",
+                       result = snprintf(netstr, len, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",
                                         ntohs(subnet->net.ipv6.address.x[0]),
                                         ntohs(subnet->net.ipv6.address.x[1]),
                                         ntohs(subnet->net.ipv6.address.x[2]),
@@ -337,15 +343,30 @@ bool net2str(char *netstr, int len, const subnet_t *subnet) {
                                         ntohs(subnet->net.ipv6.address.x[4]),
                                         ntohs(subnet->net.ipv6.address.x[5]),
                                         ntohs(subnet->net.ipv6.address.x[6]),
-                                        ntohs(subnet->net.ipv6.address.x[7]),
-                                        subnet->net.ipv6.prefixlength,
-                                        subnet->weight);
+                                        ntohs(subnet->net.ipv6.address.x[7]));
+                       prefixlength = subnet->net.ipv6.prefixlength;
+                       if (prefixlength == 128)
+                               prefixlength = -1;
                        break;
 
                default:
                        logger(DEBUG_ALWAYS, LOG_ERR, "net2str() was called with unknown subnet type %d, exiting!", subnet->type);
                        exit(1);
        }
+       netstr += result;
+       len -= result;
+
+       if (prefixlength >= 0) {
+               result = snprintf(netstr, len, "/%d", prefixlength);
+               netstr += result;
+               len -= result;
+       }
+
+       if (subnet->weight != DEFAULT_WEIGHT) {
+               snprintf(netstr, len, "#%d", subnet->weight);
+               netstr += result;
+               len -= result;
+       }
 
        return true;
 }