From 9a1bc66dfcd678fd22d0686518307b6d4b7cf55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 18 Apr 2023 20:37:22 +0800 Subject: [PATCH] Network (FreeBSD): add dirty support --- CMakeLists.txt | 1 + src/detection/network/network_bsd.c | 50 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/detection/network/network_bsd.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3febd291..a2784045 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -434,6 +434,7 @@ elseif(BSD) src/detection/gamepad/gamepad_nosupport.c src/detection/media/media_linux.c src/detection/memory/memory_bsd.c + src/detection/network/network_bsd.c src/detection/opengl/opengl_linux.c src/detection/os/os_linux.c src/detection/packages/packages_linux.c diff --git a/src/detection/network/network_bsd.c b/src/detection/network/network_bsd.c new file mode 100644 index 00000000..ccadef8f --- /dev/null +++ b/src/detection/network/network_bsd.c @@ -0,0 +1,50 @@ +#include "common/io/io.h" +#include "detection/network/network.h" + +#include +#include +#include +#include + +const char* ffDetectNetwork(FF_MAYBE_UNUSED FFinstance* instance, FFlist* result) +{ + struct ifaddrs* ifAddrStruct = NULL; + if(getifaddrs(&ifAddrStruct) < 0) + return "getifaddrs(&ifAddrStruct) failed"; + + int FF_AUTO_CLOSE_FD sockfd = socket(AF_INET, SOCK_DGRAM, 0); + + for (struct ifaddrs* ifa = ifAddrStruct; ifa; ifa = ifa->ifa_next) + { + if (!ifa->ifa_addr || ifa->ifa_addr->sa_family != AF_LINK) + continue; + + if (ifa->ifa_flags & IFF_LOOPBACK || !(ifa->ifa_flags & IFF_RUNNING)) + continue; + + bool isUp = !!(ifa->ifa_flags & IFF_UP); + if (!isUp && !instance->config.networkAll) + continue; + + FFNetworkResult* item = (FFNetworkResult*) ffListAdd(result); + ffStrbufInit(&item->type); + ffStrbufInitS(&item->name, ifa->ifa_name); + + uint8_t* ptr = (uint8_t*) LLADDR((struct sockaddr_dl *)ifa->ifa_addr); + ffStrbufInitF(&item->address, "%02x:%02x:%02x:%02x:%02x:%02x", + ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); + + if (sockfd > 0) + { + struct ifreq ifr; + strcpy(ifr.ifr_name, ifa->ifa_name); + item->mtu = ioctl(sockfd, SIOCGIFMTU, &ifr) >= 0 ? (uint32_t) ifr.ifr_mtu : 0; + } + + item->up = isUp; + } + + freeifaddrs(ifAddrStruct); + + return NULL; +}