applets/network: really fix the build on FreeBSD

This previously built on FreeBSD 12.3 for lack of SIOCGIFDATA; this
should now build on FreeBSD 13.1.
This commit is contained in:
Pierre Pronchery 2022-05-21 00:13:15 +02:00
parent e33f9d5fb9
commit c4222c2ea2

View File

@ -24,11 +24,11 @@
#endif #endif
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <libintl.h>
#include <net/if.h>
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
# include <ifaddrs.h> # include <ifaddrs.h>
#endif #endif
#include <libintl.h>
#include <net/if.h>
#include <System.h> #include <System.h>
#include "Panel/applet.h" #include "Panel/applet.h"
#define _(string) gettext(string) #define _(string) gettext(string)
@ -298,8 +298,11 @@ static void _refresh_interface_flags(Network * network, NetworkInterface * ni,
#ifdef SIOCGIFDATA #ifdef SIOCGIFDATA
# if defined(__NetBSD__) # if defined(__NetBSD__)
struct ifdatareq ifdr; struct ifdatareq ifdr;
struct if_data * pifdr = &ifdr.ifdr_data;
# else # else
struct if_data ifdr; struct ifreq ifdr;
struct if_data ifd;
struct if_data * pifdr = &ifd;
# endif # endif
# if GTK_CHECK_VERSION(2, 12, 0) # if GTK_CHECK_VERSION(2, 12, 0)
unsigned long ibytes; unsigned long ibytes;
@ -317,42 +320,43 @@ static void _refresh_interface_flags(Network * network, NetworkInterface * ni,
#ifdef SIOCGIFDATA #ifdef SIOCGIFDATA
/* XXX ignore errors */ /* XXX ignore errors */
memset(&ifdr, 0, sizeof(ifdr)); memset(&ifdr, 0, sizeof(ifdr));
# if defined(__NetBSD__)
strncpy(ifdr.ifdr_name, ni->name, sizeof(ifdr.ifdr_name)); strncpy(ifdr.ifdr_name, ni->name, sizeof(ifdr.ifdr_name));
# else
strncpy(ifdr.ifr_name, ni->name, sizeof(ifdr.ifr_name));
ifdr.ifr_data = (caddr_t)pifdr;
# endif
if(ioctl(network->fd, SIOCGIFDATA, &ifdr) == -1) if(ioctl(network->fd, SIOCGIFDATA, &ifdr) == -1)
network->helper->error(NULL, "SIOCGIFDATA", 1); network->helper->error(NULL, "SIOCGIFDATA", 1);
else else
{ {
if(ifdr.ifdr_data.ifi_ipackets > ni->ipackets) if(pifdr->ifi_ipackets > ni->ipackets)
icon = (ifdr.ifdr_data.ifi_opackets icon = (pifdr->ifi_opackets > ni->opackets)
> ni->opackets)
? "network-transmit-receive" ? "network-transmit-receive"
: "network-receive"; : "network-receive";
else if(ifdr.ifdr_data.ifi_opackets > ni->opackets) else if(pifdr->ifi_opackets > ni->opackets)
icon = "network-transmit"; icon = "network-transmit";
# ifdef LINK_STATE_DOWN # ifdef LINK_STATE_DOWN
else if(ifdr.ifdr_data.ifi_link_state else if(pifdr->ifi_link_state == LINK_STATE_DOWN)
== LINK_STATE_DOWN)
icon = "network-offline"; icon = "network-offline";
# endif # endif
else else
icon = "network-idle"; icon = "network-idle";
# if GTK_CHECK_VERSION(2, 12, 0) # if GTK_CHECK_VERSION(2, 12, 0)
ibytes = (ifdr.ifdr_data.ifi_ibytes >= ni->ibytes) ibytes = (pifdr->ifi_ibytes >= ni->ibytes)
? ifdr.ifdr_data.ifi_ibytes - ni->ibytes ? pifdr->ifi_ibytes - ni->ibytes
: ULONG_MAX - ni->ibytes : ULONG_MAX - ni->ibytes + pifdr->ifi_ibytes;
+ ifdr.ifdr_data.ifi_ibytes; obytes = (pifdr->ifi_obytes >= ni->obytes)
obytes = (ifdr.ifdr_data.ifi_obytes >= ni->obytes) ? pifdr->ifi_obytes - ni->obytes
? ifdr.ifdr_data.ifi_obytes - ni->obytes : ULONG_MAX - ni->obytes + pifdr->ifi_obytes;
: ULONG_MAX - ni->obytes
+ ifdr.ifdr_data.ifi_obytes;
snprintf(tooltip, sizeof(tooltip), snprintf(tooltip, sizeof(tooltip),
_("%s\nIn: %lu kB/s\nOut: %lu kB/s"), _("%s\nIn: %lu kB/s\nOut: %lu kB/s"),
ni->name, ibytes / 512, obytes / 512); ni->name, ibytes / 512, obytes / 512);
# endif # endif
ni->ipackets = ifdr.ifdr_data.ifi_ipackets; ni->ipackets = pifdr->ifi_ipackets;
ni->opackets = ifdr.ifdr_data.ifi_opackets; ni->opackets = pifdr->ifi_opackets;
ni->ibytes = ifdr.ifdr_data.ifi_ibytes; ni->ibytes = pifdr->ifi_ibytes;
ni->obytes = ifdr.ifdr_data.ifi_obytes; ni->obytes = pifdr->ifi_obytes;
} }
#endif #endif
} }