diff options
| -rw-r--r-- | src/Makefile.am | 4 | ||||
| -rw-r--r-- | src/daemon/daemon-conf.c | 14 | ||||
| -rw-r--r-- | src/pulsecore/core-util.c | 123 | ||||
| -rw-r--r-- | src/pulsecore/core-util.h | 4 | ||||
| -rw-r--r-- | src/pulsecore/dllmain.c | 4 | 
5 files changed, 65 insertions, 84 deletions
| diff --git a/src/Makefile.am b/src/Makefile.am index d49d91c7..b57172b9 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 3339f3b0..f640b039 100644 --- a/src/daemon/daemon-conf.c +++ b/src/daemon/daemon-conf.c @@ -159,7 +159,21 @@ pa_daemon_conf* pa_daemon_conf_new(void) {      } else  #endif +#ifdef OS_IS_WIN32 +    { +        char *t; +        char *majorminor = pa_xstrdup(VERSION); +        char *toplevel = pa_win32_get_toplevel(NULL); + +        if ((t = strchr(majorminor, '-'))) +          *t = '\0'; + +        c->dl_search_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib" PA_PATH_SEP "pulse-%s" PA_PATH_SEP "modules", toplevel, majorminor); +        pa_xfree(majorminor); +    } +#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 8a377e37..fd3cc67a 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 8619330d..80b47395 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 491ec75f..c826bc08 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; | 
