Blame src/gclue-config.c

Packit Service b2c451
/* vim: set et ts=8 sw=8: */
Packit Service b2c451
/* gclue-config.c
Packit Service b2c451
 *
Packit Service b2c451
 * Copyright 2013 Red Hat, Inc.
Packit Service b2c451
 *
Packit Service b2c451
 * Geoclue is free software; you can redistribute it and/or modify it under
Packit Service b2c451
 * the terms of the GNU General Public License as published by the Free
Packit Service b2c451
 * Software Foundation; either version 2 of the License, or (at your option)
Packit Service b2c451
 * any later version.
Packit Service b2c451
 *
Packit Service b2c451
 * Geoclue is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service b2c451
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service b2c451
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
Packit Service b2c451
 * details.
Packit Service b2c451
 *
Packit Service b2c451
 * You should have received a copy of the GNU General Public License along
Packit Service b2c451
 * with Geoclue; if not, write to the Free Software Foundation, Inc.,
Packit Service b2c451
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service b2c451
 *
Packit Service b2c451
 * Authors: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
Packit Service b2c451
 */
Packit Service b2c451
Packit Service b2c451
#include <glib/gi18n.h>
Packit Service b2c451
#include <config.h>
Packit Service b2c451
Packit Service b2c451
#include "gclue-config.h"
Packit Service b2c451
Packit Service b2c451
#define CONFIG_FILE_PATH SYSCONFDIR "/geoclue/geoclue.conf"
Packit Service b2c451
Packit Service b2c451
/* This class will be responsible for fetching configuration. */
Packit Service b2c451
Packit Service b2c451
struct _GClueConfigPrivate
Packit Service b2c451
{
Packit Service b2c451
        GKeyFile *key_file;
Packit Service b2c451
Packit Service b2c451
        char **agents;
Packit Service b2c451
        gsize num_agents;
Packit Service b2c451
Packit Service b2c451
        char *wifi_url;
Packit Service b2c451
        gboolean wifi_submit;
Packit Service b2c451
        gboolean enable_nmea_source;
Packit Service b2c451
        gboolean enable_3g_source;
Packit Service b2c451
        gboolean enable_cdma_source;
Packit Service b2c451
        gboolean enable_modem_gps_source;
Packit Service b2c451
        gboolean enable_wifi_source;
Packit Service b2c451
        char *wifi_submit_url;
Packit Service b2c451
        char *wifi_submit_nick;
Packit Service b2c451
Packit Service b2c451
        GList *app_configs;
Packit Service b2c451
};
Packit Service b2c451
Packit Service b2c451
G_DEFINE_TYPE_WITH_CODE (GClueConfig,
Packit Service b2c451
                         gclue_config,
Packit Service b2c451
                         G_TYPE_OBJECT,
Packit Service b2c451
                         G_ADD_PRIVATE (GClueConfig))
Packit Service b2c451
Packit Service b2c451
typedef struct
Packit Service b2c451
{
Packit Service b2c451
        char *id;
Packit Service b2c451
        gboolean allowed;
Packit Service b2c451
        gboolean system;
Packit Service b2c451
        int* users;
Packit Service b2c451
        gsize num_users;
Packit Service b2c451
} AppConfig;
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
app_config_free (AppConfig *app_config)
Packit Service b2c451
{
Packit Service b2c451
        g_free (app_config->id);
Packit Service b2c451
        g_free (app_config->users);
Packit Service b2c451
        g_slice_free (AppConfig, app_config);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_config_finalize (GObject *object)
Packit Service b2c451
{
Packit Service b2c451
        GClueConfigPrivate *priv;
Packit Service b2c451
Packit Service b2c451
        priv = GCLUE_CONFIG (object)->priv;
Packit Service b2c451
Packit Service b2c451
        g_clear_pointer (&priv->key_file, g_key_file_unref);
Packit Service b2c451
        g_clear_pointer (&priv->agents, g_strfreev);
Packit Service b2c451
        g_clear_pointer (&priv->wifi_url, g_free);
Packit Service b2c451
        g_clear_pointer (&priv->wifi_submit_url, g_free);
Packit Service b2c451
        g_clear_pointer (&priv->wifi_submit_nick, g_free);
Packit Service b2c451
Packit Service b2c451
        g_list_foreach (priv->app_configs, (GFunc) app_config_free, NULL);
Packit Service b2c451
Packit Service b2c451
        G_OBJECT_CLASS (gclue_config_parent_class)->finalize (object);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_config_class_init (GClueConfigClass *klass)
Packit Service b2c451
{
Packit Service b2c451
        GObjectClass *object_class;
Packit Service b2c451
Packit Service b2c451
        object_class = G_OBJECT_CLASS (klass);
Packit Service b2c451
        object_class->finalize = gclue_config_finalize;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_agent_config (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        GClueConfigPrivate *priv = config->priv;
Packit Service b2c451
        GError *error = NULL;
Packit Service b2c451
Packit Service b2c451
        priv->agents = g_key_file_get_string_list (priv->key_file,
Packit Service b2c451
                                                   "agent",
Packit Service b2c451
                                                   "whitelist",
Packit Service b2c451
                                                   &priv->num_agents,
Packit Service b2c451
                                                   &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_critical ("Failed to read 'agent/whitelist' key: %s",
Packit Service b2c451
                            error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
        }
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_app_configs (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        const char *known_groups[] = { "agent", "wifi", "3g", "cdma",
Packit Service b2c451
                                       "modem-gps", "network-nmea",
Packit Service b2c451
                                       NULL };
Packit Service b2c451
        GClueConfigPrivate *priv = config->priv;
Packit Service b2c451
        gsize num_groups = 0, i;
Packit Service b2c451
        char **groups;
Packit Service b2c451
Packit Service b2c451
        groups = g_key_file_get_groups (priv->key_file, &num_groups);
Packit Service b2c451
        if (num_groups == 0)
Packit Service b2c451
                return;
Packit Service b2c451
Packit Service b2c451
        for (i = 0; i < num_groups; i++) {
Packit Service b2c451
                AppConfig *app_config;
Packit Service b2c451
                int* users;
Packit Service b2c451
                gsize num_users = 0, j;
Packit Service b2c451
                gboolean allowed, system;
Packit Service b2c451
                gboolean ignore = FALSE;
Packit Service b2c451
                GError *error = NULL;
Packit Service b2c451
Packit Service b2c451
                for (j = 0; known_groups[j] != NULL; j++)
Packit Service b2c451
                        if (strcmp (groups[i], known_groups[j]) == 0) {
Packit Service b2c451
                                ignore = TRUE;
Packit Service b2c451
Packit Service b2c451
                                continue;
Packit Service b2c451
                        }
Packit Service b2c451
Packit Service b2c451
                if (ignore)
Packit Service b2c451
                        continue;
Packit Service b2c451
Packit Service b2c451
                allowed = g_key_file_get_boolean (priv->key_file,
Packit Service b2c451
                                                  groups[i],
Packit Service b2c451
                                                  "allowed",
Packit Service b2c451
                                                  &error);
Packit Service b2c451
                if (error != NULL)
Packit Service b2c451
                        goto error_out;
Packit Service b2c451
Packit Service b2c451
                system = g_key_file_get_boolean (priv->key_file,
Packit Service b2c451
                                                 groups[i],
Packit Service b2c451
                                                 "system",
Packit Service b2c451
                                                 &error);
Packit Service b2c451
                if (error != NULL)
Packit Service b2c451
                        goto error_out;
Packit Service b2c451
Packit Service b2c451
                users = g_key_file_get_integer_list (priv->key_file,
Packit Service b2c451
                                                     groups[i],
Packit Service b2c451
                                                     "users",
Packit Service b2c451
                                                     &num_users,
Packit Service b2c451
                                                     &error);
Packit Service b2c451
                if (error != NULL)
Packit Service b2c451
                        goto error_out;
Packit Service b2c451
Packit Service b2c451
                app_config = g_slice_new0 (AppConfig);
Packit Service b2c451
                app_config->id = g_strdup (groups[i]);
Packit Service b2c451
                app_config->allowed = allowed;
Packit Service b2c451
                app_config->system = system;
Packit Service b2c451
                app_config->users = users;
Packit Service b2c451
                app_config->num_users = num_users;
Packit Service b2c451
Packit Service b2c451
                priv->app_configs = g_list_prepend (priv->app_configs, app_config);
Packit Service b2c451
Packit Service b2c451
                continue;
Packit Service b2c451
error_out:
Packit Service b2c451
                g_warning ("Failed to load configuration for app '%s': %s",
Packit Service b2c451
                           groups[i],
Packit Service b2c451
                           error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        g_strfreev (groups);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static gboolean
Packit Service b2c451
load_enable_source_config (GClueConfig *config,
Packit Service b2c451
                           const char  *source_name)
Packit Service b2c451
{
Packit Service b2c451
        GClueConfigPrivate *priv = config->priv;
Packit Service b2c451
        GError *error = NULL;
Packit Service b2c451
        gboolean enable;
Packit Service b2c451
Packit Service b2c451
        enable = g_key_file_get_boolean (priv->key_file,
Packit Service b2c451
                                         source_name,
Packit Service b2c451
                                         "enable",
Packit Service b2c451
                                         &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_debug ("Failed to get config %s/enable:"
Packit Service b2c451
                         " %s",
Packit Service b2c451
                         source_name,
Packit Service b2c451
                         error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
Packit Service b2c451
                /* Source should be enabled by default */
Packit Service b2c451
                return TRUE;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        return enable;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
#define DEFAULT_WIFI_URL "https://location.services.mozilla.com/v1/geolocate?key=geoclue"
Packit Service b2c451
#define DEFAULT_WIFI_SUBMIT_URL "https://location.services.mozilla.com/v1/submit?key=geoclue"
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_wifi_config (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        GClueConfigPrivate *priv = config->priv;
Packit Service b2c451
        GError *error = NULL;
Packit Service b2c451
Packit Service b2c451
        priv->enable_wifi_source = load_enable_source_config (config, "wifi");
Packit Service b2c451
Packit Service b2c451
        priv->wifi_url = g_key_file_get_string (priv->key_file,
Packit Service b2c451
                                                "wifi",
Packit Service b2c451
                                                "url",
Packit Service b2c451
                                                &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_warning ("%s", error->message);
Packit Service b2c451
                g_clear_error (&error);
Packit Service b2c451
                priv->wifi_url = g_strdup (DEFAULT_WIFI_URL);
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        priv->wifi_submit = g_key_file_get_boolean (priv->key_file,
Packit Service b2c451
                                                    "wifi",
Packit Service b2c451
                                                    "submit-data",
Packit Service b2c451
                                                    &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_debug ("Failed to get config wifi/submit-data: %s",
Packit Service b2c451
                         error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
Packit Service b2c451
                return;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        priv->wifi_submit_url = g_key_file_get_string (priv->key_file,
Packit Service b2c451
                                                       "wifi",
Packit Service b2c451
                                                       "submission-url",
Packit Service b2c451
                                                       &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_debug ("No wifi submission URL: %s", error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
                priv->wifi_submit_url = g_strdup (DEFAULT_WIFI_SUBMIT_URL);
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        priv->wifi_submit_nick = g_key_file_get_string (priv->key_file,
Packit Service b2c451
                                                        "wifi",
Packit Service b2c451
                                                        "submission-nick",
Packit Service b2c451
                                                        &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_debug ("No wifi submission nick: %s", error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
        }
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_3g_config (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        config->priv->enable_3g_source =
Packit Service b2c451
                load_enable_source_config (config, "3g");
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_cdma_config (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        config->priv->enable_cdma_source =
Packit Service b2c451
                load_enable_source_config (config, "cdma");
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_modem_gps_config (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        config->priv->enable_modem_gps_source =
Packit Service b2c451
                load_enable_source_config (config, "modem-gps");
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
load_network_nmea_config (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        config->priv->enable_nmea_source =
Packit Service b2c451
                load_enable_source_config (config, "network-nmea");
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_config_init (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        GError *error = NULL;
Packit Service b2c451
Packit Service b2c451
        config->priv =
Packit Service b2c451
                G_TYPE_INSTANCE_GET_PRIVATE (config,
Packit Service b2c451
                                            GCLUE_TYPE_CONFIG,
Packit Service b2c451
                                            GClueConfigPrivate);
Packit Service b2c451
        config->priv->key_file = g_key_file_new ();
Packit Service b2c451
        g_key_file_load_from_file (config->priv->key_file,
Packit Service b2c451
                                   CONFIG_FILE_PATH,
Packit Service b2c451
                                   0,
Packit Service b2c451
                                   &error);
Packit Service b2c451
        if (error != NULL) {
Packit Service b2c451
                g_critical ("Failed to load configuration file '%s': %s",
Packit Service b2c451
                            CONFIG_FILE_PATH, error->message);
Packit Service b2c451
                g_error_free (error);
Packit Service b2c451
Packit Service b2c451
                return;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        load_agent_config (config);
Packit Service b2c451
        load_app_configs (config);
Packit Service b2c451
        load_wifi_config (config);
Packit Service b2c451
        load_3g_config (config);
Packit Service b2c451
        load_cdma_config (config);
Packit Service b2c451
        load_modem_gps_config (config);
Packit Service b2c451
        load_network_nmea_config (config);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
GClueConfig *
Packit Service b2c451
gclue_config_get_singleton (void)
Packit Service b2c451
{
Packit Service b2c451
        static GClueConfig *config = NULL;
Packit Service b2c451
Packit Service b2c451
        if (config == NULL)
Packit Service b2c451
                config = g_object_new (GCLUE_TYPE_CONFIG, NULL);
Packit Service b2c451
Packit Service b2c451
        return config;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_is_agent_allowed (GClueConfig     *config,
Packit Service b2c451
                               const char      *desktop_id,
Packit Service b2c451
                               GClueClientInfo *agent_info)
Packit Service b2c451
{
Packit Service b2c451
        gsize i;
Packit Service b2c451
Packit Service b2c451
        for (i = 0; i < config->priv->num_agents; i++) {
Packit Service b2c451
                if (g_strcmp0 (desktop_id, config->priv->agents[i]) == 0)
Packit Service b2c451
                        return TRUE;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        return FALSE;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gsize
Packit Service b2c451
gclue_config_get_num_allowed_agents (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->num_agents;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
GClueAppPerm
Packit Service b2c451
gclue_config_get_app_perm (GClueConfig     *config,
Packit Service b2c451
                           const char      *desktop_id,
Packit Service b2c451
                           GClueClientInfo *app_info)
Packit Service b2c451
{
Packit Service b2c451
        GClueConfigPrivate *priv = config->priv;
Packit Service b2c451
        GList *node;
Packit Service b2c451
        AppConfig *app_config = NULL;
Packit Service b2c451
        gsize i;
Packit Service b2c451
        guint64 uid;
Packit Service b2c451
Packit Service b2c451
        g_return_val_if_fail (desktop_id != NULL, GCLUE_APP_PERM_DISALLOWED);
Packit Service b2c451
Packit Service b2c451
        for (node = priv->app_configs; node != NULL; node = node->next) {
Packit Service b2c451
                if (strcmp (((AppConfig *) node->data)->id, desktop_id) == 0) {
Packit Service b2c451
                        app_config = (AppConfig *) node->data;
Packit Service b2c451
Packit Service b2c451
                        break;
Packit Service b2c451
                }
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        if (app_config == NULL) {
Packit Service b2c451
                g_debug ("'%s' not in configuration", desktop_id);
Packit Service b2c451
Packit Service b2c451
                return GCLUE_APP_PERM_ASK_AGENT;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        if (!app_config->allowed) {
Packit Service b2c451
                g_debug ("'%s' disallowed by configuration", desktop_id);
Packit Service b2c451
Packit Service b2c451
                return GCLUE_APP_PERM_DISALLOWED;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        if (app_config->num_users == 0)
Packit Service b2c451
                return GCLUE_APP_PERM_ALLOWED;
Packit Service b2c451
Packit Service b2c451
        uid = gclue_client_info_get_user_id (app_info);
Packit Service b2c451
Packit Service b2c451
        for (i = 0; i < app_config->num_users; i++) {
Packit Service b2c451
                if (app_config->users[i] == uid)
Packit Service b2c451
                        return GCLUE_APP_PERM_ALLOWED;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        return GCLUE_APP_PERM_DISALLOWED;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_is_system_component (GClueConfig *config,
Packit Service b2c451
                                  const char  *desktop_id)
Packit Service b2c451
{
Packit Service b2c451
        GClueConfigPrivate *priv = config->priv;
Packit Service b2c451
        GList *node;
Packit Service b2c451
        AppConfig *app_config = NULL;
Packit Service b2c451
Packit Service b2c451
        g_return_val_if_fail (desktop_id != NULL, FALSE);
Packit Service b2c451
Packit Service b2c451
        for (node = priv->app_configs; node != NULL; node = node->next) {
Packit Service b2c451
                if (strcmp (((AppConfig *) node->data)->id, desktop_id) == 0) {
Packit Service b2c451
                        app_config = (AppConfig *) node->data;
Packit Service b2c451
Packit Service b2c451
                        break;
Packit Service b2c451
                }
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        return (app_config != NULL && app_config->system);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
const char *
Packit Service b2c451
gclue_config_get_wifi_url (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->wifi_url;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
const char *
Packit Service b2c451
gclue_config_get_wifi_submit_url (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->wifi_submit_url;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
const char *
Packit Service b2c451
gclue_config_get_wifi_submit_nick (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->wifi_submit_nick;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
void
Packit Service b2c451
gclue_config_set_wifi_submit_nick (GClueConfig *config,
Packit Service b2c451
                                   const char  *nick)
Packit Service b2c451
{
Packit Service b2c451
Packit Service b2c451
        config->priv->wifi_submit_nick = g_strdup (nick);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_get_wifi_submit_data (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->wifi_submit;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_get_enable_wifi_source (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->enable_wifi_source;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_get_enable_3g_source (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->enable_3g_source;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_get_enable_modem_gps_source (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->enable_modem_gps_source;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_get_enable_cdma_source (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->enable_cdma_source;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
gboolean
Packit Service b2c451
gclue_config_get_enable_nmea_source (GClueConfig *config)
Packit Service b2c451
{
Packit Service b2c451
        return config->priv->enable_nmea_source;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
void
Packit Service b2c451
gclue_config_set_wifi_submit_data (GClueConfig *config,
Packit Service b2c451
                                   gboolean     submit)
Packit Service b2c451
{
Packit Service b2c451
Packit Service b2c451
        config->priv->wifi_submit = submit;
Packit Service b2c451
}