From 830c71ddc40d4174148a3ae5da059b2fc693c51e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Nov 2024 00:28:39 +0800 Subject: [PATCH] DisplayServer (NetBSD): detect WM / DE by process name --- src/detection/displayserver/linux/wmde.c | 32 +++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index aa1f0eafd..7a8554caa 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -8,16 +8,19 @@ #include #include -#ifdef __FreeBSD__ +#if __FreeBSD__ #include #include #include -#elif defined(__OpenBSD__) +#elif __OpenBSD__ #include #include #include -#elif defined(__sun) +#elif __sun #include +#elif __NetBSD__ + #include + #include #endif static const char* parseEnv(void) @@ -388,6 +391,29 @@ static const char* getFromProcesses(FFDisplayServerResult* result) if(result->wmPrettyName.length == 0) applyNameIfWM(result, processName.chars); + if(result->dePrettyName.length > 0 && result->wmPrettyName.length > 0) + break; + } +#elif __NetBSD__ + int request[] = {CTL_KERN, KERN_PROC2, KERN_PROC_UID, (int) userId, sizeof(struct kinfo_proc2), INT_MAX}; + + size_t size = 0; + if(sysctl(request, ARRAY_SIZE(request), NULL, &size, NULL, 0) != 0) + return "sysctl(KERN_PROC_UID, NULL) failed"; + + FF_AUTO_FREE struct kinfo_proc2* procs = malloc(size); + + if(sysctl(request, ARRAY_SIZE(request), procs, &size, NULL, 0) != 0) + return "sysctl(KERN_PROC_UID, procs) failed"; + + for(struct kinfo_proc2* proc = procs; proc < procs + (size / sizeof(struct kinfo_proc2)); proc++) + { + if(result->dePrettyName.length == 0) + applyPrettyNameIfDE(result, proc->p_comm); + + if(result->wmPrettyName.length == 0) + applyNameIfWM(result, proc->p_comm); + if(result->dePrettyName.length > 0 && result->wmPrettyName.length > 0) break; }