about summary refs log tree commit diff
path: root/system-settings/plugins/ifcfg-rh/reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'system-settings/plugins/ifcfg-rh/reader.c')
-rw-r--r--system-settings/plugins/ifcfg-rh/reader.c85
1 files changed, 49 insertions, 36 deletions
diff --git a/system-settings/plugins/ifcfg-rh/reader.c b/system-settings/plugins/ifcfg-rh/reader.c
index f25acc89..4ca9232a 100644
--- a/system-settings/plugins/ifcfg-rh/reader.c
+++ b/system-settings/plugins/ifcfg-rh/reader.c
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2008 - 2010 Red Hat, Inc.
+ * Copyright (C) 2008 - 2011 Red Hat, Inc.
  */
 
 #include <config.h>
@@ -114,7 +114,7 @@ make_connection_setting (const char *file,
 {
 	NMSettingConnection *s_con;
 	const char *ifcfg_name = NULL;
-	char *new_id = NULL, *uuid = NULL, *value;
+	char *new_id = NULL, *uuid = NULL;
 	char *ifcfg_id;
 
 	ifcfg_name = utils_get_ifcfg_name (file, TRUE);
@@ -167,21 +167,6 @@ make_connection_setting (const char *file,
 	              svTrueValue (ifcfg, "ONBOOT", TRUE),
 	              NULL);
 
-	value = svGetValue (ifcfg, "LAST_CONNECT", FALSE);
-	if (value) {
-		unsigned long int tmp;
-		guint64 timestamp;
-
-		errno = 0;
-		tmp = strtoul (value, NULL, 10);
-		if (errno == 0) {
-			timestamp = (guint64) tmp;
-			g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, timestamp, NULL);
-		} else
-			PLUGIN_WARN (IFCFG_PLUGIN_NAME, "    warning: invalid LAST_CONNECT time");
-		g_free (value);
-	}
-
 	return NM_SETTING (s_con);
 }
 
@@ -683,12 +668,7 @@ read_one_ip4_route (shvarFile *ifcfg,
 	/* Next hop */
 	if (!read_ip4_address (ifcfg, gw_tag, &tmp, error))
 		goto out;
-	if (!tmp) {
-		g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
-		             "Missing or invalid IP4 gateway address '%d'",
-		             tmp);
-		goto out;
-	}
+	/* No need to check tmp, because we don't make distinction between missing GATEWAY IP and 0.0.0.0 */
 	nm_ip4_route_set_next_hop (route, tmp);
 
 	/* Prefix */
@@ -891,11 +871,17 @@ error:
 }
 
 static NMIP6Address *
-parse_full_ip6_address (const char *addr_str, GError **error)
+parse_full_ip6_address (shvarFile *ifcfg,
+                        const char *network_file,
+                        const char *addr_str,
+                        int i,
+                        GError **error)
 {
-	NMIP6Address *addr;
+	NMIP6Address *addr = NULL;
 	char **list;
-	char *ip_tag, *prefix_tag;
+	char *ip_val, *prefix_val;
+	shvarFile *network_ifcfg;
+	char *value = NULL;
 	struct in6_addr tmp = IN6ADDR_ANY_INIT;
 	gboolean success = FALSE;
 
@@ -911,27 +897,26 @@ parse_full_ip6_address (const char *addr_str, GError **error)
 		goto error;
 	}
 
-	ip_tag = list[0];
-	prefix_tag = list[1];
+	ip_val = list[0];
+	prefix_val = list[1];
 
 	addr = nm_ip6_address_new ();
 	/* IP address */
-	if (ip_tag) {
-		if (!parse_ip6_address (ip_tag, &tmp, error))
+	if (ip_val) {
+		if (!parse_ip6_address (ip_val, &tmp, error))
 			goto error;
 	}
-
 	nm_ip6_address_set_address (addr, &tmp);
 
 	/* Prefix */
-	if (prefix_tag) {
+	if (prefix_val) {
 		long int prefix;
 
 		errno = 0;
-		prefix = strtol (prefix_tag, NULL, 10);
+		prefix = strtol (prefix_val, NULL, 10);
 		if (errno || prefix <= 0 || prefix > 128) {
 			g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
-			             "Invalid IP6 prefix '%s'", prefix_tag);
+			             "Invalid IP6 prefix '%s'", prefix_val);
 			goto error;
 		}
 		nm_ip6_address_set_prefix (addr, (guint32) prefix);
@@ -940,6 +925,32 @@ parse_full_ip6_address (const char *addr_str, GError **error)
 		nm_ip6_address_set_prefix (addr, 64);
 	}
 
+	/* Gateway */
+	tmp = in6addr_any;
+	value = svGetValue (ifcfg, "IPV6_DEFAULTGW", FALSE);
+	if (i != 0) {
+		/* We don't support gateways for IPV6ADDR_SECONDARIES yet */
+		g_free (value);
+		value = NULL;
+	}
+	if (!value) {
+		/* If no gateway in the ifcfg, try global /etc/sysconfig/network instead */
+		network_ifcfg = svNewFile (network_file);
+		if (network_ifcfg) {
+			value = svGetValue (network_ifcfg, "IPV6_DEFAULTGW", FALSE);
+			svCloseFile (network_ifcfg);
+		}
+	}
+	if (value) {
+		char *ptr;
+
+		if ((ptr = strchr (value, '%')) != NULL)
+			*ptr = '\0';  /* remove %interface prefix if present */
+		if (!parse_ip6_address (value, &tmp, error))
+			goto error;
+		nm_ip6_address_set_gateway (addr, &tmp);
+	}
+
 	success = TRUE;
 
 error:
@@ -949,6 +960,7 @@ error:
 	}
 
 	g_strfreev (list);
+	g_free (value);
 	return addr;
 }
 
@@ -1167,6 +1179,7 @@ make_ip4_setting (shvarFile *ifcfg,
 		if (!g_ascii_strcasecmp (value, "bootp") || !g_ascii_strcasecmp (value, "dhcp"))
 			method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
 		else if (!g_ascii_strcasecmp (value, "ibft")) {
+			g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, never_default, NULL);
 			/* iSCSI Boot Firmware Table: need to read values from the iSCSI 
 			 * firmware for this device and create the IP4 setting using those.
 			 */
@@ -1511,8 +1524,8 @@ make_ip6_setting (shvarFile *ifcfg,
 
 		list = g_strsplit_set (val, " ", 0);
 		g_free (val);
-		for (iter = list; iter && *iter; iter++, i++) {
-			addr = parse_full_ip6_address (*iter, error);
+		for (iter = list, i = 0; iter && *iter; iter++, i++) {
+			addr = parse_full_ip6_address (ifcfg, network_file, *iter, i, error);
 			if (!addr) {
 				g_strfreev (list);
 				goto error;