diff --git a/ChangeLog b/ChangeLog index 8bed1e5f98..9b9422849a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2006-07-24 Dan Williams + + Patch from Timothée Lecomte + * src/backends/Makefile.am + src/backends/NetworkManagerArch.c + src/backends/NetworkManagerDebian.c + src/backends/NetworkManagerGeneric.c + src/backends/NetworkManagerGeneric.h + src/backends/NetworkManagerGentoo.c + src/backends/NetworkManagerPaldo.c + src/backends/NetworkManagerRedHat.c + src/backends/NetworkManagerSlackware.c + src/backends/NetworkManagerSuSE.c + - Genericize common backend functions + 2006-07-18 Robert Love * configure.in: Add "--with-notify" option to allow disabling of diff --git a/src/backends/Makefile.am b/src/backends/Makefile.am index 67a3e55f58..f2200dc439 100644 --- a/src/backends/Makefile.am +++ b/src/backends/Makefile.am @@ -8,7 +8,8 @@ INCLUDES = -I${top_srcdir} \ noinst_LTLIBRARIES = libnmbackend.la -libnmbackend_la_SOURCES = +libnmbackend_la_SOURCES = NetworkManagerGeneric.c \ + NetworkManagerGeneric.h if TARGET_REDHAT libnmbackend_la_SOURCES += NetworkManagerRedHat.c \ diff --git a/src/backends/NetworkManagerArch.c b/src/backends/NetworkManagerArch.c index 3b8322ae56..dbfd00f7f2 100644 --- a/src/backends/NetworkManagerArch.c +++ b/src/backends/NetworkManagerArch.c @@ -42,6 +42,7 @@ #include #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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_default_route_via_device_with_iface (const char *iface */ 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_add_route_via_device_with_iface (const char *iface, const */ 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 (NMDevice *dev) */ 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_routes_with_iface (const char *iface) */ 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 (NMDevice *dev) */ 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_enable_loopback (void) */ 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_flush_loopback_routes (void) */ 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_delete_default_route (void) */ 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_restart_mdns_responder (void) */ 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 @@ void* nm_system_device_get_system_config (NMDevice * dev, NMData *app_data) 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 @@ guint32 nm_system_get_mtu (NMDevice *dev) return 0; } - diff --git a/src/backends/NetworkManagerDebian.c b/src/backends/NetworkManagerDebian.c index 82a8ece49b..d3cb58dc5f 100644 --- a/src/backends/NetworkManagerDebian.c +++ b/src/backends/NetworkManagerDebian.c @@ -31,6 +31,7 @@ #include #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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_default_route_via_device_with_iface (const char *iface */ 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_add_route_via_device_with_iface (const char *iface, const */ 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 (NMDevice *dev) */ 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_routes_with_iface (const char *iface) */ 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 (NMDevice *dev) */ 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_enable_loopback (void) */ 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_flush_loopback_routes (void) */ 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_delete_default_route (void) */ 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_restart_mdns_responder (void) */ 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 @@ -304,82 +239,6 @@ typedef struct DebSystemConfigData gboolean use_dhcp; } 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 * @@ -451,7 +310,7 @@ void* nm_system_device_get_system_config (NMDevice *dev, NMData *app_data) } 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 --git a/src/backends/NetworkManagerGeneric.c b/src/backends/NetworkManagerGeneric.c new file mode 100644 index 0000000000..1b683a725a --- /dev/null +++ b/src/backends/NetworkManagerGeneric.c @@ -0,0 +1,496 @@ +/* NetworkManager -- Network link manager + * + * Timothee Lecomte + * + * Heavily based on NetworkManagerRedhat.c by Dan Williams + * + * 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 +#endif + +#include +#include +#include +#include +#include "NetworkManagerGeneric.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 --git a/src/backends/NetworkManagerGeneric.h b/src/backends/NetworkManagerGeneric.h new file mode 100644 index 0000000000..e3aaffdc71 --- /dev/null +++ b/src/backends/NetworkManagerGeneric.h @@ -0,0 +1,93 @@ +/* NetworkManager -- Network link manager + * + * Timothee Lecomte + * + * Heavily based on NetworkManagerSystem.h by Dan Williams + * + * 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 +#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 --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c index dbfa0f0d5f..0ecbe53c7b 100644 --- a/src/backends/NetworkManagerGentoo.c +++ b/src/backends/NetworkManagerGentoo.c @@ -32,6 +32,7 @@ #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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 @@ gboolean nm_system_device_has_active_routes (NMDevice *dev) */ 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 (NMDevice *dev) */ 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_flush_addresses_with_iface (const char *iface) */ 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_enable_loopback (void) */ 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_flush_loopback_routes (void) */ 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_delete_default_route (void) */ 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_restart_mdns_responder (void) */ 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_get_system_config (NMDevice *dev, NMData *app_data) */ 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 (NMDevice *dev) */ 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 --git a/src/backends/NetworkManagerPaldo.c b/src/backends/NetworkManagerPaldo.c index 1413735f31..29b8f1664b 100644 --- a/src/backends/NetworkManagerPaldo.c +++ b/src/backends/NetworkManagerPaldo.c @@ -31,6 +31,7 @@ #include #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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_flush_routes_with_iface (const char *iface) */ 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 (NMDevice *dev) */ 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_default_route_via_device_with_iface (const char *iface */ 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 @@ gboolean nm_system_device_has_active_routes (NMDevice *dev) */ 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 (NMDevice *dev) */ 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_flush_loopback_routes (void) */ 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_delete_default_route (void) */ 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_restart_mdns_responder (void) */ 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 --git a/src/backends/NetworkManagerRedHat.c b/src/backends/NetworkManagerRedHat.c index b86854c0a1..0acf3eee64 100644 --- a/src/backends/NetworkManagerRedHat.c +++ b/src/backends/NetworkManagerRedHat.c @@ -27,6 +27,7 @@ #include #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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_flush_routes_with_iface (const char *iface) */ 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 (NMDevice *dev) */ 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_default_route_via_device_with_iface (const char *iface */ 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 @@ gboolean nm_system_device_has_active_routes (NMDevice *dev) */ 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 (NMDevice *dev) */ 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_device_flush_addresses_with_iface (const char *iface) */ 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_enable_loopback (void) */ 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_flush_loopback_routes (void) */ 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_delete_default_route (void) */ 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_restart_mdns_responder (void) */ 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); } @@ -375,82 +308,6 @@ static char *get_current_profile_name (void) } -/* - * 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 * @@ -582,7 +439,7 @@ void *nm_system_device_get_system_config (NMDevice *dev, NMData *app_data) { 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 --git a/src/backends/NetworkManagerSlackware.c b/src/backends/NetworkManagerSlackware.c index 0e8536f4ea..5523c37005 100644 --- a/src/backends/NetworkManagerSlackware.c +++ b/src/backends/NetworkManagerSlackware.c @@ -27,6 +27,7 @@ #include #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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_routes_with_iface (const char *iface) */ 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 (NMDevice *dev) */ 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 @@ gboolean nm_system_device_has_active_routes (NMDevice *dev) */ 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_enable_loopback (void) */ 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_restart_mdns_responder (void) */ 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_ip6_link_address (NMDevice *dev) */ 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_route_via_device_with_iface (const char *iface, const */ 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 (NMDevice *dev) */ 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_device_add_default_route_via_device_with_iface (const char *iface */ 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_loopback_routes (void) */ 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 --git a/src/backends/NetworkManagerSuSE.c b/src/backends/NetworkManagerSuSE.c index 005d7ed11b..b6f0d3c16b 100644 --- a/src/backends/NetworkManagerSuSE.c +++ b/src/backends/NetworkManagerSuSE.c @@ -33,6 +33,7 @@ #include #include +#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_init (void) */ 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 (NMDevice *dev) */ 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_flush_routes_with_iface (const char *iface) */ 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 (NMDevice *dev) */ 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_default_route_via_device_with_iface (const char *iface */ 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 @@ gboolean nm_system_device_has_active_routes (NMDevice *dev) */ 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 (NMDevice *dev) */ 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_device_flush_addresses_with_iface (const char *iface) */ 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_enable_loopback (void) */ 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_flush_loopback_routes (void) */ 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_delete_default_route (void) */ 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_restart_mdns_responder (void) */ 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 @@ typedef struct SuSEDeviceConfigData 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 @@ found: 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: