about summary refs log tree commit diff
path: root/src/initrd/nmi-cmdline-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/initrd/nmi-cmdline-reader.c')
-rw-r--r--src/initrd/nmi-cmdline-reader.c125
1 files changed, 71 insertions, 54 deletions
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
index 2eb6d7e5..7513b4c9 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);
+		}
+
 		/* <ifname>:{none|off|dhcp|on|any|dhcp6|auto6|ibft} */
 
 		kind = get_word (&argument, ':');
@@ -363,8 +382,8 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
 		}
 	}
 
-	if (ifname == NULL && (   g_strcmp0 (kind, "fw") == 0
-	                       || g_strcmp0 (kind, "ibft") == 0)) {
+	if (   ifname == NULL
+	    && NM_IN_STRSET (kind, "fw", "ibft")) {
 		reader_read_all_connections_from_fw (reader, sysfs_dir);
 		return;
 	}
@@ -442,7 +461,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
 	}
 
 	/* Dynamic IP configuration configured explicitly. */
-	if (g_strcmp0 (kind, "none") == 0 || (g_strcmp0 (kind, "off") == 0)) {
+	if (NM_IN_STRSET (kind, "none", "off")) {
 		if (nm_setting_ip_config_get_num_addresses (s_ip6) == 0) {
 			g_object_set (s_ip6,
 			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_DISABLED,
@@ -453,7 +472,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
 			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
 			              NULL);
 		}
-	} else if (g_strcmp0 (kind, "dhcp") == 0) {
+	} else if (nm_streq0 (kind, "dhcp")) {
 		g_object_set (s_ip4,
 		              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
 		              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
@@ -463,7 +482,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
 			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
 			              NULL);
 		}
-	} else if (g_strcmp0 (kind, "dhcp6") == 0) {
+	} else if (nm_streq0 (kind, "dhcp6")) {
 		g_object_set (s_ip6,
 		              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_DHCP,
 		              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
@@ -473,7 +492,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
 			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
 			              NULL);
 		}
-	} else if (g_strcmp0 (kind, "auto6") == 0) {
+	} else if (nm_streq0 (kind, "auto6")) {
 		g_object_set (s_ip4,
 		              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
 		              NULL);
@@ -482,7 +501,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
 			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
 			              NULL);
 		}
-	} else if (g_strcmp0 (kind, "ibft") == 0) {
+	} else if (nm_streq0 (kind, "ibft")) {
 		gs_free char *address_path = g_build_filename (sysfs_dir, "class", "net", ifname, "address", NULL);
 		gs_free char *mac, *mac_up = NULL;
 		GHashTable *nic = NULL;
@@ -591,7 +610,7 @@ reader_parse_master (Reader *reader,
 	s_con = nm_connection_get_setting_connection (connection);
 	master = nm_setting_connection_get_uuid (s_con);
 
-	if (strcmp (type_name, NM_SETTING_BOND_SETTING_NAME) == 0) {
+	if (nm_streq (type_name, NM_SETTING_BOND_SETTING_NAME)) {
 		s_bond = (NMSettingBond *)nm_connection_get_setting_by_name (connection, type_name);
 
 		opts = get_word (&argument, ':');
@@ -777,7 +796,9 @@ reader_parse_rd_znet (Reader *reader, char *argument, gboolean net_ifnames)
 		ifname = g_strdup_printf ("%s%d", prefix, index);
 	}
 
-	connection = reader_get_connection (reader, ifname, NM_SETTING_WIRED_SETTING_NAME, TRUE);
+	connection = reader_get_connection (reader, ifname, NM_SETTING_WIRED_SETTING_NAME, FALSE);
+	if (!connection)
+		return;
 	s_wired = nm_connection_get_setting_wired (connection);
 	g_object_set (s_wired,
 	              NM_SETTING_WIRED_S390_NETTYPE, nettype,
@@ -808,27 +829,6 @@ _normalize_conn (gpointer key, gpointer value, gpointer user_data)
 }
 
 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)
 {
 	NMConnection *connection;
@@ -875,7 +875,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 +886,28 @@ 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;
+	gs_unref_ptrarray GPtrArray *znets = NULL;
 	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 (nm_streq (tag, "net.ifnames"))
+			net_ifnames = !nm_streq (argument, "0");
+		else if (nm_streq (tag, "rd.peerdns"))
+			reader->ignore_auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE);
+		else if (nm_streq (tag, "rd.net.timeout.dhcp")) {
+			reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument,
+			                                                     10, 0, G_MAXINT32, 0);
+		}
 	}
 
 	for (i = 0; argv[i]; i++) {
@@ -907,24 +919,24 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
 		argument = argument_clone;
 
 		tag = get_word (&argument, '=');
-		if (strcmp (tag, "ip") == 0)
+		if (nm_streq (tag, "ip"))
 			reader_parse_ip (reader, sysfs_dir, argument);
-		else if (strcmp (tag, "rd.route") == 0) {
+		else if (nm_streq (tag, "rd.route")) {
 			if (!routes)
 				routes = g_ptr_array_new_with_free_func (g_free);
 			g_ptr_array_add (routes, g_strdup (argument));
-		} else if (strcmp (tag, "bridge") == 0)
+		} else if (nm_streq (tag, "bridge"))
 			reader_parse_master (reader, argument, NM_SETTING_BRIDGE_SETTING_NAME, "br");
-		else if (strcmp (tag, "bond") == 0)
+		else if (nm_streq (tag, "bond"))
 			reader_parse_master (reader, argument, NM_SETTING_BOND_SETTING_NAME, NULL);
-		else if (strcmp (tag, "team") == 0)
+		else if (nm_streq (tag, "team"))
 			reader_parse_master (reader, argument, NM_SETTING_TEAM_SETTING_NAME, NULL);
-		else if (strcmp (tag, "vlan") == 0)
+		else if (nm_streq (tag, "vlan"))
 			reader_parse_vlan (reader, argument);
-		else if (strcmp (tag, "bootdev") == 0) {
+		else if (nm_streq (tag, "bootdev")) {
 			g_free (bootdev);
 			bootdev = g_strdup (argument);
-		} else if (strcmp (tag, "nameserver") == 0) {
+		} else if (nm_streq (tag, "nameserver")) {
 			word = get_word (&argument, '\0');
 			if (word) {
 				if (!nameservers)
@@ -933,17 +945,17 @@ 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 (nm_streq (tag, "rd.iscsi.ibft") && _nm_utils_ascii_str_to_bool (argument, TRUE))
 			reader_read_all_connections_from_fw (reader, sysfs_dir);
-		else if (strcmp (tag, "rd.bootif") == 0)
+		else if (nm_streq (tag, "rd.bootif"))
 			ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE);
-		else if (strcmp (tag, "rd.neednet") == 0)
+		else if (nm_streq (tag, "rd.neednet"))
 			neednet = _nm_utils_ascii_str_to_bool (argument, TRUE);
-		else if (strcmp (tag, "rd.znet") == 0)
-			reader_parse_rd_znet (reader, argument, net_ifnames);
-		else if (g_ascii_strcasecmp (tag, "BOOTIF") == 0) {
+		else if (nm_streq (tag, "rd.znet")) {
+			if (!znets)
+				znets = g_ptr_array_new_with_free_func (g_free);
+			g_ptr_array_add (znets, g_strdup (argument));
+		} else if (g_ascii_strcasecmp (tag, "BOOTIF") == 0) {
 			nm_clear_g_free (&bootif_val);
 			bootif_val = g_strdup (argument);
 		}
@@ -1009,9 +1021,14 @@ 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);
+	if (znets) {
+		for (i = 0; i < znets->len; i++)
+			reader_parse_rd_znet (reader, znets->pdata[i], net_ifnames);
+	}
 
 	g_hash_table_foreach (reader->hash, _normalize_conn, NULL);
+
+	NM_SET_OUT (hostname, g_steal_pointer (&reader->hostname));
+
 	return reader_destroy (reader, FALSE);
 }