static int parse_bearers(DBusMessageIter *iter, GSList **list) { DBusMessageIter array; int type, err; dbus_message_iter_recurse(iter, &array); *list = NULL; while ((type = dbus_message_iter_get_arg_type(&array)) != DBUS_TYPE_INVALID) { char *bearer_name = NULL; if (type != DBUS_TYPE_STRING) { g_slist_free(*list); *list = NULL; return -EINVAL; } dbus_message_iter_get_basic(&array, &bearer_name); err = connman_session_parse_bearers(bearer_name, list); if (err < 0) { g_slist_free(*list); *list = NULL; return err; } dbus_message_iter_next(&array); } return 0; }
static int load_policy(GKeyFile *keyfile, const char *groupname, struct policy_group *group) { struct connman_session_config *config = group->config; char *str, **tokens; int i, err = 0; group->selinux = g_key_file_get_string(keyfile, groupname, "selinux", NULL); group->gid = g_key_file_get_string(keyfile, groupname, "gid", NULL); group->uid = g_key_file_get_string(keyfile, groupname, "uid", NULL); if (!group->selinux && !group->gid && !group->uid) return -EINVAL; config->priority = g_key_file_get_boolean(keyfile, groupname, "Priority", NULL); str = g_key_file_get_string(keyfile, groupname, "RoamingPolicy", NULL); if (str) { config->roaming_policy = connman_session_parse_roaming_policy(str); g_free(str); } str = g_key_file_get_string(keyfile, groupname, "ConnectionType", NULL); if (str) { config->type = connman_session_parse_connection_type(str); g_free(str); } config->ecall = g_key_file_get_boolean(keyfile, groupname, "EmergencyCall", NULL); str = g_key_file_get_string(keyfile, groupname, "AllowedBearers", NULL); if (str) { tokens = g_strsplit(str, " ", 0); for (i = 0; tokens[i]; i++) { err = connman_session_parse_bearers(tokens[i], &config->allowed_bearers); if (err < 0) break; } g_free(str); g_strfreev(tokens); } DBG("group %p selinux %s uid %s gid %s", group, group->selinux, group->uid, group->gid); return err; }