[PATCH] Generic backend functions



Dear NetworkManager developpers,

Please find attached a patch that implements generic backend functions. This allows to factorize a large amount of the duplicated code in the backend specific files. It applies to current CVS, in src/backends.

The patch does not change any of the backend behaviours : it only switches a "native" code to its "generic" counterpart when they are identical. It also does not restrict the flexibility of the current design : each backend is still free to implement its own function if the generic one is not satisfying.

Here is the diffstat :

Makefile.am               |    3
NetworkManagerArch.c      |  171 +--------------
NetworkManagerDebian.c    |  169 +--------------
NetworkManagerGeneric.c | 495 ++++++++++++++++++++++++++++++++++++++++++++++
NetworkManagerGeneric.h   |   93 ++++++++
NetworkManagerGentoo.c    |   90 +-------
NetworkManagerPaldo.c     |   88 +-------
NetworkManagerRedHat.c    |  173 +---------------
NetworkManagerSlackware.c |   94 +-------
NetworkManagerSuSE.c      |  172 +--------------
10 files changed, 687 insertions(+), 861 deletions(-)

For your information, I plan to extend NetworkManagerGeneric.c with more autoconf tests. It will allow to factorize more code, like the mDNS, avahi and nscd calls. Please tell me if it is appropriate.

NetworkManagerGeneric.c is also a perfect place to experiment with libnl instead of the "ip" command-line tool.

I was also planning to write some sort of "dummy" backend for distributions that are not currently supported, but I have realized that the Slackware backend also plays this role quite nicely.

Best regards,

Timoth�Lecomte
diff -Naur old/Makefile.am new/Makefile.am
--- old/Makefile.am	2006-03-27 21:58:03.000000000 +0200
+++ new/Makefile.am	2006-07-20 20:29:34.000000000 +0200
@@ -8,7 +8,8 @@
 
 noinst_LTLIBRARIES = libnmbackend.la
 
-libnmbackend_la_SOURCES =
+libnmbackend_la_SOURCES =	NetworkManagerGeneric.c	\
+				NetworkManagerGeneric.h
 
 if TARGET_REDHAT
 libnmbackend_la_SOURCES +=	NetworkManagerRedHat.c	\
diff -Naur old/NetworkManagerArch.c new/NetworkManagerArch.c
--- old/NetworkManagerArch.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerArch.c	2006-07-20 20:36:25.000000000 +0200
@@ -42,6 +42,7 @@
 #include <arpa/inet.h>
 #include <glib/gprintf.h>
 #include <glib/gfileutils.h>
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device.h"
@@ -61,6 +62,7 @@
  */
 void nm_system_init (void)
 {
+	nm_generic_init ();
 }
 
 /*
@@ -71,13 +73,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
 
 
@@ -89,14 +85,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
 
 /*
@@ -107,14 +96,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 
@@ -126,14 +108,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 /*
@@ -144,14 +119,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 /*
@@ -162,13 +130,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 
@@ -180,14 +142,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 /*
@@ -322,7 +277,7 @@
  */
 void nm_system_flush_loopback_routes (void)
 {
-	nm_system_device_flush_routes_with_iface ("lo");
+	nm_generic_flush_loopback_routes ();
 }
 
 
@@ -334,7 +289,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 
@@ -346,7 +301,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 
@@ -404,104 +359,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-	char *buf;
-	char *addr;
-	struct ether_addr hw_addr;
-	unsigned char eui[8];
-
-  if (nm_device_is_802_3_ethernet (dev))
-    nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-  else if (nm_device_is_802_11_wireless (dev))
-    nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-
-	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-	memmove(eui+5, eui+3, 3);
-	eui[3] = 0xff;
-	eui[4] = 0xfe;
-	eui[0] ^= 2;
-
-	/* Add the default link-local IPv6 address to a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
-			 eui[0], eui[1], eui[2], eui[3],
-			 eui[4], eui[5],
-			 eui[6], eui[7], nm_device_get_iface (dev));
-	nm_spawn_process (buf);
-	g_free (buf);
-}
-
-/*
- * set_ip4_config_from_resolv_conf
- *
- * Add nameservers and search names from a resolv.conf format file.
- *
- */
-static void set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
-{
-	char *	contents = NULL;
-	char **	split_contents = NULL;
-	int		i, len;
-
-	g_return_if_fail (filename != NULL);
-	g_return_if_fail (ip4_config != NULL);
-
-	if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
-		return;
-
-	if (!(split_contents = g_strsplit (contents, "\n", 0)))
-		goto out;
-	
-	len = g_strv_length (split_contents);
-	for (i = 0; i < len; i++)
-	{
-		char *line = split_contents[i];
-
-		/* Ignore comments */
-		if (!line || (line[0] == ';') || (line[0] == '#'))
-			continue;
-
-		line = g_strstrip (line);
-		if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
-		{
-			char *searches = g_strdup (line + 7);
-			char **split_searches = NULL;
-
-			if (!searches || !strlen (searches))
-				continue;
-
-			/* Allow space-separated search domains */
-			if ((split_searches = g_strsplit (searches, " ", 0)))
-			{
-				int m, srch_len;
-
-				srch_len = g_strv_length (split_searches);
-				for (m = 0; m < srch_len; m++)
-				{
-					if (split_searches[m])
-						nm_ip4_config_add_domain	(ip4_config, split_searches[m]);
-				}
-				g_strfreev (split_searches);
-			}
-			else
-			{
-				/* Only 1 item, add the whole line */
-				nm_ip4_config_add_domain	(ip4_config, searches);
-			}
-
-			g_free (searches);
-		}
-		else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
-		{
-			guint32	addr = (guint32) (inet_addr (line + 11));
-
-			if (addr != (guint32) -1)
-				nm_ip4_config_add_nameserver (ip4_config, addr);
-		}
-	}
-
-	g_strfreev (split_contents);
-
-	out:
-	g_free (contents);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 /*
@@ -728,7 +586,7 @@
 			nm_ip4_config_set_broadcast (sys_data->config, broadcast);
 		}
 
-		set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config);
+		nm_generic_set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config);
 #if 0
 		{
 			int j;
@@ -985,4 +843,3 @@
 	return 0;
 
 }
-
diff -Naur old/NetworkManagerDebian.c new/NetworkManagerDebian.c
--- old/NetworkManagerDebian.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerDebian.c	2006-07-20 10:38:29.000000000 +0200
@@ -31,6 +31,7 @@
 #include <sys/types.h>
 #include <signal.h>
 #include <arpa/inet.h>
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device.h"
@@ -50,6 +51,7 @@
  */
 void nm_system_init (void)
 {
+	nm_generic_init ();
 }
 
 /*
@@ -60,13 +62,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
 
 
@@ -78,14 +74,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
 
 /*
@@ -96,14 +85,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 
@@ -115,13 +97,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 /*
@@ -132,14 +108,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 /*
@@ -150,13 +119,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 
@@ -168,14 +131,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 /*
@@ -199,7 +155,7 @@
  */
 void nm_system_flush_loopback_routes (void)
 {
-	nm_system_device_flush_routes_with_iface ("lo");
+	nm_generic_flush_loopback_routes ();
 }
 
 
@@ -211,7 +167,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 
@@ -223,7 +179,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 
@@ -274,28 +230,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-  char *buf;
-  struct ether_addr hw_addr;
-  unsigned char eui[8];
-
-  if (nm_device_is_802_3_ethernet (dev))
-    nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-  else if (nm_device_is_802_11_wireless (dev))
-    nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-
-  memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-  memmove(eui+5, eui+3, 3);
-  eui[3] = 0xff;
-  eui[4] = 0xfe;
-  eui[0] ^= 2;
-
-  /* Add the default link-local IPv6 address to a device */
-  buf = g_strdup_printf (IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
-			 eui[0], eui[1], eui[2], eui[3],
-			 eui[4], eui[5],
-			 eui[6], eui[7], nm_device_get_iface (dev));
-  nm_spawn_process (buf);
-  g_free (buf);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 typedef struct DebSystemConfigData
@@ -305,82 +240,6 @@
 } DebSystemConfigData;
 
 /*
- * set_ip4_config_from_resolv_conf
- *
- * Add nameservers and search names from a resolv.conf format file.
- *
- */
-static void set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
-{
-	char *	contents = NULL;
-	char **	split_contents = NULL;
-	int		i, len;
-
-	g_return_if_fail (filename != NULL);
-	g_return_if_fail (ip4_config != NULL);
-
-	if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
-		return;
-
-	if (!(split_contents = g_strsplit (contents, "\n", 0)))
-		goto out;
-	
-	len = g_strv_length (split_contents);
-	for (i = 0; i < len; i++)
-	{
-		char *line = split_contents[i];
-
-		/* Ignore comments */
-		if (!line || (line[0] == ';') || (line[0] == '#'))
-			continue;
-
-		line = g_strstrip (line);
-		if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
-		{
-			char *searches = g_strdup (line + 7);
-			char **split_searches = NULL;
-
-			if (!searches || !strlen (searches))
-				continue;
-
-			/* Allow space-separated search domains */
-			if ((split_searches = g_strsplit (searches, " ", 0)))
-			{
-				int m, srch_len;
-
-				srch_len = g_strv_length (split_searches);
-				for (m = 0; m < srch_len; m++)
-				{
-					if (split_searches[m])
-						nm_ip4_config_add_domain	(ip4_config, split_searches[m]);
-				}
-				g_strfreev (split_searches);
-			}
-			else
-			{
-				/* Only 1 item, add the whole line */
-				nm_ip4_config_add_domain	(ip4_config, searches);
-			}
-
-			g_free (searches);
-		}
-		else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
-		{
-			guint32	addr = (guint32) (inet_addr (line + 11));
-
-			if (addr != (guint32) -1)
-				nm_ip4_config_add_nameserver (ip4_config, addr);
-		}
-	}
-
-	g_strfreev (split_contents);
-
-out:
-	g_free (contents);
-}
-
-
-/*
  * nm_system_device_get_system_config
  *
  * Retrieve any relevant configuration info for a particular device
@@ -451,7 +310,7 @@
 	}
 
         if (!sys_data->use_dhcp)
-            set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config);
+            nm_generic_set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config);
 
 #if 0
 	nm_debug ("------ Config (%s)", nm_device_get_iface (dev));
diff -Naur old/NetworkManagerGeneric.c new/NetworkManagerGeneric.c
--- old/NetworkManagerGeneric.c	1970-01-01 01:00:00.000000000 +0100
+++ new/NetworkManagerGeneric.c	2006-07-20 20:48:13.000000000 +0200
@@ -0,0 +1,495 @@
+/* NetworkManager -- Network link manager
+ *
+ * Timothee Lecomte <timothee lecomte ens fr>
+ *
+ * Heavily based on NetworkManagerRedhat.c by Dan Williams <dcbw redhat com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * (C) Copyright 2004 Red Hat, Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <arpa/inet.h>
+#include "NetworkManagerSystem.h"
+#include "NetworkManagerUtils.h"
+#include "nm-device.h"
+#include "nm-device-802-3-ethernet.h"
+#include "nm-device-802-11-wireless.h"
+#include "nm-utils.h"
+
+/*
+ * nm_generic_init
+ *
+ * Initializes the distribution-specific system backend
+ *
+ */
+void nm_generic_init (void)
+{
+	/* Kill any dhclients lying around */
+	nm_system_kill_all_dhcp_daemons ();
+}
+
+/*
+ * nm_generic_device_add_default_route_via_device
+ *
+ * Add default route to the given device
+ *
+ */
+void nm_generic_device_add_default_route_via_device (NMDevice *dev)
+{
+	g_return_if_fail (dev != NULL);
+
+	/* Not really applicable for test devices */
+	if (nm_device_is_test_device (dev))
+		return;
+
+	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+}
+
+
+/*
+ * nm_generic_device_add_default_route_via_device_with_iface
+ *
+ * Add default route to the given device
+ *
+ */
+void nm_generic_device_add_default_route_via_device_with_iface (const char *iface)
+{
+	char	*buf;
+
+	g_return_if_fail (iface != NULL);
+
+	/* Add default gateway */
+	buf = g_strdup_printf (IP_BINARY_PATH" route add default dev %s", iface);
+	nm_spawn_process (buf);
+	g_free (buf);
+}
+
+/*
+ * nm_generic_device_add_route_via_device_with_iface
+ *
+ * Add route to the given device
+ *
+ */
+void nm_generic_device_add_route_via_device_with_iface (const char *iface, const char *route)
+{
+	char	*buf;
+
+	g_return_if_fail (iface != NULL);
+
+	/* Add default gateway */
+	buf = g_strdup_printf (IP_BINARY_PATH" route add %s dev %s", route, iface);
+	nm_spawn_process (buf);
+	g_free (buf);
+}
+
+
+/*
+ * nm_generic_device_flush_addresses
+ *
+ * Flush all network addresses associated with a network device
+ *
+ */
+void nm_generic_device_flush_routes (NMDevice *dev)
+{
+	g_return_if_fail (dev != NULL);
+
+	/* Not really applicable for test devices */
+	if (nm_device_is_test_device (dev))
+		return;
+
+	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+}
+
+/*
+ * nm_generic_device_flush_routes_with_iface
+ *
+ * Flush all routes associated with a network device
+ *
+ */
+void nm_generic_device_flush_routes_with_iface (const char *iface)
+{
+	char	*buf;
+
+	g_return_if_fail (iface != NULL);
+
+	/* Remove routing table entries */
+	buf = g_strdup_printf (IP_BINARY_PATH" route flush dev %s", iface);
+	nm_spawn_process (buf);
+	g_free (buf);
+}
+
+/*
+ * nm_generic_device_flush_addresses
+ *
+ * Flush all network addresses associated with a network device
+ *
+ */
+void nm_generic_device_flush_addresses (NMDevice *dev)
+{
+	g_return_if_fail (dev != NULL);
+
+	/* Not really applicable for test devices */
+	if (nm_device_is_test_device (dev))
+		return;
+
+	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+}
+
+
+/*
+ * nm_generic_device_flush_addresses_with_iface
+ *
+ * Flush all network addresses associated with a network device
+ *
+ */
+void nm_generic_device_flush_addresses_with_iface (const char *iface)
+{
+	char	*buf;
+
+	g_return_if_fail (iface != NULL);
+
+	/* Remove all IP addresses for a device */
+	buf = g_strdup_printf (IP_BINARY_PATH" addr flush dev %s", iface);
+	nm_spawn_process (buf);
+	g_free (buf);
+}
+
+/*
+ * nm_generic_enable_loopback
+ *
+ * Bring up the loopback interface
+ *
+ */
+void nm_generic_enable_loopback (void)
+{
+	nm_spawn_process (IP_BINARY_PATH" link set dev lo up");
+	nm_spawn_process (IP_BINARY_PATH" addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label loopback");
+}
+
+
+/*
+ * nm_generic_flush_loopback_routes
+ *
+ * Flush all routes associated with the loopback device, because it
+ * sometimes gets the first route for ZeroConf/Link-Local traffic.
+ *
+ */
+void nm_generic_flush_loopback_routes (void)
+{
+-	nm_system_device_flush_routes_with_iface ("lo");
+}
+
+
+/*
+ * nm_generic_delete_default_route
+ *
+ * Remove the old default route in preparation for a new one
+ *
+ */
+void nm_generic_delete_default_route (void)
+{
+	nm_spawn_process (IP_BINARY_PATH" route del default");
+}
+
+
+/*
+ * nm_generic_flush_arp_cache
+ *
+ * Flush all entries in the arp cache.
+ *
+ */
+void nm_generic_flush_arp_cache (void)
+{
+	nm_spawn_process (IP_BINARY_PATH" neigh flush all");
+}
+
+
+/*
+ * nm_generic_kill_all_dhcp_daemons
+ *
+ * Kill all DHCP daemons currently running, done at startup.
+ *
+ */
+void nm_generic_kill_all_dhcp_daemons (void)
+{
+}
+
+
+/*
+ * nm_generic_update_dns
+ *
+ * Make glibc/nscd aware of any changes to the resolv.conf file by
+ * restarting nscd.
+ *
+ */
+void nm_generic_update_dns (void)
+{
+}
+
+
+/*
+ * nm_generic_restart_mdns_responder
+ *
+ * Restart the multicast DNS responder so that it knows about new
+ * network interfaces and IP addresses.
+ *
+ */
+void nm_generic_restart_mdns_responder (void)
+{
+}
+
+
+/*
+ * nm_generic_device_add_ip6_link_address
+ *
+ * Add a default link-local IPv6 address to a device.
+ *
+ */
+void nm_generic_device_add_ip6_link_address (NMDevice *dev)
+{
+	char *buf;
+	struct ether_addr hw_addr;
+	unsigned char eui[8];
+
+	if (nm_device_is_802_3_ethernet (dev))
+		nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
+	else if (nm_device_is_802_11_wireless (dev))
+		nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
+
+	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
+	memmove(eui+5, eui+3, 3);
+	eui[3] = 0xff;
+	eui[4] = 0xfe;
+	eui[0] ^= 2;
+
+	/* Add the default link-local IPv6 address to a device */
+	buf = g_strdup_printf (IP_BINARY_PATH" -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
+			 eui[0], eui[1], eui[2], eui[3],
+			 eui[4], eui[5],
+			 eui[6], eui[7], nm_device_get_iface (dev));
+	nm_spawn_process (buf);
+	g_free (buf);
+}
+
+/*
+ * nm_generic_set_ip4_config_from_resolv_conf
+ *
+ * Add nameservers and search names from a resolv.conf format file.
+ *
+ */
+void nm_generic_set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
+{
+	char *	contents = NULL;
+	char **	split_contents = NULL;
+	int		i, len;
+
+	g_return_if_fail (filename != NULL);
+	g_return_if_fail (ip4_config != NULL);
+
+	if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
+		return;
+
+	if (!(split_contents = g_strsplit (contents, "\n", 0)))
+		goto out;
+	
+	len = g_strv_length (split_contents);
+	for (i = 0; i < len; i++)
+	{
+		char *line = split_contents[i];
+
+		/* Ignore comments */
+		if (!line || (line[0] == ';') || (line[0] == '#'))
+			continue;
+
+		line = g_strstrip (line);
+		if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
+		{
+			char *searches = g_strdup (line + 7);
+			char **split_searches = NULL;
+
+			if (!searches || !strlen (searches))
+				continue;
+
+			/* Allow space-separated search domains */
+			if ((split_searches = g_strsplit (searches, " ", 0)))
+			{
+				int m, srch_len;
+
+				srch_len = g_strv_length (split_searches);
+				for (m = 0; m < srch_len; m++)
+				{
+					if (split_searches[m])
+						nm_ip4_config_add_domain	(ip4_config, split_searches[m]);
+				}
+				g_strfreev (split_searches);
+			}
+			else
+			{
+				/* Only 1 item, add the whole line */
+				nm_ip4_config_add_domain	(ip4_config, searches);
+			}
+
+			g_free (searches);
+		}
+		else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
+		{
+			guint32	addr = (guint32) (inet_addr (line + 11));
+
+			if (addr != (guint32) -1)
+				nm_ip4_config_add_nameserver (ip4_config, addr);
+		}
+	}
+
+	g_strfreev (split_contents);
+
+out:
+	g_free (contents);
+}
+
+
+/*
+ * nm_generic_device_get_system_config
+ *
+ * Retrieve any relevant configuration info for a particular device
+ * from the system network configuration information.  Clear out existing
+ * info before setting stuff too.
+ *
+ */
+void* nm_generic_device_get_system_config (NMDevice *dev, NMData *app_data)
+{
+	return NULL;
+}
+
+/*
+ * nm_generic_device_free_system_config
+ *
+ * Free stored system config data
+ *
+ */
+void nm_generic_device_free_system_config (NMDevice *dev, void *system_config_data)
+{
+	return;
+}
+
+
+/*
+ * nm_generic_device_get_use_dhcp
+ *
+ * Return whether the distro-specific system config tells us to use
+ * dhcp for this device.
+ *
+ */
+gboolean nm_generic_device_get_use_dhcp (NMDevice *dev)
+{
+	return TRUE;
+}
+
+
+/*
+ * nm_generic_device_get_disabled
+ *
+ * Return whether the distro-specific system config tells us to use
+ * dhcp for this device.
+ *
+ */
+gboolean nm_generic_device_get_disabled (NMDevice *dev)
+{
+	return FALSE;
+}
+
+
+NMIP4Config *nm_generic_device_new_ip4_system_config (NMDevice *dev)
+{
+	return NULL;
+}
+
+void nm_generic_deactivate_all_dialup (GSList *list)
+{
+}
+
+gboolean nm_generic_deactivate_dialup (GSList *list, const char *dialup)
+{
+	return FALSE;
+}
+
+gboolean nm_generic_activate_dialup (GSList *list, const char *dialup)
+{
+	return FALSE;
+}
+
+GSList * nm_generic_get_dialup_config (void)
+{
+	return NULL;
+}
+
+/*
+ * nm_generic_activate_nis
+ *
+ * set up the nis domain and write a yp.conf
+ *
+ */
+void nm_generic_activate_nis (NMIP4Config *config)
+{
+}
+
+/*
+ * nm_generic_shutdown_nis
+ *
+ * shutdown ypbind
+ *
+ */
+void nm_generic_shutdown_nis (void)
+{
+}
+
+/*
+ * nm_generic_set_hostname
+ *
+ * set the hostname
+ *
+ */
+void nm_generic_set_hostname (NMIP4Config *config)
+{
+}
+
+/*
+ * nm_generic_should_modify_resolv_conf
+ *
+ * Can NM update resolv.conf, or is it locked down?
+ */
+gboolean nm_generic_should_modify_resolv_conf (void)
+{
+	return TRUE;
+}
+
+
+/*
+ * nm_generic_get_mtu
+ *
+ * Return a user-provided or system-mandated MTU for this device or zero if
+ * no such MTU is provided.
+ */
+guint32 nm_generic_get_mtu (NMDevice *dev)
+{
+	return 0;
+}
diff -Naur old/NetworkManagerGeneric.h new/NetworkManagerGeneric.h
--- old/NetworkManagerGeneric.h	1970-01-01 01:00:00.000000000 +0100
+++ new/NetworkManagerGeneric.h	2006-07-20 20:37:54.000000000 +0200
@@ -0,0 +1,93 @@
+/* NetworkManager -- Network link manager
+ *
+ * Timothee Lecomte <timothee lecomte ens fr>
+ *
+ * Heavily based on NetworkManagerSystem.h by Dan Williams <dcbw redhat com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * (C) Copyright 2004 Red Hat, Inc.
+ */
+
+#ifndef NETWORK_MANAGER_GENERIC_H
+#define NETWORK_MANAGER_GENERIC_H
+
+#include <glib.h>
+#include "nm-device.h"
+#include "nm-ip4-config.h"
+#include "nm-named-manager.h"
+
+struct NMData;
+
+/* Prototypes for system/distribution dependent functions,
+ * implemented in the backend files in backends/ directory
+ */
+
+void			nm_generic_init (void);
+gboolean		nm_generic_device_has_active_routes			(NMDevice *dev);
+
+void			nm_generic_device_flush_routes				(NMDevice *dev);
+void			nm_generic_device_flush_routes_with_iface	(const char *iface);
+
+void			nm_generic_device_add_default_route_via_device(NMDevice *dev);
+void			nm_generic_device_add_default_route_via_device_with_iface(const char *iface);
+
+void			nm_generic_device_add_route_via_device_with_iface (const char *iface, const char *route);
+
+void			nm_generic_device_flush_addresses			(NMDevice *dev);
+void			nm_generic_device_flush_addresses_with_iface	(const char *iface);
+
+void			nm_generic_enable_loopback				(void);
+void			nm_generic_flush_loopback_routes			(void);
+void			nm_generic_delete_default_route			(void);
+void			nm_generic_flush_arp_cache				(void);
+void			nm_generic_kill_all_dhcp_daemons			(void);
+void			nm_generic_update_dns					(void);
+void			nm_generic_restart_mdns_responder			(void);
+void			nm_generic_device_add_ip6_link_address 		(NMDevice *dev);
+
+void			nm_generic_set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config);
+void *		nm_generic_device_get_system_config			(NMDevice *dev, struct NMData *data);
+void			nm_generic_device_free_system_config		(NMDevice *dev, void *system_config_data);
+NMIP4Config *	nm_generic_device_new_ip4_system_config		(NMDevice *dev);
+
+gboolean		nm_generic_device_get_use_dhcp				(NMDevice *dev);
+
+gboolean		nm_generic_device_get_disabled				(NMDevice *dev);
+
+gboolean		nm_generic_device_set_from_ip4_config		(NMDevice *dev);
+gboolean		nm_generic_vpn_device_set_from_ip4_config	(NMNamedManager *named, NMDevice *active_device, const char *iface, NMIP4Config *config, char **routes, int num_routes);
+gboolean		nm_generic_vpn_device_unset_from_ip4_config	(NMNamedManager *named, NMDevice *active_device, const char *iface, NMIP4Config *config);
+
+gboolean		nm_generic_device_set_up_down				(NMDevice *dev, gboolean up);
+gboolean		nm_generic_device_set_up_down_with_iface		(NMDevice *dev, const char *iface, gboolean up);
+
+gboolean		nm_generic_device_update_resolv_conf		(void *data, int len, const char *domain_name);
+
+GSList *		nm_generic_get_dialup_config (void);
+void			nm_generic_deactivate_all_dialup (GSList *list);
+gboolean		nm_generic_activate_dialup (GSList *list, const char *dialup);
+gboolean		nm_generic_deactivate_dialup (GSList *list, const char *dialup);
+
+void			nm_generic_set_hostname (NMIP4Config *config);
+void			nm_generic_activate_nis (NMIP4Config *config);
+void			nm_generic_shutdown_nis (void);
+
+void			nm_generic_set_mtu (NMDevice *dev);
+guint32		nm_generic_get_mtu (NMDevice *dev);
+
+gboolean		nm_generic_should_modify_resolv_conf (void);
+
+#endif
diff -Naur old/NetworkManagerGentoo.c new/NetworkManagerGentoo.c
--- old/NetworkManagerGentoo.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerGentoo.c	2006-07-20 20:50:37.000000000 +0200
@@ -32,6 +32,7 @@
 #include <signal.h>
 
 #include <arpa/inet.h>
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device.h"
@@ -48,8 +49,7 @@
  */
 void nm_system_init (void)
 {
-	/* Kill any dhclients lying around */
-	nm_system_kill_all_dhcp_daemons ();
+	nm_generic_init ();
 }
 
 /*
@@ -60,12 +60,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	g_return_if_fail (nm_device_is_test_device (dev) != TRUE);
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 /*
@@ -76,14 +71,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 /*
@@ -108,12 +96,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	g_return_if_fail (nm_device_is_test_device (dev) != TRUE);
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 /*
@@ -124,14 +107,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 #if 0
@@ -154,14 +130,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 
@@ -188,7 +157,7 @@
  */
 void nm_system_flush_loopback_routes (void)
 {
-	nm_system_device_flush_routes_with_iface ("lo");
+	nm_generic_flush_loopback_routes ();
 }
 
 /*
@@ -199,7 +168,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 /*
@@ -210,7 +179,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 
@@ -271,28 +240,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-	char *buf;
-	struct ether_addr hw_addr;
-	unsigned char eui[8];
-	
-	if (nm_device_is_802_3_ethernet (dev))
-		nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-	else if (nm_device_is_802_11_wireless (dev))
-		nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-	
-        /* Shouldnt we use sizeof(eui) ? In theory, obviously */
-	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-	memmove (eui+5, eui+3, 3);
-	eui[3] = 0xff;
-	eui[4] = 0xfe;
-	eui[0] ^= 2;
-	
-	/* Add the default link-local IPv6 address to a device */
-	buf = g_strdup_printf(IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s", 
-						eui[0], eui[1], eui[2], eui[3], eui[4], eui[5], 
-						eui[6], eui[7], nm_device_get_iface(dev));
-	nm_spawn_process(buf);
-	g_free(buf);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 typedef struct GentooSystemConfigData
@@ -454,12 +402,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	g_return_if_fail (nm_device_is_test_device (dev) != TRUE);
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
  
 /*
@@ -470,14 +413,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
  
 void nm_system_device_free_system_config (NMDevice *dev, void *system_config_data)
diff -Naur old/NetworkManagerPaldo.c new/NetworkManagerPaldo.c
--- old/NetworkManagerPaldo.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerPaldo.c	2006-07-20 20:28:58.000000000 +0200
@@ -31,6 +31,7 @@
 #include <signal.h>
 #include <arpa/inet.h>
 #include <glib/gkeyfile.h>
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device.h"
@@ -45,6 +46,7 @@
  */
 void nm_system_init (void)
 {
+	nm_generic_init ();
 }
 
 
@@ -56,13 +58,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 
@@ -74,14 +70,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 
@@ -93,13 +82,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
 
 
@@ -111,14 +94,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
 
 
@@ -130,14 +106,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 
@@ -162,13 +131,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 
@@ -180,14 +143,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 
@@ -225,7 +181,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 
@@ -237,7 +193,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 
@@ -285,27 +241,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-	char *buf;
-	struct ether_addr hw_addr;
-	unsigned char eui[8];
-
-	if (nm_device_is_802_3_ethernet (dev))
-		nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-	else if (nm_device_is_802_11_wireless (dev))
-		nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-
-	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-	memmove (eui+5, eui+3, 3);
-	eui[3] = 0xff;
-	eui[4] = 0xfe;
-	eui[0] ^= 2;
-
-	/* Add the default link-local IPv6 address to a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
-						eui[0], eui[1], eui[2], eui[3], eui[4], eui[5],
-						eui[6], eui[7], nm_device_get_iface (dev));
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 
diff -Naur old/NetworkManagerRedHat.c new/NetworkManagerRedHat.c
--- old/NetworkManagerRedHat.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerRedHat.c	2006-07-20 10:38:06.000000000 +0200
@@ -27,6 +27,7 @@
 #include <sys/types.h>
 #include <signal.h>
 #include <arpa/inet.h>
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device.h"
@@ -44,8 +45,7 @@
  */
 void nm_system_init (void)
 {
-	/* Kill any dhclients lying around */
-	nm_system_kill_all_dhcp_daemons ();
+	nm_generic_init ();
 }
 
 
@@ -57,13 +57,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 
@@ -75,14 +69,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 
@@ -94,13 +81,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
 
 
@@ -112,14 +93,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
 
 
@@ -131,14 +105,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 
@@ -163,13 +130,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 
@@ -181,14 +142,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 
@@ -213,8 +167,7 @@
  */
 void nm_system_enable_loopback (void)
 {
-	nm_system_device_set_up_down_with_iface ("lo", TRUE);
-	nm_spawn_process (IP_BINARY_PATH " addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label loopback");
+	nm_generic_enable_loopback ();
 }
 
 
@@ -227,7 +180,7 @@
  */
 void nm_system_flush_loopback_routes (void)
 {
-	nm_system_device_flush_routes_with_iface ("lo");
+	nm_generic_flush_loopback_routes ();
 }
 
 
@@ -239,7 +192,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 
@@ -251,7 +204,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 
@@ -320,27 +273,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-	char *buf;
-	struct ether_addr hw_addr;
-	unsigned char eui[8];
-
-	if (nm_device_is_802_3_ethernet (dev))
-		nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-	else if (nm_device_is_802_11_wireless (dev))
-		nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-
-	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-	memmove (eui+5, eui+3, 3);
-	eui[3] = 0xff;
-	eui[4] = 0xfe;
-	eui[0] ^= 2;
-
-	/* Add the default link-local IPv6 address to a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
-						eui[0], eui[1], eui[2], eui[3], eui[4], eui[5],
-						eui[6], eui[7], nm_device_get_iface (dev));
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 
@@ -376,82 +309,6 @@
 
 
 /*
- * set_ip4_config_from_resolv_conf
- *
- * Add nameservers and search names from a resolv.conf format file.
- *
- */
-static void set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
-{
-	char *	contents = NULL;
-	char **	split_contents = NULL;
-	int		i, len;
-
-	g_return_if_fail (filename != NULL);
-	g_return_if_fail (ip4_config != NULL);
-
-	if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
-		return;
-
-	if (!(split_contents = g_strsplit (contents, "\n", 0)))
-		goto out;
-	
-	len = g_strv_length (split_contents);
-	for (i = 0; i < len; i++)
-	{
-		char *line = split_contents[i];
-
-		/* Ignore comments */
-		if (!line || (line[0] == ';') || (line[0] == '#'))
-			continue;
-
-		line = g_strstrip (line);
-		if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
-		{
-			char *searches = g_strdup (line + 7);
-			char **split_searches = NULL;
-
-			if (!searches || !strlen (searches))
-				continue;
-
-			/* Allow space-separated search domains */
-			if ((split_searches = g_strsplit (searches, " ", 0)))
-			{
-				int m, srch_len;
-
-				srch_len = g_strv_length (split_searches);
-				for (m = 0; m < srch_len; m++)
-				{
-					if (split_searches[m])
-						nm_ip4_config_add_domain	(ip4_config, split_searches[m]);
-				}
-				g_strfreev (split_searches);
-			}
-			else
-			{
-				/* Only 1 item, add the whole line */
-				nm_ip4_config_add_domain	(ip4_config, searches);
-			}
-
-			g_free (searches);
-		}
-		else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
-		{
-			guint32	addr = (guint32) (inet_addr (line + 11));
-
-			if (addr != (guint32) -1)
-				nm_ip4_config_add_nameserver (ip4_config, addr);
-		}
-	}
-
-	g_strfreev (split_contents);
-
-out:
-	g_free (contents);
-}
-
-
-/*
  * nm_system_device_get_system_config
  *
  * Read in the config file for a device.
@@ -582,7 +439,7 @@
 		{
 			char *filename = g_strdup_printf (SYSCONFDIR"/sysconfig/networking/profiles/%s/resolv.conf", cur_profile_name);
 			
-			set_ip4_config_from_resolv_conf (filename, sys_data->config);
+			nm_generic_set_ip4_config_from_resolv_conf (filename, sys_data->config);
 			g_free (filename);
 			g_free (cur_profile_name);
 		}
diff -Naur old/NetworkManagerSlackware.c new/NetworkManagerSlackware.c
--- old/NetworkManagerSlackware.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerSlackware.c	2006-07-20 10:31:16.000000000 +0200
@@ -27,6 +27,7 @@
 #include <stdio.h>
 #include <sys/types.h>
 #include <signal.h>
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "nm-device.h"
@@ -46,7 +47,7 @@
  */
 void nm_system_init (void)
 {
-	nm_system_kill_all_dhcp_daemons();
+	nm_generic_init ();
 }
 
 /*
@@ -57,13 +58,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 /*
@@ -74,14 +69,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 
@@ -93,13 +81,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 /*
@@ -110,14 +92,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 /*
@@ -169,8 +144,7 @@
  */
 void nm_system_enable_loopback (void)
 {
-	nm_system_device_set_up_down_with_iface ("lo", TRUE);
-	nm_spawn_process (IP_BINARY_PATH " addr add 127.0.0.1/8 brd 127.255.255.255 dev lo label loopback");
+	nm_generic_enable_loopback ();
 }
 
 
@@ -182,7 +156,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 
@@ -230,27 +204,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-	char *buf;
-	struct ether_addr hw_addr;
-	unsigned char eui[8];
-
-	if (nm_device_is_802_3_ethernet (dev))
-		nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-	else if (nm_device_is_802_11_wireless (dev))
-		nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-
-	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-	memmove (eui+5, eui+3, 3);
-	eui[3] = 0xff;
-	eui[4] = 0xfe;
-	eui[0] ^= 2;
-
-	/* Add the default link-local IPv6 address to a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
-	                       eui[0], eui[1], eui[2], eui[3], eui[4], eui[5],
-	                       eui[6], eui[7], nm_device_get_iface (dev));
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 /*
@@ -261,14 +215,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 /*
@@ -279,13 +226,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
 
 /*
@@ -296,14 +237,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
  
  
@@ -316,7 +250,7 @@
  */
 void nm_system_flush_loopback_routes (void)
 {
-	nm_system_device_flush_routes_with_iface ("lo");
+	nm_generic_flush_loopback_routes ();
 }
 
  
@@ -328,7 +262,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 void nm_system_deactivate_all_dialup (GSList *list)
diff -Naur old/NetworkManagerSuSE.c new/NetworkManagerSuSE.c
--- old/NetworkManagerSuSE.c	2006-07-13 18:40:34.000000000 +0200
+++ new/NetworkManagerSuSE.c	2006-07-20 20:52:00.000000000 +0200
@@ -33,6 +33,7 @@
 #include <sys/stat.h>
 #include <arpa/inet.h>
 
+#include "NetworkManagerGeneric.h"
 #include "NetworkManagerSystem.h"
 #include "NetworkManagerUtils.h"
 #include "NetworkManagerMain.h"
@@ -62,8 +63,7 @@
  */
 void nm_system_init (void)
 {
-	/* Kill any dhclients lying around */
-	nm_system_kill_all_dhcp_daemons ();
+	nm_generic_init ();
 }
 
 
@@ -75,13 +75,7 @@
  */
 void nm_system_device_flush_routes (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_routes_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_routes (dev);
 }
 
 
@@ -93,14 +87,7 @@
  */
 void nm_system_device_flush_routes_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove routing table entries */
-	buf = g_strdup_printf (IP_BINARY_PATH " route flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_routes_with_iface (iface);
 }
 
 
@@ -112,13 +99,7 @@
  */
 void nm_system_device_add_default_route_via_device (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_add_default_route_via_device_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_add_default_route_via_device (dev);
 }
 
 
@@ -130,14 +111,7 @@
  */
 void nm_system_device_add_default_route_via_device_with_iface (const char *iface)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add default dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_default_route_via_device_with_iface (iface);
 }
 
 
@@ -149,14 +123,7 @@
  */
 void nm_system_device_add_route_via_device_with_iface (const char *iface, const char *route)
 {
-	char	*buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Add default gateway */
-	buf = g_strdup_printf (IP_BINARY_PATH " route add %s dev %s", route, iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_route_via_device_with_iface (iface, route);
 }
 
 
@@ -181,13 +148,7 @@
  */
 void nm_system_device_flush_addresses (NMDevice *dev)
 {
-	g_return_if_fail (dev != NULL);
-
-	/* Not really applicable for test devices */
-	if (nm_device_is_test_device (dev))
-		return;
-
-	nm_system_device_flush_addresses_with_iface (nm_device_get_iface (dev));
+	nm_generic_device_flush_addresses (dev);
 }
 
 
@@ -199,14 +160,7 @@
  */
 void nm_system_device_flush_addresses_with_iface (const char *iface)
 {
-	char *buf;
-
-	g_return_if_fail (iface != NULL);
-
-	/* Remove all IP addresses for a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " addr flush dev %s", iface);
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_flush_addresses_with_iface (iface);
 }
 
 
@@ -218,8 +172,7 @@
  */
 void nm_system_enable_loopback (void)
 {
-	nm_system_device_set_up_down_with_iface ("lo", TRUE);
-	nm_spawn_process (IP_BINARY_PATH " addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label loopback");
+	nm_generic_enable_loopback ();
 }
 
 
@@ -232,7 +185,7 @@
  */
 void nm_system_flush_loopback_routes (void)
 {
-	nm_system_device_flush_routes_with_iface ("lo");
+	nm_generic_flush_loopback_routes ();
 }
 
 
@@ -244,7 +197,7 @@
  */
 void nm_system_delete_default_route (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " route del default");
+	nm_generic_delete_default_route ();
 }
 
 
@@ -256,7 +209,7 @@
  */
 void nm_system_flush_arp_cache (void)
 {
-	nm_spawn_process (IP_BINARY_PATH " neigh flush all");
+	nm_generic_flush_arp_cache ();
 }
 
 
@@ -328,27 +281,7 @@
  */
 void nm_system_device_add_ip6_link_address (NMDevice *dev)
 {
-	char *buf;
-	struct ether_addr hw_addr;
-	unsigned char eui[8];
-
-	if (nm_device_is_802_3_ethernet (dev))
-		nm_device_802_3_ethernet_get_address (NM_DEVICE_802_3_ETHERNET (dev), &hw_addr);
-	else if (nm_device_is_802_11_wireless (dev))
-		nm_device_802_11_wireless_get_address (NM_DEVICE_802_11_WIRELESS (dev), &hw_addr);
-
-	memcpy (eui, &(hw_addr.ether_addr_octet), sizeof (hw_addr.ether_addr_octet));
-	memmove (eui+5, eui+3, 3);
-	eui[3] = 0xff;
-	eui[4] = 0xfe;
-	eui[0] ^= 2;
-
-	/* Add the default link-local IPv6 address to a device */
-	buf = g_strdup_printf (IP_BINARY_PATH " -6 addr add fe80::%x%02x:%x%02x:%x%02x:%x%02x/64 dev %s",
-						eui[0], eui[1], eui[2], eui[3], eui[4], eui[5],
-						eui[6], eui[7], nm_device_get_iface (dev));
-	nm_spawn_process (buf);
-	g_free (buf);
+	nm_generic_device_add_ip6_link_address (dev);
 }
 
 
@@ -360,81 +293,6 @@
 	guint32		mtu;
 } SuSEDeviceConfigData;
 
-/*
- * set_ip4_config_from_resolv_conf
- *
- * Add nameservers and search names from a resolv.conf format file.
- *
- */
-static void set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
-{
-	char *contents = NULL;
-	char **split_contents = NULL;
-	int i, len;
-
-	g_return_if_fail (filename != NULL);
-	g_return_if_fail (ip4_config != NULL);
-
-	if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
-		return;
-
-	if (!(split_contents = g_strsplit (contents, "\n", 0)))
-		goto out;
-
-	len = g_strv_length (split_contents);
-	for (i = 0; i < len; i++)
-	{
-		char *line = split_contents[i];
-
-		/* Ignore comments */
-		if (!line || (line[0] == ';') || (line[0] == '#'))
-			continue;
-
-		line = g_strstrip (line);
-		if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
-		{
-			char *searches = g_strdup (line + 7);
-			char **split_searches = NULL;
-
-			if (!searches || !strlen (searches))
-				continue;
-
-			/* Allow space-separated search domains */
-			if ((split_searches = g_strsplit (searches, " ", 0)))
-			{
-				int m, srch_len;
-
-				srch_len = g_strv_length (split_searches);
-				for (m = 0; m < srch_len; m++)
-				{
-					if (split_searches[m])
-						nm_ip4_config_add_domain	(ip4_config, split_searches[m]);
-				}
-				g_strfreev (split_searches);
-			}
-			else
-			{
-				/* Only 1 item, add the whole line */
-				nm_ip4_config_add_domain	(ip4_config, searches);
-			}
-
-			g_free (searches);
-		}
-		else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
-		{
-			guint32 addr = (guint32) (inet_addr (line + 11));
-
-			if (addr != (guint32) -1)
-				nm_ip4_config_add_nameserver (ip4_config, addr);
-		}
-	}
-
-	g_strfreev (split_contents);
-
-out:
-	g_free (contents);
-}
-
 
 /*
  * nm_system_device_get_system_config
@@ -746,7 +604,7 @@
 			nm_info ("Network configuration for device '%s' does not specify a gateway but is "
 				 "statically configured (non-DHCP).", nm_device_get_iface (dev));
 
-		set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config);
+		nm_generic_set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config);
 	}
 
 out:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]