OpenWrt – Rev 4

Subversion Repositories:
Rev:
--- a/src/dnsmasq.c
+++ b/src/dnsmasq.c
@@ -19,6 +19,8 @@
 
 #include "dnsmasq.h"
 
+#include <libubus.h>
+
 struct daemon *daemon;
 
 static volatile pid_t pid = 0;
@@ -32,6 +34,64 @@ static void fatal_event(struct event_des
 static int read_event(int fd, struct event_desc *evp, char **msg);
 static void poll_resolv(int force, int do_reload, time_t now);
 
+static struct ubus_context *ubus;
+static struct blob_buf b;
+
+static struct ubus_object_type ubus_object_type = {
+       .name = "dnsmasq",
+};
+
+static struct ubus_object ubus_object = {
+       .name = "dnsmasq",
+       .type = &ubus_object_type,
+};
+
+void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface)
+{
+       if (!ubus || !ubus_object.has_subscribers)
+               return;
+
+       blob_buf_init(&b, 0);
+       if (mac)
+               blobmsg_add_string(&b, "mac", mac);
+       if (ip)
+               blobmsg_add_string(&b, "ip", ip);
+       if (name)
+               blobmsg_add_string(&b, "name", name);
+       if (interface)
+               blobmsg_add_string(&b, "interface", interface);
+       ubus_notify(ubus, &ubus_object, type, b.head, -1);
+}
+
+static void set_ubus_listeners(void)
+{
+       if (!ubus)
+               return;
+
+       poll_listen(ubus->sock.fd, POLLIN);
+       poll_listen(ubus->sock.fd, POLLERR);
+       poll_listen(ubus->sock.fd, POLLHUP);
+}
+
+static void check_ubus_listeners()
+{
+       if (!ubus) {
+               ubus = ubus_connect(NULL);
+               if (ubus)
+                       ubus_add_object(ubus, &ubus_object);
+               else
+                       return;
+       }
+
+       if (poll_check(ubus->sock.fd, POLLIN))
+               ubus_handle_event(ubus);
+
+       if (poll_check(ubus->sock.fd, POLLHUP)) {
+               ubus_free(ubus);
+               ubus = NULL;
+       }
+}
+
 int main (int argc, char **argv)
 {
   int bind_fallback = 0;
@@ -949,6 +1009,7 @@ int main (int argc, char **argv)
       set_dbus_listeners();
 #endif 
   
+      set_ubus_listeners();
 #ifdef HAVE_DHCP
       if (daemon->dhcp || daemon->relay4)
        {
@@ -1079,6 +1140,8 @@ int main (int argc, char **argv)
       check_dbus_listeners();
 #endif
       
+      check_ubus_listeners();
+
       check_dns_listeners(now);
 
 #ifdef HAVE_TFTP
--- a/Makefile
+++ b/Makefile
@@ -85,7 +85,7 @@ all : $(BUILDDIR)
        @cd $(BUILDDIR) && $(MAKE) \
  top="$(top)" \
  build_cflags="$(version) $(dbus_cflags) $(idn2_cflags) $(idn_cflags) $(ct_cflags) $(lua_cflags) $(nettle_cflags)" \
- build_libs="$(dbus_libs) $(idn2_libs) $(idn_libs) $(ct_libs) $(lua_libs) $(sunos_libs) $(nettle_libs) $(gmp_libs)" \
+ build_libs="$(dbus_libs) $(idn2_libs) $(idn_libs) $(ct_libs) $(lua_libs) $(sunos_libs) $(nettle_libs) $(gmp_libs) -lubox -lubus" \
  -f $(top)/Makefile dnsmasq 
 
 mostly_clean :
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -1445,6 +1445,8 @@ void emit_dbus_signal(int action, struct
 #  endif
 #endif
 
+void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface);
+
 /* ipset.c */
 #ifdef HAVE_IPSET
 void ipset_init(void);
--- a/src/rfc2131.c
+++ b/src/rfc2131.c
@@ -1636,6 +1636,10 @@ static void log_packet(char *type, void
              daemon->namebuff,
              string ? string : "",
              err ? err : "");
+  if (!strcmp(type, "DHCPACK"))
+         ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface);
+  else if (!strcmp(type, "DHCPRELEASE"))
+         ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface);
 }
 
 static void log_options(unsigned char *start, u32 xid)