Manager/Lib: fix 'New Manager window' function on Linux

This was not working because the manager was not detecting its own executable name and path so it couldn't start a new instance of itself. Windows and Mac use different codepaths so it worked there.
The new library function can be extended for Windows and Mac to avoid code duplication.
This commit is contained in:
Christian Beer 2017-03-16 18:28:08 +01:00
parent aaa0254e4c
commit 31e8427469
4 changed files with 45 additions and 0 deletions

View File

@ -721,6 +721,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
}
@ -742,6 +752,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
}

View File

@ -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])

View File

@ -625,3 +625,20 @@ 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 {
perror("readlink");
return ERR_PROC_PARSE;
}
#endif
return ERR_NOT_IMPLEMENTED;
}

View File

@ -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)