summaryrefslogtreecommitdiff
path: root/wmiistatus.c
diff options
context:
space:
mode:
Diffstat (limited to 'wmiistatus.c')
-rw-r--r--wmiistatus.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/wmiistatus.c b/wmiistatus.c
index a7f0b7a..e99625a 100644
--- a/wmiistatus.c
+++ b/wmiistatus.c
@@ -50,6 +50,9 @@
#include <glob.h>
#include <dirent.h>
#include <getopt.h>
+#include <linux/ethtool.h>
+#include <linux/sockios.h>
+
#define _IS_WMIISTATUS_C
#include "wmiistatus.h"
@@ -262,7 +265,7 @@ static char *get_wireless_info() {
else (void)snprintf(part, sizeof(part), "W: down");
} else {
- char *ip_address;
+ const char *ip_address;
(void)snprintf(part, sizeof(part), "W: (%02d%%) ", quality);
ip_address = get_ip_address(wlan_interface);
strcpy(part+strlen(part), ip_address);
@@ -311,10 +314,34 @@ static const char *get_ip_address(const char *interface) {
static char *get_eth_info() {
static char part[512];
const char *ip_address = get_ip_address(eth_interface);
+ int ethspeed = 0;
+
+ if (get_ethspeed) {
+ struct ifreq ifr;
+ struct ethtool_cmd ecmd;
+ int fd, err;
+
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ write_error_to_statusbar("Could not open socket");
+
+ ecmd.cmd = ETHTOOL_GSET;
+ (void)memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_data = (caddr_t)&ecmd;
+ (void)strcpy(ifr.ifr_name, eth_interface);
+ if ((err = ioctl(fd, SIOCETHTOOL, &ifr)) == 0)
+ ethspeed = ecmd.speed;
+ else write_error_to_statusbar("Could not get interface speed. Insufficient privileges?");
+
+ (void)close(fd);
+ }
if (ip_address == NULL)
(void)snprintf(part, sizeof(part), "E: down");
- else (void)snprintf(part, sizeof(part), "E: %s", ip_address);
+ else {
+ if (get_ethspeed)
+ (void)snprintf(part, sizeof(part), "E: %s (%d Mbit/s)", ip_address, ethspeed);
+ else (void)snprintf(part, sizeof(part), "E: %s", ip_address);
+ }
return part;
}