blob: 20627be6f7b48b2a2f4796ed39949c098b649a1b [file] [log] [blame]
From a8eb5834b23e74994ba1796adcd902dbc646be5d Mon Sep 17 00:00:00 2001
From: Alex Deymo <deymo@chromium.org>
Date: Fri, 8 Mar 2013 14:48:27 -0800
Subject: [PATCH] Make "Powered" property persistent across reboots.
As part of the daemon shutdown the adapter is powered off. Restarting the
daemon will recover the current status from the adapter, but those will
always show the adapter as powered off. This patch adds a new property to
the "settings" adapter's file storing the last Powered status before
shutdown. This status is restored on startup.
diff --git a/src/adapter.c b/src/adapter.c
index e553626..0c9acbc 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -384,6 +384,10 @@ static void store_adapter_info(struct btd_adapter *adapter)
g_key_file_set_string(key_file, "General", "Alias",
adapter->stored_alias);
+ /* Always store the powered status */
+ g_key_file_set_boolean(key_file, "General", "Powered",
+ btd_adapter_get_powered(adapter));
+
ba2str(&adapter->bdaddr, address);
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings", address);
filename[PATH_MAX] = '\0';
@@ -441,6 +445,12 @@ static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
g_dbus_emit_property_changed(dbus_conn, adapter->path,
ADAPTER_INTERFACE, "Powered");
+ /* Don't store the adapter information during daemon shutdown.
+ * It will store the adapter as powered "off" as part of the
+ * shutdown. */
+ if (!powering_down)
+ store_adapter_info(adapter);
+
if (adapter->current_settings & MGMT_SETTING_POWERED) {
adapter_start(adapter);
} else {
@@ -3846,6 +3856,7 @@ static void load_config(struct btd_adapter *adapter)
char address[18];
struct stat st;
GError *gerr = NULL;
+ gboolean powered;
ba2str(&adapter->bdaddr, address);
@@ -3897,6 +3908,16 @@ static void load_config(struct btd_adapter *adapter)
gerr = NULL;
}
+ /* Get power status */
+ powered = g_key_file_get_boolean(key_file, "General", "Powered", &gerr);
+ if (gerr) {
+ powered = false;
+ g_error_free(gerr);
+ gerr = NULL;
+ }
+ /* Update the power status for this adapter */
+ set_mode(adapter, MGMT_OP_SET_POWERED, powered ? 0x01 : 0x00);
+
g_key_file_free(key_file);
}