int setting_dbus_handler_init(void* user_data)
{
SETTING_TRACE_BEGIN;
- DBusError error;
- char rule[MAX_LOCAL_BUFSIZE];
-
- dbus_error_init(&error);
- bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
- if (!bus)
- {
- SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
- dbus_error_free(&error);
- return -1;
- }
-
- dbus_connection_setup_with_g_main(bus, NULL);
- snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+ if (bus)
+ {
+ SETTING_TRACE("already get a bus, need release first.");
+ setting_dbus_handler_fini();
+ }
+ DBusError error;
+ memset(&error, 0, sizeof(DBusError));
+ char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
+ dbus_error_init(&error);
+ bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+ if (!bus)
+ {
+ SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
+ dbus_error_free(&error);
+ return -1;
+ }
- dbus_bus_add_match(bus, rule, &error);
- if (dbus_error_is_set(&error))
- {
- SETTING_TRACE("Fail to rule set; %s", error.message);
- dbus_error_free(&error);
- return -1;
- }
+ dbus_connection_setup_with_g_main(bus, NULL);
+ snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
- if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
- {
- return -1;
- }
+ dbus_bus_add_match(bus, rule, &error);
+ if (dbus_error_is_set(&error))
+ {
+ SETTING_TRACE("Fail to rule set; %s", error.message);
+ dbus_bus_remove_match(bus, rule, &error);
+ dbus_error_free(&error);
+ dbus_connection_close(bus);
+ bus = NULL;
+ return -1;
+ }
- SETTING_TRACE("app signal initialized");
+ if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
+ {
+ dbus_bus_remove_match(bus, rule, &error);
+ dbus_error_free(&error);
+ dbus_connection_close(bus);
+ bus = NULL;
+ return -1;
+ }
- return 0;
+ SETTING_TRACE("app signal initialized");
+ return 0;
}
-
int setting_dbus_handler_fini(void)
{
- DBusError error;
- char rule[MAX_LOCAL_BUFSIZE];
-
- if (bus)
+ //do safty checking first.
+ setting_retvm_if(!bus, 0, "!bus");
+ DBusError error;
+ memset(&error, 0, sizeof(DBusError));
+ char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
+
+ dbus_error_init(&error);
+ dbus_connection_remove_filter(bus, __signal_filter, NULL);
+ snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+ dbus_bus_remove_match(bus, rule, &error);
+
+ if (dbus_error_is_set(&error))
{
- dbus_error_init(&error);
- dbus_connection_remove_filter(bus, __signal_filter, NULL);
- snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
- dbus_bus_remove_match(bus, rule, &error);
-
- if (dbus_error_is_set(&error))
- {
- SETTING_TRACE("Fail to rule unset: %s", error.message);
- dbus_error_free(&error);
- return -1;
- }
-
- dbus_connection_close(bus);
- bus = NULL;
- SETTING_TRACE("app signal finalized");
+ SETTING_TRACE("Fail to rule unset: %s", error.message);
+ dbus_error_free(&error);
+ //return -1;
}
- return 0;
+
+ dbus_connection_close(bus);
+ bus = NULL;
+ SETTING_TRACE("app signal finalized");
+ return 0;
}
/////////////////////////////