BlueZ 5.3: 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.

BUG=chromium-os:38832
TEST="restart bluetoothd" preserves the previous powered status.

Change-Id: I63360cf3b4ed0557401d579eef85de07dd23f1ac
Reviewed-on: https://gerrit.chromium.org/gerrit/44986
Commit-Queue: Alex Deymo <deymo@chromium.org>
Tested-by: Alex Deymo <deymo@chromium.org>
Reviewed-by: Alex Deymo <deymo@chromium.org>
diff --git a/net-wireless/bluez/bluez-5.3.ebuild b/net-wireless/bluez/bluez-5.3-r1.ebuild
similarity index 97%
rename from net-wireless/bluez/bluez-5.3.ebuild
rename to net-wireless/bluez/bluez-5.3-r1.ebuild
index 6dc03e1..f493536 100644
--- a/net-wireless/bluez/bluez-5.3.ebuild
+++ b/net-wireless/bluez/bluez-5.3-r1.ebuild
@@ -98,6 +98,9 @@
 	#epatch "${FILESDIR}/${P}-ps3-0002.patch"
 	#epatch "${FILESDIR}/${P}-ps3-0003.patch"
 
+	# Powered property persistent across reboots.
+	epatch "${FILESDIR}/${P}-Powered-property-persistent-across-reboots.patch"
+
 	eautoreconf
 
 	if use cups; then
diff --git a/net-wireless/bluez/files/bluez-5.3-Powered-property-persistent-across-reboots.patch b/net-wireless/bluez/files/bluez-5.3-Powered-property-persistent-across-reboots.patch
new file mode 100644
index 0000000..20627be
--- /dev/null
+++ b/net-wireless/bluez/files/bluez-5.3-Powered-property-persistent-across-reboots.patch
@@ -0,0 +1,64 @@
+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);
+ }
+