summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-04-15 13:48:39 -0700
committerAyush Garg <ayush.garg@samsung.com>2023-05-15 14:55:54 +0530
commitd463570f0cf136525663eba6646416c20ec48a55 (patch)
tree7a8948942ce4cfc0046f1ff718d745ca10bb2329
parent49ef8ab470909c774c48fd9231cfc3918f865c2c (diff)
downloadbluez-d463570f0cf136525663eba6646416c20ec48a55.tar.gz
bluez-d463570f0cf136525663eba6646416c20ec48a55.tar.bz2
bluez-d463570f0cf136525663eba6646416c20ec48a55.zip
storage: Add support for STATE_DIRECTORY environment variable
When running as a systemd service the STATE_DIRECTORY environment variable maybe set: https://www.freedesktop.org/software/systemd/man/systemd.exec.html Signed-off-by: Manika Shrivastava <manika.sh@samsung.com> Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
-rw-r--r--profiles/audio/a2dp.c10
-rw-r--r--src/adapter.c123
-rw-r--r--src/device.c57
-rwxr-xr-xsrc/storage.c27
-rwxr-xr-xsrc/storage.h6
-rwxr-xr-xsrc/textfile.c41
-rwxr-xr-xsrc/textfile.h5
7 files changed, 154 insertions, 115 deletions
diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index afcd0f2b..d32aa8ed 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -38,6 +38,7 @@
#include "src/service.h"
#include "src/log.h"
#include "src/sdpd.h"
+#include "src/textfile.h"
#include "src/shared/queue.h"
#include "src/shared/timeout.h"
#include "src/shared/util.h"
@@ -885,9 +886,10 @@ static void store_remote_seps(struct a2dp_channel *chan)
ba2str(device_get_address(device), dst_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(device_get_adapter(device)),
dst_addr);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -1056,9 +1058,10 @@ static void store_last_used(struct a2dp_channel *chan, uint8_t lseid,
ba2str(device_get_address(chan->device), dst_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(device_get_adapter(chan->device)),
dst_addr);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -2365,9 +2368,10 @@ static void load_remote_seps(struct a2dp_channel *chan)
ba2str(device_get_address(device), dst_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(device_get_adapter(device)),
dst_addr);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
diff --git a/src/adapter.c b/src/adapter.c
index 665bf63b..0b4f706e 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -647,9 +647,8 @@ static void store_adapter_info(struct btd_adapter *adapter)
g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "source");
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
+ create_filename(filename, PATH_MAX, "/%s/settings",
btd_adapter_get_storage_dir(adapter));
-
create_file(filename, 0600);
str = g_key_file_to_data(key_file, &length, NULL);
@@ -8763,7 +8762,7 @@ static int load_irk(struct btd_adapter *adapter, uint8_t *irk)
char *str_irk;
int ret;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/identity",
+ create_filename(filename, PATH_MAX, "/%s/identity",
btd_adapter_get_storage_dir(adapter));
key_file = g_key_file_new();
@@ -9476,8 +9475,8 @@ static void load_devices(struct btd_adapter *adapter)
DIR *dir;
struct dirent *entry;
- snprintf(dirname, PATH_MAX, STORAGEDIR "/%s",
- btd_adapter_get_storage_dir(adapter));
+ create_filename(dirname, PATH_MAX, "/%s",
+ btd_adapter_get_storage_dir(adapter));
dir = opendir(dirname);
if (!dir) {
@@ -9525,7 +9524,7 @@ static void load_devices(struct btd_adapter *adapter)
}
}
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter),
entry->d_name);
@@ -10650,7 +10649,7 @@ static void convert_names_entry(char *key, char *value, void *user_data)
if (bachk(str) != 0)
return;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", address, str);
create_file(filename, 0600);
key_file = g_key_file_new();
@@ -10875,7 +10874,7 @@ static void convert_entry(char *key, char *value, void *user_data)
struct stat st;
int err;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
+ create_filename(filename, PATH_MAX, "/%s/%s",
converter->address, key);
err = stat(filename, &st);
@@ -10883,7 +10882,7 @@ static void convert_entry(char *key, char *value, void *user_data)
return;
}
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
converter->address, key);
key_file = g_key_file_new();
@@ -10919,7 +10918,7 @@ static void convert_file(char *file, char *address,
char filename[PATH_MAX];
struct device_converter converter;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
+ create_filename(filename, PATH_MAX, "/%s/%s", address, file);
converter.address = address;
converter.cb = cb;
@@ -10990,7 +10989,7 @@ static void store_sdp_record(char *local, char *peer, int handle, char *value)
char *data;
gsize length = 0;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
@@ -11047,7 +11046,7 @@ static void convert_sdp_entry(char *key, char *value, void *user_data)
/* Check if the device directory has been created as records should
* only be converted for known devices */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
+ create_filename(filename, PATH_MAX, "/%s/%s", src_addr, dst_addr);
err = stat(filename, &st);
if (err || !S_ISDIR(st.st_mode))
@@ -11073,7 +11072,7 @@ static void convert_sdp_entry(char *key, char *value, void *user_data)
if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
goto failed;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", src_addr,
+ create_filename(filename, PATH_MAX, "/%s/%s/attributes", src_addr,
dst_addr);
key_file = g_key_file_new();
@@ -11134,8 +11133,8 @@ static void convert_primaries_entry(char *key, char *value, void *user_data)
sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
prim_uuid = bt_uuid2string(&uuid);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", address,
- key);
+ create_filename(filename, PATH_MAX, "/%s/%s/attributes", address, key);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -11174,7 +11173,7 @@ static void convert_primaries_entry(char *key, char *value, void *user_data)
g_free(data);
g_key_file_free(key_file);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", address, key);
+ create_filename(filename, PATH_MAX, "/%s/%s/info", address, key);
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
@@ -11224,14 +11223,14 @@ static void convert_ccc_entry(char *key, char *value, void *user_data)
/* Check if the device directory has been created as records should
* only be converted for known devices */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
+ create_filename(filename, PATH_MAX, "/%s/%s", src_addr, dst_addr);
err = stat(filename, &st);
if (err || !S_ISDIR(st.st_mode))
return;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/ccc", src_addr,
- dst_addr);
+ create_filename(filename, PATH_MAX, "/%s/%s/ccc", src_addr, dst_addr);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -11280,14 +11279,14 @@ static void convert_gatt_entry(char *key, char *value, void *user_data)
/* Check if the device directory has been created as records should
* only be converted for known devices */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
+ create_filename(filename, PATH_MAX, "/%s/%s", src_addr, dst_addr);
err = stat(filename, &st);
if (err || !S_ISDIR(st.st_mode))
return;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/gatt", src_addr,
- dst_addr);
+ create_filename(filename, PATH_MAX, "/%s/%s/gatt", src_addr, dst_addr);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -11335,14 +11334,14 @@ static void convert_proximity_entry(char *key, char *value, void *user_data)
/* Check if the device directory has been created as records should
* only be converted for known devices */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, key);
+ create_filename(filename, PATH_MAX, "/%s/%s", src_addr, key);
err = stat(filename, &st);
if (err || !S_ISDIR(st.st_mode))
return;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/proximity", src_addr,
- key);
+ create_filename(filename, PATH_MAX, "/%s/%s/proximity", src_addr, key);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -11374,7 +11373,7 @@ static void convert_device_storage(struct btd_adapter *adapter)
ba2str(&adapter->bdaddr, address);
/* Convert device's name cache */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
+ create_filename(filename, PATH_MAX, "/%s/names", address);
textfile_foreach(filename, convert_names_entry, address);
/* Convert aliases */
@@ -11390,7 +11389,7 @@ static void convert_device_storage(struct btd_adapter *adapter)
convert_file("profiles", address, convert_profiles_entry, TRUE);
/* Convert primaries */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
+ create_filename(filename, PATH_MAX, "/%s/primaries", address);
textfile_foreach(filename, convert_primaries_entry, address);
/* Convert linkkeys */
@@ -11406,22 +11405,22 @@ static void convert_device_storage(struct btd_adapter *adapter)
convert_file("did", address, convert_did_entry, FALSE);
/* Convert sdp */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
+ create_filename(filename, PATH_MAX, "/%s/sdp", address);
textfile_foreach(filename, convert_sdp_entry, address);
/* Convert ccc */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
+ create_filename(filename, PATH_MAX, "/%s/ccc", address);
textfile_foreach(filename, convert_ccc_entry, address);
/* Convert appearances */
convert_file("appearances", address, convert_appearances_entry, FALSE);
/* Convert gatt */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
+ create_filename(filename, PATH_MAX, "/%s/gatt", address);
textfile_foreach(filename, convert_gatt_entry, address);
/* Convert proximity */
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
+ create_filename(filename, PATH_MAX, "/%s/proximity", address);
textfile_foreach(filename, convert_proximity_entry, address);
}
@@ -11438,7 +11437,7 @@ static void convert_config(struct btd_adapter *adapter, const char *filename,
GError *gerr = NULL;
ba2str(&adapter->bdaddr, address);
- snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
+ create_filename(config_path, PATH_MAX, "/%s/config", address);
if (read_pairable_timeout(address, &timeout) == 0)
g_key_file_set_integer(key_file, "General",
@@ -11476,7 +11475,8 @@ static void fix_storage(struct btd_adapter *adapter)
ba2str(&adapter->bdaddr, address);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
+ create_filename(filename, PATH_MAX, "/%s/config", address);
+
converted = textfile_get(filename, "converted");
if (!converted)
return;
@@ -11485,49 +11485,49 @@ static void fix_storage(struct btd_adapter *adapter)
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
+ create_filename(filename, PATH_MAX, "/%s/names", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
+ create_filename(filename, PATH_MAX, "/%s/aliases", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
+ create_filename(filename, PATH_MAX, "/%s/trusts", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
+ create_filename(filename, PATH_MAX, "/%s/blocked", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
+ create_filename(filename, PATH_MAX, "/%s/profiles", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
+ create_filename(filename, PATH_MAX, "/%s/primaries", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
+ create_filename(filename, PATH_MAX, "/%s/linkkeys", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
+ create_filename(filename, PATH_MAX, "/%s/longtermkeys", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
+ create_filename(filename, PATH_MAX, "/%s/classes", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
+ create_filename(filename, PATH_MAX, "/%s/did", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
+ create_filename(filename, PATH_MAX, "/%s/sdp", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
+ create_filename(filename, PATH_MAX, "/%s/ccc", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
+ create_filename(filename, PATH_MAX, "/%s/appearances", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
+ create_filename(filename, PATH_MAX, "/%s/gatt", address);
textfile_del(filename, "converted");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
+ create_filename(filename, PATH_MAX, "/%s/proximity", address);
textfile_del(filename, "converted");
}
@@ -11595,7 +11595,7 @@ static void load_config(struct btd_adapter *adapter)
key_file = g_key_file_new();
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
+ create_filename(filename, PATH_MAX, "/%s/settings",
btd_adapter_get_storage_dir(adapter));
if (stat(filename, &st) < 0) {
@@ -14053,7 +14053,7 @@ static void store_link_key(struct btd_adapter *adapter,
ba2str(device_get_address(device), device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
create_file(filename, 0600);
@@ -14157,7 +14157,7 @@ static void store_ltk_group(struct btd_adapter *adapter, const bdaddr_t *peer,
ba2str(peer, device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
create_file(filename, 0600);
@@ -14336,7 +14336,7 @@ static void store_csrk(struct btd_adapter *adapter, const bdaddr_t *peer,
ba2str(peer, device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
key_file = g_key_file_new();
@@ -14425,7 +14425,7 @@ static void store_irk(struct btd_adapter *adapter, const bdaddr_t *peer,
ba2str(peer, device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
@@ -14539,7 +14539,7 @@ static void store_conn_param(struct btd_adapter *adapter, const bdaddr_t *peer,
DBG("");
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
@@ -15413,8 +15413,9 @@ static void remove_keys(struct btd_adapter *adapter,
ba2str(device_get_rpa(device), device_addr);
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
@@ -15508,6 +15509,7 @@ static bool get_static_addr(struct btd_adapter *adapter)
struct bt_crypto *crypto;
GKeyFile *file;
GError *gerr = NULL;
+ char filename[PATH_MAX];
char **addrs;
char mfg[7];
char *str;
@@ -15516,11 +15518,12 @@ static bool get_static_addr(struct btd_adapter *adapter)
snprintf(mfg, sizeof(mfg), "0x%04x", adapter->manufacturer);
+ create_filename(filename, PATH_MAX, "/addresses");
+
file = g_key_file_new();
- if (!g_key_file_load_from_file(file, STORAGEDIR "/addresses", 0,
- &gerr)) {
+ if (!g_key_file_load_from_file(file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)",
- STORAGEDIR "/addresses", gerr->message);
+ filename, gerr->message);
g_clear_error(&gerr);
}
addrs = g_key_file_get_string_list(file, "Static", mfg, &len, NULL);
@@ -15576,9 +15579,9 @@ static bool get_static_addr(struct btd_adapter *adapter)
(const char **)addrs, len);
str = g_key_file_to_data(file, &len, NULL);
- if (!g_file_set_contents(STORAGEDIR "/addresses", str, len, &gerr)) {
+ if (!g_file_set_contents(filename, str, len, &gerr)) {
error("Unable set contents for %s: (%s)",
- STORAGEDIR "/addresses", gerr->message);
+ filename, gerr->message);
g_error_free(gerr);
}
g_free(str);
diff --git a/src/device.c b/src/device.c
index bf8dffca..fcd19bd8 100644
--- a/src/device.c
+++ b/src/device.c
@@ -591,7 +591,7 @@ static gboolean store_device_info_cb(gpointer user_data)
if (device->rpa)
ba2str(device->rpa, device_addr);
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(device->adapter),
device_addr);
create_file(filename, 0600);
@@ -802,7 +802,7 @@ void device_store_cached_name(struct btd_device *dev, const char *name)
ba2str(dev->rpa, d_addr);
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(dev->adapter), d_addr);
create_file(filename, 0600);
@@ -851,7 +851,7 @@ static void device_store_cached_name_resolve(struct btd_device *dev)
}
ba2str(&dev->bdaddr, d_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(dev->adapter), d_addr);
create_file(filename, 0600);
@@ -3094,7 +3094,7 @@ static void store_services(struct btd_device *device)
ba2str(device->rpa, dst_addr);
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes",
+ create_filename(filename, PATH_MAX, "/%s/%s/attributes",
btd_adapter_get_storage_dir(device->adapter),
dst_addr);
key_file = g_key_file_new();
@@ -3323,7 +3323,7 @@ static void store_gatt_db(struct btd_device *device)
ba2str(&device->bdaddr, dst_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(device->adapter),
dst_addr);
create_file(filename, 0600);
@@ -5820,7 +5820,7 @@ static char *load_cached_name(struct btd_device *device, const char *local,
if (device_address_is_private(device))
return NULL;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
key_file = g_key_file_new();
@@ -5850,7 +5850,7 @@ static void load_cached_name_resolve(struct btd_device *device,
if (device_address_is_private(device))
return;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
key_file = g_key_file_new();
@@ -5946,7 +5946,7 @@ static void convert_info(struct btd_device *device, GKeyFile *key_file)
ba2str(btd_adapter_get_address(device->adapter), adapter_addr);
ba2str(&device->bdaddr, device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr,
+ create_filename(filename, PATH_MAX, "/%s/%s/info", adapter_addr,
device_addr);
str = g_key_file_to_data(key_file, &length, NULL);
@@ -6178,8 +6178,7 @@ static void load_att_info(struct btd_device *device, const char *local,
char tmp[3];
int i;
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", local,
- peer);
+ create_filename(filename, PATH_MAX, "/%s/%s/attributes", local, peer);
/* Check if attributes file exists */
if (stat(filename, &st) < 0)
@@ -6576,7 +6575,7 @@ static void load_gatt_db(struct btd_device *device, const char *local,
DBG("Restoring %s gatt database from file", peer);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
@@ -7031,9 +7030,9 @@ struct btd_device *device_create(struct btd_adapter *adapter,
return device;
}
-char *btd_device_get_storage_path(struct btd_device *device,
- const char *filename)
+char *btd_device_get_storage_path(struct btd_device *device, const char *name)
{
+ char filename[PATH_MAX];
char dstaddr[18];
if (device_address_is_private(device)) {
@@ -7049,14 +7048,16 @@ char *btd_device_get_storage_path(struct btd_device *device,
ba2str(device->rpa, dstaddr);
#endif
- if (!filename)
- return g_strdup_printf(STORAGEDIR "/%s/%s",
+ if (!name)
+ create_filename(filename, PATH_MAX, "/%s/%s",
btd_adapter_get_storage_dir(device->adapter),
dstaddr);
-
- return g_strdup_printf(STORAGEDIR "/%s/%s/%s",
+ else
+ create_filename(filename, PATH_MAX, "/%s/%s/%s",
btd_adapter_get_storage_dir(device->adapter),
- dstaddr, filename);
+ dstaddr, name);
+
+ return strdup(filename);
}
void btd_device_device_set_name(struct btd_device *device, const char *name)
@@ -7330,7 +7331,8 @@ static void delete_folder_tree(const char *dirname)
if (entry->d_type == DT_UNKNOWN)
entry->d_type = util_get_dt(dirname, entry->d_name);
- snprintf(filename, PATH_MAX, "%s/%s", dirname, entry->d_name);
+ create_filename(filename, PATH_MAX, "%s/%s", dirname,
+ entry->d_name);
if (entry->d_type == DT_DIR)
delete_folder_tree(filename);
@@ -7384,12 +7386,12 @@ static void device_remove_stored(struct btd_device *device)
ba2str(device->rpa, device_addr);
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
+ create_filename(filename, PATH_MAX, "/%s/%s",
btd_adapter_get_storage_dir(device->adapter),
device_addr);
delete_folder_tree(filename);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s",
+ create_filename(filename, PATH_MAX, "/%s/cache/%s",
btd_adapter_get_storage_dir(device->adapter),
device_addr);
@@ -8067,8 +8069,7 @@ static void update_bredr_services(struct browse_req *req, sdp_list_t *recs)
ba2str(btd_adapter_get_address(device->adapter), srcaddr);
ba2str(&device->bdaddr, dstaddr);
- snprintf(sdp_file, PATH_MAX, STORAGEDIR "/%s/cache/%s", srcaddr,
- dstaddr);
+ create_filename(sdp_file, PATH_MAX, "/%s/cache/%s", srcaddr, dstaddr);
create_file(sdp_file, 0600);
sdp_key_file = g_key_file_new();
@@ -8080,8 +8081,8 @@ static void update_bredr_services(struct browse_req *req, sdp_list_t *recs)
sdp_key_file = NULL;
}
- snprintf(att_file, PATH_MAX, STORAGEDIR "/%s/%s/attributes", srcaddr,
- dstaddr);
+ create_filename(att_file, PATH_MAX, "/%s/%s/attributes", srcaddr,
+ dstaddr);
create_file(att_file, 0600);
att_key_file = g_key_file_new();
@@ -9372,7 +9373,7 @@ void device_store_svc_chng_ccc(struct btd_device *device, uint8_t bdaddr_type,
char *str;
ba2str(&device->bdaddr, device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(device->adapter),
device_addr);
@@ -9426,7 +9427,7 @@ void device_load_svc_chng_ccc(struct btd_device *device, uint16_t *ccc_le,
GError *gerr = NULL;
ba2str(&device->bdaddr, device_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
+ create_filename(filename, PATH_MAX, "/%s/%s/info",
btd_adapter_get_storage_dir(device->adapter),
device_addr);
@@ -10393,7 +10394,7 @@ static sdp_list_t *read_device_records(struct btd_device *device)
ba2str(device->rpa, peer);
#endif
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
diff --git a/src/storage.c b/src/storage.c
index d53c058a..950d8538 100755
--- a/src/storage.c
+++ b/src/storage.c
@@ -42,21 +42,11 @@ struct match {
char *pattern;
};
-static inline int create_filename(char *buf, size_t size,
- const bdaddr_t *bdaddr, const char *name)
-{
- char addr[18];
-
- ba2str(bdaddr, addr);
-
- return create_name(buf, size, STORAGEDIR, addr, name);
-}
-
int read_discoverable_timeout(const char *src, int *timeout)
{
char filename[PATH_MAX], *str;
- create_name(filename, PATH_MAX, STORAGEDIR, src, "config");
+ create_name(filename, PATH_MAX, src, "config");
str = textfile_get(filename, "discovto");
if (!str)
@@ -76,7 +66,7 @@ int read_pairable_timeout(const char *src, int *timeout)
{
char filename[PATH_MAX], *str;
- create_name(filename, PATH_MAX, STORAGEDIR, src, "config");
+ create_name(filename, PATH_MAX, src, "config");
str = textfile_get(filename, "pairto");
if (!str)
@@ -96,7 +86,7 @@ int read_on_mode(const char *src, char *mode, int length)
{
char filename[PATH_MAX], *str;
- create_name(filename, PATH_MAX, STORAGEDIR, src, "config");
+ create_name(filename, PATH_MAX, src, "config");
str = textfile_get(filename, "onmode");
if (!str)
@@ -114,8 +104,11 @@ int read_local_name(const bdaddr_t *bdaddr, char *name)
{
char filename[PATH_MAX], *str;
int len;
+ char addr[18];
+
+ ba2str(bdaddr, addr);
- create_filename(filename, PATH_MAX, bdaddr, "config");
+ create_filename(filename, PATH_MAX, "/%s/config", addr);
str = textfile_get(filename, "name");
if (!str)
@@ -132,7 +125,7 @@ int read_local_name(const bdaddr_t *bdaddr, char *name)
}
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-int write_device_characteristics(const bdaddr_t *sba, const bdaddr_t *dba,
+int write_device_characteristics(const char *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, uint16_t handle,
const char *chars)
{
@@ -148,7 +141,7 @@ int write_device_characteristics(const bdaddr_t *sba, const bdaddr_t *dba,
return textfile_put(filename, key, chars);
}
-char *read_device_characteristics(const bdaddr_t *sba, const bdaddr_t *dba,
+char *read_device_characteristics(const char *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, uint16_t handle)
{
char filename[PATH_MAX + 1], addr[18], key[25];
@@ -161,7 +154,7 @@ char *read_device_characteristics(const bdaddr_t *sba, const bdaddr_t *dba,
return textfile_get(filename, key);
}
-int write_device_attribute(const bdaddr_t *sba, const bdaddr_t *dba,
+int write_device_attribute(const char *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, uint16_t handle,
const char *chars)
{
diff --git a/src/storage.h b/src/storage.h
index a89058cd..fd31936f 100755
--- a/src/storage.h
+++ b/src/storage.h
@@ -13,12 +13,12 @@ int read_pairable_timeout(const char *src, int *timeout);
int read_on_mode(const char *src, char *mode, int length);
int read_local_name(const bdaddr_t *bdaddr, char *name);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-int write_device_characteristics(const bdaddr_t *sba, const bdaddr_t *dba,
+int write_device_characteristics(const char *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, uint16_t handle,
const char *chars);
-char *read_device_characteristics(const bdaddr_t *sba, const bdaddr_t *dba,
+char *read_device_characteristics(const char *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, uint16_t handle);
-int write_device_attribute(const bdaddr_t *sba, const bdaddr_t *dba,
+int write_device_attribute(const char *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, uint16_t handle,
const char *chars);
#endif
diff --git a/src/textfile.c b/src/textfile.c
index 9a8b4642..da8f9203 100755
--- a/src/textfile.c
+++ b/src/textfile.c
@@ -18,6 +18,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <sys/file.h>
#include <sys/stat.h>
@@ -26,6 +27,42 @@
#include "textfile.h"
+int create_filename(char *str, size_t size, const char *fmt, ...)
+{
+ static const char *prefix;
+ static int prefix_len;
+ char suffix[PATH_MAX];
+ va_list ap;
+ int err;
+
+ if (!prefix) {
+ const char *statedir = getenv("STATE_DIRECTORY");
+
+ /* Check if running as service */
+ if (statedir) {
+ prefix = statedir;
+
+ /* Check if there multiple paths given */
+ if (strstr(prefix, ":"))
+ prefix_len = strstr(prefix, ":") - prefix;
+ else
+ prefix_len = strlen(prefix);
+ } else {
+ prefix = STORAGEDIR;
+ prefix_len = strlen(prefix);
+ }
+ }
+
+ va_start(ap, fmt);
+ err = vsnprintf(suffix, sizeof(suffix), fmt, ap);
+ va_end(ap);
+
+ if (err < 0)
+ return err;
+
+ return snprintf(str, size, "%*s%s", prefix_len, prefix, suffix);
+}
+
static int create_dirs(const char *filename, const mode_t mode)
{
struct stat st;
@@ -75,9 +112,9 @@ int create_file(const char *filename, const mode_t mode)
return 0;
}
-int create_name(char *buf, size_t size, const char *path, const char *address, const char *name)
+int create_name(char *buf, size_t size, const char *address, const char *name)
{
- return snprintf(buf, size, "%s/%s/%s", path, address, name);
+ return create_filename(buf, size, "/%s/%s", address, name);
}
static inline char *find_key(char *map, size_t size, const char *key, size_t len, int icase)
diff --git a/src/textfile.h b/src/textfile.h
index b4e2e024..4ecd5ed9 100755
--- a/src/textfile.h
+++ b/src/textfile.h
@@ -8,9 +8,10 @@
*
*/
+int create_filename(char *str, size_t size, const char *fmt, ...)
+ __attribute__((format(printf, 3, 4)));
int create_file(const char *filename, const mode_t mode);
-int create_name(char *buf, size_t size, const char *path,
- const char *address, const char *name);
+int create_name(char *buf, size_t size, const char *address, const char *name);
int textfile_put(const char *pathname, const char *key, const char *value);
int textfile_del(const char *pathname, const char *key);