diff options
author | Chris Robinson <[email protected]> | 2016-06-04 10:45:44 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2016-06-04 10:45:44 -0700 |
commit | 0477d6159974837ee01bbc7c74a65a3be5794cdd (patch) | |
tree | d69c5e5ad3133f05c5399b70c3cac87373cf59f5 | |
parent | b2041a5ddfec78bbde1c63c8674614455ee31f93 (diff) |
Look in the executable's dir for another config file
On Windows it'll look for alsoft.ini, and elsewhere is alsoft.conf. This
applies after the user-local settings and before ALSOFT_CONF.
-rw-r--r-- | Alc/alcConfig.c | 32 | ||||
-rw-r--r-- | Alc/compat.h | 4 | ||||
-rw-r--r-- | Alc/helpers.c | 97 |
3 files changed, 133 insertions, 0 deletions
diff --git a/Alc/alcConfig.c b/Alc/alcConfig.c index 6fc9db33..f83ffd94 100644 --- a/Alc/alcConfig.c +++ b/Alc/alcConfig.c @@ -313,6 +313,7 @@ void ReadALConfig(void) { WCHAR buffer[PATH_MAX]; const WCHAR *str; + al_string ppath; FILE *f; if(SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, FALSE) != FALSE) @@ -331,6 +332,19 @@ void ReadALConfig(void) al_string_deinit(&filepath); } + ppath = GetProcPath(); + if(!al_string_empty(ppath)) + { + al_string_append_cstr(&ppath, "\\alsoft.ini"); + TRACE("Loading config %s...\n", al_string_get_cstr(ppath)); + f = al_fopen(al_string_get_cstr(ppath), "r"); + if(f) + { + LoadConfigFromFile(f); + fclose(f); + } + } + if((str=_wgetenv(L"ALSOFT_CONF")) != NULL && *str) { al_string filepath = AL_STRING_INIT_STATIC(); @@ -345,12 +359,15 @@ void ReadALConfig(void) } al_string_deinit(&filepath); } + + al_string_deinit(&ppath); } #else void ReadALConfig(void) { char buffer[PATH_MAX]; const char *str; + al_string ppath; FILE *f; str = "/etc/openal/alsoft.conf"; @@ -430,6 +447,19 @@ void ReadALConfig(void) } } + ppath = GetProcPath(); + if(!al_string_empty(ppath)) + { + al_string_append_cstr(&ppath, "/alsoft.conf"); + TRACE("Loading config %s...\n", al_string_get_cstr(ppath)); + f = al_fopen(al_string_get_cstr(ppath), "r"); + if(f) + { + LoadConfigFromFile(f); + fclose(f); + } + } + if((str=getenv("ALSOFT_CONF")) != NULL && *str) { TRACE("Loading config %s...\n", str); @@ -440,6 +470,8 @@ void ReadALConfig(void) fclose(f); } } + + al_string_deinit(&ppath); } #endif diff --git a/Alc/compat.h b/Alc/compat.h index f54ef9ce..0443692a 100644 --- a/Alc/compat.h +++ b/Alc/compat.h @@ -1,6 +1,8 @@ #ifndef AL_COMPAT_H #define AL_COMPAT_H +#include "alstring.h" + #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -23,6 +25,8 @@ FILE *al_fopen(const char *fname, const char *mode); #endif +al_string GetProcPath(void); + #ifdef HAVE_DYNLOAD void *LoadLib(const char *name); void CloseLib(void *handle); diff --git a/Alc/helpers.c b/Alc/helpers.c index e1cd6be1..bd345b6a 100644 --- a/Alc/helpers.c +++ b/Alc/helpers.c @@ -321,6 +321,57 @@ static int StringSortCompare(const void *str1, const void *str2) #ifdef _WIN32 +static WCHAR *strrchrW(WCHAR *str, WCHAR ch) +{ + WCHAR *ret = NULL; + while(*str) + { + if(*str == ch) + ret = str; + ++str; + } + return ret; +} + +al_string GetProcPath(void) +{ + al_string ret = AL_STRING_INIT_STATIC(); + WCHAR *pathname, *sep; + DWORD pathlen; + DWORD len; + + pathlen = 256; + pathname = malloc(pathlen * sizeof(pathname[0])); + while(pathlen > 0 && (len=GetModuleFileNameW(NULL, pathname, pathlen)) == pathlen) + { + free(pathname); + pathlen <<= 1; + pathname = malloc(pathlen * sizeof(pathname[0])); + } + if(len == 0) + { + free(pathname); + ERR("Failed to get process name: error %lu\n", GetLastError()); + return ret; + } + + pathname[len] = 0; + if((sep = strrchrW(pathname, '\\'))) + { + WCHAR *sep2 = strrchrW(pathname, '/'); + if(sep2) *sep2 = 0; + else *sep = 0; + } + else if((sep = strrchrW(pathname, '/'))) + *sep = 0; + al_string_copy_wcstr(&ret, pathname); + free(pathname); + + TRACE("Got: %s\n", al_string_get_cstr(ret)); + return ret; +} + + static WCHAR *FromUTF8(const char *str) { WCHAR *out = NULL; @@ -549,6 +600,52 @@ vector_al_string SearchDataFiles(const char *ext, const char *subdir) #else +al_string GetProcPath(void) +{ + al_string ret = AL_STRING_INIT_STATIC(); + const char *fname; + char *pathname, *sep; + size_t pathlen; + ssize_t len; + + pathlen = 256; + pathname = malloc(pathlen); + + fname = "/proc/self/exe"; + len = readlink(fname, pathname, pathlen); + if(len == -1 && errno == ENOENT) + { + fname = "/proc/self/file"; + len = readlink(fname, pathname, pathlen); + } + + while(len > 0 && (size_t)len == pathlen) + { + free(pathname); + pathlen <<= 1; + pathname = malloc(pathlen); + len = readlink(fname, pathname, pathlen); + } + if(len <= 0) + { + free(pathname); + ERR("Failed to link %s: %s\n", fname, strerror(errno)); + return ret; + } + + pathname[len] = 0; + sep = strrchr(pathname, '/'); + if(sep) + al_string_copy_range(&ret, pathname, sep); + else + al_string_copy_cstr(&ret, pathname); + free(pathname); + + TRACE("Got: %s\n", al_string_get_cstr(ret)); + return ret; +} + + #ifdef HAVE_DLFCN_H void *LoadLib(const char *name) |