diff options
-rw-r--r-- | Alc/alconfig.cpp | 28 | ||||
-rw-r--r-- | Alc/backends/pulseaudio.cpp | 9 | ||||
-rw-r--r-- | Alc/compat.h | 7 | ||||
-rw-r--r-- | Alc/helpers.cpp | 140 |
4 files changed, 69 insertions, 115 deletions
diff --git a/Alc/alconfig.cpp b/Alc/alconfig.cpp index 29593205..fedb6703 100644 --- a/Alc/alconfig.cpp +++ b/Alc/alconfig.cpp @@ -299,13 +299,12 @@ void ReadALConfig(void) LoadConfigFromFile(f); } - al_string ppath = AL_STRING_INIT_STATIC(); - GetProcBinary(&ppath, nullptr); - if(!alstr_empty(ppath)) + PathNamePair ppath = GetProcBinary(); + if(!ppath.path.empty()) { - alstr_append_cstr(&ppath, "\\alsoft.ini"); - TRACE("Loading config %s...\n", alstr_get_cstr(ppath)); - al::ifstream f{alstr_get_cstr(ppath)}; + ppath.path += "\\alsoft.ini"; + TRACE("Loading config %s...\n", ppath.path.c_str()); + al::ifstream f{ppath.path.c_str()}; if(f.is_open()) LoadConfigFromFile(f); } @@ -320,8 +319,6 @@ void ReadALConfig(void) if(f.is_open()) LoadConfigFromFile(f); } - - alstr_reset(&ppath); } #else void ReadALConfig(void) @@ -425,15 +422,14 @@ void ReadALConfig(void) LoadConfigFromFile(f); } - al_string ppath = AL_STRING_INIT_STATIC(); - GetProcBinary(&ppath, nullptr); - if(!alstr_empty(ppath)) + PathNamePair ppath = GetProcBinary(); + if(!ppath.path.empty()) { - if(VECTOR_BACK(ppath) != '/') alstr_append_cstr(&ppath, "/alsoft.conf"); - else alstr_append_cstr(&ppath, "alsoft.conf"); + if(ppath.path.back() != '/') ppath.path += "/alsoft.conf"; + else ppath.path += "alsoft.conf"; - TRACE("Loading config %s...\n", alstr_get_cstr(ppath)); - al::ifstream f{alstr_get_cstr(ppath)}; + TRACE("Loading config %s...\n", ppath.path.c_str()); + al::ifstream f{ppath.path}; if(f.is_open()) LoadConfigFromFile(f); } @@ -445,8 +441,6 @@ void ReadALConfig(void) if(f.is_open()) LoadConfigFromFile(f); } - - alstr_reset(&ppath); } #endif diff --git a/Alc/backends/pulseaudio.cpp b/Alc/backends/pulseaudio.cpp index e2845032..2a2de2a6 100644 --- a/Alc/backends/pulseaudio.cpp +++ b/Alc/backends/pulseaudio.cpp @@ -406,17 +406,15 @@ void wait_for_operation(pa_operation *op, pa_threaded_mainloop *loop) pa_context *connect_context(pa_threaded_mainloop *loop, ALboolean silent) { const char *name{"OpenAL Soft"}; - al_string binname{AL_STRING_INIT_STATIC()}; - GetProcBinary(nullptr, &binname); - if(!alstr_empty(binname)) - name = alstr_get_cstr(binname); + PathNamePair binname = GetProcBinary(); + if(!binname.fname.empty()) + name = binname.fname.c_str(); pa_context *context{pa_context_new(pa_threaded_mainloop_get_api(loop), name)}; if(!context) { ERR("pa_context_new() failed\n"); - alstr_reset(&binname); return nullptr; } @@ -448,7 +446,6 @@ pa_context *connect_context(pa_threaded_mainloop *loop, ALboolean silent) context = nullptr; } - alstr_reset(&binname); return context; } diff --git a/Alc/compat.h b/Alc/compat.h index 15eca1d4..31c84d48 100644 --- a/Alc/compat.h +++ b/Alc/compat.h @@ -237,8 +237,6 @@ extern "C" { #endif -void GetProcBinary(al_string *path, al_string *fname); - #ifdef HAVE_DYNLOAD void *LoadLib(const char *name); void CloseLib(void *handle); @@ -247,6 +245,11 @@ void *GetSymbol(void *handle, const char *name); #ifdef __cplusplus } /* extern "C" */ + +#include <string> + +struct PathNamePair { std::string path, fname; }; +PathNamePair GetProcBinary(void); #endif #endif /* AL_COMPAT_H */ diff --git a/Alc/helpers.cpp b/Alc/helpers.cpp index abd010e6..dede9e06 100644 --- a/Alc/helpers.cpp +++ b/Alc/helpers.cpp @@ -109,6 +109,10 @@ DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x #include <shlobj.h> #endif +#include <vector> +#include <string> +#include <algorithm> + #include "alMain.h" #include "alu.h" #include "cpu_caps.h" @@ -310,64 +314,37 @@ static int StringSortCompare(const void *str1, const void *str2) #ifdef _WIN32 -static WCHAR *strrchrW(WCHAR *str, WCHAR ch) +PathNamePair GetProcBinary() { - WCHAR *ret = NULL; - while(*str) - { - if(*str == ch) - ret = str; - ++str; - } - return ret; -} + PathNamePair ret; -void GetProcBinary(al_string *path, al_string *fname) -{ - WCHAR *pathname, *sep; - DWORD pathlen; + std::vector<WCHAR> fullpath(256); DWORD len; - - pathlen = 256; - pathname = static_cast<WCHAR*>(malloc(pathlen * sizeof(pathname[0]))); - while(pathlen > 0 && (len=GetModuleFileNameW(NULL, pathname, pathlen)) == pathlen) - { - free(pathname); - pathlen <<= 1; - pathname = static_cast<WCHAR*>(malloc(pathlen * sizeof(pathname[0]))); - } + while((len=GetModuleFileNameW(nullptr, fullpath.data(), fullpath.size())) == fullpath.size()) + fullpath.resize(fullpath.size() << 1); if(len == 0) { - free(pathname); ERR("Failed to get process name: error %lu\n", GetLastError()); - return; + return ret; } - pathname[len] = 0; - if((sep=strrchrW(pathname, '\\')) != NULL) - { - WCHAR *sep2 = strrchrW(sep+1, '/'); - if(sep2) sep = sep2; - } - else - sep = strrchrW(pathname, '/'); + fullpath.resize(len); + if(fullpath.back() != 0) + fullpath.push_back(0); - if(sep) + auto sep = std::find(fullpath.rbegin()+1, fullpath.rend(), '\\'); + sep = std::find(fullpath.rbegin()+1, sep, '/'); + if(sep != fullpath.rend()) { - if(path) alstr_copy_wrange(path, pathname, sep); - if(fname) alstr_copy_wcstr(fname, sep+1); + *sep = 0; + ret.fname = wstr_to_utf8(&*sep + 1); + ret.path = wstr_to_utf8(fullpath.data()); } else - { - if(path) alstr_clear(path); - if(fname) alstr_copy_wcstr(fname, pathname); - } - free(pathname); + ret.fname = wstr_to_utf8(fullpath.data()); - if(path && fname) - TRACE("Got: %s, %s\n", alstr_get_cstr(*path), alstr_get_cstr(*fname)); - else if(path) TRACE("Got path: %s\n", alstr_get_cstr(*path)); - else if(fname) TRACE("Got filename: %s\n", alstr_get_cstr(*fname)); + TRACE("Got: %s, %s\n", ret.path.c_str(), ret.fname.c_str()); + return ret; } @@ -562,24 +539,25 @@ vector_al_string SearchDataFiles(const char *ext, const char *subdir) #else -void GetProcBinary(al_string *path, al_string *fname) +PathNamePair GetProcBinary() { - char *pathname = NULL; - size_t pathlen; + PathNamePair ret; + std::vector<char> pathname; #ifdef __FreeBSD__ + size_t pathlen; int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; if(sysctl(mib, 4, NULL, &pathlen, NULL, 0) == -1) WARN("Failed to sysctl kern.proc.pathname: %s\n", strerror(errno)); else { - pathname = malloc(pathlen + 1); - sysctl(mib, 4, (void*)pathname, &pathlen, NULL, 0); + pathname.resize(pathlen + 1); + sysctl(mib, 4, pathname.data(), &pathlen, nullptr, 0); pathname[pathlen] = 0; } #endif #ifdef HAVE_PROC_PIDPATH - if(!pathname) + if(pathname.empty()) { const pid_t pid = getpid(); char procpath[PROC_PIDPATHINFO_MAXSIZE]; @@ -587,78 +565,60 @@ void GetProcBinary(al_string *path, al_string *fname) ret = proc_pidpath(pid, procpath, sizeof(procpath)); if(ret < 1) - { WARN("proc_pidpath(%d, ...) failed: %s\n", pid, strerror(errno)); - free(pathname); - pathname = NULL; - } else - { - pathlen = strlen(procpath); - pathname = strdup(procpath); - } + pathname.append(procpath, procpath+strlen(procpath)); } #endif - if(!pathname) + if(pathname.empty()) { - const char *selfname; - ssize_t len; - - pathlen = 256; - pathname = static_cast<char*>(malloc(pathlen)); + pathname.resize(256); - selfname = "/proc/self/exe"; - len = readlink(selfname, pathname, pathlen); + const char *selfname{"/proc/self/exe"}; + ssize_t len{readlink(selfname, pathname.data(), pathname.size())}; if(len == -1 && errno == ENOENT) { selfname = "/proc/self/file"; - len = readlink(selfname, pathname, pathlen); + len = readlink(selfname, pathname.data(), pathname.size()); } if(len == -1 && errno == ENOENT) { selfname = "/proc/curproc/exe"; - len = readlink(selfname, pathname, pathlen); + len = readlink(selfname, pathname.data(), pathname.size()); } if(len == -1 && errno == ENOENT) { selfname = "/proc/curproc/file"; - len = readlink(selfname, pathname, pathlen); + len = readlink(selfname, pathname.data(), pathname.size()); } - while(len > 0 && (size_t)len == pathlen) + while(len > 0 && (size_t)len == pathname.size()) { - free(pathname); - pathlen <<= 1; - pathname = static_cast<char*>(malloc(pathlen)); - len = readlink(selfname, pathname, pathlen); + pathname.resize(pathname.size() << 1); + len = readlink(selfname, pathname.data(), pathname.size()); } if(len <= 0) { - free(pathname); WARN("Failed to readlink %s: %s\n", selfname, strerror(errno)); - return; + return ret; } pathname[len] = 0; } + while(!pathname.empty() && pathname.back() == 0) + pathname.pop_back(); - char *sep = strrchr(pathname, '/'); - if(sep) + auto sep = std::find(pathname.crbegin(), pathname.crend(), '/'); + if(sep != pathname.crend()) { - if(path) alstr_copy_range(path, pathname, sep); - if(fname) alstr_copy_cstr(fname, sep+1); + ret.path = std::string(pathname.cbegin(), sep.base()-1); + ret.fname = std::string(sep.base(), pathname.cend()); } else - { - if(path) alstr_clear(path); - if(fname) alstr_copy_cstr(fname, pathname); - } - free(pathname); + ret.fname = std::string(pathname.cbegin(), pathname.cend()); - if(path && fname) - TRACE("Got: %s, %s\n", alstr_get_cstr(*path), alstr_get_cstr(*fname)); - else if(path) TRACE("Got path: %s\n", alstr_get_cstr(*path)); - else if(fname) TRACE("Got filename: %s\n", alstr_get_cstr(*fname)); + TRACE("Got: %s, %s\n", ret.path.c_str(), ret.fname.c_str()); + return ret; } |