diff --git a/ChangeLog b/ChangeLog index 3b5726f2f..8038a42e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,41 @@ +2005-05-15 Dan Williams + + * src/NetworkManagerDevice.[ch] + src/NetworkManagerPolicy.c + src/NetworkManager.c + src/nm-dbus-nm.c + - Remove the "just_added" parameter from nm_device_deactivate(). We no + longer send the DeviceNoLongerActive signal unconditionally, but only + when the device is actually active. + + * dispatcher-daemon/NetworkManagerDispatcher.c + - (nmd_execute_scripts): convert to GLib directory functions from opendir(), + and simplify the logic + - (nmd_get_device_name): copy value from dbus reply so we don't segfault when + we free it later on + + * initscript/RedHat/Makefile.am + initscript/RedHat/NetworkManagerDispatcher + - Add initscript for NetworkManagerDispatcher + + + Patch from Bill Moss: + * dispatcher-daemon/NetworkManagerDispatcher.c + - Remove IP4AddressChange signal code including nmd_get_device_ip4_address() + + * src/NetworkManagerDbus.c + - (nm_dbus_signal_device_ip4_address_change): remove. If the device goes up, + and DeviceNowActive gets signaled, then the device has a new IP address + anyway. There's no need for a separate signal. + + * src/NetworkManagerDevice.c + - (nm_device_update_ip4_address): Don't send IP4AddressChange signal + + * src/NetworkManagerPolicy.c + - (nm_policy_activation_finish): Send DeviceNowActive signal when the device + activates successfully. This kind of went missing when I reworked the + activation code. + 2005-05-15 Dan Williams * configure.in diff --git a/dispatcher-daemon/NetworkManagerDispatcher.c b/dispatcher-daemon/NetworkManagerDispatcher.c index d68f6e1fb..a8e49df60 100644 --- a/dispatcher-daemon/NetworkManagerDispatcher.c +++ b/dispatcher-daemon/NetworkManagerDispatcher.c @@ -35,27 +35,20 @@ #include #include +#include "NetworkManager.h" #include "nm-utils.h" -#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager" - -#define NM_DBUS_PATH "/org/freedesktop/NetworkManager" -#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager" - enum NMDAction { NMD_DEVICE_DONT_KNOW, NMD_DEVICE_NOW_INACTIVE, NMD_DEVICE_NOW_ACTIVE, - NMD_DEVICE_IP4_ADDRESS_CHANGE }; typedef enum NMDAction NMDAction; -#define NIPQUAD(addr) ((unsigned char)(addr)), \ - ((unsigned char)(addr>>8)), \ - ((unsigned char)(addr>>16)), \ - ((unsigned char)(addr>>24)) + +#define NM_SCRIPT_DIR "/etc/NetworkManager/dispatcher.d" /* * nmd_execute_scripts @@ -63,54 +56,51 @@ typedef enum NMDAction NMDAction; * Call scripts in /etc/NetworkManager.d when devices go down or up * */ -void nmd_execute_scripts (NMDAction action, char *iface_name, guint32 new_ip4_address) +void nmd_execute_scripts (NMDAction action, char *iface_name) { - DIR *dir = opendir ("/etc/NetworkManager.d"); - struct dirent *ent; + GDir * dir; + const char * file_name; + const char * char_act; - if (!dir) + if (action == NMD_DEVICE_NOW_ACTIVE) + char_act = "up"; + else if (action == NMD_DEVICE_NOW_INACTIVE) + char_act = "down"; + else + return; + + if (!(dir = g_dir_open (NM_SCRIPT_DIR, 0, NULL))) { - nm_warning ("nmd_execute_scripts(): opendir() could not open /etc/NetworkManager.d. errno = %d", errno); + nm_warning ("nmd_execute_scripts(): opendir() could not open '" NM_SCRIPT_DIR "'. errno = %d", errno); return; } - do + while ((file_name = g_dir_read_name (dir))) { - errno = 0; - if ((ent = readdir (dir)) != NULL) + char * file_path = g_strdup_printf (NM_SCRIPT_DIR"/%s", file_name); + struct stat s; + + if ((file_name[0] != '.') && (stat (file_path, &s) == 0)) { - struct stat s; - char path[500]; - - snprintf (path, 499, "/etc/NetworkManager.d/%s", ent->d_name); - if ((ent->d_name[0] != '.') && (stat (path, &s) == 0)) + /* FIXME + * We should check the permissions and only execute files that + * are 0700 or 0500. + */ + if (S_ISREG (s.st_mode) && !S_ISLNK (s.st_mode) && (s.st_uid == 0)) { - /* FIXME - * We should check the permissions and only execute files that - * are 0700 or 0500. - */ - if (S_ISREG (s.st_mode) && !S_ISLNK (s.st_mode) && (s.st_uid == 0)) - { - int x; - char cmd[500]; + int x; + char *cmd; - if ((action == NMD_DEVICE_NOW_INACTIVE) || (action == NMD_DEVICE_NOW_ACTIVE)) - { - snprintf (cmd, 499, "%s %s %s", path, iface_name, - (action == NMD_DEVICE_NOW_INACTIVE ? "down" : - (action == NMD_DEVICE_NOW_ACTIVE ? "up" : "error"))); - } - else if (action == NMD_DEVICE_IP4_ADDRESS_CHANGE) - { - snprintf (cmd, 499, "%s %s %u.%u.%u.%u", path, iface_name, NIPQUAD (new_ip4_address)); - } - x = system (cmd); - } + cmd = g_strdup_printf ("%s %s %s", file_path, iface_name, char_act); + x = system (cmd); + g_free (cmd); } } - } while (ent); - closedir (dir); + g_free (file_path); + } + + g_dir_close (dir); } @@ -121,94 +111,40 @@ void nmd_execute_scripts (NMDAction action, char *iface_name, guint32 new_ip4_ad */ char * nmd_get_device_name (DBusConnection *connection, char *path) { - DBusMessage *message; - DBusMessage *reply; - DBusError error; - char *dev_name = NULL; + DBusMessage * message; + DBusMessage * reply; + DBusError error; + char * dbus_dev_name = NULL; + char * dev_name = NULL; if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, "getName"))) { nm_warning ("Couldn't allocate the dbus message"); - return (NULL); + return NULL; } dbus_error_init (&error); reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + dbus_message_unref (message); if (dbus_error_is_set (&error)) { nm_warning ("%s raised: %s", error.name, error.message); - dbus_message_unref (message); - return (NULL); - } - - if (reply == NULL) - { - nm_warning ("dbus reply message was NULL" ); - dbus_message_unref (message); - return (NULL); + dbus_error_free (&error); + return NULL; } /* now analyze reply */ - dbus_error_init (&error); - if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dev_name, DBUS_TYPE_INVALID)) + if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &dbus_dev_name, DBUS_TYPE_INVALID)) { nm_warning ("There was an error getting the device name from NetworkManager." ); dev_name = NULL; } - + else + dev_name = g_strdup (dbus_dev_name); + dbus_message_unref (reply); - dbus_message_unref (message); - return (dev_name); -} - - -/* - * nmd_get_device_ip4_address - * - * Queries NetworkManager for the IPv4 address of a device, specified by a device path - */ -guint32 nmd_get_device_ip4_address (DBusConnection *connection, char *path) -{ - DBusMessage *message; - DBusMessage *reply; - DBusError error; - guint32 address; - - if (!(message = dbus_message_new_method_call (NM_DBUS_SERVICE, path, NM_DBUS_INTERFACE, "getIP4Address"))) - { - nm_warning ("Couldn't allocate the dbus message"); - return (0); - } - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); - if (dbus_error_is_set (&error)) - { - nm_warning ("%s raised: %s", error.name, error.message); - dbus_message_unref (message); - return (0); - } - - if (reply == NULL) - { - nm_warning ("dbus reply message was NULL" ); - dbus_message_unref (message); - return (0); - } - - /* now analyze reply */ - dbus_error_init (&error); - if (!dbus_message_get_args (reply, &error, DBUS_TYPE_UINT32, &address, DBUS_TYPE_INVALID)) - { - nm_warning ("There was an error getting the device's IPv4 address from NetworkManager." ); - address = 0; - } - - dbus_message_unref (reply); - dbus_message_unref (message); - - return (address); + return dev_name; } @@ -228,9 +164,7 @@ static DBusHandlerResult nmd_dbus_filter (DBusConnection *connection, DBusMessag dbus_error_init (&error); object_path = dbus_message_get_path (message); - if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceIP4AddressChange")) - action = NMD_DEVICE_IP4_ADDRESS_CHANGE; - else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive")) + if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive")) action = NMD_DEVICE_NOW_INACTIVE; else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive")) action = NMD_DEVICE_NOW_ACTIVE; @@ -239,30 +173,23 @@ static DBusHandlerResult nmd_dbus_filter (DBusConnection *connection, DBusMessag { if (dbus_message_get_args (message, &error, DBUS_TYPE_OBJECT_PATH, &dev_object_path, DBUS_TYPE_INVALID)) { - char * dev_iface_name; - guint32 dev_ip4_address; + char * dev_iface_name = NULL; dev_object_path = nm_dbus_unescape_object_path (dev_object_path); + if (dev_object_path) + dev_iface_name = nmd_get_device_name (connection, dev_object_path); - dev_ip4_address = nmd_get_device_ip4_address (connection, dev_object_path); - dev_iface_name = nmd_get_device_name (connection, dev_object_path); - - if (action == NMD_DEVICE_NOW_ACTIVE || action == NMD_DEVICE_NOW_INACTIVE) + if (dev_object_path && dev_iface_name) { nm_info ("Device %s (%s) is now %s.", dev_object_path, dev_iface_name, (action == NMD_DEVICE_NOW_INACTIVE ? "down" : - (action == NMD_DEVICE_NOW_ACTIVE ? "up" : "error"))); - } - else if (action == NMD_DEVICE_IP4_ADDRESS_CHANGE) - { - nm_info ("Device %s (%s) now has address %u.%u.%u.%u", dev_object_path, dev_iface_name, - NIPQUAD(dev_ip4_address)); + (action == NMD_DEVICE_NOW_ACTIVE ? "up" : "error"))); + + nmd_execute_scripts (action, dev_iface_name); } - nmd_execute_scripts (action, dev_iface_name, dev_ip4_address); - - g_free (dev_iface_name); g_free (dev_object_path); + g_free (dev_iface_name); handled = TRUE; } diff --git a/initscript/RedHat/Makefile.am b/initscript/RedHat/Makefile.am index 3ce9ed4a5..8796239a3 100644 --- a/initscript/RedHat/Makefile.am +++ b/initscript/RedHat/Makefile.am @@ -1,5 +1,5 @@ -EXTRA_DIST = NetworkManager +EXTRA_DIST = NetworkManager NetworkManagerDispatcher initddir = $(sysconfdir)/rc.d/init.d -initd_SCRIPTS = NetworkManager +initd_SCRIPTS = NetworkManager NetworkManagerDispatcher diff --git a/initscript/RedHat/NetworkManagerDispatcher b/initscript/RedHat/NetworkManagerDispatcher new file mode 100755 index 000000000..a01f0ba90 --- /dev/null +++ b/initscript/RedHat/NetworkManagerDispatcher @@ -0,0 +1,74 @@ +#!/bin/sh +# +# NetworkManager: NetworkManagerDispatcher daemon +# +# chkconfig: - 98 02 +# description: This daemon automatically runs scripts when NetworkManager \ +# changes the network state. +# +# processname: NetworkManagerDispatcher +# pidfile: /var/run/NetworkManagerDispatcher.pid +# + +# Sanity checks. +[ -x /usr/bin/NetworkManagerDispatcher ] || exit 1 + +# Source function library. +. /etc/rc.d/init.d/functions + +# so we can rearrange this easily +processname=NetworkManagerDispatcher +servicename=NetworkManagerDispatcher +pidfile=/var/run/NetworkManagerDispatcher.pid + +RETVAL=0 + +start() +{ + echo -n $"Starting NetworkManagerDispatcher daemon: " + daemon --check $servicename $processname + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename && echo `/sbin/pidof $processname` > $pidfile +} + +stop() +{ + echo -n $"Stopping NetworkManagerDispatcher daemon: " + + killproc $servicename -TERM + RETVAL=$? + echo + if [ $RETVAL -eq 0 ]; then + rm -f /var/lock/subsys/$servicename + rm -f $pidfile + fi +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + status $processname + RETVAL=$? + ;; + restart) + stop + start + ;; + condrestart) + if [ -f /var/lock/subsys/$servicename ]; then + stop + start + fi + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart}" + ;; +esac +exit $RETVAL diff --git a/src/NetworkManager.c b/src/NetworkManager.c index a6d16547a..5f059aa0b 100644 --- a/src/NetworkManager.c +++ b/src/NetworkManager.c @@ -131,7 +131,7 @@ NMDevice * nm_create_device_and_add_to_list (NMData *data, const char *udi, cons nm_device_is_wireless (dev) ? "wireless" : "wired", nm_device_get_iface (dev)); data->dev_list = g_slist_append (data->dev_list, dev); - nm_device_deactivate (dev, TRUE); + nm_device_deactivate (dev); nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); @@ -176,7 +176,7 @@ void nm_remove_device_from_list (NMData *data, const char *udi) if (dev && (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0)) { nm_device_set_removed (dev, TRUE); - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_device_worker_thread_stop (dev); nm_dbus_schedule_device_status_change_signal (data, dev, NULL, DEVICE_REMOVED); @@ -451,7 +451,7 @@ static void device_stop_and_free (NMDevice *dev, gpointer user_data) g_return_if_fail (dev != NULL); nm_device_set_removed (dev, TRUE); - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_device_unref (dev); } diff --git a/src/NetworkManagerDbus.c b/src/NetworkManagerDbus.c index 0a53da1e9..14ddb5144 100644 --- a/src/NetworkManagerDbus.c +++ b/src/NetworkManagerDbus.c @@ -343,42 +343,6 @@ void nm_dbus_signal_state_change (DBusConnection *connection, NMData *data) dbus_message_unref (message); } - -/* - * nm_dbus_signal_device_ip4_address_change - * - * Notifies the bus that a particular device's IPv4 address changed. - * - */ -void nm_dbus_signal_device_ip4_address_change (DBusConnection *connection, NMDevice *dev) -{ - DBusMessage *message; - gchar *dev_path; - - g_return_if_fail (connection != NULL); - g_return_if_fail (dev != NULL); - - if (!(dev_path = nm_dbus_get_object_path_for_device (dev))) - return; - - message = dbus_message_new_signal (NM_DBUS_PATH, NM_DBUS_INTERFACE, "DeviceIP4AddressChange"); - if (!message) - { - nm_warning ("nm_dbus_signal_device_ip4_address_change(): Not enough memory for new dbus message!"); - g_free (dev_path); - return; - } - - dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path, DBUS_TYPE_INVALID); - g_free (dev_path); - - if (!dbus_connection_send (connection, message, NULL)) - nm_warning ("nm_dbus_signal_device_ip4_address_change(): Could not raise the IP4AddressChange signal!"); - - dbus_message_unref (message); -} - - /* * nm_dbus_signal_wireless_network_change * diff --git a/src/NetworkManagerDbus.h b/src/NetworkManagerDbus.h index 167854fc0..1b2edbdf7 100644 --- a/src/NetworkManagerDbus.h +++ b/src/NetworkManagerDbus.h @@ -64,8 +64,6 @@ void nm_dbus_schedule_device_status_change_signal (NMData *data, NMDevice *dev void nm_dbus_signal_state_change (DBusConnection *connection, NMData *data); -void nm_dbus_signal_device_ip4_address_change(DBusConnection *connection, NMDevice *dev); - void nm_dbus_signal_wireless_network_change (DBusConnection *connection, NMDevice *dev, NMAccessPoint *ap, NMNetworkStatus status, gint8 strength); void nm_dbus_get_user_key_for_network (DBusConnection *connection, NMActRequest *req); diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c index 6a133d903..8f3722a49 100644 --- a/src/NetworkManagerDevice.c +++ b/src/NetworkManagerDevice.c @@ -676,7 +676,7 @@ void nm_device_set_link_active (NMDevice *dev, const gboolean link_active) /* Deactivate a currently active device */ if (!link_active && nm_device_get_act_request (dev)) { - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_policy_schedule_device_change_check (dev->app_data); } else if (link_active && !nm_device_get_act_request (dev)) @@ -1485,13 +1485,8 @@ void nm_device_update_ip4_address (NMDevice *dev) return; new_address = ((struct sockaddr_in *)(&req.ifr_addr))->sin_addr.s_addr; - - /* If the new address is different, send an IP4AddressChanged signal on the bus */ if (new_address != nm_device_get_ip4_address (dev)) - { - nm_dbus_signal_device_ip4_address_change (dev->app_data->dbus_connection, dev); dev->ip4_address = new_address; - } } @@ -3121,7 +3116,7 @@ void nm_device_activation_cancel (NMDevice *dev) * Remove a device's routing table entries and IP address. * */ -gboolean nm_device_deactivate (NMDevice *dev, gboolean just_added) +gboolean nm_device_deactivate (NMDevice *dev) { NMIP4Config * config; @@ -3130,6 +3125,12 @@ gboolean nm_device_deactivate (NMDevice *dev, gboolean just_added) nm_info ("Deactivating device %s.", nm_device_get_iface (dev)); + if (dev->act_request) + { + /* Only send if the device is actually active */ + nm_dbus_schedule_device_status_change_signal (dev->app_data, dev, NULL, DEVICE_NO_LONGER_ACTIVE); + } + if (nm_device_is_activating (dev)) nm_device_activation_cancel (dev); @@ -3141,7 +3142,7 @@ gboolean nm_device_deactivate (NMDevice *dev, gboolean just_added) } if (nm_device_get_driver_support_level (dev) == NM_DRIVER_UNSUPPORTED) - return (TRUE); + return TRUE; nm_vpn_manager_deactivate_vpn_connection (dev->app_data->vpn_manager); @@ -3158,9 +3159,6 @@ gboolean nm_device_deactivate (NMDevice *dev, gboolean just_added) nm_system_device_flush_addresses (dev); nm_device_update_ip4_address (dev); - if (!just_added) - nm_dbus_schedule_device_status_change_signal (dev->app_data, dev, NULL, DEVICE_NO_LONGER_ACTIVE); - /* Clean up stuff, don't leave the card associated */ if (nm_device_is_wireless (dev)) { diff --git a/src/NetworkManagerDevice.h b/src/NetworkManagerDevice.h index 75f0fc73c..51a4d3ba5 100644 --- a/src/NetworkManagerDevice.h +++ b/src/NetworkManagerDevice.h @@ -101,7 +101,7 @@ void nm_device_activate_schedule_stage4_ip_config_timeout (NMActRequest *req); void nm_device_activation_cancel (NMDevice *dev); gboolean nm_device_activation_should_cancel (NMDevice *dev); gboolean nm_device_is_activating (NMDevice *dev); -gboolean nm_device_deactivate (NMDevice *dev, gboolean just_added); +gboolean nm_device_deactivate (NMDevice *dev); NMAccessPoint *nm_device_wireless_get_activation_ap (NMDevice *dev, const char *essid, const char *key, NMEncKeyType key_type); diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c index bed24d573..c5242680f 100644 --- a/src/NetworkManagerPolicy.c +++ b/src/NetworkManagerPolicy.c @@ -74,6 +74,7 @@ gboolean nm_policy_activation_finish (NMActRequest *req) } nm_info ("Activation (%s) successful, device activated.", nm_device_get_iface (dev)); + nm_dbus_schedule_device_status_change_signal (data, dev, NULL, DEVICE_NOW_ACTIVE); nm_schedule_state_change_signal_broadcast (data); out: @@ -154,7 +155,7 @@ static gboolean nm_policy_activation_failed (NMActRequest *req) nm_dbus_schedule_device_status_change_signal (data, dev, NULL, DEVICE_ACTIVATION_FAILED); } - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_schedule_state_change_signal_broadcast (data); nm_policy_schedule_device_change_check (data); @@ -372,7 +373,7 @@ static gboolean nm_policy_device_change_check (NMData *data) { /* Terminate current connection */ nm_info ("SWITCH: terminating current connection '%s' because it's no longer valid.", nm_device_get_iface (old_dev)); - nm_device_deactivate (old_dev, FALSE); + nm_device_deactivate (old_dev); do_switch = TRUE; } else if (old_dev && new_dev) @@ -466,7 +467,7 @@ static gboolean nm_policy_device_activation (NMActRequest *req) g_assert (data); if ((old_dev = nm_get_active_device (data))) - nm_device_deactivate (old_dev, FALSE); + nm_device_deactivate (old_dev); new_dev = nm_act_request_get_dev (req); if (nm_device_is_activating (new_dev)) diff --git a/src/nm-dbus-nm.c b/src/nm-dbus-nm.c index ce2303cb6..8ac68bcfa 100644 --- a/src/nm-dbus-nm.c +++ b/src/nm-dbus-nm.c @@ -162,7 +162,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB goto out; } - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_schedule_state_change_signal_broadcast (data->data); @@ -378,7 +378,7 @@ static DBusMessage *nm_dbus_nm_set_wireless_enabled (DBusConnection *connection, NMDevice *dev = (NMDevice *)(elt->data); if (nm_device_is_wireless (dev)) { - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_device_bring_down (dev); } } @@ -419,7 +419,7 @@ static DBusMessage *nm_dbus_nm_sleep (DBusConnection *connection, DBusMessage *m { NMDevice *dev = (NMDevice *)(elt->data); - nm_device_deactivate (dev, FALSE); + nm_device_deactivate (dev); nm_device_bring_down (dev); } nm_unlock_mutex (app_data->dev_list_mutex, __FUNCTION__);