diff --git a/CMakeLists.txt b/CMakeLists.txt index 2215ef628..26208f710 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -387,6 +387,7 @@ if(LINUX) src/detection/media/media_linux.c src/detection/memory/memory_linux.c src/detection/monitor/monitor_linux.c + src/detection/netusage/netusage_linux.c src/detection/opengl/opengl_linux.c src/detection/os/os_linux.c src/detection/packages/packages_linux.c diff --git a/src/detection/localip/localip.h b/src/detection/localip/localip.h index 994debec5..6fea95a79 100644 --- a/src/detection/localip/localip.h +++ b/src/detection/localip/localip.h @@ -5,18 +5,6 @@ #include "fastfetch.h" -typedef struct FFLocalIpIoCounters -{ - uint64_t txBytes; - uint64_t rxBytes; - uint64_t txPackets; - uint64_t rxPackets; - uint64_t rxErrors; - uint64_t txErrors; - uint64_t rxDrops; - uint64_t txDrops; -} FFLocalIpIoCounters; - typedef struct FFLocalIpResult { FFstrbuf name; @@ -25,8 +13,6 @@ typedef struct FFLocalIpResult FFstrbuf mac; bool defaultRoute; - FFLocalIpIoCounters ioCounters; - #ifdef _WIN32 uint32_t ifIndex; #endif diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index a94a83c95..e70234735 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -228,61 +228,6 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if (ifAddrStruct) freeifaddrs(ifAddrStruct); - #ifdef __linux__ - { - FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/sys/class/net/"); - uint32_t baseLen = path.length; - - FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); - FF_LIST_FOR_EACH(FFLocalIpResult, ip, *results) - { - ffStrbufAppend(&path, &ip->name); - ffStrbufAppendS(&path, "/statistics/"); - uint32_t statLen = path.length; - - ffStrbufAppendS(&path, "rx_bytes"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.rxBytes = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "tx_bytes"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.txBytes = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "rx_packets"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.rxPackets = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "tx_packets"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.txPackets = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "rx_errors"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.rxErrors = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "tx_errors"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.txErrors = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "rx_dropped"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.rxDrops = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, statLen); - - ffStrbufAppendS(&path, "tx_dropped"); - if (ffReadFileBuffer(path.chars, &buffer)) - ip->ioCounters.txDrops = ffStrbufToUInt(&buffer, 0); - ffStrbufSubstrBefore(&path, baseLen); - } - } - #endif - char iface[16 /*IF_NAMESIZE*/ + 1]; if (getDefaultRoute(iface)) { diff --git a/src/detection/netusage/netusage.h b/src/detection/netusage/netusage.h new file mode 100644 index 000000000..a754f3917 --- /dev/null +++ b/src/detection/netusage/netusage.h @@ -0,0 +1,16 @@ +#include "fastfetch.h" + +typedef struct FFNetUsageIoCounters +{ + FFstrbuf name; + uint64_t txBytes; + uint64_t rxBytes; + uint64_t txPackets; + uint64_t rxPackets; + uint64_t rxErrors; + uint64_t txErrors; + uint64_t rxDrops; + uint64_t txDrops; +} FFNetUsageIoCounters; + +const char* ffGetNetIoCounter(FFlist* result /* list of FFNetUsageIoCounters */); diff --git a/src/detection/netusage/netusage_linux.c b/src/detection/netusage/netusage_linux.c new file mode 100644 index 000000000..c430a1f47 --- /dev/null +++ b/src/detection/netusage/netusage_linux.c @@ -0,0 +1,73 @@ +#include "netusage.h" + +#include "common/io/io.h" + +#include + +const char* ffGetNetIoCounter(FFlist* result) +{ + FF_AUTO_CLOSE_DIR DIR* dirp = opendir("/sys/class/net"); + if (!dirp) return "opendir(\"/sys/class/net\") == NULL"; + + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateA(64); + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); + + struct dirent* entry; + while((entry = readdir(dirp)) != NULL) + { + if(entry->d_name[0] == '.') + continue; + + ffStrbufSetF(&path, "/sys/class/net/%s/operstate", entry->d_name); + if(!ffReadFileBuffer(path.chars, &buffer) || !ffStrbufEqualS(&buffer, "up")) + continue; + + FFNetUsageIoCounters* counters = (FFNetUsageIoCounters*) ffListAdd(result); + ffStrbufInitS(&counters->name, entry->d_name); + + ffStrbufSetF(&path, "/sys/class/net/%s/statistics/"); + uint32_t statLen = path.length; + + ffStrbufAppendS(&path, "rx_bytes"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->rxBytes = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "tx_bytes"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->txBytes = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "rx_packets"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->rxPackets = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "tx_packets"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->txPackets = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "rx_errors"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->rxErrors = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "tx_errors"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->txErrors = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "rx_dropped"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->rxDrops = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + + ffStrbufAppendS(&path, "tx_dropped"); + if (ffReadFileBuffer(path.chars, &buffer)) + counters->txDrops = ffStrbufToUInt(&buffer, 0); + ffStrbufSubstrBefore(&path, statLen); + } + + return NULL; +}