utils: fix existing node check when keep_old/no_delete is enabled
[project/netifd.git] / proto-static.c
index 57da77d..17cff0a 100644 (file)
@@ -46,53 +46,13 @@ struct static_proto_state {
 };
 
 static bool
-split_netmask(char *str, unsigned int *netmask)
-{
-       char *delim, *err = NULL;
-
-       delim = strchr(str, '/');
-       if (delim) {
-               *(delim++) = 0;
-
-               *netmask = strtoul(delim, &err, 10);
-               if (err && *err)
-                       return false;
-       }
-       return true;
-}
-
-static int
-parse_ip_and_netmask(int af, const char *str, void *addr, unsigned int *netmask)
-{
-       char *astr = alloca(strlen(str) + 1);
-
-       strcpy(astr, str);
-       if (!split_netmask(astr, netmask))
-               return 0;
-
-       if (af == AF_INET6) {
-               if (*netmask > 128)
-                       return 0;
-       } else {
-               if (*netmask > 32)
-                       return 0;
-       }
-
-       return inet_pton(af, str, addr);
-}
-
-static bool
 parse_addr(struct interface *iface, const char *str, bool v6, int mask)
 {
        struct device_addr *addr;
-       int af = v6 ? AF_INET6 : AF_INET;
 
-       addr = calloc(1, sizeof(*addr));
-       addr->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4;
-       addr->mask = mask;
-       if (!parse_ip_and_netmask(af, str, &addr->addr, &addr->mask)) {
+       addr = proto_parse_ip_addr_string(str, v6, mask);
+       if (!addr) {
                interface_add_error(iface, "proto-static", "INVALID_ADDRESS", &str, 1);
-               free(addr);
                return false;
        }
        vlist_add(&iface->proto_addr, &addr->node);