From: Daniel Wagner <daniel.wag...@bmw-carit.de> --- plugins/session_policy_ivi.c | 116 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+)
diff --git a/plugins/session_policy_ivi.c b/plugins/session_policy_ivi.c index 063e763..5e6b04b 100644 --- a/plugins/session_policy_ivi.c +++ b/plugins/session_policy_ivi.c @@ -24,6 +24,7 @@ #endif #include <errno.h> +#include <string.h> #include <glib.h> @@ -38,6 +39,7 @@ static DBusConnection *connection; static GHashTable *session_hash; +static GHashTable *ident_hash; struct create_data { struct connman_session *session; @@ -46,6 +48,7 @@ struct create_data { }; struct policy_data { + char *ident; struct connman_session *session; struct connman_session_config *config; @@ -59,6 +62,7 @@ static void cleanup_policy(struct policy_data *policy) if (policy->config != NULL) connman_session_free_bearers(policy->config->allowed_bearers); + g_free(policy->ident); g_free(policy->config); g_free(policy); } @@ -174,6 +178,101 @@ static struct connman_session_policy session_policy_ivi = { .destroy = policy_ivi_destroy, }; +static int load_policy(struct policy_data *policy) +{ + return 0; +} + +static struct policy_data *create_policy(const char *ident) +{ + struct policy_data *policy; + char *key; + + DBG("ident %s", ident); + + if (g_hash_table_lookup(ident_hash, ident) != NULL) + return NULL; + + policy = g_try_new0(struct policy_data, 1); + if (policy == NULL) + return NULL; + + key = g_strdup(ident); + policy->ident = g_strdup(ident); + policy->config = new_config(); + + if (key == NULL || policy->ident == NULL || policy->config == NULL) { + g_free(key); + cleanup_policy(policy); + return NULL; + } + + g_hash_table_replace(ident_hash, key, policy); + + connman_info("Adding configuration %s", ident); + + return policy; +} + +static connman_bool_t validate_ident(const char *ident) +{ + unsigned int i; + + if (ident == NULL) + return FALSE; + + for (i = 0; i < strlen(ident); i++) + if (g_ascii_isprint(ident[i]) == FALSE) + return FALSE; + + return TRUE; +} + +static int read_policies(void) +{ + GDir *dir; + + DBG(""); + + dir = g_dir_open(STORAGEDIR, 0, NULL); + if (dir != NULL) { + const gchar *file; + + while ((file = g_dir_read_name(dir)) != NULL) { + GString *str; + gchar *ident; + + if (g_str_has_suffix(file, ".policy") == FALSE) + continue; + + ident = g_strrstr(file, ".policy"); + if (ident == NULL) + continue; + + str = g_string_new_len(file, ident - file); + if (str == NULL) + continue; + + ident = g_string_free(str, FALSE); + + if (validate_ident(ident) == TRUE) { + struct policy_data *policy; + + policy = create_policy(ident); + if (policy != NULL) + load_policy(policy); + } else { + connman_error("Invalid config ident %s", ident); + } + g_free(ident); + } + + g_dir_close(dir); + } + + return 0; +} + static int session_policy_ivi_init(void) { int err; @@ -194,9 +293,25 @@ static int session_policy_ivi_init(void) goto err; } + ident_hash = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); + if (ident_hash == NULL) { + err = -ENOMEM; + connman_session_policy_unregister(&session_policy_ivi); + goto err; + } + + read_policies(); + return 0; err: + if (session_hash != NULL) + g_hash_table_destroy(session_hash); + + if (ident_hash != NULL) + g_hash_table_destroy(ident_hash); + dbus_connection_unref(connection); return err; @@ -216,6 +331,7 @@ static void session_policy_ivi_exit(void) } g_hash_table_destroy(session_hash); + g_hash_table_destroy(ident_hash); connman_session_policy_unregister(&session_policy_ivi); -- 1.7.12.1.382.gb0576a6 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman