aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/alconfig.cpp28
-rw-r--r--Alc/backends/pulseaudio.cpp9
-rw-r--r--Alc/compat.h7
-rw-r--r--Alc/helpers.cpp140
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;
}