From 1df1852c76fe14f946a75adf85f3adeb49e22e0c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Wed, 22 May 2019 16:54:54 +0100 Subject: [PATCH] Move most Wine could out to Wine file --- daemon/gamemode-wine.c | 13 ++++++++++--- daemon/gamemode.c | 26 ++++---------------------- daemon/gamemode.h | 4 +--- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/daemon/gamemode-wine.c b/daemon/gamemode-wine.c index 608a97d..4548dc0 100644 --- a/daemon/gamemode-wine.c +++ b/daemon/gamemode-wine.c @@ -43,7 +43,7 @@ POSSIBILITY OF SUCH DAMAGE. /** * Detect if the process is a wine preloader process */ -bool game_mode_detect_wine_preloader(const char *exe) +static bool game_mode_detect_wine_preloader(const char *exe) { return (strtail(exe, "/wine-preloader") || strtail(exe, "/wine64-preloader")); } @@ -51,7 +51,7 @@ bool game_mode_detect_wine_preloader(const char *exe) /** * Detect if the process is a wine loader process */ -bool game_mode_detect_wine_loader(const char *exe) +static bool game_mode_detect_wine_loader(const char *exe) { return (strtail(exe, "/wine") || strtail(exe, "/wine64")); } @@ -61,8 +61,15 @@ bool game_mode_detect_wine_loader(const char *exe) * This function is used if game_mode_context_find_exe() identified the * process as wine-preloader. Returns NULL when resolve fails. */ -char *game_mode_resolve_wine_preloader(const pid_t pid) +char *game_mode_resolve_wine_preloader(const char *exe, const pid_t pid) { + /* Detect if the process is a wine loader process */ + if (game_mode_detect_wine_preloader(exe) || game_mode_detect_wine_loader(exe)) { + LOG_MSG("Detected wine for client %d [%s].\n", pid, exe); + } else { + return NULL; + } + char buffer[PATH_MAX]; char *wine_exe = NULL, *wineprefix = NULL; diff --git a/daemon/gamemode.c b/daemon/gamemode.c index 335aaf9..115280a 100644 --- a/daemon/gamemode.c +++ b/daemon/gamemode.c @@ -748,32 +748,14 @@ static char *game_mode_context_find_exe(pid_t pid) char *exe = strdup(buffer); - /* Detect if the process is a wine loader process */ - if (game_mode_detect_wine_preloader(exe)) { - LOG_MSG("Detected wine preloader for client %d [%s].\n", pid, exe); - goto wine_preloader; - } - if (game_mode_detect_wine_loader(exe)) { - LOG_MSG("Detected wine loader for client %d [%s].\n", pid, exe); - goto wine_preloader; + /* Resolve for wine if appropriate */ + if ((wine_exe = game_mode_resolve_wine_preloader(exe, pid))) { + free(exe); + exe = wine_exe; } return exe; -wine_preloader: - - wine_exe = game_mode_resolve_wine_preloader(pid); - if (wine_exe) { - free(exe); - exe = wine_exe; - return exe; - } - - /* We have to ignore this because the wine process is in some sort - * of respawn mode - */ - free(exe); - fail: if (errno != 0) // otherwise a proper message was logged before LOG_ERROR("Unable to find executable for PID %d: %s\n", pid, strerror(errno)); diff --git a/daemon/gamemode.h b/daemon/gamemode.h index 1545aeb..21bc238 100644 --- a/daemon/gamemode.h +++ b/daemon/gamemode.h @@ -149,9 +149,7 @@ void game_mode_apply_scheduling(const GameModeContext *self, const pid_t client) * Provides internal API functions specific to handling wine * prefixes. */ -bool game_mode_detect_wine_loader(const char *exe); -bool game_mode_detect_wine_preloader(const char *exe); -char *game_mode_resolve_wine_preloader(const pid_t pid); +char *game_mode_resolve_wine_preloader(const char *exe, const pid_t pid); /** gamemode-tests.c * Provides a test suite to verify gamemode behaviour