Package: dnsmasq Version: 2.46-1 Severity: wishlist Tags: patch It would be nice if dnsmasq's DBus interface supported introspection. Implementing this is pretty straightforward, the necessary code is in the attached patch.
Cheers, Jeremy -- System Information: Debian Release: 5.0 APT prefers unstable APT policy: (500, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.26-1-amd64 (SMP w/2 CPU cores) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages dnsmasq depends on: ii adduser 3.110 add and remove users and groups ii dnsmasq-base 2.46-1 A small caching DNS proxy and DHCP ii netbase 4.34 Basic TCP/IP networking system dnsmasq recommends no packages. Versions of packages dnsmasq suggests: pn resolvconf <none> (no description available) -- no debconf information
diff -urN dnsmasq-2.46.orig/src/dbus.c dnsmasq-2.46/src/dbus.c --- dnsmasq-2.46.orig/src/dbus.c 2008-11-14 21:02:08.000000000 +0100 +++ dnsmasq-2.46/src/dbus.c 2008-12-15 10:45:48.000000000 +0100 @@ -21,6 +21,42 @@ #define DBUS_API_SUBJECT_TO_CHANGE #include <dbus/dbus.h> +const char* introspection_xml = +"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n" +"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n" +"<node name=\"" DNSMASQ_PATH "\">\n" +" <interface name=\"org.freedesktop.DBus.Introspectable\">\n" +" <method name=\"Introspect\">\n" +" <arg name=\"data\" direction=\"out\" type=\"s\"/>\n" +" </method>\n" +" </interface>\n" +" <interface name=\"" DNSMASQ_SERVICE "\">\n" +" <method name=\"ClearCache\">\n" +" </method>\n" +" <method name=\"GetVersion\">\n" +" <arg name=\"version\" direction=\"out\" type=\"s\"/>\n" +" </method>\n" +" <method name=\"SetServers\">\n" +" <arg name=\"servers\" direction=\"in\" type=\"av\"/>\n" +" </method>\n" +" <signal name=\"DhcpLeaseAdded\">\n" +" <arg name=\"ipaddr\" type=\"s\"/>\n" +" <arg name=\"hwaddr\" type=\"s\"/>\n" +" <arg name=\"hostname\" type=\"s\"/>\n" +" </signal>\n" +" <signal name=\"DhcpLeaseDeleted\">\n" +" <arg name=\"ipaddr\" type=\"s\"/>\n" +" <arg name=\"hwaddr\" type=\"s\"/>\n" +" <arg name=\"hostname\" type=\"s\"/>\n" +" </signal>\n" +" <signal name=\"DhcpLeaseUpdated\">\n" +" <arg name=\"ipaddr\" type=\"s\"/>\n" +" <arg name=\"hwaddr\" type=\"s\"/>\n" +" <arg name=\"hostname\" type=\"s\"/>\n" +" </signal>\n" +" </interface>\n" +"</node>\n"; + struct watch { DBusWatch *watch; struct watch *next; @@ -229,7 +265,15 @@ { char *method = (char *)dbus_message_get_member(message); - if (strcmp(method, "GetVersion") == 0) + if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) + { + DBusMessage *reply = dbus_message_new_method_return(message); + + dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_xml, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + } + else if (strcmp(method, "GetVersion") == 0) { char *v = VERSION; DBusMessage *reply = dbus_message_new_method_return(message);

