1e93ef8498
Refresh patches Upstream commits since last bump: 3b6eb19 Log DNSSEC trust anchors at startup. f3e5787 Trivial comment change. c851c69 Log failure to confirm an address in DHCPv6. a3bd7e7 Fix missing fatal errors when parsing some command-line/config options. ab5ceaf Document the --help option in the french manual 1f2f69d Fix recurrent minor spelling mistake in french manual f361b39 Fix some mistakes in french translation of the manual eb1fe15 When replacing cache entries, preserve CNAMES which target them. Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
128 lines
3.3 KiB
Diff
128 lines
3.3 KiB
Diff
--- 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)
|