From 9b491c2f49a2eae5adde7bab364758ddfbf557f9 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 22 Jul 2025 22:03:53 +0800 Subject: [PATCH] Wifi (Linux): fix interface status when the interface is up but not connected --- src/detection/wifi/wifi_linux.c | 35 +++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index deadf6dcc..34c3d9f08 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -554,21 +554,48 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED FFlist* result) item->conn.channel = 0; item->conn.frequency = 0; + char operstate; ffStrbufSetF(&buffer, "/sys/class/net/%s/operstate", i->if_name); - if (!ffAppendFileBuffer(buffer.chars, &item->inf.status)) + if (!ffReadFileData(buffer.chars, 1, &operstate)) { FF_DEBUG("Failed to read operstate file"); continue; } - ffStrbufTrimRightSpace(&item->inf.status); - FF_DEBUG("Interface status: %s", item->inf.status.chars); - if (!ffStrbufEqualS(&item->inf.status, "up")) + FF_DEBUG("Connection status: %c", operstate); + if (operstate != 'u') { FF_DEBUG("Skipping interface as it's not up"); + ffStrbufSetStatic(&item->conn.status, "disconnected"); + + ffStrbufSetF(&buffer, "/sys/class/net/%s/flags", i->if_name); + char flags[16]; + ssize_t len = ffReadFileData(buffer.chars, sizeof(flags), flags); + if (len <= 0) + { + FF_DEBUG("Failed to read flags file"); + ffStrbufSetStatic(&item->inf.status, "unknown"); + continue; + } + flags[len] = '\0'; + FF_DEBUG("Interface flags: %s", flags); + unsigned flagsVal = (unsigned) strtoul(flags, NULL, 16); + if (flagsVal & IFF_UP) + { + ffStrbufSetStatic(&item->inf.status, "up"); + FF_DEBUG("Interface is up but not connected"); + } + else + { + ffStrbufSetStatic(&item->inf.status, "down"); + FF_DEBUG("Interface is down"); + } + continue; } + ffStrbufSetStatic(&item->inf.status, "up"); + FF_DEBUG("Trying to detect wifi with iw"); if (detectWifiWithIw(item, &buffer) != NULL) {