ubus: fix invalid ipv6-prefix json
[project/odhcpd.git] / src / ubus.c
index 95eeff7..973ae5a 100644 (file)
@@ -55,7 +55,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
                                blobmsg_add_string(&b, NULL, "static");
                        blobmsg_close_array(&b, m);
 
                                blobmsg_add_string(&b, NULL, "static");
                        blobmsg_close_array(&b, m);
 
-                       buf = blobmsg_alloc_string_buffer(&b, "ip", INET_ADDRSTRLEN);
+                       buf = blobmsg_alloc_string_buffer(&b, "address", INET_ADDRSTRLEN);
                        struct in_addr addr = {.s_addr = c->addr};
                        inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN);
                        blobmsg_add_string_buffer(&b);
                        struct in_addr addr = {.s_addr = c->addr};
                        inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN);
                        blobmsg_add_string_buffer(&b);
@@ -80,7 +80,7 @@ static void dhcpv6_blobmsg_ia_addr(struct in6_addr *addr, int prefix, uint32_t p
                                        uint32_t valid, _unused void *arg)
 {
        void *a = blobmsg_open_table(&b, NULL);
                                        uint32_t valid, _unused void *arg)
 {
        void *a = blobmsg_open_table(&b, NULL);
-       char *buf = blobmsg_alloc_string_buffer(&b, NULL, INET6_ADDRSTRLEN);
+       char *buf = blobmsg_alloc_string_buffer(&b, "address", INET6_ADDRSTRLEN);
 
        inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN);
        blobmsg_add_string_buffer(&b);
 
        inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN);
        blobmsg_add_string_buffer(&b);
@@ -311,6 +311,25 @@ static const struct blobmsg_policy obj_attrs[OBJ_ATTR_MAX] = {
        [OBJ_ATTR_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING },
 };
 
        [OBJ_ATTR_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING },
 };
 
+void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac,
+               const size_t mlen, const struct in_addr *addr, const char *name,
+               const char *interface)
+{
+       if (!ubus || !main_object.has_subscribers)
+               return;
+
+       blob_buf_init(&b, 0);
+       if (mac)
+               blobmsg_add_string(&b, "mac", odhcpd_print_mac(mac, mlen));
+       if (addr)
+               blobmsg_add_string(&b, "ip", inet_ntoa(*addr));
+       if (name)
+               blobmsg_add_string(&b, "name", name);
+       if (interface)
+               blobmsg_add_string(&b, "interface", interface);
+
+       ubus_notify(ubus, &main_object, type, b.head, -1);
+}
 
 static void handle_event(_unused struct ubus_context *ctx, _unused struct ubus_event_handler *ev,
                 _unused const char *type, struct blob_attr *msg)
 
 static void handle_event(_unused struct ubus_context *ctx, _unused struct ubus_event_handler *ev,
                 _unused const char *type, struct blob_attr *msg)
@@ -393,7 +412,7 @@ bool ubus_has_prefix(const char *name, const char *ifname)
 int ubus_init(void)
 {
        if (!(ubus = ubus_connect(NULL))) {
 int ubus_init(void)
 {
        if (!(ubus = ubus_connect(NULL))) {
-               syslog(LOG_ERR, "Unable to connect to ubus: %s", strerror(errno));
+               syslog(LOG_ERR, "Unable to connect to ubus: %m");
                return -1;
        }
 
                return -1;
        }