diff options
Diffstat (limited to 'arch/linux/common/net.h')
-rw-r--r-- | arch/linux/common/net.h | 80 |
1 files changed, 68 insertions, 12 deletions
diff --git a/arch/linux/common/net.h b/arch/linux/common/net.h index 87e7e59b..cd8b8706 100644 --- a/arch/linux/common/net.h +++ b/arch/linux/common/net.h @@ -24,14 +24,25 @@ static gchar *network_interfaces = NULL; #include <linux/sockios.h> #include <sys/socket.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> /* for strncpy */ +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + + typedef struct _NetInfo NetInfo; struct _NetInfo { - char name[16]; - int mtu; - unsigned char mac[8]; + char name[16]; + int mtu; + unsigned char mac[8]; + char ip[16]; + char mask[16]; + char broadcast[16]; }; - void get_net_info(char *if_name, NetInfo *netinfo) { struct ifreq ifr; @@ -39,21 +50,49 @@ void get_net_info(char *if_name, NetInfo *netinfo) fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - strcpy(ifr.ifr_name, if_name); + /* IPv4 */ + ifr.ifr_addr.sa_family = AF_INET; strcpy(netinfo->name, if_name); + /* MTU */ + strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { netinfo->mtu = 0; } else { netinfo->mtu = ifr.ifr_mtu; } - + + /* HW Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { memset(netinfo->mac, 0, 8); } else { memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8); } + + /* IP Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { + netinfo->ip[0] = 0; + } else { + sprintf(netinfo->ip, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); + } + + /* Mask Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { + netinfo->mask[0] = 0; + } else { + sprintf(netinfo->mask, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); + } + + /* Broadcast Address */ + strcpy(ifr.ifr_name, if_name); + if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { + netinfo->broadcast[0] = 0; + } else { + sprintf(netinfo->broadcast, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); + } shutdown(fd, 0); } @@ -162,21 +201,25 @@ scan_net_interfaces_24(void) gfloat recv_mb = recv_bytes / 1048576.0; gfloat trans_mb = trans_bytes / 1048576.0; + get_net_info(ifacename, &ni); + devid = g_strdup_printf("NET%s", ifacename); - network_interfaces = g_strdup_printf("%s$%s$%s=Sent %.2fMiB, received %.2fMiB\n", + network_interfaces = g_strdup_printf("%s$%s$%s=Sent %.2fMiB, received %.2fMiB%s\n", network_interfaces, devid, ifacename, trans_mb, - recv_mb); + recv_mb, + ni.ip[0] ? + (gchar*)idle_free(g_strdup_printf(" (%s)", ni.ip)) : ""); - get_net_info(ifacename, &ni); detailed = g_strdup_printf("[Network Adapter Properties]\n" "Interface Type=%s\n" - "Hardware Address=%02x:%02x:%02x:%02x:%02x:%02x\n" + "Hardware Address (MAC)=%02x:%02x:%02x:%02x:%02x:%02x\n" "MTU=%d\n" - "Bytes Sent=%ld (%.2fMiB)\n" - "Bytes Received=%ld (%.2fMiB)\n", + "[Transfer Details]\n" + "Bytes Received=%ld (%.2fMiB)\n" + "Bytes Sent=%ld (%.2fMiB)\n", net_get_iface_type(ifacename), ni.mac[0], ni.mac[1], ni.mac[2], ni.mac[3], @@ -184,6 +227,19 @@ scan_net_interfaces_24(void) ni.mtu, recv_bytes, recv_mb, trans_bytes, trans_mb); + + if (ni.ip[0] || ni.mask[0] || ni.broadcast[0]) { + detailed = g_strdup_printf("%s\n" + "[Internet Protocol (IPv4)]\n" + "IP Address=%s\n" + "Mask=%s\n" + "Broadcast Address=%s\n", + detailed, + ni.ip[0] ? ni.ip : "Not set", + ni.mask[0] ? ni.mask : "Not set", + ni.broadcast[0] ? ni.broadcast : "Not set"); + } + g_hash_table_insert(moreinfo, devid, detailed); } } |