diff options
-rw-r--r-- | netspeed/data/netspeed-details.ui | 161 | ||||
-rw-r--r-- | netspeed/src/backend.c | 102 | ||||
-rw-r--r-- | netspeed/src/backend.h | 4 | ||||
-rw-r--r-- | netspeed/src/netspeed.c | 22 |
4 files changed, 203 insertions, 86 deletions
diff --git a/netspeed/data/netspeed-details.ui b/netspeed/data/netspeed-details.ui index a537555f..32f01ed1 100644 --- a/netspeed/data/netspeed-details.ui +++ b/netspeed/data/netspeed-details.ui @@ -1,40 +1,40 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.36.0 --> +<!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.22"/> <object class="GtkImage" id="close_img"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">window-close</property> + <property name="can-focus">False</property> + <property name="icon-name">window-close</property> </object> <object class="GtkImage" id="help_img"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">help-browser</property> + <property name="can-focus">False</property> + <property name="icon-name">help-browser</property> </object> <object class="GtkDialog" id="dialog"> - <property name="can_focus">False</property> - <property name="border_width">12</property> - <property name="type_hint">dialog</property> + <property name="can-focus">False</property> + <property name="border-width">12</property> + <property name="type-hint">dialog</property> <signal name="response" handler="on_dialog_response" swapped="no"/> <child internal-child="vbox"> <object class="GtkBox"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">12</property> <child internal-child="action_area"> <object class="GtkButtonBox"> - <property name="can_focus">False</property> - <property name="layout_style">end</property> + <property name="can-focus">False</property> + <property name="layout-style">end</property> <child> <object class="GtkButton" id="button1"> <property name="label" translatable="yes">_Help</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <property name="image">help_img</property> - <property name="use_underline">True</property> - <property name="always_show_image">True</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> </object> <packing> <property name="expand">True</property> @@ -46,13 +46,13 @@ <object class="GtkButton" id="button2"> <property name="label" translatable="yes">_Close</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">True</property> <property name="image">close_img</property> - <property name="use_underline">True</property> - <property name="always_show_image">True</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> </object> <packing> <property name="expand">True</property> @@ -70,26 +70,26 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">10</property> <child> <object class="GtkFrame" id="da_frame"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> + <property name="can-focus">False</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> <child> <object class="GtkAlignment"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="xalign">0</property> <property name="yalign">0</property> <child> <object class="GtkDrawingArea" id="drawingarea"> - <property name="height_request">180</property> + <property name="height-request">180</property> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <signal name="draw" handler="on_drawingarea_draw" swapped="no"/> </object> </child> @@ -97,7 +97,7 @@ </child> <child type="label"> <object class="GtkLabel"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Transfer Rate Graph</property> </object> </child> @@ -111,13 +111,13 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">6</property> <child> <object class="GtkColorButton" id="incolor_sel"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <signal name="color-set" handler="on_incolor_sel_color_set" swapped="no"/> </object> <packing> @@ -129,10 +129,10 @@ <child> <object class="GtkLabel"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_In graph color</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">incolor_sel</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">incolor_sel</property> </object> <packing> <property name="expand">False</property> @@ -143,8 +143,8 @@ <child> <object class="GtkColorButton" id="outcolor_sel"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <signal name="color-set" handler="on_outcolor_sel_color_set" swapped="no"/> </object> <packing> @@ -156,10 +156,10 @@ <child> <object class="GtkLabel"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">_Out graph color</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">outcolor_sel</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">outcolor_sel</property> </object> <packing> <property name="expand">False</property> @@ -177,19 +177,19 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="ip_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">IPv4 Address:</property> <property name="xalign">0</property> @@ -203,7 +203,7 @@ <child> <object class="GtkLabel" id="ip_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="selectable">True</property> <property name="xalign">0</property> @@ -217,7 +217,7 @@ <child> <object class="GtkLabel" id="netmask_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">Netmask:</property> <property name="xalign">0</property> @@ -231,7 +231,7 @@ <child> <object class="GtkLabel" id="netmask_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="selectable">True</property> <property name="xalign">0</property> @@ -252,12 +252,12 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="hwaddr_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">Hardware Address:</property> <property name="xalign">0</property> @@ -271,7 +271,7 @@ <child> <object class="GtkLabel" id="hwaddr_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="selectable">True</property> <property name="xalign">0</property> @@ -285,7 +285,7 @@ <child> <object class="GtkLabel" id="ptpip_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">P-t-P Address:</property> <property name="xalign">0</property> @@ -299,7 +299,7 @@ <child> <object class="GtkLabel" id="ptpip_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="selectable">True</property> <property name="xalign">0</property> @@ -320,12 +320,12 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="inbytes_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">Bytes in:</property> <property name="xalign">0</property> @@ -339,7 +339,7 @@ <child> <object class="GtkLabel" id="inbytes_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">0 byte</property> <property name="xalign">0</property> @@ -353,7 +353,7 @@ <child> <object class="GtkLabel" id="outbytes_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">Bytes out:</property> <property name="xalign">0</property> @@ -367,7 +367,7 @@ <child> <object class="GtkLabel" id="outbytes_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">0 byte</property> <property name="xalign">0</property> @@ -388,15 +388,16 @@ <child> <object class="GtkBox" id="ipv6_box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="ipv6_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">IPv6 Address:</property> <property name="xalign">0</property> + <property name="yalign">0</property> </object> <packing> <property name="expand">False</property> @@ -407,10 +408,11 @@ <child> <object class="GtkLabel" id="ipv6_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="selectable">True</property> <property name="xalign">0</property> + <property name="yalign">0</property> </object> <packing> <property name="expand">False</property> @@ -428,18 +430,18 @@ <child> <object class="GtkBox" id="wireless_box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="essid_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">ESSID:</property> <property name="xalign">0</property> @@ -453,7 +455,7 @@ <child> <object class="GtkLabel" id="essid_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="selectable">True</property> <property name="xalign">0</property> @@ -467,7 +469,7 @@ <child> <object class="GtkLabel" id="signal_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="label" translatable="yes">Signal Strength:</property> <property name="xalign">0</property> @@ -481,7 +483,7 @@ <child> <object class="GtkProgressBar" id="signalbar"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">start</property> <property name="hexpand">True</property> </object> @@ -501,18 +503,18 @@ <child> <object class="GtkBox" id="netlink_box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="station_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Station:</property> <property name="xalign">0</property> </object> @@ -525,7 +527,7 @@ <child> <object class="GtkLabel" id="station_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="xalign">0</property> </object> <packing> @@ -537,7 +539,7 @@ <child> <object class="GtkLabel" id="channel_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Channel:</property> <property name="xalign">0</property> </object> @@ -550,7 +552,7 @@ <child> <object class="GtkLabel" id="channel_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="xalign">0</property> </object> <packing> @@ -569,12 +571,12 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="connected_time_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Connected Time:</property> <property name="xalign">0</property> </object> @@ -587,7 +589,7 @@ <child> <object class="GtkLabel" id="connected_time_text"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="xalign">0</property> </object> <packing> @@ -637,12 +639,9 @@ <action-widget response="-11">button1</action-widget> <action-widget response="-3">button2</action-widget> </action-widgets> - <child type="titlebar"> - <placeholder/> - </child> </object> <object class="GtkSizeGroup"> - <property name="ignore_hidden">True</property> + <property name="ignore-hidden">True</property> <widgets> <widget name="ip_label"/> <widget name="hwaddr_label"/> @@ -654,7 +653,7 @@ </widgets> </object> <object class="GtkSizeGroup"> - <property name="ignore_hidden">True</property> + <property name="ignore-hidden">True</property> <widgets> <widget name="ip_text"/> <widget name="hwaddr_text"/> @@ -664,7 +663,7 @@ </widgets> </object> <object class="GtkSizeGroup"> - <property name="ignore_hidden">True</property> + <property name="ignore-hidden">True</property> <widgets> <widget name="netmask_label"/> <widget name="ptpip_label"/> @@ -674,7 +673,7 @@ </widgets> </object> <object class="GtkSizeGroup"> - <property name="ignore_hidden">True</property> + <property name="ignore-hidden">True</property> <widgets> <widget name="netmask_text"/> <widget name="ptpip_text"/> diff --git a/netspeed/src/backend.c b/netspeed/src/backend.c index 110173d6..5eb67319 100644 --- a/netspeed/src/backend.c +++ b/netspeed/src/backend.c @@ -27,6 +27,12 @@ #include <sys/sockio.h> #endif +#include <sys/socket.h> +#include <sys/types.h> +#include <ifaddrs.h> +#include <netinet/in.h> +#include <arpa/inet.h> + #include <glib.h> #include <glib/gi18n.h> #include <glibtop/netlist.h> @@ -105,6 +111,102 @@ get_available_devices (void) return device_glist; } +GSList* +get_ip_address_list (const char *iface_name, + gboolean ipv4) +{ + GSList *list = NULL; + struct ifaddrs *ifaces; + + if (getifaddrs (&ifaces) != -1) { + int family; + char ip[INET6_ADDRSTRLEN]; + + family = ipv4 ? AF_INET : AF_INET6; + for (struct ifaddrs *iface = ifaces; iface != NULL; iface = iface->ifa_next) { + if (iface->ifa_addr == NULL) + continue; + + if ((iface->ifa_addr->sa_family == family) && + !g_strcmp0 (iface->ifa_name, iface_name)) + { + unsigned int netmask = 0; + void *sinx_addr = NULL; + + if (iface->ifa_addr->sa_family == AF_INET6) { + struct sockaddr_in6 ip6_addr; + struct sockaddr_in6 ip6_network; + uint32_t ip6_netmask = 0; + const char *scope; + int i; + + memcpy (&ip6_addr, iface->ifa_addr, sizeof (struct sockaddr_in6)); + memcpy (&ip6_network, iface->ifa_netmask, sizeof (struct sockaddr_in6)); + + /* get network scope */ + if (IN6_IS_ADDR_LINKLOCAL (&ip6_addr.sin6_addr)) { + scope = _("link-local"); + } else if (IN6_IS_ADDR_SITELOCAL (&ip6_addr.sin6_addr)) { + scope = _("site-local"); + } else if (IN6_IS_ADDR_V4MAPPED (&ip6_addr.sin6_addr)) { + scope = _("v4mapped"); + } else if (IN6_IS_ADDR_V4COMPAT (&ip6_addr.sin6_addr)) { + scope = _("v4compat"); + } else if (IN6_IS_ADDR_LOOPBACK (&ip6_addr.sin6_addr)) { + scope = _("host"); + } else if (IN6_IS_ADDR_UNSPECIFIED (&ip6_addr.sin6_addr)) { + scope = _("unspecified"); + } else { + scope = _("global"); + } + + /* get network ip */ + sinx_addr = &ip6_addr.sin6_addr; + inet_ntop (iface->ifa_addr->sa_family, sinx_addr, ip, sizeof (ip)); + + /* get network mask length */ + for (i = 0; i < 4; i++) { + ip6_netmask = ntohl (((uint32_t*)(&ip6_network.sin6_addr))[i]); + while (ip6_netmask) { + netmask++; + ip6_netmask <<= 1; + } + } + + list = g_slist_prepend (list, + g_strdup_printf ("%s: %s/%u", + scope, ip, netmask)); + } else { + struct sockaddr_in ip4_addr; + struct sockaddr_in ip4_network; + in_addr_t ip4_netmask = 0; + + memcpy (&ip4_addr, iface->ifa_addr, sizeof (struct sockaddr_in)); + memcpy (&ip4_network, iface->ifa_netmask, sizeof (struct sockaddr_in)); + + /* get network ip */ + sinx_addr = &ip4_addr.sin_addr; + inet_ntop (iface->ifa_addr->sa_family, sinx_addr, ip, sizeof (ip)); + + /* get network mask length */ + ip4_netmask = ntohl (ip4_network.sin_addr.s_addr); + while (ip4_netmask) { + netmask++; + ip4_netmask <<= 1; + } + + list = g_slist_prepend (list, + g_strdup_printf ("%s/%u", ip, netmask)); + } + } + } + if (list != NULL) + list = g_slist_sort (list, (GCompareFunc) g_strcmp0); + freeifaddrs (ifaces); + } + return list; +} + const gchar* get_default_route (void) { diff --git a/netspeed/src/backend.h b/netspeed/src/backend.h index 536bf862..cd98c66c 100644 --- a/netspeed/src/backend.h +++ b/netspeed/src/backend.h @@ -104,4 +104,8 @@ compare_device_info (const DevInfo *a, const DevInfo *b); void get_wireless_info (DevInfo *devinfo); + +GSList* +get_ip_address_list (const char *ifa_name, gboolean ipv4); + #endif /* _BACKEND_H */ diff --git a/netspeed/src/netspeed.c b/netspeed/src/netspeed.c index b3e88847..eaa1b5ae 100644 --- a/netspeed/src/netspeed.c +++ b/netspeed/src/netspeed.c @@ -688,7 +688,6 @@ fill_details_dialog (MateNetspeedApplet *applet) { char *text; char ipv4_text [INET_ADDRSTRLEN]; - char ipv6_text [INET6_ADDRSTRLEN]; if (applet->devinfo->ip) { format_ipv4 (applet->devinfo->ip, ipv4_text); @@ -723,10 +722,23 @@ fill_details_dialog (MateNetspeedApplet *applet) gtk_label_set_text (GTK_LABEL (applet->ptpip_text), text); /* check if we got an ipv6 address */ - format_ipv6 (applet->devinfo->ipv6, ipv6_text); - if (strlen (ipv6_text) > 2) { - gtk_label_set_text (GTK_LABEL (applet->ipv6_text), ipv6_text); - gtk_widget_show (applet->ipv6_box); + GSList *ipv6_address_list = get_ip_address_list (applet->devinfo->name, FALSE); + if (ipv6_address_list != NULL) { + GSList *iterator; + GString *string = NULL; + + for (iterator = ipv6_address_list; iterator; iterator = iterator->next) { + if (string == NULL) + string = g_string_new ((char*) iterator->data); + else + g_string_append_printf (string, "\n%s", (char*) iterator->data); + } + if (string != NULL) { + gtk_label_set_text (GTK_LABEL (applet->ipv6_text), string->str); + gtk_widget_show (applet->ipv6_box); + } + g_string_free (string, TRUE); + g_slist_free_full (ipv6_address_list, g_free); } else { gtk_widget_hide (applet->ipv6_box); } |