Re: [PATCH] Generic backend functions



On Thu, 2006-07-20 at 21:26 +0200, Timoth�Lecomte wrote:
> 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.

On vacation now, but will try to review the patch either today or
tomorrow...

Thanks!
Dan

> 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
> plain text document attachment (NetworkManagerGeneric.diff)
> 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:
> _______________________________________________
> NetworkManager-list mailing list
> NetworkManager-list gnome org
> http://mail.gnome.org/mailman/listinfo/networkmanager-list




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