In order to be able to passing the user configuration provided
through the D-Bus Manager.SessionCreate() call to the callback
we need to store the configuration into a local data data structure.
This can then be passed into the callback we introduce in the following
patches.
---
 src/session.c | 50 ++++++++++++++++++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 16 deletions(-)

diff --git a/src/session.c b/src/session.c
index ddc5252..b1f11de 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1584,6 +1584,14 @@ static const GDBusMethodTable session_methods[] = {
        { },
 };
 
+struct user_config {
+       enum connman_session_type type;
+       connman_bool_t type_valid;
+
+       GSList *allowed_bearers;
+       connman_bool_t allowed_bearers_valid;
+};
+
 static void session_create_cb(struct connman_session *session,
                                struct connman_session_config *config,
                                void *user_data)
@@ -1600,10 +1608,7 @@ int __connman_session_create(DBusMessage *msg)
        DBusMessageIter iter, array;
        struct connman_session *session = NULL;
        struct session_info *info, *info_last;
-       enum connman_session_type type = CONNMAN_SESSION_TYPE_ANY;
-       GSList *allowed_bearers = NULL;
-       connman_bool_t allowed_bearers_valid = FALSE;
-       connman_bool_t type_valid = FALSE;
+       struct user_config *config = NULL;
        int err;
 
        owner = dbus_message_get_sender(msg);
@@ -1619,6 +1624,14 @@ int __connman_session_create(DBusMessage *msg)
                goto err;
        }
 
+       config = g_try_new0(struct user_config, 1);
+       if (config == NULL) {
+               err = -ENOMEM;
+               goto err;
+       }
+
+       config->type = CONNMAN_SESSION_TYPE_ANY;
+
        dbus_message_iter_init(msg, &iter);
        dbus_message_iter_recurse(&iter, &array);
 
@@ -1636,11 +1649,11 @@ int __connman_session_create(DBusMessage *msg)
                case DBUS_TYPE_ARRAY:
                        if (g_str_equal(key, "AllowedBearers") == TRUE) {
                                err = session_parse_allowed_bearers(&value,
-                                                       &allowed_bearers);
+                                               &config->allowed_bearers);
                                if (err < 0)
                                        goto err;
 
-                               allowed_bearers_valid = TRUE;
+                               config->allowed_bearers_valid = TRUE;
                        } else {
                                return -EINVAL;
                        }
@@ -1648,8 +1661,8 @@ int __connman_session_create(DBusMessage *msg)
                case DBUS_TYPE_STRING:
                        if (g_str_equal(key, "ConnectionType") == TRUE) {
                                dbus_message_iter_get_basic(&value, &val);
-                               type = string2type(val);
-                               type_valid = TRUE;
+                               config->type = string2type(val);
+                               config->type_valid = TRUE;
                        } else {
                                return -EINVAL;
                        }
@@ -1717,18 +1730,18 @@ int __connman_session_create(DBusMessage *msg)
                ecall_session = session;
 
        info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
-       if (type_valid == FALSE)
-               type = CONNMAN_SESSION_TYPE_ANY;
+       if (config->type_valid == FALSE)
+               config->type = CONNMAN_SESSION_TYPE_ANY;
        info->config.type = apply_policy_on_type(
                                session->policy_config->type,
-                               type);
+                               config->type);
        info->config.priority = session->policy_config->priority;
        info->config.roaming_policy = session->policy_config->roaming_policy;
        info->entry = NULL;
 
-       if (allowed_bearers_valid == FALSE) {
-               allowed_bearers = connman_session_allowed_bearers_any();
-               if (allowed_bearers == NULL) {
+       if (config->allowed_bearers_valid == FALSE) {
+               config->allowed_bearers = connman_session_allowed_bearers_any();
+               if (config->allowed_bearers == NULL) {
                        err = -ENOMEM;
                        goto err;
                }
@@ -1736,11 +1749,14 @@ int __connman_session_create(DBusMessage *msg)
 
        err = apply_policy_on_bearers(
                        session->policy_config->allowed_bearers,
-                       allowed_bearers,
+                       config->allowed_bearers,
                        &info->config.allowed_bearers);
        if (err < 0)
                goto err;
 
+       connman_session_free_bearers(config->allowed_bearers);
+       g_free(config);
+
        g_hash_table_replace(session_hash, session->session_path, session);
 
        DBG("add %s", session->session_path);
@@ -1789,7 +1805,9 @@ err:
 
        g_free(session_path);
 
-       connman_session_free_bearers(allowed_bearers);
+       if (config != NULL)
+               connman_session_free_bearers(config->allowed_bearers);
+       g_free(config);
 
        return err;
 }
-- 
1.7.11.4

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to