diff options
| author | Leandro A. F. Pereira <leandro@hardinfo.org> | 2006-01-26 19:39:15 +0000 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2006-01-26 19:39:15 +0000 | 
| commit | e9906f6d9335ae96cd6afac714646b97edc469a5 (patch) | |
| tree | 956f3266766454f931e7d18e2fe78a6256d11039 /hardinfo2/arch/linux | |
| parent | 53f455be1d85829551761dbcfcf6e5706606186b (diff) | |
Sync with internal svn
Diffstat (limited to 'hardinfo2/arch/linux')
| -rw-r--r-- | hardinfo2/arch/linux/common/net.h | 204 | ||||
| l--------- | hardinfo2/arch/linux/x86/net.h | 1 | 
2 files changed, 205 insertions, 0 deletions
| diff --git a/hardinfo2/arch/linux/common/net.h b/hardinfo2/arch/linux/common/net.h new file mode 100644 index 00000000..d0738ce5 --- /dev/null +++ b/hardinfo2/arch/linux/common/net.h @@ -0,0 +1,204 @@ +/* + *    HardInfo - Displays System Information + *    Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br> + * + *    This program is free software; you can redistribute it and/or modify + *    it under the terms of the GNU General Public License as published by + *    the Free Software Foundation, version 2. + * + *    This program is distributed in the hope that it will be useful, + *    but WITHOUT ANY WARRANTY; without even the implied warranty of + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *    GNU General Public License for more details. + * + *    You should have received a copy of the GNU General Public License + *    along with this program; if not, write to the Free Software + *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA + */ + +static gchar *network_interfaces = NULL; + +#include <sys/ioctl.h> +#include <net/if.h> +#include <netinet/in.h> +#include <linux/sockios.h> +#include <sys/socket.h> + +typedef struct _NetInfo NetInfo; +struct _NetInfo { +    char                name[16];  +    int                 mtu; +    unsigned char       mac[8]; +}; + + +void get_net_info(char *if_name, NetInfo *netinfo) +{ +    struct ifreq ifr; +    int fd; + +    fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + +    strcpy(ifr.ifr_name, if_name); +    strcpy(netinfo->name, if_name); + +    strcpy(ifr.ifr_name, if_name); +    if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { +        netinfo->mtu = 0; +    } else { +        netinfo->mtu = ifr.ifr_mtu; +    } +     +    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); +    } + +    shutdown(fd, 0); +} + +static struct { +    char *type; +    char *label; +} netdev2type[] = { +    { "eth",	"Ethernet" }, +    { "lo",	"Loopback" }, +    { "ppp",	"Point-to-Point" }, +    { "ath",	"Wireless" }, +    { "wlan",	"Wireless" }, +    { "tun",    "Virtual Point-to-Point (TUN)" }, +    { "tap",    "Ethernet (TAP)" }, +    { "plip",   "Parallel Line Internet Protocol" }, +    { "irlan",  "Infrared" }, +    { "slip",   "Serial Line Internet Protocol" }, +    { "isdn",	"Integrated Services Digital Network" }, +    { "sit",	"IPv6-over-IPv4 Tunnel" }, +    { "vmnet8", "VMWare Virtual Network Interface (NAT)" }, +    { "vmnet",  "VMWare Virtual Network Interface" }, +    { NULL,	"Unknown" }, +}; + +static const gchar * +net_get_iface_type(gchar *name) +{ +    int i; +     +    for (i = 0; netdev2type[i].type; i++) { +        if (g_str_has_prefix(name, netdev2type[i].type)) +            break; +    } +     +    return netdev2type[i].label; +} + +static gboolean +remove_net_devices(gpointer key, gpointer value, gpointer data) +{ +    if (!strncmp((gchar *) key, "NET", 4)) { +	g_free((gchar *) key); +	g_free((GtkTreeIter *) value); +	return TRUE; +    } +    return FALSE; +} + +static void +scan_net_interfaces_24(void) +{ +    FILE *proc_net; +    NetInfo ni; +    gchar buffer[256]; +    gchar *devid, *detailed; +    gulong recv_bytes; +    gulong recv_errors; +    gulong recv_packets; +     +    gulong trans_bytes; +    gulong trans_errors; +    gulong trans_packets; +     +    if (!g_file_test("/proc/net/dev", G_FILE_TEST_EXISTS)) { +        if (network_interfaces) { +            g_free(network_interfaces); +            network_interfaces = g_strdup("[Network Interfaces]\n" +                                          "None found=\n"); +        } + +	return; +    } + +    if (network_interfaces) { +        g_free(network_interfaces); +    } +     +    network_interfaces = g_strdup("[Network Interfaces]\n"); + +    proc_net = fopen("/proc/net/dev", "r"); +    while (fgets(buffer, 256, proc_net)) { +	if (strchr(buffer, ':')) { +	    gint trash; +	    gchar ifacename[16]; +	    gchar *buf = buffer; +	    gint i; + +	    buf = g_strstrip(buf); + +	    memset(ifacename, 0, 16); + +	    for (i = 0; buffer[i] != ':' && i < 16; i++) { +		ifacename[i] = buffer[i]; +	    } + +	    buf = strchr(buf, ':') + 1; + +	    /* iface: bytes packets errs drop fifo frame compressed multicast */ +	    sscanf(buf, "%ld %ld %ld %d %d %d %d %d %ld %ld %ld", +		   &recv_bytes, &recv_packets, +		   &recv_errors, &trash, &trash, &trash, &trash, +		   &trash, &trans_bytes, &trans_packets, +		   &trans_errors); + +            gfloat recv_mb = recv_bytes / 1048576.0; +            gfloat trans_mb = trans_bytes / 1048576.0; +             +            devid = g_strdup_printf("NET%s", ifacename); +	    network_interfaces = g_strdup_printf("%s$%s$%s=Sent %.2fMiB, received %.2fMiB\n", +                                                  network_interfaces, +                                                  devid, +                                                  ifacename, +                                                  trans_mb, +                                                  recv_mb); +             +            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" +                                        "MTU=%d\n" +                                        "Bytes Sent=%ld (%.2fMiB)\n" +                                        "Bytes Received=%ld (%.2fMiB)\n", +                                        net_get_iface_type(ifacename), +                                        ni.mac[0], ni.mac[1], +                                        ni.mac[2], ni.mac[3], +                                        ni.mac[4], ni.mac[5], +                                        ni.mtu, +                                        recv_bytes, recv_mb, +                                        trans_bytes, trans_mb); +            g_hash_table_insert(moreinfo, devid, detailed); +	} +    } +    fclose(proc_net); +} + +static void +scan_net_interfaces(void) +{ +    /* FIXME: See if we're running Linux 2.6 and if /sys is mounted, then use +              that instead of /proc/net/dev */ + +    /* remove old devices from global device table */ +    g_hash_table_foreach_remove(moreinfo, remove_net_devices, NULL); + +    scan_net_interfaces_24(); +} diff --git a/hardinfo2/arch/linux/x86/net.h b/hardinfo2/arch/linux/x86/net.h new file mode 120000 index 00000000..72d77b26 --- /dev/null +++ b/hardinfo2/arch/linux/x86/net.h @@ -0,0 +1 @@ +../../linux/common/net.h
\ No newline at end of file | 
