diff --git a/man/nm-initrd-generator.xml b/man/nm-initrd-generator.xml index 503700fa80..f11be1f64b 100644 --- a/man/nm-initrd-generator.xml +++ b/man/nm-initrd-generator.xml @@ -74,6 +74,21 @@ + + + + + + + path + + + + Persistent connection directory. If it exists, rd.neednet will not + cause a default connection to be generated in absence of other options. + + + diff --git a/src/nm-initrd-generator/nm-initrd-generator.c b/src/nm-initrd-generator/nm-initrd-generator.c index 1705e8fcae..981cb14bdf 100644 --- a/src/nm-initrd-generator/nm-initrd-generator.c +++ b/src/nm-initrd-generator/nm-initrd-generator.c @@ -80,13 +80,14 @@ int main(int argc, char *argv[]) { GHashTable *connections; - gs_free char *connections_dir = NULL; - gs_free char *initrd_dir = NULL; - gs_free char *sysfs_dir = NULL; - gs_free char *run_config_dir = NULL; - gboolean dump_to_stdout = FALSE; - gs_strfreev char **remaining = NULL; - GOptionEntry option_entries[] = { + gs_free char *connections_dir = NULL; + gs_free char *etc_connections_dir = NULL; + gs_free char *initrd_dir = NULL; + gs_free char *sysfs_dir = NULL; + gs_free char *run_config_dir = NULL; + gboolean dump_to_stdout = FALSE; + gs_strfreev char **remaining = NULL; + GOptionEntry option_entries[] = { {"connections-dir", 'c', 0, @@ -94,6 +95,13 @@ main(int argc, char *argv[]) &connections_dir, "Output connection directory", NM_KEYFILE_PATH_NAME_RUN}, + {"persistent-connections-dir", + 'p', + 0, + G_OPTION_ARG_FILENAME, + &etc_connections_dir, + "Persistent connection directory", + NM_KEYFILE_PATH_NAME_ETC_DEFAULT}, {"initrd-data-dir", 'i', 0, @@ -153,6 +161,8 @@ main(int argc, char *argv[]) return 0; } + if (!etc_connections_dir) + etc_connections_dir = g_strdup(NM_KEYFILE_PATH_NAME_ETC_DEFAULT); if (!connections_dir) connections_dir = g_strdup(NM_KEYFILE_PATH_NAME_RUN); if (!sysfs_dir) @@ -162,7 +172,8 @@ main(int argc, char *argv[]) if (!run_config_dir) run_config_dir = g_strdup(DEFAULT_RUN_CONFIG_DIR); - connections = nmi_cmdline_reader_parse(sysfs_dir, + connections = nmi_cmdline_reader_parse(etc_connections_dir, + sysfs_dir, (const char *const *) remaining, &hostname, &carrier_timeout_sec); diff --git a/src/nm-initrd-generator/nm-initrd-generator.h b/src/nm-initrd-generator/nm-initrd-generator.h index dabf3201c0..4f33ac653b 100644 --- a/src/nm-initrd-generator/nm-initrd-generator.h +++ b/src/nm-initrd-generator/nm-initrd-generator.h @@ -38,7 +38,8 @@ nmi_ibft_update_connection_from_nic(NMConnection *connection, GHashTable *nic, G NMConnection *nmi_dt_reader_parse(const char *sysfs_dir); -GHashTable *nmi_cmdline_reader_parse(const char *sysfs_dir, +GHashTable *nmi_cmdline_reader_parse(const char *etc_connections_dir, + const char *sysfs_dir, const char *const *argv, char **hostname, gint64 *carrier_timeout_sec); diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c index 77b2cfba73..8a56039b7f 100644 --- a/src/nm-initrd-generator/nmi-cmdline-reader.c +++ b/src/nm-initrd-generator/nmi-cmdline-reader.c @@ -1316,7 +1316,8 @@ connection_set_needed_cb(gpointer key, gpointer value, gpointer user_data) } GHashTable * -nmi_cmdline_reader_parse(const char *sysfs_dir, +nmi_cmdline_reader_parse(const char *etc_connections_dir, + const char *sysfs_dir, const char *const *argv, char **hostname, gint64 *carrier_timeout_sec) @@ -1512,7 +1513,8 @@ nmi_cmdline_reader_parse(const char *sysfs_dir, } if (neednet) { - if (g_hash_table_size(reader->hash) == 0) { + if (!(etc_connections_dir && g_file_test(etc_connections_dir, G_FILE_TEST_IS_DIR)) + && g_hash_table_size(reader->hash) == 0) { /* Make sure there's some connection. */ reader_get_default_connection(reader); } diff --git a/src/nm-initrd-generator/tests/test-cmdline-reader.c b/src/nm-initrd-generator/tests/test-cmdline-reader.c index 02d87eb8f8..009af54006 100644 --- a/src/nm-initrd-generator/tests/test-cmdline-reader.c +++ b/src/nm-initrd-generator/tests/test-cmdline-reader.c @@ -29,7 +29,8 @@ gint64 *const _out_carrier_timeout_sec = (out_carrier_timeout_sec); \ GHashTable *_connections; \ \ - _connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs", \ + _connections = nmi_cmdline_reader_parse(NULL, \ + TEST_INITRD_DIR "/sysfs", \ _ARGV, \ _out_hostname, \ _out_carrier_timeout_sec); \