treewide: always init interface list heads during initialization
[project/odhcpd.git] / src / ubus.c
index e1fb30e29daf40c47ed549d041fd27741287b0b5..e9c5b6fb542813fe860d3fe171d0adf423ee6385 100644 (file)
@@ -29,7 +29,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
        a = blobmsg_open_table(&b, "device");
 
        avl_for_each_element(&interfaces, iface, avl) {
-               if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL)
+               if (iface->dhcpv4 != MODE_SERVER)
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
@@ -49,6 +49,16 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
                        blobmsg_add_string(&b, "hostname", (c->hostname) ? c->hostname : "");
                        blobmsg_add_u8(&b, "accept-reconf-nonce", c->accept_fr_nonce);
 
+                       if (c->reqopts) {
+                               int opt = 0;
+                               int chars = 0;
+                               buf = blobmsg_alloc_string_buffer(&b, "reqopts", strlen(c->reqopts) * 4 + 1);
+                               for(; c->reqopts[opt]; opt++)
+                                       chars += snprintf(buf + chars, 6, "%u,", (uint8_t)c->reqopts[opt]);
+                               buf[chars - 1] = '\0';
+                               blobmsg_add_string_buffer(&b);
+                       }
+
                        m = blobmsg_open_array(&b, "flags");
                        if (c->flags & OAF_BOUND)
                                blobmsg_add_string(&b, NULL, "bound");
@@ -112,7 +122,7 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
        a = blobmsg_open_table(&b, "device");
 
        avl_for_each_element(&interfaces, iface, avl) {
-               if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL)
+               if (iface->dhcpv6 != MODE_SERVER)
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
@@ -146,7 +156,7 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
                        blobmsg_close_array(&b, m);
 
                        m = blobmsg_open_array(&b, a->length == 128 ? "ipv6-addr": "ipv6-prefix");
-                       dhcpv6_enum_ia_addrs(iface, a, now, dhcpv6_blobmsg_ia_addr, NULL);
+                       dhcpv6_ia_enum_addrs(iface, a, now, dhcpv6_blobmsg_ia_addr, NULL);
                        blobmsg_close_table(&b, m);
 
                        blobmsg_add_u32(&b, "valid", INFINITE_VALID(a->valid_until) ?
@@ -245,15 +255,15 @@ static int handle_update(_unused struct ubus_context *ctx, _unused struct ubus_o
 {
        struct blob_attr *tb[IFACE_ATTR_MAX];
        struct interface *c;
-       bool update = false;
+       bool update = true;
 
        blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
        const char *interface = (tb[IFACE_ATTR_INTERFACE]) ?
                        blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]) : "";
 
        avl_for_each_element(&interfaces, c, avl) {
-               if (!strcmp(interface, c->name) && !c->ignore) {
-                       update = true;
+               if (!strcmp(interface, c->name) && c->ignore) {
+                       update = false;
                        break;
                }
        }