xfce4-speed-plugin/panel-plugin/wormulon/freebsd.c

153 lines
4.1 KiB
C

/*****************************************************************************
*
* init_osspecific()
*
* Init function
*
****************************************************************************/
void init_osspecific(netdata* data)
{
data->watchif = -1;
#ifdef DEBUG
fprintf( stderr, "The netload plugin was initialized for FreeBSD.\n" );
#endif
}
/*****************************************************************************
*
* checkinterface()
*
* check if a given interface exists and is up.
* return TRUE if it does and FALSE if not
*
****************************************************************************/
int checkinterface(netdata* data)
{
int validinterface = FALSE;
int i, num_iface;
size_t len;
int name[6];
struct ifmibdata ifmd;
#ifdef DEBUG
fprintf( stderr, "Checking the interface '%s' now ...\n", data->ifdata.if_name );
#endif
len = sizeof(num_iface);
sysctlbyname("net.link.generic.system.ifcount", &num_iface, &len, NULL, 0);
for (i=1; i <= num_iface; i++)
{
name[0] = CTL_NET;
name[1] = PF_LINK;
name[2] = NETLINK_GENERIC;
name[3] = IFMIB_IFDATA;
name[4] = i;
name[5] = IFDATA_GENERAL;
len = sizeof(ifmd);
sysctl(name, 6, &ifmd, &len, NULL, 0);
if (strcmp(ifmd.ifmd_name, (char *)data->ifdata.if_name) == 0)
{
/*
* now we have an interface and just have to see if it's up
* in case we just want to debug media types we disable
* IFF_UP flags
*/
#ifndef MEDIADEBUG
if (ifmd.ifmd_flags & IFF_UP)
#endif
validinterface = TRUE;
break; /* in any case we can stop searching here */
}
}
return validinterface;
}
/******************************************************************************
*
* get_stat()
*
* use sysctl() to read the statistics and fill statistics struct
*
****************************************************************************/
int get_stat(netdata* data)
{
/*
* use sysctl() to get the right interface number if !dev_opened
* then read the data directly from the ifmd_data struct
*/
int i, num_iface;
size_t len;
int name[6];
struct ifmibdata ifmd;
unsigned long rx_o, tx_o;
if (!data->dev_opened)
{
len = sizeof(num_iface);
sysctlbyname("net.link.generic.system.ifcount", &num_iface, &len,
NULL, 0);
for (i=1; i <= num_iface; i++)
{
name[0] = CTL_NET;
name[1] = PF_LINK;
name[2] = NETLINK_GENERIC;
name[3] = IFMIB_IFDATA;
name[4] = i;
name[5] = IFDATA_GENERAL;
len = sizeof(ifmd);
sysctl(name, 6, &ifmd, &len, NULL, 0);
if (strcmp(ifmd.ifmd_name, (char *)data->ifdata.if_name) == 0)
{
/* got the right interface */
#ifdef DEBUG
fprintf( stderr, "Got the right interface.\n");
#endif
data->watchif = i;
data->dev_opened++;
}
else
{
#ifdef DEBUG
fprintf( stderr, "Got NOT the right interface.\n");
#endif
}
}
}
/* in any case read the struct and record statistics */
name[0] = CTL_NET;
name[1] = PF_LINK;
name[2] = NETLINK_GENERIC;
name[3] = IFMIB_IFDATA;
name[4] = data->watchif;
name[5] = IFDATA_GENERAL;
len = sizeof(ifmd);
sysctl(name, 6, &ifmd, &len, NULL, 0);
rx_o = data->stats.rx_bytes; tx_o = data->stats.tx_bytes;
data->stats.tx_packets = ifmd.ifmd_data.ifi_opackets;
data->stats.rx_packets = ifmd.ifmd_data.ifi_ipackets;
data->stats.rx_bytes = ifmd.ifmd_data.ifi_ibytes;
data->stats.tx_bytes = ifmd.ifmd_data.ifi_obytes;
data->stats.rx_errors = ifmd.ifmd_data.ifi_ierrors;
data->stats.tx_errors = ifmd.ifmd_data.ifi_oerrors;
if (rx_o > data->stats.rx_bytes)
data->stats.rx_over++;
if (tx_o > data->stats.tx_bytes)
data->stats.tx_over++;
return (0);
}
C 96%
Makefile 3.5%
Shell 0.5%