From 792cb5b89c7eec960e30593cbfc7b9c11b859acf Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 27 Mar 2006 18:30:52 +0000 Subject: [PATCH] 2006-03-27 Dan Williams Patch from Tor Krill * configure.in initscript/Makefile.am src/backends/Makefile.am src/backends/NetworkManagerArch.c initscript/Arch/Makefile.am initscript/Arch/networkmanager-dispatcher.in initscript/Arch/networkmanager.in - Add Arch Linux support, fixes gnome.org #335147 git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1649 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 12 + configure.in | 9 +- initscript/Arch/Makefile.am | 4 + initscript/Arch/networkmanager-dispatcher.in | 54 ++ initscript/Arch/networkmanager.in | 55 ++ initscript/Makefile.am | 3 + src/backends/Makefile.am | 4 + src/backends/NetworkManagerArch.c | 954 +++++++++++++++++++ 8 files changed, 1093 insertions(+), 2 deletions(-) create mode 100644 initscript/Arch/Makefile.am create mode 100644 initscript/Arch/networkmanager-dispatcher.in create mode 100644 initscript/Arch/networkmanager.in create mode 100644 src/backends/NetworkManagerArch.c diff --git a/ChangeLog b/ChangeLog index 2ca8f8bac5..59c268c58d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-03-27 Dan Williams + + Patch from Tor Krill + * configure.in + initscript/Makefile.am + src/backends/Makefile.am + src/backends/NetworkManagerArch.c + initscript/Arch/Makefile.am + initscript/Arch/networkmanager-dispatcher.in + initscript/Arch/networkmanager.in + - Add Arch Linux support, fixes gnome.org #335147 + 2006-03-27 Dan Williams Patch from Diffe diff --git a/configure.in b/configure.in index 335cc8ddc6..efbb8ead9b 100644 --- a/configure.in +++ b/configure.in @@ -44,13 +44,14 @@ ALL_LINGUAS="bg bs ca cs da de el en_CA es fi fr gu hr hu it ja ko lt nb ne nl p AC_PROG_INTLTOOL([0.27.2]) AM_GLIB_GNU_GETTEXT -AC_ARG_WITH(distro, AC_HELP_STRING([--with-distro=DISTRO], [Specify the Linux distribution to target: One of redhat, suse, gentoo, debian, or slackware])) +AC_ARG_WITH(distro, AC_HELP_STRING([--with-distro=DISTRO], [Specify the Linux distribution to target: One of redhat, suse, gentoo, debian, arch or slackware])) if test "z$with_distro" = "z"; then AC_CHECK_FILE(/etc/redhat-release,with_distro="redhat") AC_CHECK_FILE(/etc/SuSE-release,with_distro="suse") AC_CHECK_FILE(/etc/fedora-release,with_distro="redhat") AC_CHECK_FILE(/etc/gentoo-release,with_distro="gentoo") AC_CHECK_FILE(/etc/debian_version,with_distro="debian") + AC_CHECK_FILE(/etc/arch-release,with_distro="arch") AC_CHECK_FILE(/etc/slackware-version,with_distro="slackware") fi with_distro=`echo ${with_distro} | tr '[[:upper:]]' '[[:lower:]]' ` @@ -60,7 +61,7 @@ if test "z$with_distro" = "z"; then exit 1 else case $with_distro in - redhat|suse|gentoo|debian|slackware) ;; + redhat|suse|gentoo|debian|slackware|arch) ;; *) echo "Your distribution (${with_distro}) is not yet supported! (patches welcome)" exit 1 @@ -72,6 +73,7 @@ AM_CONDITIONAL(TARGET_SUSE, test x"$with_distro" = xsuse) AM_CONDITIONAL(TARGET_GENTOO, test x"$with_distro" = xgentoo) AM_CONDITIONAL(TARGET_DEBIAN, test x"$with_distro" = xdebian) AM_CONDITIONAL(TARGET_SLACKWARE, test x"$with_distro" = xslackware) +AM_CONDITIONAL(TARGET_ARCH, test x"$with_distro" = xarch) AC_MSG_CHECKING([for wireless-tools >= 28pre9]) AC_TRY_COMPILE([#include ], @@ -338,6 +340,9 @@ initscript/Slackware/Makefile initscript/SUSE/Makefile initscript/SUSE/networkmanager initscript/SUSE/networkmanager-dispatcher +initscript/Arch/Makefile +initscript/Arch/networkmanager +initscript/Arch/networkmanager-dispatcher man/Makefile man/NetworkManager.1 man/NetworkManagerDispatcher.1 diff --git a/initscript/Arch/Makefile.am b/initscript/Arch/Makefile.am new file mode 100644 index 0000000000..b611ead672 --- /dev/null +++ b/initscript/Arch/Makefile.am @@ -0,0 +1,4 @@ +EXTRA_DIST = networkmanager networkmanager-dispatcher + +initddir = $(sysconfdir)/rc.d +initd_SCRIPTS = networkmanager networkmanager-dispatcher diff --git a/initscript/Arch/networkmanager-dispatcher.in b/initscript/Arch/networkmanager-dispatcher.in new file mode 100644 index 0000000000..e04dd89c57 --- /dev/null +++ b/initscript/Arch/networkmanager-dispatcher.in @@ -0,0 +1,54 @@ +#!/bin/bash + +prefix=@prefix@ +exec_prefix=@prefix@ +sbindir=@sbindir@ +NETWORKMANAGER_BIN=${sbindir}/NetworkManagerDispatcher + +# general config +. /etc/rc.conf +. /etc/rc.d/functions + +# Sanity checks. +[ -x $NETWORKMANAGER_BIN ] || exit 0 + +# We need /usr/sbin/ip +[ -x /usr/sbin/ip ] || exit 0 + +PID=`pidof -o %PPID $NETWORKMANAGER_BIN` +case "$1" in + start) + stat_busy "Starting NetworkManagerDispatcher" + if [ -z "$PID" ]; then + $NETWORKMANAGER_BIN + fi + if [ ! -z "$PID" -o $? -gt 0 ]; then + stat_fail + else + add_daemon NetworkManagerDispatcher + stat_done + fi + ;; + stop) + stat_busy "Stopping NetworkManagerDispatcher" + [ ! -z "$PID" ] && kill $PID &> /dev/null + if [ $? -gt 0 ]; then + stat_fail + else + rm_daemon NetworkManagerDispatcher + stat_done + fi + ;; + restart) + $0 stop + sleep 1 + $0 start + ;; + *) + echo "usage: $0 {start|stop|restart}" + ;; +esac +exit 0 + + + diff --git a/initscript/Arch/networkmanager.in b/initscript/Arch/networkmanager.in new file mode 100644 index 0000000000..41b7c86941 --- /dev/null +++ b/initscript/Arch/networkmanager.in @@ -0,0 +1,55 @@ +#!/bin/bash + +prefix=@prefix@ +exec_prefix=@prefix@ +sbindir=@sbindir@ + +NETWORKMANAGER_BIN=${sbindir}/NetworkManager + +# general config +. /etc/rc.conf +. /etc/rc.d/functions + +# Sanity checks. +[ -x $NETWORKMANAGER_BIN ] || exit 0 + +# We need /usr/sbin/ip +[ -x /usr/sbin/ip ] || exit 0 + +PID=`pidof -o %PPID $NETWORKMANAGER_BIN` +case "$1" in + start) + stat_busy "Starting NetworkManager" + if [ -z "$PID" ]; then + $NETWORKMANAGER_BIN + fi + if [ ! -z "$PID" -o $? -gt 0 ]; then + stat_fail + else + add_daemon NetworkManager + stat_done + fi + ;; + stop) + stat_busy "Stopping NetworkManager" + [ ! -z "$PID" ] && kill $PID &> /dev/null + if [ $? -gt 0 ]; then + stat_fail + else + rm_daemon NetworkManager + stat_done + fi + ;; + restart) + $0 stop + sleep 1 + $0 start + ;; + *) + echo "usage: $0 {start|stop|restart}" + ;; +esac +exit 0 + + + diff --git a/initscript/Makefile.am b/initscript/Makefile.am index b20408a1eb..e5ee9a1198 100644 --- a/initscript/Makefile.am +++ b/initscript/Makefile.am @@ -14,3 +14,6 @@ endif if TARGET_SUSE SUBDIRS += SUSE endif +if TARGET_ARCH +SUBDIRS += Arch +endif diff --git a/src/backends/Makefile.am b/src/backends/Makefile.am index 583acef01e..da5de20595 100644 --- a/src/backends/Makefile.am +++ b/src/backends/Makefile.am @@ -38,6 +38,10 @@ if TARGET_SLACKWARE libnmbackend_la_SOURCES += NetworkManagerSlackware.c endif +if TARGET_ARCH +libnmbackend_la_SOURCES += NetworkManagerArch.c +endif + libnmbackend_la_LIBADD = $(DBUS_LIBS) $(GTHREAD_LIBS) libnmbackend_la_CPPFLAGS = $(DBUS_CFLAGS) \ $(GTHREAD_CFLAGS) \ diff --git a/src/backends/NetworkManagerArch.c b/src/backends/NetworkManagerArch.c new file mode 100644 index 0000000000..c6cb52d6f0 --- /dev/null +++ b/src/backends/NetworkManagerArch.c @@ -0,0 +1,954 @@ +/* NetworkManager -- Network link manager + * + * Backend implementation for the Arch Linux distribution http://www.archlinux.org + * + * Tor Krill and Will Rea + * + * Updated by Wael Nasreddine + * + * Heavily based on NetworkManagerDebian.c by Matthew Garrett + * + * 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 Tom Parker + * (C) Copyright 2004 Matthew Garrett + * (C) Copyright 2004 Red Hat, Inc. + */ + +#include +#include +#include +#include +#include +#include +#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 "NetworkManagerDialup.h" +#include "interface_parser.h" +#include "nm-utils.h" + +#define ARPING "/usr/sbin/arping" + +/* + * nm_system_init + * + * Initializes the distribution-specific system backend + * + */ +void nm_system_init (void) +{ +} + +/* + * nm_system_device_add_default_route_via_device + * + * Add default route to the given device + * + */ +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_system_device_add_default_route_via_device_with_iface + * + * Add default route to the given device + * + */ +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 ("/usr/sbin/ip route add default dev %s", iface); + nm_spawn_process (buf); + g_free (buf); +} + +/* + * nm_system_device_add_route_via_device_with_iface + * + * Add route to the given device + * + */ +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 ("/usr/sbin/ip route add %s dev %s", route, iface); + nm_spawn_process (buf); + g_free (buf); +} + + +/* + * nm_system_device_flush_addresses + * + * Flush all network addresses associated with a network device + * + */ +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_system_device_flush_routes_with_iface + * + * Flush all routes associated with a network device + * + */ +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 ("/usr/sbin/ip route flush dev %s", iface); + nm_spawn_process (buf); + g_free (buf); +} + +/* + * nm_system_device_flush_addresses + * + * Flush all network addresses associated with a network device + * + */ +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_system_device_flush_addresses_with_iface + * + * Flush all network addresses associated with a network device + * + */ +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 ("/usr/sbin/ip addr flush dev %s", iface); + nm_spawn_process (buf); + g_free (buf); +} + +/* + * nm_system_device_setup_static_ip4_config + * + * Set up the device with a particular IPv4 address/netmask/gateway. + * + * Returns: TRUE on success + * FALSE on error + * + */ +#if 0 +gboolean nm_system_device_setup_static_ip4_config (NMDevice *dev) +{ +#define IPBITS (sizeof (guint32) * 8) + struct in_addr temp_addr; + struct in_addr temp_addr2; + char *s_tmp; + char *s_tmp2; + int i; + guint32 addr; + guint32 netmask; + guint32 prefix = IPBITS; /* initialize with # bits in ipv4 address */ + guint32 broadcast; + char *buf; + int err; + const char *iface; + + g_return_val_if_fail (dev != NULL, FALSE); + g_return_val_if_fail (!nm_device_config_get_use_dhcp (dev), FALSE); + + addr = nm_device_config_get_ip4_address (dev); + netmask = nm_device_config_get_ip4_netmask (dev); + iface = nm_device_get_iface (dev); + broadcast = nm_device_config_get_ip4_broadcast (dev); + + /* get the prefix from the netmask */ + for (i = 0; i < IPBITS; i++) + { + if (!(ntohl (netmask) & ((2 << i) - 1))) + prefix--; + } + + /* Calculate the broadcast address if the user didn't specify one */ + if (!broadcast) + broadcast = ((addr & (int)netmask) | ~(int)netmask); + + /* + * Try and work out if someone else has our IP + * using RFC 2131 Duplicate Address Detection + */ + temp_addr.s_addr = addr; + buf = g_strdup_printf ("%s -q -D -c 1 -I %s %s",ARPING, + iface, inet_ntoa (temp_addr)); + if ((err = nm_spawn_process (buf))) + { + nm_warning ("Error: Duplicate address '%s' detected for " + "device '%s' \n", iface, inet_ntoa (temp_addr)); + goto error; + } + g_free (buf); + + /* set our IP address */ + temp_addr.s_addr = addr; + temp_addr2.s_addr = broadcast; + s_tmp = g_strdup (inet_ntoa (temp_addr)); + s_tmp2 = g_strdup (inet_ntoa (temp_addr2)); + buf = g_strdup_printf ("/sbin/ip addr add %s/%d brd %s dev %s label %s", + s_tmp, prefix, s_tmp2, iface, iface); + g_free (s_tmp); + g_free (s_tmp2); + if ((err = nm_spawn_process (buf))) + { + nm_warning ("Error: could not set network configuration for " + "device '%s' using command:\n '%s'", + iface, buf); + goto error; + } + g_free (buf); + + /* Alert other computers of our new address */ + temp_addr.s_addr = addr; + buf = g_strdup_printf ("%s -q -A -c 1 -I %s %s", ARPING,iface, + inet_ntoa (temp_addr)); + nm_spawn_process (buf); + g_free (buf); + g_usleep (G_USEC_PER_SEC * 2); + buf = g_strdup_printf ("%s -q -U -c 1 -I %s %s", ARPING, iface, + inet_ntoa (temp_addr)); + nm_spawn_process (buf); + g_free (buf); + + /* set the default route to be this device's gateway */ + temp_addr.s_addr = nm_device_config_get_ip4_gateway (dev); + buf = g_strdup_printf ("/sbin/ip route replace default via %s dev %s", + inet_ntoa (temp_addr), iface); + if ((err = nm_spawn_process (buf))) + { + nm_warning ("Error: could not set default route using " + "command:\n '%s'", buf); + goto error; + } + g_free (buf); + return(TRUE); + + error: + g_free (buf); + nm_system_device_flush_addresses (dev); + nm_system_device_flush_routes (dev); + return(FALSE); +} +#endif + +/* + * nm_system_enable_loopback + * + * Bring up the loopback interface + * + */ +void nm_system_enable_loopback (void) +{ + nm_spawn_process ("/sbin/ifconfig lo up"); +} + + +/* + * nm_system_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_system_flush_loopback_routes (void) +{ + nm_spawn_process ("/usr/sbin/ip route flush dev lo"); +} + + +/* + * nm_system_delete_default_route + * + * Remove the old default route in preparation for a new one + * + */ +void nm_system_delete_default_route (void) +{ + nm_spawn_process ("/usr/sbin/ip route del default"); +} + + +/* + * nm_system_flush_arp_cache + * + * Flush all entries in the arp cache. + * + */ +void nm_system_flush_arp_cache (void) +{ + nm_spawn_process ("/usr/sbin/ip neigh flush all"); +} + + +/* + * nm_system_kill_all_dhcp_daemons + * + * Kill all DHCP daemons currently running, done at startup. + * + */ +void nm_system_kill_all_dhcp_daemons (void) +{ + nm_spawn_process ("/usr/bin/killall -q dhclient"); +} + + +/* + * nm_system_update_dns + * + * Make glibc/nscd aware of any changes to the resolv.conf file by + * restarting nscd. + * + */ +void nm_system_update_dns (void) +{ + nm_spawn_process ("/etc/rc.d/nscd restart"); + +} + + +/* + * nm_system_restart_mdns_responder + * + * Restart the multicast DNS responder so that it knows about new + * network interfaces and IP addresses. + * + */ +void nm_system_restart_mdns_responder (void) +{ + nm_spawn_process ("/etc/rc.d/avahi-daemon restart"); +} + + +/* + * nm_system_device_add_ip6_link_address + * + * Add a default link-local IPv6 address to a device. + * + */ +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 ("/usr/sbin/ip -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); +} + +/* +* ArchReadConfig +* +* Read platform dependant config file and fill hash with relevant info +*/ + +static GHashTable * ArchReadConfig(const char* file, const char* dev) +{ + gchar *contents=NULL; + gchar **split_contents=NULL; + GHashTable *cfg,*ifs; + guint len; + gint i; + gpointer val; + + if (!g_file_get_contents (file, &contents, NULL, NULL) || (contents == NULL)) + { + return NULL; + } + + if (!(split_contents = g_strsplit (contents, "\n", 0))) + { + g_free(contents); + return NULL; + } + + cfg=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); + if (cfg==NULL) + { + g_free(contents); + return NULL; + } + + ifs=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); + if (ifs==NULL) + { + g_free(contents); + g_hash_table_destroy(cfg); + return NULL; + } + + /* load hash with key value pairs from config file */ + len = g_strv_length (split_contents); + for (i = 0; i < len; i++) + { + char *line = split_contents[i]; + gchar** splt; + + /* Ignore comments */ + if (!line || (line[0] == ';') || (line[0] == '#')) + { + continue; + } + + line = g_strstrip(line); + + splt=g_strsplit(line,"=",0); + if (g_strv_length(splt)==2) + { + g_hash_table_insert(cfg,g_strstrip(splt[0]),g_strstrip(splt[1])); + } + else + { + g_strfreev(splt); + } + + } + + /* Find our network device */ + if ((val=g_hash_table_lookup(cfg,dev))) + { + char hit[128]; + gchar** splt; + gint hits; + + if (sscanf(val,"\"%[0-9a-zA-Z .]\"",hit)) + { + + splt=g_strsplit(hit," ",0); + + hits=g_strv_length(splt); + if (hits>1) + { + guint j=0; + while ((hits-=2)>=0) + { + g_hash_table_insert(ifs,splt[j],splt[j+1]); + j+=2; + } + + } + + } + } + + /* Find out any default route */ + if ((val=g_hash_table_lookup(cfg,"ROUTES"))) + { + char hit[128]; + gchar** splt; + gint hits,i; + + if (sscanf(val,"( %[!0-9a-zA-z ] )",hit)) + { + + splt=g_strsplit(hit," ",0); + + hits=g_strv_length(splt); + for (i=0;iuse_dhcp = TRUE; + sys_data->config=NULL; + + ifh=ArchReadConfig("/etc/rc.conf",nm_device_get_iface(dev)); + if (ifh==NULL) + { + g_free(sys_data); + return NULL; + } + + if ((val=g_hash_table_lookup(ifh,nm_device_get_iface(dev)))) + { + // We found an IP-nr and thus have a static configuration + + sys_data->use_dhcp=FALSE; + sys_data->config = nm_ip4_config_new(); + + nm_ip4_config_set_address (sys_data->config, inet_addr (val)); + + val = g_hash_table_lookup(ifh, "gateway"); + if (val) + nm_ip4_config_set_gateway (sys_data->config, inet_addr (val)); + + val = g_hash_table_lookup(ifh, "netmask"); + if (val) + nm_ip4_config_set_netmask (sys_data->config, inet_addr (val)); + else + { + guint32 addr = nm_ip4_config_get_address (sys_data->config); + + /* Make a default netmask if we have an IP address */ + if (((ntohl (addr) & 0xFF000000) >> 24) <= 127) + nm_ip4_config_set_netmask (sys_data->config, htonl (0xFF000000)); + else if (((ntohl (addr) & 0xFF000000) >> 24) <= 191) + nm_ip4_config_set_netmask (sys_data->config, htonl (0xFFFF0000)); + else + nm_ip4_config_set_netmask (sys_data->config, htonl (0xFFFFFF00)); + } + + val = g_hash_table_lookup(ifh, "broadcast"); + if (val) + nm_ip4_config_set_broadcast (sys_data->config, inet_addr (val)); + else + { + guint32 broadcast = ((nm_ip4_config_get_address (sys_data->config) & nm_ip4_config_get_netmask (sys_data->config)) + | ~nm_ip4_config_get_netmask (sys_data->config)); + nm_ip4_config_set_broadcast (sys_data->config, broadcast); + } + + set_ip4_config_from_resolv_conf (SYSCONFDIR"/resolv.conf", sys_data->config); +#if 1 + { + int j; + nm_debug ("------ Config (%s)", nm_device_get_iface (dev)); + nm_debug (" ADDR=%d", nm_ip4_config_get_address (sys_data->config)); + nm_debug (" GW =%d", nm_ip4_config_get_gateway (sys_data->config)); + nm_debug (" NM =%d", nm_ip4_config_get_netmask (sys_data->config)); + nm_debug (" NSs =%d",nm_ip4_config_get_num_nameservers(sys_data->config)); + for (j=0;jconfig);j++) + { + nm_debug (" NS =%d",nm_ip4_config_get_nameserver(sys_data->config,j)); + } + nm_debug ("---------------------\n"); + } +#endif + + } + + g_hash_table_destroy(ifh); + + + return (void *)sys_data; +} + +/* + * nm_system_device_free_system_config + * + * Free stored system config data + * + */ +void nm_system_device_free_system_config (NMDevice *dev, void *system_config_data) +{ + ArchSystemConfigData *sys_data = (ArchSystemConfigData*) system_config_data; + + g_return_if_fail (dev != NULL); + + if (!sys_data) + { + return; + } + + if (sys_data->config) + nm_ip4_config_unref (sys_data->config); + + +} + + +/* + * nm_system_device_get_use_dhcp + * + * Return whether the distro-specific system config tells us to use + * dhcp for this device. + * + */ +gboolean nm_system_device_get_use_dhcp (NMDevice *dev) +{ + ArchSystemConfigData *sys_data; + + g_return_val_if_fail (dev != NULL, TRUE); + + if ((sys_data = nm_device_get_system_config_data(dev))) + { + return sys_data->use_dhcp; + } + + return TRUE; +} + +/* + * nm_system_device_get_disabled + * + * Return whether the distro-specific system config tells us to use + * dhcp for this device. + * + */ +gboolean nm_system_device_get_disabled (NMDevice *dev) +{ + return FALSE; +} + + +NMIP4Config *nm_system_device_new_ip4_system_config (NMDevice *dev) +{ + ArchSystemConfigData *sys_data; + NMIP4Config *new_config = NULL; + + g_return_val_if_fail (dev != NULL, NULL); + + if ((sys_data = nm_device_get_system_config_data (dev))) + new_config = nm_ip4_config_copy (sys_data->config); + + return new_config; +} + +void nm_system_deactivate_all_dialup (GSList *list) +{ + GSList *elt; + + for (elt = list; elt; elt = g_slist_next (elt)) + { + NMDialUpConfig *config = (NMDialUpConfig *) elt->data; + char *cmd; + + cmd = g_strdup_printf ("/sbin/ifconfig %s down", (char *) config->data); + nm_spawn_process (cmd); + g_free (cmd); + } +} + +gboolean nm_system_deactivate_dialup (GSList *list, const char *dialup) +{ + GSList *elt; + gboolean ret = FALSE; + + for (elt = list; elt; elt = g_slist_next (elt)) + { + NMDialUpConfig *config = (NMDialUpConfig *) elt->data; + if (strcmp (dialup, config->name) == 0) + { + char *cmd; + + nm_info ("Deactivating dialup device %s (%s) ...", dialup, (char *) config->data); + cmd = g_strdup_printf ("/sbin/ifconfig %s down", (char *) config->data); + nm_spawn_process (cmd); + g_free (cmd); + ret = TRUE; + break; + } + } + + return ret; +} + +gboolean nm_system_activate_dialup (GSList *list, const char *dialup) +{ + GSList *elt; + gboolean ret = FALSE; + + for (elt = list; elt; elt = g_slist_next (elt)) + { + NMDialUpConfig *config = (NMDialUpConfig *) elt->data; + if (strcmp (dialup, config->name) == 0) + { + char *cmd; + + nm_info ("Activating dialup device %s (%s) ...", dialup, (char *) config->data); + cmd = g_strdup_printf ("/sbin/ifconfig %s up", (char *) config->data); + nm_spawn_process (cmd); + g_free (cmd); + ret = TRUE; + break; + } + } + + return ret; +} + +GSList * nm_system_get_dialup_config (void) +{ + const char *buf; + if_block *curr_device; + gboolean error = FALSE; + GError *err; + unsigned int i = 0; + size_t len; + GSList *list = NULL; +#if 0 // PORT me + if_block *curr; + ifparser_init(); + + /* FIXME: get all ppp(and others?) lines from /e/n/i here */ + curr = ifparser_getfirst(); + while (curr!=NULL) + { + NMDialUpConfig *config; + if (strcmp(curr->type,"iface")==0) + { + buf = ifparser_getkey(curr,"inet"); + if (buf && strcmp (buf, "ppp")==0) + { + config = g_malloc (sizeof (NMDialUpConfig)); + config->name = g_strdup_printf ("Modem (#%d)", i++); + config->data = g_strdup (curr->name); /* interface name */ + + list = g_slist_append (list, config); + + nm_info ("Found dial up configuration for %s: %s", config->name, (char *) config->data); + } + } + curr = curr->next; + } + ifparser_destroy(); + + /* Hack: Go back and remove the "(#0)" if there is only one device */ + if (i == 1) + { + NMDialUpConfig *config = (NMDialUpConfig *) list->data; + g_free (config->name); + config->name = g_strdup ("Modem"); + } +#endif + return list; +} + +/* + * nm_system_activate_nis + * + * set up the nis domain and write a yp.conf + * + */ +void nm_system_activate_nis (NMIP4Config *config) +{ +} + +/* + * nm_system_should_modify_resolv_conf + * + * Can NM update resolv.conf, or is it locked down? + */ +gboolean nm_system_should_modify_resolv_conf (void) +{ + return TRUE; +} + +/* + * nm_system_shutdown_nis + * + * shutdown ypbind + * + */ +void nm_system_shutdown_nis (void) +{ +} + +/* + * nm_system_set_hostname + * + * set the hostname + * + */ +void nm_system_set_hostname (NMIP4Config *config) +{ +} +