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