[RFC V3 04/12] adapter: Add force dir creation to convert_file()
From: Frédéric Danis <hidden>
Date: 2012-11-30 14:46:58
Subsystem:
the rest · Maintainer:
Linus Torvalds
Some device information, like class or device id, should only be converted if directory for this device has already been created during previous conversion (from aliases, trusts, blocked, ... files). --- src/adapter.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 8e3251b..a976793 100644
--- a/src/adapter.c
+++ b/src/adapter.c@@ -34,6 +34,7 @@ #include <stdbool.h> #include <sys/ioctl.h> #include <sys/file.h> +#include <sys/stat.h> #include <bluetooth/bluetooth.h> #include <bluetooth/uuid.h>
@@ -2526,6 +2527,7 @@ static void convert_names_entry(char *key, char *value, void *user_data) struct device_converter { char *address; void (*cb)(GKeyFile *key_file, void *value); + gboolean force; }; static void convert_aliases_entry(GKeyFile *key_file, void *value)
@@ -2601,6 +2603,19 @@ static void convert_entry(char *key, char *value, void *user_data) if (bachk(key) != 0) return; + if (converter->force == FALSE) { + struct stat st; + int err; + + snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", + converter->address, key); + filename[PATH_MAX] = '\0'; + + err = stat(filename, &st); + if (err || !S_ISDIR(st.st_mode)) + return; + } + snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", converter->address, key); filename[PATH_MAX] = '\0';
@@ -2621,7 +2636,8 @@ static void convert_entry(char *key, char *value, void *user_data) } static void convert_file(char *file, char *address, - void (*cb)(GKeyFile *key_file, void *value)) + void (*cb)(GKeyFile *key_file, void *value), + gboolean force) { char filename[PATH_MAX + 1]; struct device_converter converter;
@@ -2636,6 +2652,7 @@ static void convert_file(char *file, char *address, } else { converter.address = address; converter.cb = cb; + converter.force = force; textfile_foreach(filename, convert_entry, &converter); textfile_put(filename, "converted", "yes");
@@ -2665,19 +2682,19 @@ static void convert_device_storage(struct btd_adapter *adapter) free(str); /* Convert aliases */ - convert_file("aliases", address, convert_aliases_entry); + convert_file("aliases", address, convert_aliases_entry, TRUE); /* Convert trusts */ - convert_file("trusts", address, convert_trusts_entry); - - /* Convert classes */ - convert_file("classes", address, convert_classes_entry); + convert_file("trusts", address, convert_trusts_entry, TRUE); /* Convert blocked */ - convert_file("blocked", address, convert_blocked_entry); + convert_file("blocked", address, convert_blocked_entry, TRUE); + + /* Convert classes */ + convert_file("classes", address, convert_classes_entry, FALSE); /* Convert device ids */ - convert_file("did", address, convert_did_entry); + convert_file("did", address, convert_did_entry, FALSE); } static void convert_config(struct btd_adapter *adapter, const char *filename,
--
1.7.9.5