From e4a3f1247564300b047b01ec3e6696c3b4eac41a Mon Sep 17 00:00:00 2001 From: Christopher Aillon Date: Mon, 12 Sep 2005 17:44:45 +0000 Subject: [PATCH] 2005-09-12 Christopher Aillon * gnome/applet/applet-dbus-devices.c: * gnome/applet/applet.c: * gnome/applet/nm-device.c: * gnome/applet/nm-device.h: * src/NetworkManagerUtils.c: * src/NetworkManagerUtils.h: * src/nm-dbus-device.c: I've got a fever, and the only cure for it is less ioctl. Make NM push IP data rather than make the applet open a socket to the device. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@960 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 13 ++++ gnome/applet/applet-dbus-devices.c | 11 ++- gnome/applet/applet.c | 104 +++-------------------------- gnome/applet/nm-device.c | 72 ++++++++++++++++++-- gnome/applet/nm-device.h | 9 +++ src/NetworkManagerUtils.c | 14 ++++ src/NetworkManagerUtils.h | 2 + src/nm-dbus-device.c | 18 ++++- 8 files changed, 138 insertions(+), 105 deletions(-) diff --git a/ChangeLog b/ChangeLog index d44ba6b598..3007a0f336 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-09-12 Christopher Aillon + + * gnome/applet/applet-dbus-devices.c: + * gnome/applet/applet.c: + * gnome/applet/nm-device.c: + * gnome/applet/nm-device.h: + * src/NetworkManagerUtils.c: + * src/NetworkManagerUtils.h: + * src/nm-dbus-device.c: + I've got a fever, and the only cure for it is less ioctl. + Make NM push IP data rather than make the applet open a socket + to the device. + 2005-09-10 Christopher Aillon * gnome/applet/applet.c: diff --git a/gnome/applet/applet-dbus-devices.c b/gnome/applet/applet-dbus-devices.c index 085f9edf50..1afe490dd1 100644 --- a/gnome/applet/applet-dbus-devices.c +++ b/gnome/applet/applet-dbus-devices.c @@ -658,7 +658,9 @@ static void nmwa_dbus_device_properties_cb (DBusPendingCall *pcall, void *user_d dbus_uint32_t type = 0; const char * udi = NULL; dbus_bool_t active = FALSE; - dbus_uint32_t ip4_address = 0; + const char * ip4_address = NULL; + const char * broadcast = NULL; + const char * subnetmask = NULL; const char * hw_addr = NULL; dbus_uint32_t mode = 0; dbus_int32_t strength = -1; @@ -687,7 +689,9 @@ static void nmwa_dbus_device_properties_cb (DBusPendingCall *pcall, void *user_d DBUS_TYPE_STRING, &udi, DBUS_TYPE_BOOLEAN,&active, DBUS_TYPE_UINT32, &act_stage, - DBUS_TYPE_UINT32, &ip4_address, + DBUS_TYPE_STRING, &ip4_address, + DBUS_TYPE_STRING, &subnetmask, + DBUS_TYPE_STRING, &broadcast, DBUS_TYPE_STRING, &hw_addr, DBUS_TYPE_UINT32, &mode, DBUS_TYPE_INT32, &strength, @@ -706,6 +710,9 @@ static void nmwa_dbus_device_properties_cb (DBusPendingCall *pcall, void *user_d network_device_set_link (dev, link_active); network_device_set_driver_support_level (dev, driver_support_level); network_device_set_act_stage (dev, act_stage); + network_device_set_ip4_address (dev, ip4_address); + network_device_set_broadcast (dev, broadcast); + network_device_set_netmask (dev, subnetmask); /* If the device already exists in our list for some reason, remove it so we * can add the new one with updated data. diff --git a/gnome/applet/applet.c b/gnome/applet/applet.c index 5942008874..04937543bb 100644 --- a/gnome/applet/applet.c +++ b/gnome/applet/applet.c @@ -32,23 +32,6 @@ #endif #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include #include #include @@ -206,13 +189,10 @@ static gboolean nmwa_update_info (NMWirelessApplet *applet) { GtkWidget *info_dialog; char *addr = NULL, *mask = NULL, *broadcast = NULL; - char *dest = NULL, *mac = NULL, *iface_and_type = NULL; + char *mac = NULL, *iface_and_type = NULL; GtkWidget *label; - struct ifreq ifr; - int fd, flags; const char *iface = NULL; NetworkDevice *dev; - gboolean ret = TRUE; info_dialog = glade_xml_get_widget (applet->info_dialog_xml, "info_dialog"); if (!info_dialog) @@ -222,7 +202,6 @@ static gboolean nmwa_update_info (NMWirelessApplet *applet) g_free (err); return FALSE; } - if ((dev = nmwa_get_first_active_device (applet->device_list))) iface = network_device_get_iface (dev); @@ -235,82 +214,22 @@ static gboolean nmwa_update_info (NMWirelessApplet *applet) return FALSE; } - fd = socket (AF_INET, SOCK_DGRAM, 0); - if (fd < 0) - { - char *err = g_strdup (_("Could not open socket!")); - nmwa_show_socket_err (info_dialog, err); - g_free (err); - return FALSE; - } + mac = (char*) network_device_get_address (dev); + broadcast = (char*) network_device_get_broadcast (dev); + addr = (char*) network_device_get_ip4_address (dev); + mask = (char*) network_device_get_netmask (dev); - ifr.ifr_addr.sa_family = AF_INET; - - g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name)); - if (ioctl (fd, SIOCGIFADDR, &ifr) == 0) - addr = g_strdup (inet_ntoa (((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr)); - - g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name)); - if (ioctl (fd, SIOCGIFFLAGS, &ifr) < 0) - { - char *err = g_strdup (_("Failed to get information about the interface!")); - nmwa_show_socket_err (info_dialog, err); - g_free (err); - ret = FALSE; - goto out; - } - flags = ifr.ifr_flags; - - g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name)); - if (flags & IFF_BROADCAST && ioctl (fd, SIOCGIFBRDADDR, &ifr) == 0) - broadcast = g_strdup (inet_ntoa (((struct sockaddr_in *) &ifr.ifr_broadaddr)->sin_addr)); - - g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name)); - if (ioctl (fd, SIOCGIFNETMASK, &ifr) == 0) - mask = g_strdup (inet_ntoa (((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr)); - - g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name)); - if (flags & IFF_POINTOPOINT && ioctl (fd, SIOCGIFDSTADDR, &ifr) == 0) - dest = g_strdup (inet_ntoa (((struct sockaddr_in *) &ifr.ifr_dstaddr)->sin_addr)); - - g_strlcpy (ifr.ifr_name, iface, sizeof (ifr.ifr_name)); - if (ioctl (fd, SIOCGIFHWADDR, &ifr) == 0) - mac = g_strdup_printf ("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", - (unsigned char) ifr.ifr_hwaddr.sa_data[0], - (unsigned char) ifr.ifr_hwaddr.sa_data[1], - (unsigned char) ifr.ifr_hwaddr.sa_data[2], - (unsigned char) ifr.ifr_hwaddr.sa_data[3], - (unsigned char) ifr.ifr_hwaddr.sa_data[4], - (unsigned char) ifr.ifr_hwaddr.sa_data[5]); - - label = get_label (info_dialog, applet->info_dialog_xml, "label-interface"); if (network_device_is_wired (dev)) iface_and_type = g_strdup_printf (_("Wired Ethernet (%s)"), iface); else iface_and_type = g_strdup_printf (_("Wireless Ethernet (%s)"), iface); + + label = get_label (info_dialog, applet->info_dialog_xml, "label-interface"); gtk_label_set_text (GTK_LABEL (label), iface_and_type); label = get_label (info_dialog, applet->info_dialog_xml, "label-ip-address"); gtk_label_set_text (GTK_LABEL (label), addr); - label = get_label (info_dialog, applet->info_dialog_xml, "label-destination-address"); - if (flags & IFF_POINTOPOINT) - { - gtk_label_set_text (GTK_LABEL (label), dest); - gtk_widget_show (label); - } - else - gtk_widget_hide (label); - - label = get_label (info_dialog, applet->info_dialog_xml, "label-destination-address-label"); - if (flags & IFF_POINTOPOINT) - { - gtk_label_set_text (GTK_LABEL (label), dest); - gtk_widget_show (label); - } - else - gtk_widget_hide (label); - label = get_label (info_dialog, applet->info_dialog_xml, "label-broadcast-address"); gtk_label_set_text (GTK_LABEL (label), broadcast); @@ -320,16 +239,9 @@ static gboolean nmwa_update_info (NMWirelessApplet *applet) label = get_label (info_dialog, applet->info_dialog_xml, "label-hardware-address"); gtk_label_set_text (GTK_LABEL (label), mac); -out: - close (fd); - g_free (addr); - g_free (broadcast); - g_free (mask); - g_free (dest); g_free (iface_and_type); - g_free (mac); - return ret; + return TRUE; } static void nmwa_show_info_cb (GtkMenuItem *mi, NMWirelessApplet *applet) diff --git a/gnome/applet/nm-device.c b/gnome/applet/nm-device.c index 8c18c54a6d..9fefd862fe 100644 --- a/gnome/applet/nm-device.c +++ b/gnome/applet/nm-device.c @@ -41,6 +41,9 @@ struct NetworkDevice gboolean link; NMDriverSupportLevel driver_support_level; char * addr; + char * ip4addr; + char * broadcast; + char * netmask; char * udi; gint strength; GSList * networks; @@ -89,6 +92,9 @@ NetworkDevice *network_device_copy (NetworkDevice *src) dev->type = src->type; dev->link = src->link; dev->addr = g_strdup (src->addr); + dev->ip4addr = g_strdup (src->ip4addr); + dev->broadcast = g_strdup (src->broadcast); + dev->netmask = g_strdup (src->netmask); dev->driver_support_level = src->driver_support_level; dev->iface = g_strdup (src->iface); dev->desc = g_strdup (src->desc); @@ -145,6 +151,9 @@ void network_device_unref (NetworkDevice *dev) g_free (dev->udi); g_free (dev->desc); g_free (dev->addr); + g_free (dev->broadcast); + g_free (dev->netmask); + g_free (dev->ip4addr); memset (dev, 0, sizeof (NetworkDevice)); g_free (dev); } @@ -400,12 +409,65 @@ void network_device_set_address (NetworkDevice *dev, const char *addr) g_return_if_fail (dev != NULL); if (dev->addr) - { g_free (dev->addr); - dev->addr = NULL; - } - if (addr) - dev->addr = g_strdup (addr); + dev->addr = addr ? g_strdup (addr) : NULL; +} + +/* + * Accessors for broadcast address + */ +const char *network_device_get_broadcast (NetworkDevice *dev) +{ + g_return_val_if_fail (dev != NULL, NULL); + + return (dev->broadcast); +} + +void network_device_set_broadcast (NetworkDevice *dev, const char *addr) +{ + g_return_if_fail (dev != NULL); + + if (dev->broadcast) + g_free (dev->broadcast); + dev->broadcast = addr ? g_strdup (addr) : NULL; +} + +/* + * Accessors for subnet address + */ +const char *network_device_get_netmask (NetworkDevice *dev) +{ + g_return_val_if_fail (dev != NULL, NULL); + + return (dev->netmask); +} + +void network_device_set_netmask (NetworkDevice *dev, const char *addr) +{ + g_return_if_fail (dev != NULL); + + if (dev->netmask) + g_free (dev->netmask); + dev->netmask = addr ? g_strdup (addr) : NULL; +} + +/* + * Accessors for ip4 address + */ +const char *network_device_get_ip4_address (NetworkDevice *dev) +{ + g_return_val_if_fail (dev != NULL, NULL); + + return (dev->ip4addr); +} + +void network_device_set_ip4_address (NetworkDevice *dev, const char *addr) +{ + g_return_if_fail (dev != NULL); + + if (dev->ip4addr) + g_free (dev->ip4addr); + dev->ip4addr = addr ? g_strdup (addr) : NULL; } /* diff --git a/gnome/applet/nm-device.h b/gnome/applet/nm-device.h index e79a44a1f6..782983bdb3 100644 --- a/gnome/applet/nm-device.h +++ b/gnome/applet/nm-device.h @@ -60,6 +60,15 @@ guint network_device_get_num_wireless_networks (NetworkDevice *dev); const char * network_device_get_address (NetworkDevice *dev); void network_device_set_address (NetworkDevice *dev, const char *addr); +const char * network_device_get_broadcast (NetworkDevice *dev); +void network_device_set_broadcast (NetworkDevice *dev, const char *addr); + +const char * network_device_get_netmask (NetworkDevice *dev); +void network_device_set_netmask (NetworkDevice *dev, const char *addr); + +const char * network_device_get_ip4_address (NetworkDevice *dev); +void network_device_set_ip4_address (NetworkDevice *dev, const char *addr); + NMDriverSupportLevel network_device_get_driver_support_level (NetworkDevice *dev); void network_device_set_driver_support_level (NetworkDevice *dev, NMDriverSupportLevel level); diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index ab594be807..8201b5a7de 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -802,3 +804,15 @@ gboolean nm_completion_boolean_function2_test(int tries, return FALSE; } + +gchar *nm_utils_inet_ip4_address_as_string (guint32 ip) +{ + struct in_addr tmp_addr; + gchar *ip_string; + + tmp_addr.s_addr = ip; + ip_string = inet_ntoa (tmp_addr); + + return g_strdup (ip_string); +} + diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 33585a1e31..66a54f7497 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -102,4 +102,6 @@ gboolean nm_completion_boolean_function2_test(int tries, nm_completion_args args); #define nm_completion_boolean_function_test nm_completion_boolean_function1_test +gchar* nm_utils_inet_ip4_address_as_string (guint32 ip); + #endif diff --git a/src/nm-dbus-device.c b/src/nm-dbus-device.c index d81385f349..85090cd063 100644 --- a/src/nm-dbus-device.c +++ b/src/nm-dbus-device.c @@ -32,6 +32,7 @@ #include "NetworkManagerDbus.h" #include "NetworkManagerDbusUtils.h" #include "NetworkManagerPolicy.h" +#include "NetworkManagerUtils.h" #include "nm-dbus-device.h" @@ -325,7 +326,9 @@ static DBusMessage *nm_dbus_device_get_properties (DBusConnection *connection, D const char * iface = nm_device_get_iface (dev); dbus_uint32_t type = (dbus_uint32_t) nm_device_get_type (dev); const char * udi = nm_device_get_udi (dev); - dbus_uint32_t ip4_address = (dbus_uint32_t) nm_device_get_ip4_address (dev); + gchar * ip4_address; + gchar * broadcast; + gchar * subnetmask; struct ether_addr hw_addr; char hw_addr_buf[20]; char * hw_addr_buf_ptr = &hw_addr_buf[0]; @@ -338,11 +341,17 @@ static DBusMessage *nm_dbus_device_get_properties (DBusConnection *connection, D int num_networks = 0; dbus_bool_t active = nm_device_get_act_request (dev) ? TRUE : FALSE; NMActStage act_stage = active ? nm_act_request_get_stage (nm_device_get_act_request (dev)) : NM_ACT_STAGE_UNKNOWN; + NMIP4Config * ip4config; nm_device_get_hw_address (dev, &hw_addr); memset (hw_addr_buf, 0, 20); ether_ntoa_r (&hw_addr, &hw_addr_buf[0]); + ip4config = nm_device_get_ip4_config (dev); + ip4_address = nm_utils_inet_ip4_address_as_string (nm_device_get_ip4_address (dev)); + broadcast = nm_utils_inet_ip4_address_as_string (nm_ip4_config_get_broadcast (ip4config)); + subnetmask = nm_utils_inet_ip4_address_as_string (nm_ip4_config_get_netmask (ip4config)); + if (nm_device_is_wireless (dev)) { NMActRequest * req = nm_device_get_act_request (dev); @@ -391,7 +400,9 @@ static DBusMessage *nm_dbus_device_get_properties (DBusConnection *connection, D DBUS_TYPE_STRING, &udi, DBUS_TYPE_BOOLEAN,&active, DBUS_TYPE_UINT32, &act_stage, - DBUS_TYPE_UINT32, &ip4_address, + DBUS_TYPE_STRING, &ip4_address, + DBUS_TYPE_STRING, &subnetmask, + DBUS_TYPE_STRING, &broadcast, DBUS_TYPE_STRING, &hw_addr_buf_ptr, DBUS_TYPE_UINT32, &mode, DBUS_TYPE_INT32, &strength, @@ -403,6 +414,9 @@ static DBusMessage *nm_dbus_device_get_properties (DBusConnection *connection, D g_free (op); g_free (active_network_path); g_strfreev (networks); + g_free (ip4_address); + g_free (broadcast); + g_free (subnetmask); } return reply;