#include "util.h"
#include "neterror.h"
#include "wifi-state.h"
+#include "netdbus.h"
+#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
+#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus"
#define MAC_INFO_FILEPATH tzplatform_mkpath(TZ_SYS_ETC, "/.mac.info")
#define MAC_ADDRESS_MAX_LEN 18
static gboolean netconfig_device_picker_test = FALSE;
static int mdnsd_ref_count = 0;
+typedef struct {
+ char *conn_name;
+ int conn_id;
+} dnssd_conn_destroy_data;
GKeyFile *netconfig_keyfile_load(const char *pathname)
{
return netconfig_execute_file(path, args, envs);
}
-gboolean handle_launch_mdns(Network *object, GDBusMethodInvocation *context)
+static void __dnssd_conn_destroyed_cb(GDBusConnection *conn,
+ const gchar *Name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
{
- DBG("Launch mdnsresponder daemon");
+ gchar *name = NULL;
+ gchar *old = NULL;
+ gchar *new = NULL;
+ dnssd_conn_destroy_data *data = user_data;
+ GDBusConnection *connection = NULL;
+ connection = netdbus_get_connection();
+
+ if (param == NULL)
+ return;
- if (execute_mdnsd_script("start") < 0) {
- ERR("Failed to launch mdnsresponder daemon");
- netconfig_error_invalid_parameter(context);
- return FALSE;
+ g_variant_get(param, "(sss)", &name, &old, &new);
+
+ if (g_strcmp0(name, data->conn_name) == 0 && *new == '\0') {
+ DBG("Connection %s Destroyed: name %s id %d", data->conn_name, name,
+ data->conn_id);
+ mdnsd_ref_count--;
+ g_dbus_connection_signal_unsubscribe(connection, data->conn_id);
+ if (mdnsd_ref_count == 0) {
+ if (execute_mdnsd_script("stop") < 0)
+ ERR("Failed to stop mdnsresponder daemon");
+ }
}
+ g_free(name);
+ g_free(old);
+ g_free(new);
+ g_free(data->conn_name);
+ g_free(data);
+ return;
+}
- mdnsd_ref_count++;
- DBG("Ref mdnsresponder daemon. ref count: %d", mdnsd_ref_count);
+static void register_dnssd_conn_destroy_signal(gchar *name)
+{
+ dnssd_conn_destroy_data *data;
+ GDBusConnection *connection = NULL;
+ connection = netdbus_get_connection();
- network_complete_launch_mdns(object, context);
- return TRUE;
+ if (connection == NULL) {
+ ERR("Failed to get GDbus Connection");
+ return;
+ }
+
+ data = g_try_malloc0(sizeof(dnssd_conn_destroy_data));
+ data->conn_name = g_strdup(name);
+
+ data->conn_id = g_dbus_connection_signal_subscribe(connection,
+ DBUS_SERVICE_DBUS, DBUS_INTERFACE_DBUS,
+ "NameOwnerChanged", NULL, name,
+ G_DBUS_SIGNAL_FLAGS_NONE, __dnssd_conn_destroyed_cb,
+ data, NULL);
+ return;
}
-gboolean handle_unref_mdns(Network *object, GDBusMethodInvocation *context)
+gboolean handle_launch_mdns(Network *object, GDBusMethodInvocation *context,
+ gchar *name)
{
- DBG("Unef mdnsresponder daemon");
+ DBG("Launch mdnsresponder daemon");
- if (mdnsd_ref_count <= 0) {
- ERR("Invalid access");
+ if (execute_mdnsd_script("start") < 0) {
+ ERR("Failed to launch mdnsresponder daemon");
netconfig_error_invalid_parameter(context);
return FALSE;
}
- mdnsd_ref_count--;
-
- DBG("Unref mdnsresponder daemon. ref count: %d", mdnsd_ref_count);
- if (mdnsd_ref_count == 0) {
- if (execute_mdnsd_script("stop") < 0) {
- ERR("Failed to stop mdnsresponder daemon");
- netconfig_error_invalid_parameter(context);
- return FALSE;
- }
- }
+ mdnsd_ref_count++;
+ register_dnssd_conn_destroy_signal(name);
+ DBG("Ref mdnsresponder daemon. ref count: %d", mdnsd_ref_count);
- network_complete_unref_mdns(object, context);
+ network_complete_launch_mdns(object, context);
return TRUE;
}