From: Daniel Wagner <[email protected]>
Instead of using 'enums' for the allowed bearer we drop back
and use strings again. The main reason is that we want also
to support service name as valid 'bearer type' in the policy plugin.
The D-Bus API will still only accept real bearer types.
---
include/session.h | 1 -
plugins/session_policy_local.c | 23 +++++----
src/session.c | 106 +++++++++++++++++------------------------
3 files changed, 60 insertions(+), 70 deletions(-)
diff --git a/include/session.h b/include/session.h
index 61cc264..54f4d4a 100644
--- a/include/session.h
+++ b/include/session.h
@@ -109,7 +109,6 @@ struct connman_session_config
*connman_session_create_default_config(void);
enum connman_session_roaming_policy connman_session_parse_roaming_policy(const
char *policy);
enum connman_session_type connman_session_parse_connection_type(const char
*type);
-int connman_session_parse_bearers(const char *token, GSList **list);
const char *connman_session_get_owner(struct connman_session *session);
diff --git a/plugins/session_policy_local.c b/plugins/session_policy_local.c
index 8a25c3c..cac6f72 100644
--- a/plugins/session_policy_local.c
+++ b/plugins/session_policy_local.c
@@ -104,11 +104,19 @@ struct policy_config {
struct policy_group *group;
};
+static gpointer copy_string(gconstpointer src, gpointer data)
+{
+ const char *string = src;
+
+ return g_strdup(string);
+}
+
static void copy_session_config(struct connman_session_config *dst,
struct connman_session_config *src)
{
- g_slist_free(dst->allowed_bearers);
- dst->allowed_bearers = g_slist_copy(src->allowed_bearers);
+ g_slist_free_full(dst->allowed_bearers, g_free);
+ dst->allowed_bearers =
+ g_slist_copy_deep(src->allowed_bearers, copy_string, NULL);
dst->ecall = src->ecall;
dst->type = src->type;
dst->roaming_policy = src->roaming_policy;
@@ -450,10 +458,9 @@ static int load_policy(GKeyFile *keyfile, const char
*groupname,
tokens = g_strsplit(str, " ", 0);
for (i = 0; tokens[i] != NULL; i++) {
- err = connman_session_parse_bearers(tokens[i],
- &config->allowed_bearers);
- if (err < 0)
- break;
+ config->allowed_bearers =
+ g_slist_append(config->allowed_bearers,
+ g_strdup(tokens[i]));
}
g_free(str);
@@ -496,7 +503,7 @@ static void cleanup_config(gpointer user_data)
policy->group->sessions =
g_slist_remove(policy->group->sessions, policy);
- g_slist_free(policy->config->allowed_bearers);
+ g_slist_free_full(policy->config->allowed_bearers, g_free);
g_free(policy->config->id);
g_free(policy->config);
g_free(policy->selinux_context);
@@ -514,7 +521,7 @@ static void cleanup_group(gpointer user_data)
g_slist_free_full(group->sessions, set_default_config);
- g_slist_free(group->config->allowed_bearers);
+ g_slist_free_full(group->config->allowed_bearers, g_free);
g_free(group->config->id);
g_free(group->config);
if (group->selinux != NULL)
diff --git a/src/session.c b/src/session.c
index 690e014..bcbb009 100644
--- a/src/session.c
+++ b/src/session.c
@@ -431,7 +431,7 @@ static void free_session(struct connman_session *session)
g_dbus_remove_watch(connection, session->notify_watch);
destroy_policy_config(session);
- g_slist_free(session->info->config.allowed_bearers);
+ g_slist_free_full(session->info->config.allowed_bearers, g_free);
g_free(session->owner);
g_free(session->session_path);
g_free(session->notify_path);
@@ -451,7 +451,7 @@ static void nfacct_cleanup_cb(int error, struct
nfacct_context *ctx,
__connman_nfacct_destroy_context(session->nfctx);
- g_slist_free(session->user_allowed_bearers);
+ g_slist_free_full(session->user_allowed_bearers, g_free);
if (session->service_hash != NULL)
g_hash_table_destroy(session->service_hash);
g_list_free(session->service_list);
@@ -506,7 +506,7 @@ static void cleanup_creation_data(struct creation_data
*creation_data)
if (creation_data->pending != NULL)
dbus_message_unref(creation_data->pending);
- g_slist_free(creation_data->allowed_bearers);
+ g_slist_free_full(creation_data->allowed_bearers, g_free);
g_free(creation_data);
}
@@ -619,9 +619,8 @@ void connman_session_set_default_config(struct
connman_session_config *config)
config->type = CONNMAN_SESSION_TYPE_ANY;
config->ecall = FALSE;
- g_slist_free(config->allowed_bearers);
- config->allowed_bearers = g_slist_prepend(NULL,
- GINT_TO_POINTER(CONNMAN_SERVICE_TYPE_UNKNOWN));
+ g_slist_free_full(config->allowed_bearers, g_free);
+ config->allowed_bearers = g_slist_prepend(NULL, g_strdup("*"));
}
struct connman_session_config *connman_session_create_default_config(void)
@@ -650,23 +649,6 @@ static enum connman_session_type apply_policy_on_type(
return CONNMAN_SESSION_TYPE_INTERNET;
}
-int connman_session_parse_bearers(const char *token, GSList **list)
-{
- enum connman_service_type bearer;
- int err;
-
- if (g_strcmp0(token, "") == 0)
- return 0;
-
- err = bearer2service(token, &bearer);
- if (err < 0)
- return err;
-
- *list = g_slist_append(*list, GINT_TO_POINTER(bearer));
-
- return 0;
-}
-
static int parse_bearers(DBusMessageIter *iter, GSList **list)
{
DBusMessageIter array;
@@ -679,58 +661,62 @@ static int parse_bearers(DBusMessageIter *iter, GSList
**list)
while ((type = dbus_message_iter_get_arg_type(&array)) !=
DBUS_TYPE_INVALID) {
char *bearer_name = NULL;
+ enum connman_service_type bearer;
if (type != DBUS_TYPE_STRING) {
- g_slist_free(*list);
+ g_slist_free_full(*list, g_free);
*list = NULL;
return -EINVAL;
}
dbus_message_iter_get_basic(&array, &bearer_name);
- err = connman_session_parse_bearers(bearer_name, list);
+ /*
+ * Check if it is a valid service type provided via
+ * the D-Bus API
+ */
+ err = bearer2service(bearer_name, &bearer);
if (err < 0) {
- g_slist_free(*list);
+ g_slist_free_full(*list, g_free);
*list = NULL;
return err;
}
+ *list = g_slist_append(*list, g_strdup(bearer_name));
+
dbus_message_iter_next(&array);
}
return 0;
}
-static int filter_bearer(GSList *policy_bearers,
- enum connman_service_type bearer,
+static int filter_bearer(GSList *policy_bearers, const char *bearer,
GSList **list)
{
- enum connman_service_type policy;
GSList *it;
+ const char *tmp = NULL;
if (policy_bearers == NULL)
return 0;
for (it = policy_bearers; it != NULL; it = it->next) {
- policy = GPOINTER_TO_INT(it->data);
+ char *policy = it->data;
- if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) {
- bearer = policy;
- goto clone;
+ if (g_strcmp0(bearer, "*") == 0) {
+ tmp = policy;
+ break;
}
- if (policy != CONNMAN_SERVICE_TYPE_UNKNOWN && policy != bearer)
+ if (g_strcmp0(policy, "*") != 0 &&
+ g_strcmp0(policy, bearer) != 0)
continue;
- goto clone;
+ tmp = bearer;
+ break;
}
- *list = NULL;
-
- return 0;
-
-clone:
- *list = g_slist_append(*list, GINT_TO_POINTER(bearer));
+ if (tmp != NULL)
+ *list = g_slist_append(*list, g_strdup(tmp));
return 0;
}
@@ -738,14 +724,13 @@ clone:
static int apply_policy_on_bearers(GSList *policy_bearers, GSList *bearers,
GSList **list)
{
- enum connman_service_type bearer;
GSList *it;
int err;
*list = NULL;
for (it = bearers; it != NULL; it = it->next) {
- bearer = GPOINTER_TO_INT(it->data);
+ char *bearer = it->data;
err = filter_bearer(policy_bearers, bearer, list);
if (err < 0)
@@ -767,14 +752,10 @@ static void append_allowed_bearers(DBusMessageIter *iter,
void *user_data)
for (list = info->config.allowed_bearers;
list != NULL; list = list->next) {
- enum connman_service_type bearer = GPOINTER_TO_INT(list->data);
- const char *name = __connman_service_type2string(bearer);
-
- if (name == NULL)
- name = "*";
+ char *bearer = list->data;
dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
- &name);
+ &bearer);
}
}
@@ -998,14 +979,18 @@ static connman_bool_t service_type_match(struct
connman_session *session,
for (list = info->config.allowed_bearers;
list != NULL; list = list->next) {
- enum connman_service_type bearer = GPOINTER_TO_INT(list->data);
+ char *bearer = list->data;
+ enum connman_service_type bearer_type;
enum connman_service_type service_type;
- if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN)
+ if (g_strcmp0(bearer, "*") == 0)
return TRUE;
+ if (bearer2service(bearer, &bearer_type) < 0)
+ return FALSE;
+
service_type = connman_service_get_type(service);
- if (bearer == service_type)
+ if (bearer_type == service_type)
return TRUE;
}
@@ -1068,7 +1053,11 @@ static gint sort_allowed_bearers(struct connman_service
*service_a,
for (list = info->config.allowed_bearers;
list != NULL; list = list->next) {
- enum connman_service_type bearer = GPOINTER_TO_INT(list->data);
+ char *bearer_name = list->data;
+ enum connman_service_type bearer;
+
+ if (bearer2service(bearer_name, &bearer) < 0)
+ return -1;
if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) {
if (type_a != type_b) {
@@ -1655,7 +1644,7 @@ int connman_session_config_update(struct connman_session
*session)
if (err < 0)
return err;
- g_slist_free(info->config.allowed_bearers);
+ g_slist_free_full(info->config.allowed_bearers, g_free);
info->config.allowed_bearers = allowed_bearers;
info->config.type = apply_policy_on_type(
@@ -1746,7 +1735,7 @@ static DBusMessage *change_session(DBusConnection *conn,
if (err < 0)
return __connman_error_failed(msg, err);
- g_slist_free(info->config.allowed_bearers);
+ g_slist_free_full(info->config.allowed_bearers, g_free);
session->user_allowed_bearers = allowed_bearers;
err = apply_policy_on_bearers(
@@ -2100,12 +2089,7 @@ int __connman_session_create(DBusMessage *msg)
*/
if (user_allowed_bearers == FALSE) {
creation_data->allowed_bearers =
- g_slist_append(NULL,
- GINT_TO_POINTER(CONNMAN_SERVICE_TYPE_UNKNOWN));
- if (creation_data->allowed_bearers == NULL) {
- err = -ENOMEM;
- goto err;
- }
+ g_slist_append(NULL, g_strdup("*"));
}
/* ... and for ConnectionType it is 'any'. */
--
1.8.2.rc3.16.gce432ca
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman