diff options
author | Thomas Haller <thaller@redhat.com> | 2015-11-06 16:45:27 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-04-06 19:36:21 +0200 |
commit | d9c55a491372458cfa7d10b420d937ecd8fa25c0 (patch) | |
tree | 343fdd6c4b20ebc5207e368a5c3a31261594678c | |
parent | 350d96a9eeb39f06ca7a139289c11f2a1d3f891c (diff) | |
download | NetworkManager-th/run-state-to-nm-config-bgo764474.tar.gz |
config: let NetworkManager.state be handled by NMConfigth/run-state-to-nm-config-bgo764474
Later we want to persist more state information, particularly about
which devices are managed.
Move reading and writing of the state file to NMConfig.
-rw-r--r-- | src/main.c | 94 | ||||
-rw-r--r-- | src/nm-config.c | 220 | ||||
-rw-r--r-- | src/nm-config.h | 27 | ||||
-rw-r--r-- | src/nm-manager.c | 148 | ||||
-rw-r--r-- | src/nm-manager.h | 6 |
5 files changed, 278 insertions, 217 deletions
diff --git a/src/main.c b/src/main.c index 4616155d9a..41f4eda275 100644 --- a/src/main.c +++ b/src/main.c @@ -71,81 +71,10 @@ static struct { char *opt_log_level; char *opt_log_domains; char *pidfile; - char *state_file; } global_opt = { .become_daemon = TRUE, }; -static gboolean -parse_state_file (const char *filename, - gboolean *net_enabled, - gboolean *wifi_enabled, - gboolean *wwan_enabled, - GError **error) -{ - GKeyFile *state_file; - GError *tmp_error = NULL; - gboolean wifi, net, wwan; - - g_return_val_if_fail (net_enabled != NULL, FALSE); - g_return_val_if_fail (wifi_enabled != NULL, FALSE); - g_return_val_if_fail (wwan_enabled != NULL, FALSE); - - state_file = g_key_file_new (); - g_key_file_set_list_separator (state_file, ','); - if (!g_key_file_load_from_file (state_file, filename, G_KEY_FILE_KEEP_COMMENTS, &tmp_error)) { - gboolean ret = FALSE; - - /* This is kinda ugly; create the file and directory if it doesn't - * exist yet. We can't rely on distros necessarily creating the - * /var/lib/NetworkManager for us since we have to ensure that - * users upgrading NM get this working too. - */ - if (g_error_matches (tmp_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) { - char *data; - gsize len = 0; - - g_clear_error (&tmp_error); - - /* Write out the initial state to the state file */ - g_key_file_set_boolean (state_file, "main", "NetworkingEnabled", *net_enabled); - g_key_file_set_boolean (state_file, "main", "WirelessEnabled", *wifi_enabled); - g_key_file_set_boolean (state_file, "main", "WWANEnabled", *wwan_enabled); - - data = g_key_file_to_data (state_file, &len, NULL); - if (data) - ret = g_file_set_contents (filename, data, len, error); - g_free (data); - } else { - /* the error is not "No such file or directory" - propagate the error */ - g_propagate_error (error, tmp_error); - } - - return ret; - } - - /* Reading state bits of NetworkManager; an error leaves the passed-in state - * value unchanged. - */ - net = g_key_file_get_boolean (state_file, "main", "NetworkingEnabled", &tmp_error); - if (tmp_error == NULL) - *net_enabled = net; - g_clear_error (&tmp_error); - - wifi = g_key_file_get_boolean (state_file, "main", "WirelessEnabled", &tmp_error); - if (tmp_error == NULL) - *wifi_enabled = wifi; - g_clear_error (&tmp_error); - - wwan = g_key_file_get_boolean (state_file, "main", "WWANEnabled", &tmp_error); - if (tmp_error == NULL) - *wwan_enabled = wwan; - g_clear_error (&tmp_error); - - g_key_file_free (state_file); - return TRUE; -} - static void _set_g_fatal_warnings (void) { @@ -239,7 +168,6 @@ do_early_setup (int *argc, char **argv[], NMConfigCmdLineOptions *config_cli) "PLATFORM,RFKILL,WIFI" }, { "g-fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &global_opt.g_fatal_warnings, N_("Make all warnings fatal"), NULL }, { "pid-file", 'p', 0, G_OPTION_ARG_FILENAME, &global_opt.pidfile, N_("Specify the location of a PID file"), N_(NM_DEFAULT_PID_FILE) }, - { "state-file", 0, 0, G_OPTION_ARG_FILENAME, &global_opt.state_file, N_("State file location"), N_(NM_DEFAULT_SYSTEM_STATE_FILE) }, { "run-from-build-dir", 0, 0, G_OPTION_ARG_NONE, &global_opt.run_from_build_dir, "Run from build directory", NULL }, { "print-config", 0, 0, G_OPTION_ARG_NONE, &global_opt.print_config, N_("Print NetworkManager configuration and exit"), NULL }, {NULL} @@ -255,7 +183,6 @@ do_early_setup (int *argc, char **argv[], NMConfigCmdLineOptions *config_cli) exit (1); global_opt.pidfile = global_opt.pidfile ? global_opt.pidfile : g_strdup (NM_DEFAULT_PID_FILE); - global_opt.state_file = global_opt.state_file ? global_opt.state_file : g_strdup (NM_DEFAULT_SYSTEM_STATE_FILE); } /* @@ -265,7 +192,6 @@ do_early_setup (int *argc, char **argv[], NMConfigCmdLineOptions *config_cli) int main (int argc, char *argv[]) { - gboolean wifi_enabled = TRUE, net_enabled = TRUE, wwan_enabled = TRUE; gboolean success = FALSE; NMConfig *config; GError *error = NULL; @@ -406,17 +332,12 @@ main (int argc, char *argv[]) nm_log_info (LOGD_CORE, "NetworkManager (version " NM_DIST_VERSION ") is starting..."); - /* Parse the state file */ - if (!parse_state_file (global_opt.state_file, &net_enabled, &wifi_enabled, &wwan_enabled, &error)) { - nm_log_err (LOGD_CORE, "State file %s parsing failed: %s", - global_opt.state_file, - error->message); - /* Not a hard failure */ - } - g_clear_error (&error); - nm_log_info (LOGD_CORE, "Read config: %s", nm_config_data_get_config_description (nm_config_get_data (config))); nm_config_data_log (nm_config_get_data (config), "CONFIG: ", " ", NULL); + + /* the first access to RunState causes the file to be read (and possibly print a warning) */ + nm_config_run_state_get (config); + nm_log_dbg (LOGD_CORE, "WEXT support is %s", #if HAVE_WEXT "enabled" @@ -427,10 +348,7 @@ main (int argc, char *argv[]) nm_auth_manager_setup (nm_config_get_auth_polkit (config)); - nm_manager_setup (global_opt.state_file, - net_enabled, - wifi_enabled, - wwan_enabled); + nm_manager_setup (); if (!nm_bus_manager_get_connection (nm_bus_manager_get ())) { nm_log_warn (LOGD_CORE, "Failed to connect to D-Bus; only private bus is available"); @@ -482,6 +400,8 @@ done: nm_manager_stop (nm_manager_get ()); + nm_config_run_state_set (config, TRUE, TRUE); + if (global_opt.pidfile && wrote_pidfile) unlink (global_opt.pidfile); diff --git a/src/nm-config.c b/src/nm-config.c index 58fd96cbf4..f6aa75413a 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -38,12 +38,27 @@ #define DEFAULT_SYSTEM_CONFIG_DIR NMLIBDIR "/conf.d" #define DEFAULT_NO_AUTO_DEFAULT_FILE NMSTATEDIR "/no-auto-default.state" #define DEFAULT_INTERN_CONFIG_FILE NMSTATEDIR "/NetworkManager-intern.conf" +#define DEFAULT_STATE_FILE NMSTATEDIR "/NetworkManager.state" + +/*****************************************************************************/ + +#define _NMLOG_PREFIX_NAME "config" +#define _NMLOG_DOMAIN LOGD_CORE + +#define _NMLOG(level, ...) \ + nm_log (level, _NMLOG_DOMAIN, \ + "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + _NMLOG_PREFIX_NAME \ + _NM_UTILS_MACRO_REST(__VA_ARGS__)) + +/*****************************************************************************/ struct NMConfigCmdLineOptions { char *config_main_file; char *intern_config_file; char *config_dir; char *system_config_dir; + char *state_file; char *no_auto_default_file; char *plugins; gboolean configure_and_quit; @@ -58,6 +73,10 @@ struct NMConfigCmdLineOptions { }; typedef struct { + NMConfigRunState p; +} RunState; + +typedef struct { NMConfigCmdLineOptions cli; NMConfigData *config_data; @@ -81,6 +100,16 @@ typedef struct { gboolean configure_and_quit; char **atomic_section_prefixes; + + /* The run-state. This is actually a mutable data member and it makes sense: + * The regular config is immutable (NMConfigData) which allows atomic updates + * which is handy during reload. Also, we invoke a config-changed signal when + * the config changes. + * + * For run-state, there are no events. You can query it and set it. + * It only gets read once at startup, and later is cached and only written + * out to disk. Hence, no need for the immutable dance here. */ + RunState *run_state; } NMConfigPrivate; enum { @@ -406,6 +435,7 @@ _nm_config_cmd_line_options_clear (NMConfigCmdLineOptions *cli) g_clear_pointer (&cli->system_config_dir, g_free); g_clear_pointer (&cli->no_auto_default_file, g_free); g_clear_pointer (&cli->intern_config_file, g_free); + g_clear_pointer (&cli->state_file, g_free); g_clear_pointer (&cli->plugins, g_free); cli->configure_and_quit = FALSE; cli->is_debug = FALSE; @@ -427,6 +457,7 @@ _nm_config_cmd_line_options_copy (const NMConfigCmdLineOptions *cli, NMConfigCmd dst->config_main_file = g_strdup (cli->config_main_file); dst->no_auto_default_file = g_strdup (cli->no_auto_default_file); dst->intern_config_file = g_strdup (cli->intern_config_file); + dst->state_file = g_strdup (cli->state_file); dst->plugins = g_strdup (cli->plugins); dst->configure_and_quit = cli->configure_and_quit; dst->is_debug = cli->is_debug; @@ -466,6 +497,7 @@ nm_config_cmd_line_options_add_to_entries (NMConfigCmdLineOptions *cli, { "config-dir", 0, 0, G_OPTION_ARG_FILENAME, &cli->config_dir, N_("Config directory location"), N_(DEFAULT_CONFIG_DIR) }, { "system-config-dir", 0, 0, G_OPTION_ARG_FILENAME, &cli->system_config_dir, N_("System config directory location"), N_(DEFAULT_SYSTEM_CONFIG_DIR) }, { "intern-config", 0, 0, G_OPTION_ARG_FILENAME, &cli->intern_config_file, N_("Internal config file location"), N_(DEFAULT_INTERN_CONFIG_FILE) }, + { "state-file", 0, 0, G_OPTION_ARG_FILENAME, &cli->state_file, N_("State file location"), N_(DEFAULT_STATE_FILE) }, { "no-auto-default", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, &cli->no_auto_default_file, N_("State file for no-auto-default devices"), N_(DEFAULT_NO_AUTO_DEFAULT_FILE) }, { "plugins", 0, 0, G_OPTION_ARG_STRING, &cli->plugins, N_("List of plugins separated by ','"), N_(CONFIG_PLUGINS_DEFAULT) }, { "configure-and-quit", 0, 0, G_OPTION_ARG_NONE, &cli->configure_and_quit, N_("Quit after initial configuration"), NULL }, @@ -1645,7 +1677,191 @@ nm_config_set_values (NMConfig *self, g_key_file_unref (keyfile_new); } -/************************************************************************/ +/****************************************************************************** + * RunState + ******************************************************************************/ + +static const char * +run_state_get_filename (const NMConfigCmdLineOptions *cli) +{ + /* For an empty filename, we assume the user wants to disable + * persistant run-state. NMConfig will not try to read it nor + * write it out. */ + if (!cli->state_file) + return DEFAULT_STATE_FILE; + return cli->state_file[0] ? cli->state_file : NULL; +} + +static RunState * +run_state_new (void) +{ + RunState *run_state; + + run_state = g_slice_new0 (RunState); + run_state->p.net_enabled = TRUE; + run_state->p.wifi_enabled = TRUE; + run_state->p.wwan_enabled = TRUE; + + return run_state; +} + +static void +run_state_free (RunState *run_state) +{ + if (!run_state) + return; + g_slice_free (RunState, run_state); +} + +static RunState * +run_state_new_from_file (const char *filename) +{ + GKeyFile *keyfile; + gs_free_error GError *error = NULL; + RunState *run_state; + + run_state = run_state_new (); + + if (!filename) + return run_state; + + keyfile = g_key_file_new (); + g_key_file_set_list_separator (keyfile, ','); + if (!g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, &error)) { + if (g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) + _LOGD ("run-state: missing state file \"%s\": %s", filename, error->message); + else + _LOGW ("run-state: error reading state file \"%s\": %s", filename, error->message); + goto out; + } + + _LOGD ("run-state: sucessfully read state file \"%s\"", filename); + + run_state->p.net_enabled = nm_config_keyfile_get_boolean (keyfile, "main", "NetworkingEnabled", run_state->p.net_enabled); + run_state->p.wifi_enabled = nm_config_keyfile_get_boolean (keyfile, "main", "WirelessEnabled", run_state->p.wifi_enabled); + run_state->p.wwan_enabled = nm_config_keyfile_get_boolean (keyfile, "main", "WWANEnabled", run_state->p.wwan_enabled); + +out: + g_key_file_unref (keyfile); + return run_state; +} + +const NMConfigRunState * +nm_config_run_state_get (NMConfig *self) +{ + NMConfigPrivate *priv; + + g_return_val_if_fail (NM_IS_CONFIG (self), NULL); + + priv = NM_CONFIG_GET_PRIVATE (self); + + if (G_UNLIKELY (!priv->run_state)) { + /* read the runstate from file lazy on first access. The reason is that + * we want to log a failure to read the file via nm-logging. But during + * construction of NMConfig, nm-logging is not yet configured. + */ + priv->run_state = run_state_new_from_file (run_state_get_filename (&priv->cli)); + } + + return &priv->run_state->p; +} + +static void +run_state_write (NMConfig *self) +{ + NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self); + const char *filename; + GString *str; + GError *error = NULL; + + filename = run_state_get_filename (&priv->cli); + + if (!filename) { + priv->run_state->p.dirty = FALSE; + return; + } + + str = g_string_sized_new (256); + + /* Let's construct the keyfile data by hand. */ + + g_string_append (str, "[main]\n"); + g_string_append_printf (str, "NetworkingEnabled=%s\n", priv->run_state->p.net_enabled ? "true" : "false"); + g_string_append_printf (str, "WirelessEnabled=%s\n", priv->run_state->p.wifi_enabled ? "true" : "false"); + g_string_append_printf (str, "WWANEnabled=%s\n", priv->run_state->p.wwan_enabled ? "true" : "false"); + + if (!g_file_set_contents (filename, + str->str, str->len, + &error)) { + _LOGD ("run-state: error writing state file \"%s\": %s", filename, error->message); + g_clear_error (&error); + /* we leave the state dirty. That potentally means, that we try to + * write the file over and over again, although it isn't possible. */ + priv->run_state->p.dirty = TRUE; + } else + priv->run_state->p.dirty = FALSE; + + _LOGT ("run-state: success writing state file \"%s\"", filename); + + g_string_free (str, TRUE); +} + +void +_nm_config_run_state_set (NMConfig *self, + gboolean allow_persist, + gboolean force_persist, + ...) +{ + NMConfigPrivate *priv; + va_list ap; + NMConfigRunStatePropertyType property_type; + + g_return_if_fail (NM_IS_CONFIG (self)); + + priv = NM_CONFIG_GET_PRIVATE (self); + + va_start (ap, force_persist); + + /* We expect that the NMConfigRunStatePropertyType is an integer type <= sizeof (int). + * Smaller would be fine, since the variadic arguments get promoted to int. + * Larger would be a problem, also, because we want that "0" is a valid sentinel. */ + G_STATIC_ASSERT_EXPR (sizeof (NMConfigRunStatePropertyType) <= sizeof (int)); + + while ((property_type = va_arg (ap, int)) != NM_CONFIG_RUN_STATE_PROPERTY_NONE) { + bool *p_bool, v_bool; + + switch (property_type) { + case NM_CONFIG_RUN_STATE_PROPERTY_NETWORKING_ENABLED: + p_bool = &priv->run_state->p.net_enabled; + goto handle_p_bool; + case NM_CONFIG_RUN_STATE_PROPERTY_WIFI_ENABLED: + p_bool = &priv->run_state->p.wifi_enabled; + goto handle_p_bool; + case NM_CONFIG_RUN_STATE_PROPERTY_WWAN_ENABLED: + p_bool = &priv->run_state->p.wwan_enabled; + goto handle_p_bool; + default: + break; + } + + g_return_if_reached (); + +handle_p_bool: + v_bool = va_arg (ap, gboolean); + if (*p_bool == v_bool) + continue; + *p_bool = v_bool; + priv->run_state->p.dirty = TRUE; + } + + va_end (ap); + + if ( allow_persist + && (force_persist || priv->run_state->p.dirty)) + run_state_write (self); +} + +/*****************************************************************************/ void nm_config_reload (NMConfig *self, int signal) @@ -1918,6 +2134,8 @@ finalize (GObject *gobject) { NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (gobject); + run_state_free (priv->run_state); + g_free (priv->config_dir); g_free (priv->system_config_dir); g_free (priv->no_auto_default_file); diff --git a/src/nm-config.h b/src/nm-config.h index 8bbab2ac6f..36007fa895 100644 --- a/src/nm-config.h +++ b/src/nm-config.h @@ -83,6 +83,24 @@ G_BEGIN_DECLS typedef struct NMConfigCmdLineOptions NMConfigCmdLineOptions; +typedef enum { + NM_CONFIG_RUN_STATE_PROPERTY_NONE, + + /* 1 set-argument: (gboolean enabled) */ + NM_CONFIG_RUN_STATE_PROPERTY_NETWORKING_ENABLED, + NM_CONFIG_RUN_STATE_PROPERTY_WIFI_ENABLED, + NM_CONFIG_RUN_STATE_PROPERTY_WWAN_ENABLED, +} NMConfigRunStatePropertyType; + +typedef struct { + bool net_enabled; + bool wifi_enabled; + bool wwan_enabled; + + /* Whether the runstate is modified and not saved to disk. */ + bool dirty; +} NMConfigRunState; + struct _NMConfig { GObject parent; }; @@ -131,6 +149,15 @@ NMConfig *nm_config_new (const NMConfigCmdLineOptions *cli, char **atomic_sectio NMConfig *nm_config_setup (const NMConfigCmdLineOptions *cli, char **atomic_section_prefixes, GError **error); void nm_config_reload (NMConfig *config, int signal); +const NMConfigRunState *nm_config_run_state_get (NMConfig *config); + +void _nm_config_run_state_set (NMConfig *config, + gboolean allow_persist, + gboolean force_persist, + ...); +#define nm_config_run_state_set(config, allow_persist, force_persist, ...) \ + _nm_config_run_state_set (config, allow_persist, force_persist, ##__VA_ARGS__, 0) + gint nm_config_parse_boolean (const char *str, gint default_value); GKeyFile *nm_config_create_keyfile (void); diff --git a/src/nm-manager.c b/src/nm-manager.c index 289a91d6c7..bf5c6a190b 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -90,15 +90,13 @@ typedef struct { gboolean sw_enabled; gboolean hw_enabled; RfKillType rtype; + NMConfigRunStatePropertyType key; const char *desc; - const char *key; const char *prop; const char *hw_prop; } RadioState; typedef struct { - char *state_file; - GSList *active_connections; GSList *authorizing_connections; guint ac_cleanup_id; @@ -166,7 +164,6 @@ static guint signals[LAST_SIGNAL] = { 0 }; NM_GOBJECT_PROPERTIES_DEFINE (NMManager, PROP_VERSION, PROP_STATE, - PROP_STATE_FILE, PROP_STARTUP, PROP_NETWORKING_ENABLED, PROP_WIRELESS_ENABLED, @@ -1240,54 +1237,6 @@ system_hostname_changed_cb (NMSettings *settings, /* General NMManager stuff */ /*******************************************************************/ -/* Store value into key-file; supported types: boolean, int, string */ -static gboolean -write_value_to_state_file (const char *filename, - const char *group, - const char *key, - GType value_type, - gpointer value, - GError **error) -{ - GKeyFile *key_file; - char *data; - gsize len = 0; - gboolean ret = FALSE; - - g_return_val_if_fail (filename != NULL, FALSE); - g_return_val_if_fail (group != NULL, FALSE); - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (value_type == G_TYPE_BOOLEAN || - value_type == G_TYPE_INT || - value_type == G_TYPE_STRING, - FALSE); - - key_file = g_key_file_new (); - - g_key_file_set_list_separator (key_file, ','); - g_key_file_load_from_file (key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL); - switch (value_type) { - case G_TYPE_BOOLEAN: - g_key_file_set_boolean (key_file, group, key, *((gboolean *) value)); - break; - case G_TYPE_INT: - g_key_file_set_integer (key_file, group, key, *((gint *) value)); - break; - case G_TYPE_STRING: - g_key_file_set_string (key_file, group, key, *((const gchar **) value)); - break; - } - - data = g_key_file_to_data (key_file, &len, NULL); - if (data) { - ret = g_file_set_contents (filename, data, len, error); - g_free (data); - } - g_key_file_free (key_file); - - return ret; -} - static gboolean radio_enabled_for_rstate (RadioState *rstate, gboolean check_changeable) { @@ -4061,21 +4010,10 @@ static void _internal_enable (NMManager *self, gboolean enable) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); - GError *error = NULL; /* Update "NetworkingEnabled" key in state file */ - if (priv->state_file) { - if (!write_value_to_state_file (priv->state_file, - "main", "NetworkingEnabled", - G_TYPE_BOOLEAN, (gpointer) &enable, - &error)) { - /* Not a hard error */ - _LOGW (LOGD_SUSPEND, "writing to state file %s failed: %s", - priv->state_file, - error->message); - g_clear_error (&error); - } - } + nm_config_run_state_set (priv->config, TRUE, FALSE, + NM_CONFIG_RUN_STATE_PROPERTY_NETWORKING_ENABLED, enable); _LOGI (LOGD_SUSPEND, "%s requested (sleeping: %s enabled: %s)", enable ? "enable" : "disable", @@ -5013,7 +4951,6 @@ manager_radio_user_toggled (NMManager *self, gboolean enabled) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); - GError *error = NULL; gboolean old_enabled, new_enabled; /* Don't touch devices if asleep/networking disabled */ @@ -5027,17 +4964,8 @@ manager_radio_user_toggled (NMManager *self, } /* Update enabled key in state file */ - if (priv->state_file) { - if (!write_value_to_state_file (priv->state_file, - "main", rstate->key, - G_TYPE_BOOLEAN, (gpointer) &enabled, - &error)) { - _LOGW (LOGD_CORE, "writing to state file %s failed: %s", - priv->state_file, - error->message); - g_clear_error (&error); - } - } + nm_config_run_state_set (priv->config, TRUE, FALSE, + rstate->key, enabled); /* When the user toggles the radio, their request should override any * daemon (like ModemManager) enabled state that can be changed. For WWAN @@ -5112,21 +5040,13 @@ nm_connection_provider_get (void) } NMManager * -nm_manager_setup (const char *state_file, - gboolean initial_net_enabled, - gboolean initial_wifi_enabled, - gboolean initial_wwan_enabled) +nm_manager_setup (void) { NMManager *self; g_return_val_if_fail (!singleton_instance, singleton_instance); - self = g_object_new (NM_TYPE_MANAGER, - NM_MANAGER_NETWORKING_ENABLED, initial_net_enabled, - NM_MANAGER_WIRELESS_ENABLED, initial_wifi_enabled, - NM_MANAGER_WWAN_ENABLED, initial_wwan_enabled, - NM_MANAGER_STATE_FILE, state_file, - NULL); + self = g_object_new (NM_TYPE_MANAGER, NULL); nm_assert (NM_IS_MANAGER (self)); singleton_instance = self; @@ -5144,6 +5064,7 @@ constructed (GObject *object) NMManager *self = NM_MANAGER (object); NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); NMConfigData *config_data; + const NMConfigRunState *run_state; G_OBJECT_CLASS (nm_manager_parent_class)->constructed (object); @@ -5186,6 +5107,13 @@ constructed (GObject *object) g_signal_connect (priv->connectivity, "notify::" NM_CONNECTIVITY_STATE, G_CALLBACK (connectivity_changed), self); + run_state = nm_config_run_state_get (priv->config); + + priv->net_enabled = run_state->net_enabled; + + priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = run_state->wifi_enabled; + priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = run_state->wwan_enabled; + priv->rfkill_mgr = nm_rfkill_manager_new (); g_signal_connect (priv->rfkill_mgr, "rfkill-changed", @@ -5212,14 +5140,14 @@ nm_manager_init (NMManager *self) memset (priv->radio_states, 0, sizeof (priv->radio_states)); priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = TRUE; - priv->radio_states[RFKILL_TYPE_WLAN].key = "WirelessEnabled"; + priv->radio_states[RFKILL_TYPE_WLAN].key = NM_CONFIG_RUN_STATE_PROPERTY_WIFI_ENABLED; priv->radio_states[RFKILL_TYPE_WLAN].prop = NM_MANAGER_WIRELESS_ENABLED; priv->radio_states[RFKILL_TYPE_WLAN].hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED; priv->radio_states[RFKILL_TYPE_WLAN].desc = "WiFi"; priv->radio_states[RFKILL_TYPE_WLAN].rtype = RFKILL_TYPE_WLAN; priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = TRUE; - priv->radio_states[RFKILL_TYPE_WWAN].key = "WWANEnabled"; + priv->radio_states[RFKILL_TYPE_WWAN].key = NM_CONFIG_RUN_STATE_PROPERTY_WWAN_ENABLED; priv->radio_states[RFKILL_TYPE_WWAN].prop = NM_MANAGER_WWAN_ENABLED; priv->radio_states[RFKILL_TYPE_WWAN].hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED; priv->radio_states[RFKILL_TYPE_WWAN].desc = "WWAN"; @@ -5383,33 +5311,15 @@ set_property (GObject *object, guint prop_id, GError *error = NULL; switch (prop_id) { - case PROP_STATE_FILE: - /* construct-only */ - priv->state_file = g_value_dup_string (value); - break; - case PROP_NETWORKING_ENABLED: - /* construct-only */ - priv->net_enabled = g_value_get_boolean (value); - break; case PROP_WIRELESS_ENABLED: - if (!priv->rfkill_mgr) { - /* called during object construction. */ - priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = g_value_get_boolean (value); - } else { - manager_radio_user_toggled (NM_MANAGER (object), - &priv->radio_states[RFKILL_TYPE_WLAN], - g_value_get_boolean (value)); - } + manager_radio_user_toggled (NM_MANAGER (object), + &priv->radio_states[RFKILL_TYPE_WLAN], + g_value_get_boolean (value)); break; case PROP_WWAN_ENABLED: - if (!priv->rfkill_mgr) { - /* called during object construction. */ - priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = g_value_get_boolean (value); - } else { - manager_radio_user_toggled (NM_MANAGER (object), - &priv->radio_states[RFKILL_TYPE_WWAN], - g_value_get_boolean (value)); - } + manager_radio_user_toggled (NM_MANAGER (object), + &priv->radio_states[RFKILL_TYPE_WWAN], + g_value_get_boolean (value)); break; case PROP_WIMAX_ENABLED: /* WIMAX is depreacted. This does nothing. */ @@ -5487,7 +5397,6 @@ dispose (GObject *object) g_clear_object (&priv->settings); } - g_clear_pointer (&priv->state_file, g_free); g_clear_object (&priv->vpn_manager); /* Unregister property filter */ @@ -5547,13 +5456,6 @@ nm_manager_class_init (NMManagerClass *manager_class) G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - obj_properties[PROP_STATE_FILE] = - g_param_spec_string (NM_MANAGER_STATE_FILE, "", "", - NULL, - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS); - obj_properties[PROP_STATE] = g_param_spec_uint (NM_MANAGER_STATE, "", "", 0, NM_STATE_DISCONNECTED, 0, @@ -5569,14 +5471,13 @@ nm_manager_class_init (NMManagerClass *manager_class) obj_properties[PROP_NETWORKING_ENABLED] = g_param_spec_boolean (NM_MANAGER_NETWORKING_ENABLED, "", "", TRUE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); obj_properties[PROP_WIRELESS_ENABLED] = g_param_spec_boolean (NM_MANAGER_WIRELESS_ENABLED, "", "", TRUE, G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); obj_properties[PROP_WIRELESS_HARDWARE_ENABLED] = @@ -5589,7 +5490,6 @@ nm_manager_class_init (NMManagerClass *manager_class) g_param_spec_boolean (NM_MANAGER_WWAN_ENABLED, "", "", TRUE, G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); obj_properties[PROP_WWAN_HARDWARE_ENABLED] = diff --git a/src/nm-manager.h b/src/nm-manager.h index 5401b002c1..24e8054bfa 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -55,7 +55,6 @@ /* Not exported */ #define NM_MANAGER_HOSTNAME "hostname" #define NM_MANAGER_SLEEPING "sleeping" -#define NM_MANAGER_STATE_FILE "state-file" /* signals */ #define NM_MANAGER_CHECK_PERMISSIONS "check-permissions" @@ -88,10 +87,7 @@ typedef struct { GType nm_manager_get_type (void); /* nm_manager_setup() should only be used by main.c */ -NMManager * nm_manager_setup (const char *state_file, - gboolean initial_net_enabled, - gboolean initial_wifi_enabled, - gboolean initial_wwan_enabled); +NMManager * nm_manager_setup (void); NMManager * nm_manager_get (void); |