diff --git a/man/nm-initrd-generator.xml b/man/nm-initrd-generator.xml index df2cf12a4..37f5ffdf4 100644 --- a/man/nm-initrd-generator.xml +++ b/man/nm-initrd-generator.xml @@ -74,6 +74,20 @@ + + + + + + + path + + + + Output directory for initrd data (e.g. hostname). + + + @@ -118,6 +132,7 @@ + @@ -128,6 +143,34 @@ + Differences from the network-legacy dracut module + + nm-initrd-generator generates a set of + connections that are then configured by the NetworkManager + instance running in the initrd. There are some differences in + behavior compared to the network-legacy dracut module: + + + + When an interface is configured with a static address + and a gateway, the network-legacy module waits that the + gateway responds to arping requests before proceeding, while + NetworkManager doesn't. + + + + network-legacy configures interfaces one by one in the + order in which they are announced by udev. If multiple + interfaces specify a hostname (from command line or from + DHCP), the one from the last interface activated wins. With + NetworkManager, hostnames from command line have higher + precedence over ones from DHCP, and the last that appears in + the command line wins. + + + + + Exit Status nm-initrd-generator exits with status 0. It ignores unrecognized options and prints an error message if it encounters a malformed option. diff --git a/src/initrd/nm-initrd-generator.c b/src/initrd/nm-initrd-generator.c index dccb21f87..a04ffb7d4 100644 --- a/src/initrd/nm-initrd-generator.c +++ b/src/initrd/nm-initrd-generator.c @@ -64,24 +64,28 @@ err_out: } #define DEFAULT_SYSFS_DIR "/sys" +#define DEFAULT_INITRD_DATA_DIR NMRUNDIR "/initrd" 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; gboolean dump_to_stdout = FALSE; gs_strfreev char **remaining = NULL; GOptionEntry option_entries[] = { - { "connections-dir", 'c', 0, G_OPTION_ARG_FILENAME, &connections_dir, "Output connection directory", NM_KEYFILE_PATH_NAME_RUN }, - { "sysfs-dir", 'd', 0, G_OPTION_ARG_FILENAME, &sysfs_dir, "The sysfs mount point", DEFAULT_SYSFS_DIR }, - { "stdout", 's', 0, G_OPTION_ARG_NONE, &dump_to_stdout, "Dump connections to standard output", NULL }, - { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL }, + { "connections-dir", 'c', 0, G_OPTION_ARG_FILENAME, &connections_dir, "Output connection directory", NM_KEYFILE_PATH_NAME_RUN }, + { "initrd-data-dir", 'i', 0, G_OPTION_ARG_FILENAME, &initrd_dir, "Output initrd data directory", DEFAULT_INITRD_DATA_DIR }, + { "sysfs-dir", 'd', 0, G_OPTION_ARG_FILENAME, &sysfs_dir, "The sysfs mount point", DEFAULT_SYSFS_DIR }, + { "stdout", 's', 0, G_OPTION_ARG_NONE, &dump_to_stdout, "Dump connections to standard output", NULL }, + { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL }, { NULL } }; GOptionContext *option_context; - GError *error = NULL; + gs_free_error GError *error = NULL; + gs_free char *hostname = NULL; int errsv; option_context = g_option_context_new ("-- [ip=...] [rd.route=...] [bridge=...] [bond=...] [team=...] [vlan=...] " @@ -108,6 +112,8 @@ main (int argc, char *argv[]) connections_dir = g_strdup (NM_KEYFILE_PATH_NAME_RUN); if (!sysfs_dir) sysfs_dir = g_strdup (DEFAULT_SYSFS_DIR); + if (!initrd_dir) + initrd_dir = g_strdup (DEFAULT_INITRD_DATA_DIR); if (dump_to_stdout) nm_clear_g_free (&connections_dir); @@ -117,9 +123,31 @@ main (int argc, char *argv[]) return 1; } - connections = nmi_cmdline_reader_parse (sysfs_dir, (const char *const*) remaining); + connections = nmi_cmdline_reader_parse (sysfs_dir, + (const char *const*) remaining, + &hostname); + g_hash_table_foreach (connections, output_conn, connections_dir); g_hash_table_destroy (connections); + if (g_mkdir_with_parents (initrd_dir, 0755) != 0) { + errsv = errno; + _LOGW (LOGD_CORE, "%s: %s", initrd_dir, nm_strerror_native (errsv)); + return 1; + } + + if (hostname) { + gs_free char *hostname_file = NULL; + gs_free char *data = NULL; + + hostname_file = g_strdup_printf ("%s/hostname", initrd_dir); + data = g_strdup_printf ("%s\n", hostname); + + if (!g_file_set_contents (hostname_file, data, strlen (data), &error)) { + _LOGW (LOGD_CORE, "%s: %s", hostname_file, error->message); + return 1; + } + } + return 0; } diff --git a/src/initrd/nm-initrd-generator.h b/src/initrd/nm-initrd-generator.h index cba383d1e..971999212 100644 --- a/src/initrd/nm-initrd-generator.h +++ b/src/initrd/nm-initrd-generator.h @@ -28,6 +28,6 @@ gboolean nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTab NMConnection *nmi_dt_reader_parse (const char *sysfs_dir); -GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv); +GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char **hostname); #endif /* __NM_INITRD_GENERATOR_H__ */ diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c index 2eb6d7e5b..2f6afefcb 100644 --- a/src/initrd/nmi-cmdline-reader.c +++ b/src/initrd/nmi-cmdline-reader.c @@ -7,6 +7,7 @@ #include "nm-core-internal.h" #include "nm-initrd-generator.h" +#include "systemd/nm-sd-utils-shared.h" /*****************************************************************************/ @@ -22,6 +23,11 @@ typedef struct { GPtrArray *array; NMConnection *bootdev_connection; /* connection for bootdev=$ifname */ NMConnection *default_connection; /* connection not bound to any ifname */ + char *hostname; + + /* Parameters to be set for all connections */ + gboolean ignore_auto_dns; + int dhcp_timeout; } Reader; static Reader * @@ -45,6 +51,7 @@ reader_destroy (Reader *reader, gboolean free_hash) g_ptr_array_unref (reader->array); hash = g_steal_pointer (&reader->hash); + nm_clear_g_free (&reader->hostname); nm_g_slice_free (reader); if (!free_hash) return g_steal_pointer (&hash); @@ -86,6 +93,8 @@ reader_create_connection (Reader *reader, g_object_set (setting, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE, + NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns, + NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout, NULL); setting = nm_setting_ip6_config_new (); @@ -94,6 +103,8 @@ reader_create_connection (Reader *reader, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, (int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64, + NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns, + NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout, NULL); setting = nm_setting_connection_new (); @@ -345,6 +356,14 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument) ifname = tmp; } + if (client_hostname && !nm_sd_hostname_is_valid (client_hostname, FALSE)) + client_hostname = NULL; + + if (client_hostname) { + g_free (reader->hostname); + reader->hostname = g_strdup (client_hostname); + } + /* :{none|off|dhcp|on|any|dhcp6|auto6|ibft} */ kind = get_word (&argument, ':'); @@ -807,27 +826,6 @@ _normalize_conn (gpointer key, gpointer value, gpointer user_data) nm_connection_normalize (connection, NULL, NULL, NULL); } -static void -reader_set_ignore_auto_dns (Reader *reader) -{ - GHashTableIter iter; - NMConnection *connection; - NMSettingIPConfig *s_ip = NULL; - - g_hash_table_iter_init (&iter, reader->hash); - while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &connection)) { - s_ip = nm_connection_get_setting_ip4_config (connection); - g_object_set (s_ip, - NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, TRUE, - NULL); - - s_ip = nm_connection_get_setting_ip6_config (connection); - g_object_set (s_ip, - NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, TRUE, - NULL); - } -} - static void reader_add_nameservers (Reader *reader, GPtrArray *nameservers) { @@ -875,7 +873,7 @@ reader_add_nameservers (Reader *reader, GPtrArray *nameservers) } GHashTable * -nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv) +nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char **hostname) { Reader *reader; const char *tag; @@ -886,16 +884,27 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv) gboolean net_ifnames = TRUE; gs_unref_ptrarray GPtrArray *nameservers = NULL; gs_unref_ptrarray GPtrArray *routes = NULL; - gboolean ignore_auto_dns = FALSE; int i; reader = reader_new (); for (i = 0; argv[i]; i++) { - if (strcmp (argv[i], "net.ifnames=0") == 0) - net_ifnames = FALSE; - else if (g_str_has_prefix (argv[i], "net.ifnames=")) - net_ifnames = TRUE; + gs_free char *argument_clone = NULL; + char *argument; + + argument_clone = g_strdup (argv[i]); + argument = argument_clone; + + tag = get_word (&argument, '='); + + if (strcmp (tag, "net.ifnames") == 0) + net_ifnames = strcmp (argument, "0") != 0; + else if (strcmp (tag, "rd.peerdns") == 0) + reader->ignore_auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE); + else if (strcmp (tag, "rd.net.timeout.dhcp") == 0) { + reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument, + 10, 0, G_MAXINT32, 0); + } } for (i = 0; argv[i]; i++) { @@ -933,9 +942,7 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv) } if (argument && *argument) _LOGW (LOGD_CORE, "Ignoring extra: '%s'.", argument); - } else if (strcmp (tag, "rd.peerdns") == 0) - ignore_auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE); - else if (strcmp (tag, "rd.iscsi.ibft") == 0 && _nm_utils_ascii_str_to_bool (argument, TRUE)) + } else if (strcmp (tag, "rd.iscsi.ibft") == 0 && _nm_utils_ascii_str_to_bool (argument, TRUE)) reader_read_all_connections_from_fw (reader, sysfs_dir); else if (strcmp (tag, "rd.bootif") == 0) ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE); @@ -1009,9 +1016,9 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv) if (nameservers) reader_add_nameservers (reader, nameservers); - if (ignore_auto_dns) - reader_set_ignore_auto_dns (reader); - g_hash_table_foreach (reader->hash, _normalize_conn, NULL); + + NM_SET_OUT (hostname, g_steal_pointer (&reader->hostname)); + return reader_destroy (reader, FALSE); } diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c index b2b06e27c..4c972e738 100644 --- a/src/initrd/tests/test-cmdline-reader.c +++ b/src/initrd/tests/test-cmdline-reader.c @@ -30,10 +30,12 @@ test_auto (void) NMSettingWired *s_wired; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "default_connection"); g_assert (connection); @@ -81,10 +83,12 @@ test_if_auto_with_mtu (void) NMSettingWired *s_wired; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth0"); g_assert (connection); @@ -115,10 +119,13 @@ test_if_dhcp6 (void) NMConnection *connection; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); + connection = g_hash_table_lookup (connections, "eth1"); g_assert (connection); nmtst_assert_connection_verifies_without_normalization (connection); @@ -145,10 +152,12 @@ test_if_auto_with_mtu_and_mac (void) NMSettingWired *s_wired; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth2"); g_assert (connection); @@ -183,10 +192,12 @@ test_if_ip4_manual (void) NMConnection *connection; NMSettingIPConfig *s_ip4; NMIPAddress *ip_addr; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, "hostname1.example.com"); connection = g_hash_table_lookup (connections, "eth3"); g_assert (connection); @@ -237,10 +248,12 @@ test_if_ip6_manual (void) NMConnection *connection; NMSettingIPConfig *s_ip6; NMIPAddress *ip_addr; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, "hostname0.example.com"); connection = g_hash_table_lookup (connections, "eth4"); g_assert (connection); @@ -274,10 +287,12 @@ test_multiple_merge (void) NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; NMIPAddress *ip_addr; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth0"); g_assert (connection); @@ -317,10 +332,12 @@ test_multiple_bootdev (void) NMConnection *connection; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth3"); g_assert (connection); @@ -344,10 +361,12 @@ test_bootdev (void) const char *const*ARGV = NM_MAKE_STRV ("vlan=vlan2:ens5", "bootdev=ens3"); NMConnection *connection; NMSettingConnection *s_con; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "ens3"); g_assert (connection); @@ -384,10 +403,12 @@ test_some_more (void) NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; NMIPRoute *ip_route; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth1"); g_assert (connection); @@ -466,10 +487,12 @@ test_bond (void) NMSettingBond *s_bond; NMIPRoute *ip_route; const char *master_uuid; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 3); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "bong0"); g_assert (connection); @@ -545,10 +568,12 @@ test_bond_default (void) NMSettingIPConfig *s_ip6; NMSettingBond *s_bond; const char *master_uuid; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "bond0"); @@ -598,7 +623,9 @@ static void test_bridge (void) { gs_unref_hashtable GHashTable *connections = NULL; - const char *const*ARGV = NM_MAKE_STRV ("bridge=bridge0:eth0,eth1", "rd.route=192.0.2.53::bridge0"); + const char *const*ARGV = NM_MAKE_STRV ("bridge=bridge0:eth0,eth1", + "rd.route=192.0.2.53::bridge0", + "rd.net.timeout.dhcp=10"); NMConnection *connection; NMSettingConnection *s_con; NMSettingIPConfig *s_ip4; @@ -606,10 +633,12 @@ test_bridge (void) NMSettingBridge *s_bridge; NMIPRoute *ip_route; const char *master_uuid; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 3); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "bridge0"); g_assert (connection); @@ -626,6 +655,7 @@ test_bridge (void) g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0); g_assert (!nm_setting_ip_config_get_gateway (s_ip4)); g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 1); + g_assert_cmpint (nm_setting_ip_config_get_dhcp_timeout(s_ip4), ==, 10); ip_route = nm_setting_ip_config_get_route (s_ip4, 0); g_assert_cmpstr (nm_ip_route_get_dest (ip_route), ==, "192.0.2.53"); g_assert_cmpint (nm_ip_route_get_family (ip_route), ==, AF_INET); @@ -640,6 +670,8 @@ test_bridge (void) g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0); g_assert (!nm_setting_ip_config_get_gateway (s_ip6)); g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0); + g_assert_cmpint (nm_setting_ip_config_get_dhcp_timeout(s_ip6), ==, 10); + s_bridge = nm_connection_get_setting_bridge (connection); g_assert (s_bridge); @@ -682,10 +714,12 @@ test_bridge_default (void) NMSettingIPConfig *s_ip6; NMSettingBridge *s_bridge; const char *master_uuid; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "br0"); @@ -740,10 +774,12 @@ test_team (void) NMSettingIPConfig *s_ip6; NMSettingTeam *s_team; const char *master_uuid; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 3); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "team0"); g_assert (connection); @@ -806,10 +842,12 @@ test_ibft_ip_dev (void) gs_unref_hashtable GHashTable *connections = NULL; NMSettingConnection *s_con; NMConnection *connection; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth0"); g_assert (connection); @@ -825,10 +863,12 @@ _test_ibft_ip (const char *const*ARGV) { gs_unref_hashtable GHashTable *connections = NULL; NMConnection *connection; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "ibft0"); g_assert (connection); @@ -864,10 +904,12 @@ test_ignore_extra (void) { gs_unref_hashtable GHashTable *connections = NULL; const char *const*ARGV = NM_MAKE_STRV ("blabla", "extra", "lalala"); + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 0); + g_assert_cmpstr (hostname, ==, NULL); } static void @@ -886,10 +928,12 @@ test_rd_znet (void) { .name = "portno", .value_str = "1" }, }; int i_s390_options_keys; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, "foo.example.com"); connection = g_hash_table_lookup (connections, "enc800"); g_assert (NM_IS_CONNECTION (connection)); @@ -963,10 +1007,12 @@ test_rd_znet_legacy (void) "net.ifnames=0"); NMConnection *connection; NMSettingConnection *s_con; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, "foo.example.com"); connection = g_hash_table_lookup (connections, "eth0"); g_assert (NM_IS_CONNECTION (connection)); @@ -1001,10 +1047,12 @@ test_bootif (void) NMSettingWired *s_wired; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "default_connection"); g_assert (connection); @@ -1037,10 +1085,12 @@ test_bootif_hwtype (void) NMSettingWired *s_wired; NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 2); + g_assert_cmpstr (hostname, ==, NULL); connection = g_hash_table_lookup (connections, "eth0"); g_assert (connection); @@ -1100,10 +1150,12 @@ test_nameserver (void) "nameserver=[2606:4700:4700::1111]"); NMConnection *connection; NMSettingIPConfig *s_ip; + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 3); + g_assert_cmpstr (hostname, ==, "foo.example.com"); connection = g_hash_table_lookup (connections, "eth0"); g_assert (connection); @@ -1140,10 +1192,12 @@ test_bootif_off (void) { gs_unref_hashtable GHashTable *connections = NULL; const char *const*ARGV = NM_MAKE_STRV ("BOOTIF=01-00-53-AB-cd-02-03", "rd.bootif=0"); + gs_free char *hostname = NULL; - connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); g_assert (connections); g_assert_cmpint (g_hash_table_size (connections), ==, 0); + g_assert_cmpstr (hostname, ==, NULL); } NMTST_DEFINE ();