[pulseaudio-discuss] [PATCH 2/9] Find modules and config files relative to the installed libraries.

Maarten Bosmans mkbosmans at gmail.com
Wed Mar 16 02:55:39 PDT 2011


Do not use replace %PULSE_ROOT% from the environment.
---
 src/Makefile.am           |    4 --
 src/daemon/daemon-conf.c  |    7 +++
 src/pulsecore/core-util.c |  123 ++++++++++++++++----------------------------
 src/pulsecore/core-util.h |    4 ++
 src/pulsecore/dllmain.c   |    4 +-
 5 files changed, 58 insertions(+), 84 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index d49d91c..b57172b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -37,11 +37,7 @@ dbuspolicydir=$(sysconfdir)/dbus-1/system.d
 ###################################
 
 PA_BINARY=$(bindir)/pulseaudio$(EXEEXT)
-if OS_IS_WIN32
-PA_DEFAULT_CONFIG_DIR=%PULSE_ROOT%
-else
 PA_DEFAULT_CONFIG_DIR=$(pulseconfdir)
-endif
 
 ###################################
 #     Compiler/linker flags       #
diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index 3339f3b..2b04b9e 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -159,7 +159,14 @@ pa_daemon_conf* pa_daemon_conf_new(void) {
     } else
 
 #endif
+#ifdef OS_IS_WIN32
+    {
+        char *toplevel = pa_win32_get_toplevel(NULL);
+        c->dl_search_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib" PA_PATH_SEP "pulse-1.0" PA_PATH_SEP "modules", toplevel);
+    }
+#else
         c->dl_search_path = pa_xstrdup(PA_DLSEARCHPATH);
+#endif
 
     return c;
 }
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 8a377e3..fd3cc67 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -146,24 +146,29 @@ static pa_strlist *recorded_env = NULL;
 
 #ifdef OS_IS_WIN32
 
-#define PULSE_ROOTENV "PULSE_ROOT"
+/* Returns the directory of the current DLL, with '/bin/' removed if it is the last component */
+char *pa_win32_get_toplevel(HANDLE handle) {
+    static char *toplevel = NULL;
 
-int pa_set_root(HANDLE handle) {
-    char library_path[MAX_PATH], *sep;
+    if (!toplevel) {
+        char library_path[MAX_PATH];
+        char *p;
 
-    /* FIXME: Needs to set errno */
+        if (!GetModuleFileName(handle, library_path, MAX_PATH))
+            return NULL;
 
-    if (!GetModuleFileName(handle, library_path, MAX_PATH))
-        return 0;
+        toplevel = pa_xstrdup(library_path);
 
-    sep = strrchr(library_path, PA_PATH_SEP_CHAR);
-    if (sep)
-        *sep = '\0';
+        p = strrchr(toplevel, PA_PATH_SEP_CHAR);
+        if (p)
+            *p = '\0';
 
-    if (!SetEnvironmentVariable(PULSE_ROOTENV, library_path))
-        return 0;
+        p = strrchr(toplevel, PA_PATH_SEP_CHAR);
+        if (p && (strcmp(p + 1, "bin") == 0))
+            *p = '\0';
+    }
 
-    return 1;
+    return toplevel;
 }
 
 #endif
@@ -699,7 +704,7 @@ int pa_make_realtime(int rtprio) {
 #elif defined(OS_IS_WIN32)
     /* Windows only allows realtime scheduling to be set on a per process basis.
      * Therefore, instead of making the thread realtime, just give it the highest non-realtime priority. */
-    if(SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL)) {
+    if (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL)) {
         pa_log_info("Successfully enabled THREAD_PRIORITY_TIME_CRITICAL scheduling for thread.");
         return 0;
     }
@@ -928,7 +933,7 @@ const char *pa_sig2str(int sig) {
     }
 #else
 
-    switch(sig) {
+    switch (sig) {
 #ifdef SIGHUP
         case SIGHUP:    return "SIGHUP";
 #endif
@@ -1218,11 +1223,11 @@ int pa_lock_fd(int fd, int b) {
             return 0;
     }
 
-    pa_log("%slock: %s", !b? "un" : "", pa_cstrerror(errno));
+    pa_log("%slock: %s", !b ? "un" : "", pa_cstrerror(errno));
 #endif
 
 #ifdef OS_IS_WIN32
-    HANDLE h = (HANDLE)_get_osfhandle(fd);
+    HANDLE h = (HANDLE) _get_osfhandle(fd);
 
     if (b && LockFile(h, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF))
         return 0;
@@ -1675,23 +1680,9 @@ fail:
  * stored there.*/
 FILE *pa_open_config_file(const char *global, const char *local, const char *env, char **result) {
     const char *fn;
-#ifdef OS_IS_WIN32
-    char buf[PATH_MAX];
-
-    if (!getenv(PULSE_ROOTENV))
-        pa_set_root(NULL);
-#endif
+    FILE *f;
 
     if (env && (fn = getenv(env))) {
-        FILE *f;
-
-#ifdef OS_IS_WIN32
-        if (!ExpandEnvironmentStrings(fn, buf, PATH_MAX))
-            /* FIXME: Needs to set errno! */
-            return NULL;
-        fn = buf;
-#endif
-
         if ((f = pa_fopen_cloexec(fn, "r"))) {
             if (result)
                 *result = pa_xstrdup(fn);
@@ -1707,7 +1698,6 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
         const char *e;
         char *lfn;
         char *h;
-        FILE *f;
 
         if ((e = getenv("PULSE_CONFIG_PATH")))
             fn = lfn = pa_sprintf_malloc("%s" PA_PATH_SEP "%s", e, local);
@@ -1717,15 +1707,6 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
         } else
             return NULL;
 
-#ifdef OS_IS_WIN32
-        if (!ExpandEnvironmentStrings(lfn, buf, PATH_MAX)) {
-            /* FIXME: Needs to set errno! */
-            pa_xfree(lfn);
-            return NULL;
-        }
-        fn = buf;
-#endif
-
         if ((f = pa_fopen_cloexec(fn, "r"))) {
             if (result)
                 *result = pa_xstrdup(fn);
@@ -1744,22 +1725,26 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
     }
 
     if (global) {
-        FILE *f;
+        char *gfn;
 
 #ifdef OS_IS_WIN32
-        if (!ExpandEnvironmentStrings(global, buf, PATH_MAX))
-            /* FIXME: Needs to set errno! */
-            return NULL;
-        global = buf;
+        if (strncmp(global, PA_DEFAULT_CONFIG_DIR, strlen(PA_DEFAULT_CONFIG_DIR)) == 0)
+            gfn = pa_sprintf_malloc("%s" PA_PATH_SEP "etc" PA_PATH_SEP "pulse%s",
+                                    pa_win32_get_toplevel(NULL),
+                                    global + strlen(PA_DEFAULT_CONFIG_DIR));
+        else
 #endif
+        gfn = pa_xstrdup(global);
 
-        if ((f = pa_fopen_cloexec(global, "r"))) {
-
+        if ((f = pa_fopen_cloexec(gfn, "r"))) {
             if (result)
-                *result = pa_xstrdup(global);
+                *result = gfn;
+            else
+                pa_xfree(gfn);
 
             return f;
         }
+        pa_xfree(gfn);
     }
 
     errno = ENOENT;
@@ -1768,22 +1753,8 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
 
 char *pa_find_config_file(const char *global, const char *local, const char *env) {
     const char *fn;
-#ifdef OS_IS_WIN32
-    char buf[PATH_MAX];
-
-    if (!getenv(PULSE_ROOTENV))
-        pa_set_root(NULL);
-#endif
 
     if (env && (fn = getenv(env))) {
-
-#ifdef OS_IS_WIN32
-        if (!ExpandEnvironmentStrings(fn, buf, PATH_MAX))
-            /* FIXME: Needs to set errno! */
-            return NULL;
-        fn = buf;
-#endif
-
         if (access(fn, R_OK) == 0)
             return pa_xstrdup(fn);
 
@@ -1804,15 +1775,6 @@ char *pa_find_config_file(const char *global, const char *local, const char *env
         } else
             return NULL;
 
-#ifdef OS_IS_WIN32
-        if (!ExpandEnvironmentStrings(lfn, buf, PATH_MAX)) {
-            /* FIXME: Needs to set errno! */
-            pa_xfree(lfn);
-            return NULL;
-        }
-        fn = buf;
-#endif
-
         if (access(fn, R_OK) == 0) {
             char *r = pa_xstrdup(fn);
             pa_xfree(lfn);
@@ -1829,15 +1791,20 @@ char *pa_find_config_file(const char *global, const char *local, const char *env
     }
 
     if (global) {
+        char *gfn;
+
 #ifdef OS_IS_WIN32
-        if (!ExpandEnvironmentStrings(global, buf, PATH_MAX))
-            /* FIXME: Needs to set errno! */
-            return NULL;
-        global = buf;
+        if (strncmp(global, PA_DEFAULT_CONFIG_DIR, strlen(PA_DEFAULT_CONFIG_DIR)) == 0)
+            gfn = pa_sprintf_malloc("%s" PA_PATH_SEP "etc" PA_PATH_SEP "pulse%s",
+                                    pa_win32_get_toplevel(NULL),
+                                    global + strlen(PA_DEFAULT_CONFIG_DIR));
+        else
 #endif
+        gfn = pa_xstrdup(global);
 
-        if (access(global, R_OK) == 0)
-            return pa_xstrdup(global);
+        if (access(gfn, R_OK) == 0)
+            return gfn;
+        pa_xfree(gfn);
     }
 
     errno = ENOENT;
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 8619330..80b4739 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -271,4 +271,8 @@ void pa_nullify_stdfds(void);
 char *pa_read_line_from_file(const char *fn);
 pa_bool_t pa_running_in_vm(void);
 
+#ifdef OS_IS_WIN32
+char *pa_win32_get_toplevel(HANDLE handle);
+#endif
+
 #endif
diff --git a/src/pulsecore/dllmain.c b/src/pulsecore/dllmain.c
index 491ec75..c826bc0 100644
--- a/src/pulsecore/dllmain.c
+++ b/src/pulsecore/dllmain.c
@@ -31,7 +31,7 @@
 
 #include <windows.h>
 
-extern pa_set_root(HANDLE handle);
+extern pa_win32_get_toplevel(HANDLE handle);
 
 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
     WSADATA data;
@@ -39,7 +39,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
     switch (fdwReason) {
 
     case DLL_PROCESS_ATTACH:
-        if (!pa_set_root(hinstDLL))
+        if (!pa_win32_get_toplevel(hinstDLL))
             return FALSE;
         WSAStartup(MAKEWORD(2, 0), &data);
         break;
-- 
1.7.1




More information about the pulseaudio-discuss mailing list