fix the exit status for the proto-shell task, use WEXITSTATUS
[project/netifd.git] / proto-static.c
index 17cff0a..ca39b7c 100644 (file)
@@ -17,6 +17,7 @@ enum {
        OPT_NETMASK,
        OPT_GATEWAY,
        OPT_IP6GW,
+       OPT_DNS,
        __OPT_MAX,
 };
 
@@ -26,11 +27,13 @@ static const struct blobmsg_policy static_attrs[__OPT_MAX] = {
        [OPT_NETMASK] = { .name = "netmask", .type = BLOBMSG_TYPE_STRING },
        [OPT_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
        [OPT_IP6GW] = { .name = "ip6gw", .type = BLOBMSG_TYPE_STRING },
+       [OPT_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY },
 };
 
 static const union config_param_info static_attr_info[__OPT_MAX] = {
        [OPT_IPADDR] = { .type = BLOBMSG_TYPE_STRING },
        [OPT_IP6ADDR] = { .type = BLOBMSG_TYPE_STRING },
+       [OPT_DNS] = { .type = BLOBMSG_TYPE_STRING },
 };
 
 static const struct config_param_list static_attr_list = {
@@ -55,7 +58,7 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask)
                interface_add_error(iface, "proto-static", "INVALID_ADDRESS", &str, 1);
                return false;
        }
-       vlist_add(&iface->proto_addr, &addr->node);
+       vlist_add(&iface->proto_ip.addr, &addr->node);
        return true;
 }
 
@@ -91,7 +94,7 @@ parse_gateway_option(struct interface *iface, struct blob_attr *attr, bool v6)
        }
        route->mask = 0;
        route->flags = DEVADDR_DEVICE | (v6 ? DEVADDR_INET6 : DEVADDR_INET4);
-       vlist_add(&iface->proto_route, &route->node);
+       vlist_add(&iface->proto_ip.route, &route->node);
 
        return true;
 }
@@ -100,20 +103,18 @@ static int
 proto_apply_static_settings(struct interface *iface, struct blob_attr *attr)
 {
        struct blob_attr *tb[__OPT_MAX];
-       struct in_addr ina;
        const char *error;
-       int netmask = 32;
+       unsigned int netmask = 32;
        int n_v4 = 0, n_v6 = 0;
 
        blobmsg_parse(static_attrs, __OPT_MAX, tb, blob_data(attr), blob_len(attr));
 
        if (tb[OPT_NETMASK]) {
-               if (!inet_aton(blobmsg_data(tb[OPT_NETMASK]), &ina)) {
+               netmask = parse_netmask_string(blobmsg_data(tb[OPT_NETMASK]), false);
+               if (netmask > 32) {
                        error = "INVALID_NETMASK";
                        goto error;
                }
-
-               netmask = 32 - fls(~(ntohl(ina.s_addr)));
        }
 
        if (tb[OPT_IPADDR])
@@ -140,6 +141,9 @@ proto_apply_static_settings(struct interface *iface, struct blob_attr *attr)
                        goto out;
        }
 
+       if (tb[OPT_DNS])
+               interface_add_dns_server_list(&iface->proto_ip, tb[OPT_DNS]);
+
        return 0;
 
 error:
@@ -185,7 +189,7 @@ static_free(struct interface_proto_state *proto)
        free(state);
 }
 
-struct interface_proto_state *
+static struct interface_proto_state *
 static_attach(const struct proto_handler *h, struct interface *iface,
              struct blob_attr *attr)
 {