diff --git a/clientgui/BOINCGUIApp.cpp b/clientgui/BOINCGUIApp.cpp index ea71405e65..653981b016 100644 --- a/clientgui/BOINCGUIApp.cpp +++ b/clientgui/BOINCGUIApp.cpp @@ -724,6 +724,16 @@ void CBOINCGUIApp::DetectExecutableName() { // Store the root directory for later use. m_strBOINCMGRExecutableName = pszProg; +#elif defined(__WXGTK__) + char path[PATH_MAX]; + if (!get_real_executable_path(path, PATH_MAX)) { + // find filename component + char* name = strrchr(path, '/'); + if (name) { + name++; + m_strBOINCMGRExecutableName = name; + } + } #endif } @@ -745,6 +755,17 @@ void CBOINCGUIApp::DetectRootDirectory() { // Store the root directory for later use. m_strBOINCMGRRootDirectory = szPath; +#elif defined(__WXGTK__) + char path[PATH_MAX]; + if (!get_real_executable_path(path, PATH_MAX)) { + // find path component + char* name = strrchr(path, '/'); + if (name) { + name++; + *name = '\0'; + m_strBOINCMGRRootDirectory = path; + } + } #endif } diff --git a/configure.ac b/configure.ac index 48defb1661..e7d8e00635 100644 --- a/configure.ac +++ b/configure.ac @@ -1017,6 +1017,11 @@ if test -e "/proc/self/stat"; then AC_DEFINE(HAVE__PROC_SELF_STAT, 1, [Define to 1 if /proc/self/stat exists]) fi +dnl Check for /proc/self/exe (Linux) +if test -e "/proc/self/exe"; then + AC_DEFINE(HAVE__PROC_SELF_EXE, 1, [Define to 1 if /proc/self/exe exists]) +fi + dnl Check for /proc/meminfo (Linux) if test -e "/proc/meminfo"; then AC_DEFINE(HAVE__PROC_MEMINFO, 1, [Define to 1 if /proc/meminfo exists]) diff --git a/lib/util.cpp b/lib/util.cpp index 4c94a67336..9ea53a61d6 100644 --- a/lib/util.cpp +++ b/lib/util.cpp @@ -625,3 +625,24 @@ double rand_normal() { cached = true; return z*cos(PI2*u2); } + +// determines the real path and filename of the current process +// not the current working directory +// +int get_real_executable_path(char* path, size_t max_len) { +#ifdef HAVE__PROC_SELF_EXE + int ret = readlink("/proc/self/exe", path, max_len); + if ( ret >= 0) { + path[ret] = '\0'; // readlink does not null terminate + return 0; + } else { +#ifdef _USING_FCGI_ + FCGI::perror("readlink"); +#else + perror("readlink"); +#endif + return ERR_PROC_PARSE; + } +#endif + return ERR_NOT_IMPLEMENTED; +} diff --git a/lib/util.h b/lib/util.h index 19358219b4..c01fbbe486 100644 --- a/lib/util.h +++ b/lib/util.h @@ -110,6 +110,8 @@ extern bool process_exists(int); extern int wait_client_mutex(const char* dir, double timeout); +extern int get_real_executable_path(char* path, size_t max_len); + #ifdef GCL_SIMULATOR extern double simtime; #define time(x) ((int)simtime)