From a691985541e9f308dccf7dc9cdfde112c7067d34 Mon Sep 17 00:00:00 2001 From: Ikey Doherty Date: Sun, 22 Oct 2017 00:10:36 +0100 Subject: [PATCH] Dedupe, implement support for getting steam directory Signed-off-by: Ikey Doherty --- src/common/files.c | 43 +++++++++++++++++++++++++++++++++++++++++-- src/common/files.h | 11 +++++++++++ src/lsi/lsi.h | 10 ---------- src/shim/shim.c | 1 + 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/common/files.c b/src/common/files.c index af6b07e..c0f0caf 100644 --- a/src/common/files.c +++ b/src/common/files.c @@ -15,11 +15,20 @@ #include #include #include +#include #include +#include "../common.h" #include "files.h" +#include "nica/util.h" -const char *lsi_get_home_dir(void) +bool lsi_file_exists(const char *path) +{ + __lsi_unused__ struct stat st = { 0 }; + return lstat(path, &st) == 0; +} + +const char *lsi_get_home_dir() { char *c = NULL; struct passwd *p = NULL; @@ -35,7 +44,7 @@ const char *lsi_get_home_dir(void) return p->pw_dir; } -char *lsi_get_user_config_dir(void) +char *lsi_get_user_config_dir() { const char *home = lsi_get_home_dir(); char *c = NULL; @@ -45,6 +54,36 @@ char *lsi_get_user_config_dir(void) return c; } +/** + * Just use .local/share/Steam at this point.. + */ +static inline char *lsi_get_fallback_steam_dir(const char *home) +{ + char *p = NULL; + if (asprintf(&p, "%s/.local/share/Steam", home) < 0) { + return NULL; + } + return p; +} + +char *lsi_get_steam_dir() +{ + const char *homedir = NULL; + autofree(char) *candidate = NULL; + autofree(char) *resolv = NULL; + + homedir = lsi_get_home_dir(); + if (asprintf(&candidate, "%s/.steam/root", homedir) < 0) { + return NULL; + } + + resolv = realpath(candidate, NULL); + if (!resolv || !lsi_file_exists(resolv)) { + return lsi_get_fallback_steam_dir(homedir); + } + return strdup(resolv); +} + /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * diff --git a/src/common/files.h b/src/common/files.h index fdfa007..5538795 100644 --- a/src/common/files.h +++ b/src/common/files.h @@ -13,6 +13,7 @@ #define _GNU_SOURCE +#include #include /** @@ -25,6 +26,16 @@ const char *lsi_get_home_dir(void); */ char *lsi_get_user_config_dir(void); +/** + * Find out where Steam is installed + */ +char *lsi_get_steam_dir(void); + +/** + * Quick helper to determine if the path exists + */ +bool lsi_file_exists(const char *path); + /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * diff --git a/src/lsi/lsi.h b/src/lsi/lsi.h index 84e2b4a..9b18346 100644 --- a/src/lsi/lsi.h +++ b/src/lsi/lsi.h @@ -17,7 +17,6 @@ #include #include #include -#include #include #include "../common.h" @@ -97,15 +96,6 @@ __lsi_inline__ static inline const char *lsi_preload_list(void) */ void lsi_report_failure(const char *s, ...); -/** - * Quick helper to determine if the path exists - */ -__lsi_inline__ static inline bool lsi_file_exists(const char *path) -{ - __lsi_unused__ struct stat st = { 0 }; - return lstat(path, &st) == 0; -} - /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * diff --git a/src/shim/shim.c b/src/shim/shim.c index 50918e0..a812e85 100644 --- a/src/shim/shim.c +++ b/src/shim/shim.c @@ -17,6 +17,7 @@ #include #include +#include "../common/files.h" #include "config.h" #include "lsi.h"