master ohmu/fastfetch-openbsd / src / detection / wifi / wifi_haiku.cpp
ohmu  ·  2026-10-15
  1extern "C" {
  2    #include "wifi.h"
  3}
  4
  5#include <NetworkDevice.h>
  6#include <NetworkInterface.h>
  7#include <NetworkRoster.h>
  8
  9static void initWifiResult(FFWifiResult* item, const char* name) {
 10    ffStrbufInitS(&item->inf.description, name);
 11    ffStrbufInit(&item->inf.status);
 12    ffStrbufInit(&item->conn.status);
 13    ffStrbufInit(&item->conn.ssid);
 14    ffStrbufInit(&item->conn.bssid);
 15    ffStrbufInit(&item->conn.protocol);
 16    ffStrbufInit(&item->conn.security);
 17    item->conn.signalQuality = -DBL_MAX;
 18    item->conn.rxRate = -DBL_MAX;
 19    item->conn.txRate = -DBL_MAX;
 20    item->conn.channel = 0;
 21    item->conn.channelWidth = 0;
 22    item->conn.frequency = 0;
 23}
 24
 25static void setWifiSecurity(FFstrbuf* security, const wireless_network& network) {
 26    switch (network.authentication_mode) {
 27        case B_NETWORK_AUTHENTICATION_NONE:
 28            if (network.flags & B_NETWORK_IS_ENCRYPTED) {
 29                ffStrbufSetStatic(security, "Encrypted");
 30            } else {
 31                ffStrbufSetStatic(security, "Insecure");
 32            }
 33            break;
 34        case B_NETWORK_AUTHENTICATION_WEP:
 35            ffStrbufSetStatic(security, "WEP");
 36            break;
 37        case B_NETWORK_AUTHENTICATION_WPA:
 38            ffStrbufSetStatic(security, "WPA");
 39            break;
 40        case B_NETWORK_AUTHENTICATION_WPA2:
 41            ffStrbufSetStatic(security, "WPA2");
 42            break;
 43        case B_NETWORK_AUTHENTICATION_EAP:
 44            ffStrbufSetStatic(security, "WPA Enterprise");
 45            break;
 46        default:
 47            ffStrbufSetF(security, "Unknown (%lu)", (unsigned long) network.authentication_mode);
 48            break;
 49    }
 50}
 51
 52static void setWifiBssid(FFstrbuf* bssid, const wireless_network& network) {
 53    const uint8* address = network.address.LinkLevelAddress();
 54    if (address == nullptr || network.address.LinkLevelAddressLength() < 6) {
 55        return;
 56    }
 57
 58    ffStrbufSetF(bssid, "%02X:%02X:%02X:%02X:%02X:%02X",
 59        address[0], address[1], address[2], address[3], address[4], address[5]);
 60}
 61
 62const char* ffDetectWifi(FFlist* result) {
 63    BNetworkRoster& roster = BNetworkRoster::Default();
 64    BNetworkInterface interface;
 65    uint32 cookie = 0;
 66
 67    while (roster.GetNextInterface(&cookie, interface) == B_OK) {
 68        if (!interface.Exists()) {
 69            continue;
 70        }
 71
 72        BNetworkDevice device(interface.Name());
 73        if (!device.Exists() || !device.IsWireless()) {
 74            continue;
 75        }
 76
 77        FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
 78        initWifiResult(item, interface.Name());
 79
 80        ffStrbufSetStatic(&item->inf.status, interface.HasLink() ? "Up" : "Down");
 81        if (!interface.HasLink() || !device.HasLink()) {
 82            ffStrbufSetStatic(&item->conn.status, "Not connected");
 83            continue;
 84        }
 85
 86        ffStrbufSetStatic(&item->conn.status, "Connected");
 87
 88        uint32 networkCookie = 0;
 89        wireless_network network = {};
 90        if (device.GetNextAssociatedNetwork(networkCookie, network) != B_OK) {
 91            continue;
 92        }
 93
 94        ffStrbufSetNS(&item->conn.ssid, (uint32_t) strnlen(network.name, sizeof(network.name)), network.name);
 95        setWifiBssid(&item->conn.bssid, network);
 96        item->conn.signalQuality = network.signal_strength > 100 ? 100 : network.signal_strength;
 97        setWifiSecurity(&item->conn.security, network);
 98    }
 99
100    return nullptr;
101}