diff --git a/src/util/kmod.c b/src/util/kmod.c index 60d1889bf..defc0ca29 100644 --- a/src/util/kmod.c +++ b/src/util/kmod.c @@ -31,6 +31,50 @@ bool ffKmodLoaded(const char* modName) { return modfind(modName) >= 0; } +#elif __NetBSD__ +#include "util/stringUtils.h" + +#include +#include + +typedef struct FFNbsdModList +{ + int len; + modstat_t mods[]; +} FFNbsdModList; + +bool ffKmodLoaded(const char* modName) +{ + static FFNbsdModList* list = NULL; + + if (list == NULL) + { + struct iovec iov = {}; + + // 初始尝试分配的内存大小 + for (size_t len = 8192;; len = iov.iov_len) + { + iov.iov_len = len; + iov.iov_base = realloc(iov.iov_base, len); + if (modctl(MODCTL_STAT, &iov) < 0) + { + free(iov.iov_base); + return true; // ignore errors + } + + if (len >= iov.iov_len) break; + } + list = (FFNbsdModList*) iov.iov_base; + } + + for (int i = 0; i < list->len; i++) + { + if (ffStrEquals(list->mods[i].ms_name, modName)) + return true; + } + + return false; +} #elif __APPLE__ #include "util/apple/cf_helpers.h" #include