summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-04-19 15:56:24 +0200
committerThomas Haller <thaller@redhat.com>2017-04-20 14:29:00 +0200
commit7fa7d57a8375a499889607ad4e72837a03114b42 (patch)
tree890914c06a81a69dc3b9e17ebd71af786ff8c1c3
parentcd92ee58a696b951088ca64634bfddb45afd933a (diff)
downloadNetworkManager-7fa7d57a8375a499889607ad4e72837a03114b42.tar.gz
config: add first_start paramter to NMConfig to detect restart
(cherry picked from commit 2131954a190244714e8b27b48567594c7b103fb9)
-rw-r--r--src/main-utils.c3
-rw-r--r--src/main.c9
-rw-r--r--src/nm-config.c22
-rw-r--r--src/nm-config.h4
-rw-r--r--src/tests/config/test-config.c2
5 files changed, 35 insertions, 5 deletions
diff --git a/src/main-utils.c b/src/main-utils.c
index 9e3aa7bd55..c84f1e4c16 100644
--- a/src/main-utils.c
+++ b/src/main-utils.c
@@ -149,6 +149,9 @@ nm_main_utils_ensure_rundir ()
exit (1);
}
+ /* NM_CONFIG_DEVICE_STATE_DIR is used to determine whether NM is restarted or not.
+ * It is important to set NMConfigCmdLineOptions.first_start before creating
+ * the directory. */
nm_assert (g_str_has_prefix (NM_CONFIG_DEVICE_STATE_DIR, NMRUNDIR"/"));
if (g_mkdir (NM_CONFIG_DEVICE_STATE_DIR, 0755) != 0) {
errsv = errno;
diff --git a/src/main.c b/src/main.c
index 52f3200e75..52f0b7c8f9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -239,7 +239,11 @@ main (int argc, char *argv[])
main_loop = g_main_loop_new (NULL, FALSE);
- config_cli = nm_config_cmd_line_options_new ();
+ /* we determine a first-start (contrary to a restart during the same boot)
+ * based on the existence of NM_CONFIG_DEVICE_STATE_DIR directory. */
+ config_cli = nm_config_cmd_line_options_new (!g_file_test (NM_CONFIG_DEVICE_STATE_DIR,
+ G_FILE_TEST_IS_DIR));
+
do_early_setup (&argc, &argv, config_cli);
if (global_opt.g_fatal_warnings)
@@ -356,7 +360,8 @@ main (int argc, char *argv[])
NM_CONFIG_GET_VALUE_STRIP | NM_CONFIG_GET_VALUE_NO_EMPTY),
nm_config_get_is_debug (config));
- nm_log_info (LOGD_CORE, "NetworkManager (version " NM_DIST_VERSION ") is starting...");
+ nm_log_info (LOGD_CORE, "NetworkManager (version " NM_DIST_VERSION ") is starting... (%s)",
+ nm_config_get_first_start (config) ? "for the first time" : "after a restart");
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);
diff --git a/src/nm-config.c b/src/nm-config.c
index 7c3c886861..15d016a21b 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -60,6 +60,15 @@ struct NMConfigCmdLineOptions {
*/
int connectivity_interval;
char *connectivity_response;
+
+ /* @first_start is not provided by command line. It is a convenient hack
+ * to pass in an argument to NMConfig. This makes NMConfigCmdLineOptions a
+ * misnomer.
+ *
+ * It is true, if NM is started the first time -- contrary to a restart
+ * during the same boot up. That is determined by the content of the
+ * /var/run/NetworManager state directory. */
+ bool first_start;
};
typedef struct {
@@ -291,6 +300,12 @@ nm_config_get_is_debug (NMConfig *config)
return NM_CONFIG_GET_PRIVATE (config)->cli.is_debug;
}
+gboolean
+nm_config_get_first_start (NMConfig *config)
+{
+ return NM_CONFIG_GET_PRIVATE (config)->cli.first_start;
+}
+
/*****************************************************************************/
static char **
@@ -412,6 +427,7 @@ _nm_config_cmd_line_options_clear (NMConfigCmdLineOptions *cli)
g_clear_pointer (&cli->connectivity_uri, g_free);
g_clear_pointer (&cli->connectivity_response, g_free);
cli->connectivity_interval = -1;
+ cli->first_start = FALSE;
}
static void
@@ -434,14 +450,18 @@ _nm_config_cmd_line_options_copy (const NMConfigCmdLineOptions *cli, NMConfigCmd
dst->connectivity_uri = g_strdup (cli->connectivity_uri);
dst->connectivity_response = g_strdup (cli->connectivity_response);
dst->connectivity_interval = cli->connectivity_interval;
+ dst->first_start = cli->first_start;
}
NMConfigCmdLineOptions *
-nm_config_cmd_line_options_new ()
+nm_config_cmd_line_options_new (gboolean first_start)
{
NMConfigCmdLineOptions *cli = g_new0 (NMConfigCmdLineOptions, 1);
_nm_config_cmd_line_options_clear (cli);
+
+ cli->first_start = first_start;
+
return cli;
}
diff --git a/src/nm-config.h b/src/nm-config.h
index 54d3a1ed90..283d6a1b4b 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -125,13 +125,15 @@ const char *nm_config_get_log_domains (NMConfig *config);
gboolean nm_config_get_configure_and_quit (NMConfig *config);
gboolean nm_config_get_is_debug (NMConfig *config);
+gboolean nm_config_get_first_start (NMConfig *config);
+
void nm_config_set_values (NMConfig *self,
GKeyFile *keyfile_intern_new,
gboolean allow_write,
gboolean force_rewrite);
/* for main.c only */
-NMConfigCmdLineOptions *nm_config_cmd_line_options_new (void);
+NMConfigCmdLineOptions *nm_config_cmd_line_options_new (gboolean first_start);
void nm_config_cmd_line_options_free (NMConfigCmdLineOptions *cli);
void nm_config_cmd_line_options_add_to_entries (NMConfigCmdLineOptions *cli,
GOptionContext *opt_ctx);
diff --git a/src/tests/config/test-config.c b/src/tests/config/test-config.c
index dd2a58a06a..edb5c1aa23 100644
--- a/src/tests/config/test-config.c
+++ b/src/tests/config/test-config.c
@@ -97,7 +97,7 @@ setup_config (GError **error, const char *config_file, const char *intern_config
argv = (char **)args->pdata;
argc = args->len;
- cli = nm_config_cmd_line_options_new ();
+ cli = nm_config_cmd_line_options_new (FALSE);
context = g_option_context_new (NULL);
nm_config_cmd_line_options_add_to_entries (cli, context);