ソースを参照

Move most Wine could out to Wine file

Marc Di Luzio 5 年 前
コミット
1df1852c76
3 ファイル変更14 行追加27 行削除
  1. 10 3
      daemon/gamemode-wine.c
  2. 3 21
      daemon/gamemode.c
  3. 1 3
      daemon/gamemode.h

+ 10 - 3
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;
 

+ 3 - 21
daemon/gamemode.c

@@ -748,31 +748,13 @@ 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;
-	}
-
-	return exe;
-
-wine_preloader:
-
-	wine_exe = game_mode_resolve_wine_preloader(pid);
-	if (wine_exe) {
+	/* Resolve for wine if appropriate */
+	if ((wine_exe = game_mode_resolve_wine_preloader(exe, pid))) {
 		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);
+	return exe;
 
 fail:
 	if (errno != 0) // otherwise a proper message was logged before

+ 1 - 3
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