All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 00/16] Move storage config and names files to ini-file format
@ 2012-10-18 13:01 Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 01/16] doc: Add settings storage documentation Frédéric Danis
                   ` (15 more replies)
  0 siblings, 16 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

Adapter saved configuration will be saved to /var/lib/bluetooth/<adapter address>/settings
in ini-file format for BlueZ 5.
Devices name cache will be saved in 1 file per device (named by device address)
under /var/lib/bluetooth/<adapter address>/cache/ directory.
If this files does not exist, we try to convert legacy files to this new format.

Access to variables during run-time is performed in adapter structure which is
populated by loading saved configuration during initialization.

Patches 2 to 8 remove access to config file from run-time.
Patch 9 moves to ini-file format style (load, save and convert).
Patches 11 to 16 move devices name cache to new files (read, write and convert).

Frédéric Danis (16):
  doc: Add settings storage documentation
  adapter: Read name in storage at init
  adaptername: Retrieve config name from adapter
  adapter: Read device class in storage at init
  adapter: Move pairable read to load_config()
  adapter: Read pairable timeout in storage at init
  adapter: Read discoverable timeout in storage at init
  adapter: Read mode in storage at init
  adapter: Move saved config to ini-file format
  TODO: Add entry to remove storage convertion function
  adapter: Move storage names to cache directory
  event: Remove write of LastSeen info
  device: Retrieve name from cache directory
  dbusoob: Store device name in cache directory
  input: Retrieve device name from cache directory
  hcitool: Retrieve names from cache directory

 Makefile.tools           |    2 +-
 TODO                     |    6 +
 doc/settings-storage.txt |   99 +++++++++++
 plugins/adaptername.c    |    6 +-
 plugins/dbusoob.c        |   26 ++-
 plugins/neard.c          |    2 +-
 profiles/input/device.c  |   26 ++-
 src/adapter.c            |  408 ++++++++++++++++++++++++++++++++++++----------
 src/adapter.h            |    3 +-
 src/device.c             |   25 ++-
 src/event.c              |   37 +++--
 src/mgmt.c               |   19 +--
 src/mgmt.h               |    1 +
 tools/hcitool.c          |   31 +++-
 14 files changed, 552 insertions(+), 139 deletions(-)
 create mode 100644 doc/settings-storage.txt

-- 
1.7.9.5


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v6 01/16] doc: Add settings storage documentation
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 23:13   ` Marcel Holtmann
  2012-10-18 13:01 ` [PATCH v6 02/16] adapter: Read name in storage at init Frédéric Danis
                   ` (14 subsequent siblings)
  15 siblings, 1 reply; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 doc/settings-storage.txt |   99 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)
 create mode 100644 doc/settings-storage.txt

diff --git a/doc/settings-storage.txt b/doc/settings-storage.txt
new file mode 100644
index 0000000..73d4766
--- /dev/null
+++ b/doc/settings-storage.txt
@@ -0,0 +1,99 @@
+Information related to local adapters and remote devices are stored in storage
+directory (default: /var/lib/bluetooth).
+Files are in ini-file format.
+
+There is one directory per adapter, named by its bluetooth address, which
+contains:
+ - a settings file for the local adapter
+ - an attribute_db file containing attributes of supported LE services
+ - names file containing names of all devices already seen
+ - one directory per remote device, named by remote device address, which
+   contains:
+    - a settings file
+    - a key file accessible only by root
+    - an attribute_db file containing attributes of remote LE services
+
+So the directory structure should be:
+    /var/lib/bluetooth/<adapter address>/
+        ./settings
+        ./attributes
+        ./cache/
+            ./<remote device address>
+            ./<remote device address>
+            ...
+        ./<remote device address>/
+            ./info
+            ./attributes
+        ./<remote device address>/
+            ./info
+            ./attributes
+        ...
+
+Adapter directory files
+=======================
+
+Settings file contains 1 [General] group with adapter info:
+  [General]
+  Name=
+  Class=0x000000
+  Discoverable=<true|false>
+  Connectable=<true|false>
+  Pairable=<true|false>
+  Powered=<true|false>
+  PairableTimeout=0
+  DiscoverableTimeout=0
+
+The attributes file is a list of handles (group name) with UUID and Value as
+keys, for example:
+  [0x0001]
+  UUID=00002800-0000-1000-8000-00805f9b34fb
+  Value=0018
+
+  [0x0004]
+  UUID=00002803-0000-1000-8000-00805f9b34fb
+  Value=020600002A
+
+  [0x0006]
+  UUID=00002a00-0000-1000-8000-00805f9b34fb
+  Value=4578616D706C6520446576696365
+
+Cache directory files
+======================
+
+Each files, named by remote device address, contains 1 [General] group:
+  [General]
+  Name=device name a
+
+Device directory files
+======================
+
+Remote device info file will include a [General] group with device info,
+[DeviceID], [LinkKey] and [LongTermKey] groups with related info:
+  [General]
+  Alias=
+  Class=0x000000
+  SupportedTechnologies=<BR/EDR|LE>;<BR/EDR|LE>
+  AddressType=<static|public>
+  Trusted=<true|false>
+  Profiles=<128 bits UUID of profile 1>;<128 bits UUID of profile 2>;...
+
+  [DeviceID]
+  Source=0
+  Vendor=0
+  Product=0
+  Version=0
+
+  [LinkKey]
+  Key=
+  Type=0
+  PINLength=0
+
+  [LongTermKey]
+  Key=
+  Authenticated=<true|false>
+  EncSize=0
+  EDiv=0
+  Rand=0
+
+The attribute_db file is a list of handles (group name) with UUID and Value as
+keys (cf. attribute_db in adapter directory).
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 02/16] adapter: Read name in storage at init
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 01/16] doc: Add settings storage documentation Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 03/16] adaptername: Retrieve config name from adapter Frédéric Danis
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/adapter.c |   13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/adapter.c b/src/adapter.c
index 3b24816..233527a 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2506,6 +2506,18 @@ void btd_adapter_unref(struct btd_adapter *adapter)
 	g_free(path);
 }
 
+static void load_config(struct btd_adapter *adapter)
+{
+	char name[MAX_NAME_LENGTH + 1];
+
+	/* Get name */
+	if (read_local_name(&adapter->bdaddr, name) < 0)
+		adapter->name = NULL;
+	else
+		adapter->name = g_strdup(name);
+
+}
+
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 {
 	adapter->up = up;
@@ -2525,6 +2537,7 @@ gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 	if (main_opts.gatt_enabled)
 		btd_adapter_gatt_server_start(adapter);
 
+	load_config(adapter);
 	load_drivers(adapter);
 	btd_profile_foreach(probe_profile, adapter);
 	clear_blocked(adapter);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 03/16] adaptername: Retrieve config name from adapter
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 01/16] doc: Add settings storage documentation Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 02/16] adapter: Read name in storage at init Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 04/16] adapter: Read device class in storage at init Frédéric Danis
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 plugins/adaptername.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/plugins/adaptername.c b/plugins/adaptername.c
index f58fb0f..353f11c 100644
--- a/plugins/adaptername.c
+++ b/plugins/adaptername.c
@@ -211,8 +211,10 @@ static int adaptername_probe(struct btd_adapter *adapter)
 	adapter_set_allow_name_changes(adapter, TRUE);
 	current_id = adapter_get_dev_id(adapter);
 
-	if (read_local_name(adapter_get_address(adapter), name) < 0)
-		expand_name(name, MAX_NAME_LENGTH, main_opts.name, current_id);
+	if (btd_adapter_get_name(adapter) != NULL)
+		return 0;
+
+	expand_name(name, MAX_NAME_LENGTH, main_opts.name, current_id);
 
 	DBG("Setting name '%s' for device 'hci%d'", name, current_id);
 	adapter_set_name(adapter, name);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 04/16] adapter: Read device class in storage at init
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (2 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 03/16] adaptername: Retrieve config name from adapter Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 05/16] adapter: Move pairable read to load_config() Frédéric Danis
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/adapter.c |   21 ++++++++++-----------
 src/adapter.h |    2 +-
 src/mgmt.c    |    2 +-
 3 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 233527a..dd06d46 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2177,18 +2177,11 @@ void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
 		*pairable = adapter->pairable;
 }
 
-void btd_adapter_read_class(struct btd_adapter *adapter, uint8_t *major,
+void btd_adapter_get_major_minor(struct btd_adapter *adapter, uint8_t *major,
 								uint8_t *minor)
 {
-	uint8_t cls[3];
-
-	if (read_local_class(&adapter->bdaddr, cls) < 0) {
-		uint32_t class = htobl(main_opts.class);
-		memcpy(cls, &class, 3);
-	}
-
-	*major = cls[1];
-	*minor = cls[0];
+	*major = (adapter->dev_class >> 8) & 0xFF;
+	*minor = adapter->dev_class & 0xFF;
 }
 
 uint32_t btd_adapter_get_class(struct btd_adapter *adapter)
@@ -2257,7 +2250,6 @@ void btd_adapter_start(struct btd_adapter *adapter)
 
 	ba2str(&adapter->bdaddr, address);
 
-	adapter->dev_class = 0;
 	adapter->off_requested = FALSE;
 	adapter->up = TRUE;
 	adapter->discov_timeout = get_discoverable_timeout(address);
@@ -2509,6 +2501,7 @@ void btd_adapter_unref(struct btd_adapter *adapter)
 static void load_config(struct btd_adapter *adapter)
 {
 	char name[MAX_NAME_LENGTH + 1];
+	uint8_t class[3];
 
 	/* Get name */
 	if (read_local_name(&adapter->bdaddr, name) < 0)
@@ -2516,6 +2509,12 @@ static void load_config(struct btd_adapter *adapter)
 	else
 		adapter->name = g_strdup(name);
 
+	/* Get class */
+	if (read_local_class(&adapter->bdaddr, class) == 0)
+		adapter->dev_class = class[0] | (class[1] << 8) |
+					(class[2] << 16);
+	else
+		adapter->dev_class = main_opts.class;
 }
 
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
diff --git a/src/adapter.h b/src/adapter.h
index d53c658..be69781 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -85,7 +85,7 @@ void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
 						uint16_t *discoverable_timeout,
 						gboolean *pairable);
 
-void btd_adapter_read_class(struct btd_adapter *adapter, uint8_t *major,
+void btd_adapter_get_major_minor(struct btd_adapter *adapter, uint8_t *major,
 							uint8_t *minor);
 
 uint32_t btd_adapter_get_class(struct btd_adapter *adapter);
diff --git a/src/mgmt.c b/src/mgmt.c
index 627fb4b..ad180c3 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -1105,7 +1105,7 @@ static void read_info_complete(int sk, uint16_t index, void *buf, size_t len)
 	else
 		adapter_name_changed(adapter, (char *) rp->name);
 
-	btd_adapter_read_class(adapter, &major, &minor);
+	btd_adapter_get_major_minor(adapter, &major, &minor);
 	mgmt_set_dev_class(index, major, minor);
 
 	btd_adapter_get_mode(adapter, &mode, NULL, NULL, NULL);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 05/16] adapter: Move pairable read to load_config()
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (3 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 04/16] adapter: Read device class in storage at init Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 06/16] adapter: Read pairable timeout in storage at init Frédéric Danis
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/adapter.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index dd06d46..74c36ec 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2515,6 +2515,10 @@ static void load_config(struct btd_adapter *adapter)
 					(class[2] << 16);
 	else
 		adapter->dev_class = main_opts.class;
+
+	/* Get pairable mode */
+	if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
+		adapter->pairable = TRUE;
 }
 
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
@@ -2542,10 +2546,6 @@ gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 	clear_blocked(adapter);
 	load_devices(adapter);
 
-	/* Set pairable mode */
-	if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
-		adapter->pairable = TRUE;
-
 	/* retrieve the active connections: address the scenario where
 	 * the are active connections before the daemon've started */
 	load_connections(adapter);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 06/16] adapter: Read pairable timeout in storage at init
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (4 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 05/16] adapter: Move pairable read to load_config() Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 07/16] adapter: Read discoverable " Frédéric Danis
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/adapter.c |   21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 74c36ec..6d2aadc 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2117,16 +2117,6 @@ static int get_discoverable_timeout(const char *src)
 	return main_opts.discovto;
 }
 
-static int get_pairable_timeout(const char *src)
-{
-	int timeout;
-
-	if (read_pairable_timeout(src, &timeout) == 0)
-		return timeout;
-
-	return main_opts.pairto;
-}
-
 static void set_auto_connect(gpointer data, gpointer user_data)
 {
 	struct btd_device *device = data;
@@ -2253,7 +2243,6 @@ void btd_adapter_start(struct btd_adapter *adapter)
 	adapter->off_requested = FALSE;
 	adapter->up = TRUE;
 	adapter->discov_timeout = get_discoverable_timeout(address);
-	adapter->pairable_timeout = get_pairable_timeout(address);
 	adapter->off_timer = 0;
 
 	if (adapter->scan_mode & SCAN_INQUIRY)
@@ -2502,6 +2491,10 @@ static void load_config(struct btd_adapter *adapter)
 {
 	char name[MAX_NAME_LENGTH + 1];
 	uint8_t class[3];
+	char address[18];
+	int timeout;
+
+	ba2str(&adapter->bdaddr, address);
 
 	/* Get name */
 	if (read_local_name(&adapter->bdaddr, name) < 0)
@@ -2519,6 +2512,12 @@ static void load_config(struct btd_adapter *adapter)
 	/* Get pairable mode */
 	if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
 		adapter->pairable = TRUE;
+
+	/* Get pairable timeout */
+	if (read_pairable_timeout(address, &timeout) < 0)
+		adapter->pairable_timeout = main_opts.pairto;
+	else
+		adapter->pairable_timeout = timeout;
 }
 
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 07/16] adapter: Read discoverable timeout in storage at init
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (5 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 06/16] adapter: Read pairable timeout in storage at init Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 08/16] adapter: Read mode " Frédéric Danis
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/adapter.c |   19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 6d2aadc..20fa1d0 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2107,16 +2107,6 @@ static void load_connections(struct btd_adapter *adapter)
 	g_slist_free_full(conns, g_free);
 }
 
-static int get_discoverable_timeout(const char *src)
-{
-	int timeout;
-
-	if (read_discoverable_timeout(src, &timeout) == 0)
-		return timeout;
-
-	return main_opts.discovto;
-}
-
 static void set_auto_connect(gpointer data, gpointer user_data)
 {
 	struct btd_device *device = data;
@@ -2161,7 +2151,7 @@ void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
 		*on_mode = get_mode(&adapter->bdaddr, "on");
 
 	if (discoverable_timeout)
-		*discoverable_timeout = get_discoverable_timeout(address);
+		*discoverable_timeout = adapter->discov_timeout;
 
 	if (pairable)
 		*pairable = adapter->pairable;
@@ -2242,7 +2232,6 @@ void btd_adapter_start(struct btd_adapter *adapter)
 
 	adapter->off_requested = FALSE;
 	adapter->up = TRUE;
-	adapter->discov_timeout = get_discoverable_timeout(address);
 	adapter->off_timer = 0;
 
 	if (adapter->scan_mode & SCAN_INQUIRY)
@@ -2518,6 +2507,12 @@ static void load_config(struct btd_adapter *adapter)
 		adapter->pairable_timeout = main_opts.pairto;
 	else
 		adapter->pairable_timeout = timeout;
+
+	/* Get discoverable timeout */
+	if (read_discoverable_timeout(address, &timeout) < 0)
+		adapter->discov_timeout = main_opts.discovto;
+	else
+		adapter->discov_timeout = timeout;
 }
 
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 08/16] adapter: Read mode in storage at init
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (6 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 07/16] adapter: Read discoverable " Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 09/16] adapter: Move saved config to ini-file format Frédéric Danis
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

Mgmt interface allows to change connectable and discoverable adapter
status even if the adapter is off. So both status are changed during
adapter init.
Remove on_mode from btd_adapter_get_mode(), as it is no more used.
Update src/mgmt.c and plugins/neard.c
---
 plugins/neard.c |    2 +-
 src/adapter.c   |   75 +++++++++++++++++++++++++++++--------------------------
 src/adapter.h   |    1 -
 src/mgmt.c      |   17 +++----------
 src/mgmt.h      |    1 +
 5 files changed, 45 insertions(+), 51 deletions(-)

diff --git a/plugins/neard.c b/plugins/neard.c
index 2da5024..8018977 100644
--- a/plugins/neard.c
+++ b/plugins/neard.c
@@ -376,7 +376,7 @@ static int check_adapter(struct btd_adapter *adapter)
 	if (btd_adapter_check_oob_handler(adapter))
 		return -EINPROGRESS;
 
-	btd_adapter_get_mode(adapter, NULL, NULL, NULL, &pairable);
+	btd_adapter_get_mode(adapter, NULL, NULL, &pairable);
 
 	if (!pairable || !adapter_get_agent(adapter))
 		return -ENOENT;
diff --git a/src/adapter.c b/src/adapter.c
index 20fa1d0..155293e 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -156,6 +156,7 @@ struct btd_adapter {
 	guint auto_timeout_id;		/* Automatic connections timeout */
 	sdp_list_t *services;		/* Services associated to adapter */
 
+	gboolean discoverable;		/* discoverable state */
 	gboolean pairable;		/* pairable state */
 	gboolean initialized;
 
@@ -196,7 +197,7 @@ static const char *mode2str(uint8_t mode)
 	}
 }
 
-static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
+static uint8_t get_mode(const char *mode)
 {
 	if (strcasecmp("off", mode) == 0)
 		return MODE_OFF;
@@ -204,15 +205,7 @@ static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
 		return MODE_CONNECTABLE;
 	else if (strcasecmp("discoverable", mode) == 0)
 		return MODE_DISCOVERABLE;
-	else if (strcasecmp("on", mode) == 0) {
-		char onmode[14], srcaddr[18];
-
-		ba2str(bdaddr, srcaddr);
-		if (read_on_mode(srcaddr, onmode, sizeof(onmode)) < 0)
-			return MODE_CONNECTABLE;
-
-		return get_mode(bdaddr, onmode);
-	} else
+	else
 		return MODE_UNKNOWN;
 }
 
@@ -375,11 +368,8 @@ static void set_powered(struct btd_adapter *adapter, gboolean powered,
 	uint8_t mode;
 	int err;
 
-	if (powered) {
-		mode = get_mode(&adapter->bdaddr, "on");
-		return set_discoverable(adapter, mode == MODE_DISCOVERABLE,
-									id);
-	}
+	if (powered)
+		return set_discoverable(adapter, adapter->discoverable, id);
 
 	mode = MODE_OFF;
 
@@ -1416,7 +1406,10 @@ static DBusMessage *request_session(DBusConnection *conn,
 	if (!adapter->mode_sessions)
 		adapter->global_mode = adapter->mode;
 
-	new_mode = get_mode(&adapter->bdaddr, "on");
+	if (adapter->discoverable)
+		new_mode = MODE_DISCOVERABLE;
+	else
+		new_mode = MODE_CONNECTABLE;
 
 	req = find_session(adapter->mode_sessions, sender);
 	if (req) {
@@ -2130,25 +2123,15 @@ static void call_adapter_powered_callbacks(struct btd_adapter *adapter,
 }
 
 void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
-						uint8_t *on_mode,
 						uint16_t *discoverable_timeout,
 						gboolean *pairable)
 {
-	char str[14], address[18];
+	char address[18];
 
 	ba2str(&adapter->bdaddr, address);
 
-	if (mode) {
-		if (main_opts.remember_powered == FALSE)
-			*mode = main_opts.mode;
-		else if (read_device_mode(address, str, sizeof(str)) == 0)
-			*mode = get_mode(&adapter->bdaddr, str);
-		else
-			*mode = main_opts.mode;
-	}
-
-	if (on_mode)
-		*on_mode = get_mode(&adapter->bdaddr, "on");
+	if (mode)
+		*mode = adapter->mode;
 
 	if (discoverable_timeout)
 		*discoverable_timeout = adapter->discov_timeout;
@@ -2234,10 +2217,13 @@ void btd_adapter_start(struct btd_adapter *adapter)
 	adapter->up = TRUE;
 	adapter->off_timer = 0;
 
-	if (adapter->scan_mode & SCAN_INQUIRY)
+	if (adapter->scan_mode & SCAN_INQUIRY) {
 		adapter->mode = MODE_DISCOVERABLE;
-	else
+		adapter->discoverable = TRUE;
+	} else {
 		adapter->mode = MODE_CONNECTABLE;
+		adapter->discoverable = FALSE;
+	}
 
 	g_dbus_emit_property_changed(btd_get_dbus_connection(), adapter->path,
 						ADAPTER_INTERFACE, "Powered");
@@ -2481,6 +2467,7 @@ static void load_config(struct btd_adapter *adapter)
 	char name[MAX_NAME_LENGTH + 1];
 	uint8_t class[3];
 	char address[18];
+	char mode[14];
 	int timeout;
 
 	ba2str(&adapter->bdaddr, address);
@@ -2513,6 +2500,24 @@ static void load_config(struct btd_adapter *adapter)
 		adapter->discov_timeout = main_opts.discovto;
 	else
 		adapter->discov_timeout = timeout;
+
+	/* Get mode */
+	if (main_opts.remember_powered == FALSE)
+		adapter->mode = main_opts.mode;
+	else if (read_device_mode(address, mode, sizeof(mode)) == 0)
+		adapter->mode = get_mode(mode);
+	else
+		adapter->mode = main_opts.mode;
+
+	/* Get on mode */
+	if (read_on_mode(address, mode, sizeof(mode)) == 0)
+		adapter->discoverable = (strcasecmp("discoverable", mode) == 0);
+	else
+		adapter->discoverable = (adapter->mode == MODE_DISCOVERABLE);
+
+	mgmt_set_connectable(adapter->dev_id, TRUE);
+	mgmt_set_discoverable(adapter->dev_id, adapter->discoverable,
+				adapter->discov_timeout);
 }
 
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
@@ -2893,9 +2898,11 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
 		break;
 	case SCAN_PAGE:
 		adapter->mode = MODE_CONNECTABLE;
+		adapter->discoverable = FALSE;
 		break;
 	case (SCAN_PAGE | SCAN_INQUIRY):
 		adapter->mode = MODE_DISCOVERABLE;
+		adapter->discoverable = TRUE;
 		break;
 	default:
 		/* ignore, reserved */
@@ -3198,17 +3205,13 @@ gboolean adapter_powering_down(struct btd_adapter *adapter)
 
 int btd_adapter_restore_powered(struct btd_adapter *adapter)
 {
-	char mode[14], address[18];
-
 	if (!main_opts.remember_powered)
 		return -EINVAL;
 
 	if (adapter->up)
 		return 0;
 
-	ba2str(&adapter->bdaddr, address);
-	if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
-						g_str_equal(mode, "off"))
+	if (adapter->mode == MODE_OFF)
 		return 0;
 
 	return mgmt_set_powered(adapter->dev_id, TRUE);
diff --git a/src/adapter.h b/src/adapter.h
index be69781..54f9ea7 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -81,7 +81,6 @@ void btd_adapter_start(struct btd_adapter *adapter);
 int btd_adapter_stop(struct btd_adapter *adapter);
 
 void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
-						uint8_t *on_mode,
 						uint16_t *discoverable_timeout,
 						gboolean *pairable);
 
diff --git a/src/mgmt.c b/src/mgmt.c
index ad180c3..18a653e 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -207,7 +207,7 @@ static int mgmt_set_mode(int index, uint16_t opcode, uint8_t val)
 	return 0;
 }
 
-static int mgmt_set_connectable(int index, gboolean connectable)
+int mgmt_set_connectable(int index, gboolean connectable)
 {
 	DBG("index %d connectable %d", index, connectable);
 	return mgmt_set_mode(index, MGMT_OP_SET_CONNECTABLE, connectable);
@@ -315,27 +315,18 @@ static void update_settings(struct btd_adapter *adapter, uint32_t settings)
 {
 	struct controller_info *info;
 	gboolean pairable;
-	uint8_t on_mode;
 	uint16_t index, discoverable_timeout;
 
 	DBG("new settings %x", settings);
 
-	btd_adapter_get_mode(adapter, NULL, &on_mode, &discoverable_timeout,
-								&pairable);
+	btd_adapter_get_mode(adapter, NULL, &discoverable_timeout, &pairable);
 
 	index = adapter_get_dev_id(adapter);
 
 	info = &controllers[index];
 
-	if (on_mode == MODE_DISCOVERABLE && !mgmt_discoverable(settings)) {
-		if(!mgmt_connectable(settings))
-			mgmt_set_connectable(index, TRUE);
-		mgmt_set_discoverable(index, TRUE, discoverable_timeout);
-	} else if (on_mode == MODE_CONNECTABLE && !mgmt_connectable(settings)) {
-		mgmt_set_connectable(index, TRUE);
-	} else if (mgmt_powered(settings)) {
+	if (mgmt_powered(settings))
 		adapter_mode_changed(adapter, create_mode(settings));
-	}
 
 	if (mgmt_pairable(settings) != pairable)
 		mgmt_set_pairable(index, pairable);
@@ -1108,7 +1099,7 @@ static void read_info_complete(int sk, uint16_t index, void *buf, size_t len)
 	btd_adapter_get_major_minor(adapter, &major, &minor);
 	mgmt_set_dev_class(index, major, minor);
 
-	btd_adapter_get_mode(adapter, &mode, NULL, NULL, NULL);
+	btd_adapter_get_mode(adapter, &mode, NULL, NULL);
 	if (mode == MODE_OFF && mgmt_powered(info->current_settings)) {
 		mgmt_set_powered(index, FALSE);
 		return;
diff --git a/src/mgmt.h b/src/mgmt.h
index a2c0497..daa168a 100644
--- a/src/mgmt.h
+++ b/src/mgmt.h
@@ -26,6 +26,7 @@ int mgmt_setup(void);
 void mgmt_cleanup(void);
 
 int mgmt_set_powered(int index, gboolean powered);
+int mgmt_set_connectable(int index, gboolean connectable);
 int mgmt_set_discoverable(int index, gboolean discoverable, uint16_t timeout);
 int mgmt_set_pairable(int index, gboolean pairable);
 int mgmt_set_name(int index, const char *name);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 09/16] adapter: Move saved config to ini-file format
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (7 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 08/16] adapter: Read mode " Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 10/16] TODO: Add entry to remove storage convertion function Frédéric Danis
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

Read and write config file in ini-file format.
If the file can not be loaded, try to convert legacy configuration.
---
 src/adapter.c |  234 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 189 insertions(+), 45 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 155293e..30fda1f 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -33,6 +33,7 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <sys/ioctl.h>
+#include <sys/file.h>
 
 #include <bluetooth/bluetooth.h>
 #include <bluetooth/uuid.h>
@@ -83,6 +84,8 @@
 #define REMOVE_TEMP_TIMEOUT (3 * 60)
 #define PENDING_FOUND_MAX 5
 
+#define SETTINGS_PATH STORAGEDIR "/%s/settings"
+
 static GSList *adapter_drivers = NULL;
 
 enum session_req_type {
@@ -209,6 +212,56 @@ static uint8_t get_mode(const char *mode)
 		return MODE_UNKNOWN;
 }
 
+static void store_adapter_info(struct btd_adapter *adapter)
+{
+	GKeyFile *key_file;
+	char filename[PATH_MAX + 1];
+	char address[18];
+	char *str;
+	gsize length = 0;
+
+	key_file = g_key_file_new();
+
+	g_key_file_set_string(key_file, "General", "Name", adapter->name);
+
+	str = g_strdup_printf("0x%2.2x%2.2x%2.2x",
+				(adapter->dev_class >> 16) & 0xFF,
+				(adapter->dev_class >> 8) & 0xFF,
+				adapter->dev_class & 0xFF);
+	g_key_file_set_string(key_file, "General", "Class", str);
+	g_free(str);
+
+	g_key_file_set_boolean(key_file, "General", "Powered",
+				adapter->mode > MODE_OFF);
+
+	g_key_file_set_boolean(key_file, "General", "Pairable",
+				adapter->pairable);
+
+	if (adapter->pairable_timeout != main_opts.pairto)
+		g_key_file_set_integer(key_file, "General", "PairableTimeout",
+					adapter->pairable_timeout);
+
+	g_key_file_set_boolean(key_file, "General", "Discoverable",
+				adapter->discoverable);
+
+	if (adapter->discov_timeout != main_opts.discovto)
+		g_key_file_set_integer(key_file, "General",
+					"DiscoverableTimeout",
+					adapter->discov_timeout);
+
+	ba2str(&adapter->bdaddr, address);
+	snprintf(filename, PATH_MAX, SETTINGS_PATH, address);
+	filename[PATH_MAX] = '\0';
+
+	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+	str = g_key_file_to_data(key_file, &length, NULL);
+	g_file_set_contents(filename, str, length, NULL);
+	g_free(str);
+
+	g_key_file_free(key_file);
+}
+
 static struct session_req *session_ref(struct session_req *req)
 {
 	req->refcount++;
@@ -278,7 +331,6 @@ static struct session_req *find_session_by_msg(GSList *list, const DBusMessage *
 static int set_mode(struct btd_adapter *adapter, uint8_t new_mode)
 {
 	int err;
-	const char *modestr;
 
 	if (adapter->pending_mode != NULL)
 		return -EALREADY;
@@ -310,10 +362,9 @@ static int set_mode(struct btd_adapter *adapter, uint8_t new_mode)
 		return err;
 
 done:
-	modestr = mode2str(new_mode);
-	write_device_mode(&adapter->bdaddr, modestr);
+	store_adapter_info(adapter);
 
-	DBG("%s", modestr);
+	DBG("%s", mode2str(new_mode));
 
 	return 0;
 }
@@ -451,7 +502,7 @@ void btd_adapter_pairable_changed(struct btd_adapter *adapter,
 {
 	adapter->pairable = pairable;
 
-	write_device_pairable(&adapter->bdaddr, pairable);
+	store_adapter_info(adapter);
 
 	g_dbus_emit_property_changed(btd_get_dbus_connection(), adapter->path,
 					ADAPTER_INTERFACE, "Pairable");
@@ -713,7 +764,7 @@ static void set_discoverable_timeout(struct btd_adapter *adapter,
 
 	adapter->discov_timeout = timeout;
 
-	write_discoverable_timeout(&adapter->bdaddr, timeout);
+	store_adapter_info(adapter);
 
 	g_dbus_emit_property_changed(conn, adapter->path, ADAPTER_INTERFACE,
 						"DiscoverableTimeout");
@@ -733,7 +784,7 @@ static void set_pairable_timeout(struct btd_adapter *adapter,
 
 	adapter->pairable_timeout = timeout;
 
-	write_pairable_timeout(&adapter->bdaddr, timeout);
+	store_adapter_info(adapter);
 
 	g_dbus_emit_property_changed(conn, adapter->path, ADAPTER_INTERFACE,
 							"PairableTimeout");
@@ -749,10 +800,10 @@ void btd_adapter_class_changed(struct btd_adapter *adapter, uint8_t *new_class)
 	if (class == adapter->dev_class)
 		return;
 
-	write_local_class(&adapter->bdaddr, new_class);
-
 	adapter->dev_class = class;
 
+	store_adapter_info(adapter);
+
 	if (main_opts.gatt_enabled) {
 		uint8_t cls[3];
 
@@ -806,7 +857,7 @@ int adapter_set_name(struct btd_adapter *adapter, const char *name)
 		adapter->name = g_strdup(maxname);
 	}
 
-	write_local_name(&adapter->bdaddr, maxname);
+	store_adapter_info(adapter);
 
 	return 0;
 }
@@ -2294,13 +2345,11 @@ static void set_mode_complete(struct btd_adapter *adapter)
 {
 	DBusConnection *conn = btd_get_dbus_connection();
 	struct session_req *pending;
-	const char *modestr;
 	int err;
 
-	modestr = mode2str(adapter->mode);
-	write_device_mode(&adapter->bdaddr, modestr);
+	store_adapter_info(adapter);
 
-	DBG("%s", modestr);
+	DBG("%s", mode2str(adapter->mode));
 
 	if (adapter->mode == MODE_OFF) {
 		g_slist_free_full(adapter->mode_sessions, session_free);
@@ -2462,58 +2511,153 @@ void btd_adapter_unref(struct btd_adapter *adapter)
 	g_free(path);
 }
 
-static void load_config(struct btd_adapter *adapter)
+static void convert_config(struct btd_adapter *adapter, const char *filename,
+				GKeyFile *key_file)
 {
-	char name[MAX_NAME_LENGTH + 1];
-	uint8_t class[3];
 	char address[18];
-	char mode[14];
+	char str[MAX_NAME_LENGTH + 1];
+	char config_path[PATH_MAX + 1];
+	char *converted;
+	uint8_t class[3];
+	gboolean flag;
 	int timeout;
+	uint8_t mode;
+	char *data;
+	gsize length = 0;
+
+	ba2str(&adapter->bdaddr, address);
+	snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
+	config_path[PATH_MAX] = '\0';
+
+	converted = textfile_get(config_path, "converted");
+	if (converted) {
+		if (strcmp(converted, "yes") == 0) {
+			DBG("Legacy config file already converted");
+			return;
+		}
+
+		g_free(converted);
+	}
+
+	if (read_local_name(&adapter->bdaddr, str) == 0)
+		g_key_file_set_string(key_file, "General", "Name", str);
+
+	if (read_local_class(&adapter->bdaddr, class) == 0) {
+		sprintf(str, "0x%2.2x%2.2x%2.2x", class[2], class[1], class[0]);
+		g_key_file_set_string(key_file, "General", "Class", str);
+	}
+
+	if (read_device_pairable(&adapter->bdaddr, &flag) == 0)
+		g_key_file_set_boolean(key_file, "General", "Pairable", flag);
+
+	if (read_pairable_timeout(address, &timeout) == 0)
+		g_key_file_set_integer(key_file, "General",
+						"PairableTimeout", timeout);
+
+	if (read_discoverable_timeout(address, &timeout) == 0)
+		g_key_file_set_integer(key_file, "General",
+						"DiscoverableTimeout", timeout);
+
+	if (read_device_mode(address, str, sizeof(str)) == 0) {
+		mode = get_mode(str);
+		g_key_file_set_boolean(key_file, "General", "Powered",
+					mode > MODE_OFF);
+	}
+
+	if (read_on_mode(address, str, sizeof(str)) == 0) {
+		mode = get_mode(str);
+		g_key_file_set_boolean(key_file, "General", "Discoverable",
+					mode == MODE_DISCOVERABLE);
+	}
+
+	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+	data = g_key_file_to_data(key_file, &length, NULL);
+	g_file_set_contents(filename, data, length, NULL);
+	g_free(data);
+
+	textfile_put(config_path, "converted", "yes");
+}
+
+static void load_config(struct btd_adapter *adapter)
+{
+	GKeyFile *key_file;
+	char filename[PATH_MAX + 1];
+	char address[18];
+	char *str;
+	gboolean powered;
+	GError *gerr = NULL;
 
 	ba2str(&adapter->bdaddr, address);
 
+	key_file = g_key_file_new();
+
+	snprintf(filename, PATH_MAX, SETTINGS_PATH, address);
+	filename[PATH_MAX] = '\0';
+
+	if (!g_key_file_load_from_file(key_file, filename, 0, NULL))
+		convert_config(adapter, filename, key_file);
+
 	/* Get name */
-	if (read_local_name(&adapter->bdaddr, name) < 0)
-		adapter->name = NULL;
-	else
-		adapter->name = g_strdup(name);
+	adapter->name = g_key_file_get_string(key_file, "General",
+								"Name", NULL);
 
 	/* Get class */
-	if (read_local_class(&adapter->bdaddr, class) == 0)
-		adapter->dev_class = class[0] | (class[1] << 8) |
-					(class[2] << 16);
-	else
+	str = g_key_file_get_string(key_file, "General", "Class", NULL);
+	if (str) {
+		adapter->dev_class = strtol(str, NULL, 16);
+		g_free(str);
+	} else
 		adapter->dev_class = main_opts.class;
 
 	/* Get pairable mode */
-	if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
+	adapter->pairable = g_key_file_get_boolean(key_file, "General",
+							"Pairable", &gerr);
+	if (gerr) {
 		adapter->pairable = TRUE;
+		g_error_free(gerr);
+		gerr = NULL;
+	}
 
 	/* Get pairable timeout */
-	if (read_pairable_timeout(address, &timeout) < 0)
+	adapter->pairable_timeout = g_key_file_get_integer(key_file, "General",
+						"PairableTimeout", &gerr);
+	if (gerr) {
 		adapter->pairable_timeout = main_opts.pairto;
-	else
-		adapter->pairable_timeout = timeout;
+		g_error_free(gerr);
+		gerr = NULL;
+	}
+
+	/* Get discoverable mode */
+	adapter->discoverable = g_key_file_get_boolean(key_file, "General",
+							"Discoverable", &gerr);
+	if (gerr) {
+		adapter->discoverable = (main_opts.mode == MODE_DISCOVERABLE);
+		g_error_free(gerr);
+		gerr = NULL;
+	}
 
 	/* Get discoverable timeout */
-	if (read_discoverable_timeout(address, &timeout) < 0)
+	adapter->discov_timeout = g_key_file_get_integer(key_file, "General",
+						"DiscoverableTimeout", &gerr);
+	if (gerr) {
 		adapter->discov_timeout = main_opts.discovto;
-	else
-		adapter->discov_timeout = timeout;
+		g_error_free(gerr);
+		gerr = NULL;
+	}
 
-	/* Get mode */
-	if (main_opts.remember_powered == FALSE)
-		adapter->mode = main_opts.mode;
-	else if (read_device_mode(address, mode, sizeof(mode)) == 0)
-		adapter->mode = get_mode(mode);
-	else
+	/* Get powered mode */
+	powered = g_key_file_get_boolean(key_file, "General", "Powered",
+						&gerr);
+	if (gerr) {
 		adapter->mode = main_opts.mode;
-
-	/* Get on mode */
-	if (read_on_mode(address, mode, sizeof(mode)) == 0)
-		adapter->discoverable = (strcasecmp("discoverable", mode) == 0);
-	else
-		adapter->discoverable = (adapter->mode == MODE_DISCOVERABLE);
+		g_error_free(gerr);
+		gerr = NULL;
+	} else if (powered) {
+		adapter->mode = adapter->discoverable ? MODE_DISCOVERABLE :
+							MODE_CONNECTABLE;
+	} else
+		adapter->mode = MODE_OFF;
 
 	mgmt_set_connectable(adapter->dev_id, TRUE);
 	mgmt_set_discoverable(adapter->dev_id, adapter->discoverable,
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 10/16] TODO: Add entry to remove storage convertion function
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (8 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 09/16] adapter: Move saved config to ini-file format Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 11/16] adapter: Move storage names to cache directory Frédéric Danis
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 TODO |    6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/TODO b/TODO
index ca72cd6..bc9bf9c 100644
--- a/TODO
+++ b/TODO
@@ -30,6 +30,12 @@ General
   Priority: Low
   Complexity: C1
 
+- Function in src/adapter.c to convert old storage files to new ini-file format
+  should be removed 6-8 months after first BlueZ 5 release.
+
+  Priority: Low
+  Complexity: C1
+
 BlueZ 5
 =======
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 11/16] adapter: Move storage names to cache directory
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (9 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 10/16] TODO: Add entry to remove storage convertion function Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 12/16] event: Remove write of LastSeen info Frédéric Danis
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/adapter.c |   81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 src/event.c   |   24 ++++++++++++++---
 2 files changed, 99 insertions(+), 6 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 30fda1f..942d48d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2511,6 +2511,58 @@ void btd_adapter_unref(struct btd_adapter *adapter)
 	g_free(path);
 }
 
+static void convert_names_entry(char *key, char *value, void *user_data)
+{
+	char *address = user_data;
+	char filename[PATH_MAX + 1];
+	char *str = key;
+	GKeyFile *key_file;
+	char *data;
+	gsize length = 0;
+
+	if (strchr(key, '#'))
+		str[17] = '\0';
+
+	if (bachk(str) != 0)
+		return;
+
+	snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
+	filename[PATH_MAX] = '\0';
+	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+	key_file = g_key_file_new();
+	g_key_file_load_from_file(key_file, filename, 0, NULL);
+	g_key_file_set_string(key_file, "General", "Name", value);
+
+	data = g_key_file_to_data(key_file, &length, NULL);
+	g_file_set_contents(filename, data, length, NULL);
+	g_free(data);
+
+	g_key_file_free(key_file);
+}
+
+static void convert_device_storage(struct btd_adapter *adapter)
+{
+	char filename[PATH_MAX + 1];
+	char address[18];
+	char *str;
+
+	ba2str(&adapter->bdaddr, address);
+
+	/* Convert device's name cache */
+	snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
+	filename[PATH_MAX] = '\0';
+
+	str = textfile_get(filename, "converted");
+	if (str && strcmp(str, "yes") == 0) {
+		DBG("Legacy names file already converted");
+	} else {
+		textfile_foreach(filename, convert_names_entry, address);
+		textfile_put(filename, "converted", "yes");
+	}
+	free(str);
+}
+
 static void convert_config(struct btd_adapter *adapter, const char *filename,
 				GKeyFile *key_file)
 {
@@ -2684,6 +2736,7 @@ gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 		btd_adapter_gatt_server_start(adapter);
 
 	load_config(adapter);
+	convert_device_storage(adapter);
 	load_drivers(adapter);
 	btd_profile_foreach(probe_profile, adapter);
 	clear_blocked(adapter);
@@ -2965,9 +3018,31 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
 		write_remote_appearance(&adapter->bdaddr, bdaddr, bdaddr_type,
 							eir_data.appearance);
 
-	if (eir_data.name != NULL && eir_data.name_complete)
-		write_device_name(&adapter->bdaddr, bdaddr, bdaddr_type,
-								eir_data.name);
+	if (eir_data.name != NULL && eir_data.name_complete) {
+		char filename[PATH_MAX + 1];
+		char s_addr[18], d_addr[18];
+		GKeyFile *key_file;
+		char *data;
+		gsize length = 0;
+
+		ba2str(&adapter->bdaddr, s_addr);
+		ba2str(bdaddr, d_addr);
+		snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+				s_addr, d_addr);
+		filename[PATH_MAX] = '\0';
+		create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+		key_file = g_key_file_new();
+		g_key_file_load_from_file(key_file, filename, 0, NULL);
+		g_key_file_set_string(key_file, "General", "Name",
+					eir_data.name);
+
+		data = g_key_file_to_data(key_file, &length, NULL);
+		g_file_set_contents(filename, data, length, NULL);
+		g_free(data);
+
+		g_key_file_free(key_file);
+	}
 
 	/* Avoid creating LE device if it's not discoverable */
 	if (bdaddr_type != BDADDR_BREDR &&
diff --git a/src/event.c b/src/event.c
index 48aeffd..3c43135 100644
--- a/src/event.c
+++ b/src/event.c
@@ -34,6 +34,7 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include <bluetooth/bluetooth.h>
 
@@ -265,7 +266,11 @@ void btd_event_remote_name(bdaddr_t *local, bdaddr_t *peer, char *name)
 {
 	struct btd_adapter *adapter;
 	struct btd_device *device;
-	uint8_t peer_type;
+	char filename[PATH_MAX + 1];
+	char local_addr[18], peer_addr[18];
+	GKeyFile *key_file;
+	char *data;
+	gsize length = 0;
 
 	if (!g_utf8_validate(name, -1, NULL)) {
 		int i;
@@ -282,9 +287,22 @@ void btd_event_remote_name(bdaddr_t *local, bdaddr_t *peer, char *name)
 	if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
 		return;
 
-	peer_type = device_get_addr_type(device);
+	ba2str(local, local_addr);
+	ba2str(peer, peer_addr);
+	snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local_addr,
+			peer_addr);
+	filename[PATH_MAX] = '\0';
+	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+	key_file = g_key_file_new();
+	g_key_file_load_from_file(key_file, filename, 0, NULL);
+	g_key_file_set_string(key_file, "General", "Name", name);
+
+	data = g_key_file_to_data(key_file, &length, NULL);
+	g_file_set_contents(filename, data, length, NULL);
+	g_free(data);
 
-	write_device_name(local, peer, peer_type, name);
+	g_key_file_free(key_file);
 
 	if (device)
 		device_set_name(device, name);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 12/16] event: Remove write of LastSeen info
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (10 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 11/16] adapter: Move storage names to cache directory Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 13/16] device: Retrieve name from cache directory Frédéric Danis
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/event.c |   13 -------------
 1 file changed, 13 deletions(-)

diff --git a/src/event.c b/src/event.c
index 3c43135..d7daed2 100644
--- a/src/event.c
+++ b/src/event.c
@@ -221,17 +221,6 @@ void btd_event_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer,
 	device_simple_pairing_complete(device, status);
 }
 
-static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba, uint8_t dba_type)
-{
-	time_t t;
-	struct tm *tm;
-
-	t = time(NULL);
-	tm = gmtime(&t);
-
-	write_lastseen_info(sba, dba, dba_type, tm);
-}
-
 static void update_lastused(bdaddr_t *sba, bdaddr_t *dba, uint8_t dba_type)
 {
 	time_t t;
@@ -256,8 +245,6 @@ void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_type
 		return;
 	}
 
-	update_lastseen(local, peer, bdaddr_type);
-
 	adapter_update_found_devices(adapter, peer, bdaddr_type, rssi,
 					confirm_name, legacy, data, data_len);
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 13/16] device: Retrieve name from cache directory
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (11 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 12/16] event: Remove write of LastSeen info Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 14/16] dbusoob: Store device name in " Frédéric Danis
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/device.c |   25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/device.c b/src/device.c
index bb0f890..5eecbb3 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1589,6 +1589,8 @@ struct btd_device *device_create(struct btd_adapter *adapter,
 	const bdaddr_t *src;
 	char srcaddr[18], alias[MAX_NAME_LENGTH + 1];
 	uint16_t vendor, product, version;
+	char filename[PATH_MAX + 1];
+	GKeyFile *key_file;
 
 	device = g_try_malloc0(sizeof(struct btd_device));
 	if (device == NULL)
@@ -1616,7 +1618,28 @@ struct btd_device *device_create(struct btd_adapter *adapter,
 	src = adapter_get_address(adapter);
 	ba2str(src, srcaddr);
 
-	read_device_name(srcaddr, address, bdaddr_type, device->name);
+	snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", srcaddr,
+			address);
+	filename[PATH_MAX] = '\0';
+	key_file = g_key_file_new();
+
+	if (g_key_file_load_from_file(key_file, filename, 0, NULL)) {
+		char *str;
+		int len;
+
+		str = g_key_file_get_string(key_file, "General", "Name", NULL);
+		if (str) {
+			len = strlen(str);
+			if (len > HCI_MAX_NAME_LENGTH)
+				str[HCI_MAX_NAME_LENGTH] = '\0';
+
+			strcpy(device->name, str);
+			g_free(str);
+		}
+	}
+
+	g_key_file_free(key_file);
+
 	if (read_device_alias(srcaddr, address, bdaddr_type, alias,
 							sizeof(alias)) == 0)
 		device->alias = g_strdup(alias);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 14/16] dbusoob: Store device name in cache directory
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (12 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 13/16] device: Retrieve name from cache directory Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 15/16] input: Retrieve device name from " Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 16/16] hcitool: Retrieve names " Frédéric Danis
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 plugins/dbusoob.c |   26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/plugins/dbusoob.c b/plugins/dbusoob.c
index 5c5b6ef..82d512c 100644
--- a/plugins/dbusoob.c
+++ b/plugins/dbusoob.c
@@ -31,6 +31,7 @@
 
 #include <errno.h>
 #include <gdbus.h>
+#include <sys/stat.h>
 
 #include <bluetooth/bluetooth.h>
 #include <bluetooth/hci.h>
@@ -194,6 +195,11 @@ static gboolean parse_data(DBusMessageIter *data, struct oob_data *remote_data)
 static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
 {
 	bdaddr_t bdaddr;
+	char filename[PATH_MAX + 1];
+	char s_addr[18];
+	GKeyFile *key_file;
+	char *str;
+	gsize length = 0;
 
 	str2ba(data->addr, &bdaddr);
 
@@ -207,9 +213,23 @@ static gboolean store_data(struct btd_adapter *adapter, struct oob_data *data)
 		write_remote_class(adapter_get_address(adapter), &bdaddr,
 								data->class);
 
-	if (data->name)
-		write_device_name(adapter_get_address(adapter), &bdaddr, 0,
-								data->name);
+	if (data->name) {
+		ba2str(adapter_get_address(adapter), s_addr);
+		snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+				s_addr, data->addr);
+		filename[PATH_MAX] = '\0';
+		create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+		key_file = g_key_file_new();
+		g_key_file_load_from_file(key_file, filename, 0, NULL);
+		g_key_file_set_string(key_file, "General", "Name", data->name);
+
+		str = g_key_file_to_data(key_file, &length, NULL);
+		g_file_set_contents(filename, str, length, NULL);
+		g_free(str);
+
+		g_key_file_free(key_file);
+	}
 
 	return TRUE;
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 15/16] input: Retrieve device name from cache directory
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (13 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 14/16] dbusoob: Store device name in " Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  2012-10-18 13:01 ` [PATCH v6 16/16] hcitool: Retrieve names " Frédéric Danis
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 profiles/input/device.c |   26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/profiles/input/device.c b/profiles/input/device.c
index 997235b..f4f4f65 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -37,6 +37,7 @@
 #include <bluetooth/sdp_lib.h>
 #include <bluetooth/uuid.h>
 
+#include <glib.h>
 #include <gdbus.h>
 
 #include "log.h"
@@ -762,7 +763,9 @@ static struct input_device *input_device_new(struct btd_device *device,
 {
 	struct btd_adapter *adapter = device_get_adapter(device);
 	struct input_device *idev;
-	char name[249], src_addr[18], dst_addr[18];
+	char src_addr[18], dst_addr[18];
+	char filename[PATH_MAX + 1];
+	GKeyFile *key_file;
 
 	idev = g_new0(struct input_device, 1);
 	bacpy(&idev->src, adapter_get_address(adapter));
@@ -775,9 +778,24 @@ static struct input_device *input_device_new(struct btd_device *device,
 	ba2str(&idev->src, src_addr);
 	ba2str(&idev->dst, dst_addr);
 
-	if (read_device_name(src_addr, dst_addr, device_get_addr_type(device),
-				name) == 0)
-		idev->name = g_strdup(name);
+	snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", src_addr,
+			dst_addr);
+	filename[PATH_MAX] = '\0';
+	key_file = g_key_file_new();
+
+	if (g_key_file_load_from_file(key_file, filename, 0, NULL)) {
+		int len;
+
+		idev->name = g_key_file_get_string(key_file, "General",
+								"Name", NULL);
+		if (idev->name) {
+			len = strlen(idev->name);
+			if (len > HCI_MAX_NAME_LENGTH)
+				idev->name[HCI_MAX_NAME_LENGTH] = '\0';
+		}
+	}
+
+	g_key_file_free(key_file);
 
 	if (g_dbus_register_interface(btd_get_dbus_connection(),
 					idev->path, INPUT_DEVICE_INTERFACE,
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v6 16/16] hcitool: Retrieve names from cache directory
  2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
                   ` (14 preceding siblings ...)
  2012-10-18 13:01 ` [PATCH v6 15/16] input: Retrieve device name from " Frédéric Danis
@ 2012-10-18 13:01 ` Frédéric Danis
  15 siblings, 0 replies; 21+ messages in thread
From: Frédéric Danis @ 2012-10-18 13:01 UTC (permalink / raw)
  To: linux-bluetooth

---
 Makefile.tools  |    2 +-
 tools/hcitool.c |   31 ++++++++++++++++++++++++++-----
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/Makefile.tools b/Makefile.tools
index e1f693c..a6adbed 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -28,7 +28,7 @@ tools_hciconfig_LDADD = lib/libbluetooth-private.la
 
 tools_hcitool_SOURCES = tools/hcitool.c src/oui.h src/oui.c \
 						src/textfile.h src/textfile.c
-tools_hcitool_LDADD = lib/libbluetooth-private.la
+tools_hcitool_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@
 
 tools_sdptool_SOURCES = tools/sdptool.c src/sdp-xml.h src/sdp-xml.c
 tools_sdptool_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@
diff --git a/tools/hcitool.c b/tools/hcitool.c
index aefbd68..a05e31f 100644
--- a/tools/hcitool.c
+++ b/tools/hcitool.c
@@ -40,6 +40,8 @@
 #include <sys/socket.h>
 #include <signal.h>
 
+#include <glib.h>
+
 #include <bluetooth/bluetooth.h>
 #include <bluetooth/hci.h>
 #include <bluetooth/hci_lib.h>
@@ -409,13 +411,32 @@ static char *major_classes[] = {
 
 static char *get_device_name(const bdaddr_t *local, const bdaddr_t *peer)
 {
-	char filename[PATH_MAX + 1], addr[18];
+	char filename[PATH_MAX + 1];
+	char local_addr[18], peer_addr[18];
+	GKeyFile *key_file;
+	char *str = NULL;
+	int len;
+
+	ba2str(local, local_addr);
+	ba2str(peer, peer_addr);
+
+	snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local_addr,
+			peer_addr);
+	filename[PATH_MAX] = '\0';
+	key_file = g_key_file_new();
+
+	if (g_key_file_load_from_file(key_file, filename, 0, NULL)) {
+		str = g_key_file_get_string(key_file, "General", "Name", NULL);
+		if (str) {
+			len = strlen(str);
+			if (len > HCI_MAX_NAME_LENGTH)
+				str[HCI_MAX_NAME_LENGTH] = '\0';
+		}
+	}
 
-	ba2str(local, addr);
-	create_name(filename, PATH_MAX, STORAGEDIR, addr, "names");
+	g_key_file_free(key_file);
 
-	ba2str(peer, addr);
-	return textfile_get(filename, addr);
+	return str;
 }
 
 /* Display local devices */
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH v6 01/16] doc: Add settings storage documentation
  2012-10-18 13:01 ` [PATCH v6 01/16] doc: Add settings storage documentation Frédéric Danis
@ 2012-10-18 23:13   ` Marcel Holtmann
  2012-10-19  0:41     ` Anderson Lizardo
  2012-10-19  9:33     ` Frederic Danis
  0 siblings, 2 replies; 21+ messages in thread
From: Marcel Holtmann @ 2012-10-18 23:13 UTC (permalink / raw)
  To: Frédéric Danis; +Cc: linux-bluetooth

Hi Fred,

> ---
>  doc/settings-storage.txt |   99 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 99 insertions(+)
>  create mode 100644 doc/settings-storage.txt
> 
> diff --git a/doc/settings-storage.txt b/doc/settings-storage.txt
> new file mode 100644
> index 0000000..73d4766
> --- /dev/null
> +++ b/doc/settings-storage.txt
> @@ -0,0 +1,99 @@
> +Information related to local adapters and remote devices are stored in storage
> +directory (default: /var/lib/bluetooth).
> +Files are in ini-file format.
> +
> +There is one directory per adapter, named by its bluetooth address, which
> +contains:
> + - a settings file for the local adapter
> + - an attribute_db file containing attributes of supported LE services
> + - names file containing names of all devices already seen
> + - one directory per remote device, named by remote device address, which
> +   contains:
> +    - a settings file
> +    - a key file accessible only by root
> +    - an attribute_db file containing attributes of remote LE services

please fix the name of the attribute_db file.

And I would prefer if we are a bit more verbose. I would prefer if this
reads like a nice instruction manual in plain English on what we are
storing and how.

Adding different sections like introduction, details etc. is fine as
well. The easier it becomes to read, the easier it becomes to understand
by people not familiar what is going on. Look at some of the oFono
documents for examples.

> +So the directory structure should be:
> +    /var/lib/bluetooth/<adapter address>/
> +        ./settings
> +        ./attributes
> +        ./cache/
> +            ./<remote device address>
> +            ./<remote device address>
> +            ...
> +        ./<remote device address>/
> +            ./info
> +            ./attributes
> +        ./<remote device address>/
> +            ./info
> +            ./attributes
> +        ...

I am still debating if we not better keep a single directory structure
instead of a nested one. I have not made up my mind and going forth and
back on this.

/var/lib/bluetooth/<adapter>/<device>-info
/var/lib/bluetooth/<adapter>/<device>-attributes
/var/lib/bluetooth/<adapter>/cache-<device>-info

And for the profile specific ones, we could then have a function that
returns specific files based on the profile names.

/var/lib/bluetooth/<adapter>/<device>-audio

> +
> +Adapter directory files
> +=======================
> +
> +Settings file contains 1 [General] group with adapter info:
> +  [General]
> +  Name=
> +  Class=0x000000

Lets store this as MajorClass and MinorClass. Since that is how we are
programming it into the kernel.

And for simplicity, I would prefer that this document also has a section
listing the possible values. At least for the common used classes like
Computer, Phone etc.

We could also consider that we allow actually simple names like "phone",
"computer" etc. Just to make this simpler. Not sure if this is a really
great idea, but we could discuss this.

> +  Discoverable=<true|false>
> +  Connectable=<true|false>
> +  Pairable=<true|false>
> +  Powered=<true|false>
> +  PairableTimeout=0
> +  DiscoverableTimeout=0
> +
> +The attributes file is a list of handles (group name) with UUID and Value as
> +keys, for example:
> +  [0x0001]
> +  UUID=00002800-0000-1000-8000-00805f9b34fb
> +  Value=0018
> +
> +  [0x0004]
> +  UUID=00002803-0000-1000-8000-00805f9b34fb
> +  Value=020600002A
> +
> +  [0x0006]
> +  UUID=00002a00-0000-1000-8000-00805f9b34fb
> +  Value=4578616D706C6520446576696365

You need to mention that values are hex encoded strings. Just to be
clear here.

I am not 100% convinced that we want to keep the sections/handles in hex
value notation. Is that really a good idea?

> +Cache directory files
> +======================
> +
> +Each files, named by remote device address, contains 1 [General] group:
> +  [General]
> +  Name=device name a

Is this the only thing we are storing in these files? Or are we planning
to store additional information at some point.

> +Device directory files
> +======================
> +
> +Remote device info file will include a [General] group with device info,
> +[DeviceID], [LinkKey] and [LongTermKey] groups with related info:
> +  [General]
> +  Alias=

Are we just doing the Alias here? We are not keeping the Name? In theory
we have a short name and full name actually. If we ever only got the
short name, we need to know that. Then we have to request the long name
next time.

> +  Class=0x000000
> +  SupportedTechnologies=<BR/EDR|LE>;<BR/EDR|LE>

We could just store the Host features bits here. That would make it a
bit simpler to remember all the magic features.

> +  AddressType=<static|public>
> +  Trusted=<true|false>
> +  Profiles=<128 bits UUID of profile 1>;<128 bits UUID of profile 2>;...
> +
> +  [DeviceID]
> +  Source=0
> +  Vendor=0
> +  Product=0
> +  Version=0
> +
> +  [LinkKey]
> +  Key=
> +  Type=0
> +  PINLength=0
> +
> +  [LongTermKey]
> +  Key=
> +  Authenticated=<true|false>
> +  EncSize=0
> +  EDiv=0
> +  Rand=0
> +
> +The attribute_db file is a list of handles (group name) with UUID and Value as
> +keys (cf. attribute_db in adapter directory).

Regards

Marcel



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v6 01/16] doc: Add settings storage documentation
  2012-10-18 23:13   ` Marcel Holtmann
@ 2012-10-19  0:41     ` Anderson Lizardo
  2012-10-19  9:33     ` Frederic Danis
  1 sibling, 0 replies; 21+ messages in thread
From: Anderson Lizardo @ 2012-10-19  0:41 UTC (permalink / raw)
  To: Marcel Holtmann; +Cc: Frédéric Danis, linux-bluetooth

Hi Marcel/Fr=E9d=E9ric,

On Thu, Oct 18, 2012 at 8:13 PM, Marcel Holtmann <marcel@holtmann.org> wrot=
e:
>> +  [0x0001]
>> +  UUID=3D00002800-0000-1000-8000-00805f9b34fb
>> +  Value=3D0018
>> +
>> +  [0x0004]
>> +  UUID=3D00002803-0000-1000-8000-00805f9b34fb
>> +  Value=3D020600002A
>> +
>> +  [0x0006]
>> +  UUID=3D00002a00-0000-1000-8000-00805f9b34fb
>> +  Value=3D4578616D706C6520446576696365
>
> You need to mention that values are hex encoded strings. Just to be
> clear here.
>
> I am not 100% convinced that we want to keep the sections/handles in hex
> value notation. Is that really a good idea?

Alternatively, we could have:

[Attribute<N>]
UUID=3D...
Value=3D...

where "<N>" is the attribute value handle (in decimal). The section
name could then be easily parsed to extract the handle from it.

What do you think?

Regards,
--=20
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v6 01/16] doc: Add settings storage documentation
  2012-10-18 23:13   ` Marcel Holtmann
  2012-10-19  0:41     ` Anderson Lizardo
@ 2012-10-19  9:33     ` Frederic Danis
  2012-10-19 16:12       ` Marcel Holtmann
  1 sibling, 1 reply; 21+ messages in thread
From: Frederic Danis @ 2012-10-19  9:33 UTC (permalink / raw)
  To: Marcel Holtmann; +Cc: linux-bluetooth

Hello Marcel,

On 19/10/2012 01:13, Marcel Holtmann wrote:
<snip>
>> +Cache directory files
>> +======================
>> +
>> +Each files, named by remote device address, contains 1 [General] group:
>> +  [General]
>> +  Name=device name a
>
> Is this the only thing we are storing in these files? Or are we planning
> to store additional information at some point.
>
>> +Device directory files
>> +======================
>> +
>> +Remote device info file will include a [General] group with device info,
>> +[DeviceID], [LinkKey] and [LongTermKey] groups with related info:
>> +  [General]
>> +  Alias=
>
> Are we just doing the Alias here? We are not keeping the Name? In theory
> we have a short name and full name actually. If we ever only got the
> short name, we need to know that. Then we have to request the long name
> next time.

Name is already stored in cache file. So I think we do not need to save 
it also in device info file.

We may store both short and long names in the cache file.

Regards

Fred

-- 
Frederic Danis                            Open Source Technology Center
frederic.danis@intel.com                              Intel Corporation

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v6 01/16] doc: Add settings storage documentation
  2012-10-19  9:33     ` Frederic Danis
@ 2012-10-19 16:12       ` Marcel Holtmann
  0 siblings, 0 replies; 21+ messages in thread
From: Marcel Holtmann @ 2012-10-19 16:12 UTC (permalink / raw)
  To: Frederic Danis; +Cc: linux-bluetooth

Hi Fred,

> >> +Cache directory files
> >> +======================
> >> +
> >> +Each files, named by remote device address, contains 1 [General] group:
> >> +  [General]
> >> +  Name=device name a
> >
> > Is this the only thing we are storing in these files? Or are we planning
> > to store additional information at some point.
> >
> >> +Device directory files
> >> +======================
> >> +
> >> +Remote device info file will include a [General] group with device info,
> >> +[DeviceID], [LinkKey] and [LongTermKey] groups with related info:
> >> +  [General]
> >> +  Alias=
> >
> > Are we just doing the Alias here? We are not keeping the Name? In theory
> > we have a short name and full name actually. If we ever only got the
> > short name, we need to know that. Then we have to request the long name
> > next time.
> 
> Name is already stored in cache file. So I think we do not need to save 
> it also in device info file.
> 
> We may store both short and long names in the cache file.

I was assuming that the cache file is only used for LE devices with
static random addresses, but know I remember that we even need to store
the names for devices that we only discovered and not paired with.

Regards

Marcel



^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2012-10-19 16:12 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-18 13:01 [PATCH v6 00/16] Move storage config and names files to ini-file format Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 01/16] doc: Add settings storage documentation Frédéric Danis
2012-10-18 23:13   ` Marcel Holtmann
2012-10-19  0:41     ` Anderson Lizardo
2012-10-19  9:33     ` Frederic Danis
2012-10-19 16:12       ` Marcel Holtmann
2012-10-18 13:01 ` [PATCH v6 02/16] adapter: Read name in storage at init Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 03/16] adaptername: Retrieve config name from adapter Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 04/16] adapter: Read device class in storage at init Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 05/16] adapter: Move pairable read to load_config() Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 06/16] adapter: Read pairable timeout in storage at init Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 07/16] adapter: Read discoverable " Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 08/16] adapter: Read mode " Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 09/16] adapter: Move saved config to ini-file format Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 10/16] TODO: Add entry to remove storage convertion function Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 11/16] adapter: Move storage names to cache directory Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 12/16] event: Remove write of LastSeen info Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 13/16] device: Retrieve name from cache directory Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 14/16] dbusoob: Store device name in " Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 15/16] input: Retrieve device name from " Frédéric Danis
2012-10-18 13:01 ` [PATCH v6 16/16] hcitool: Retrieve names " Frédéric Danis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.