From abdaed11030475d9b558667f91d2214258cfa105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Valverde?= Date: Wed, 25 Jan 2023 20:15:16 +0000 Subject: [PATCH] Add support for configuration path relocation on Unix Get the installation prefix from the program dir. We have code to obtain the directory where the executable resides for all platforms we support, Linux, BSDs, Apple, etc. On less well-known platforms where this isn't true (POSIX does not define any standard interfaces for this) we fallback on using a hard-coded installation prefix, like we have been doing until now. The path relocation allows the whole installation tree to be moved without having to recompile the program. But note there are other requirements for shared libraries to have full support for relocation. This is only partial support. We now use a header to pass the relative path definitions to avoid excessively long compilation command lines as the number of #defines increases. --- wsutil/CMakeLists.txt | 36 +++++++++++------------------ wsutil/filesystem.c | 51 ++++++++++++++++++++++------------------- wsutil/path_config.h.in | 10 ++++++++ 3 files changed, 51 insertions(+), 46 deletions(-) create mode 100644 wsutil/path_config.h.in diff --git a/wsutil/CMakeLists.txt b/wsutil/CMakeLists.txt index ef45a20248..54a9707c10 100644 --- a/wsutil/CMakeLists.txt +++ b/wsutil/CMakeLists.txt @@ -7,28 +7,20 @@ # SPDX-License-Identifier: GPL-2.0-or-later # -if(UNIX OR USE_MSYSTEM) - if(USE_MSYSTEM) - # Windows binaries are relocatable and do not need a prefix. - file(TO_NATIVE_PATH "${PLUGIN_INSTALL_LIBDIR}" _dir) - string(REPLACE "\\" "\\\\" _plugin_dir "${_dir}") - file(TO_NATIVE_PATH "${EXTCAP_INSTALL_LIBDIR}" _dir) - string(REPLACE "\\" "\\\\" _extcap_dir "${_dir}") - file(TO_NATIVE_PATH "${CMAKE_INSTALL_DATADIR}" _dir) - string(REPLACE "\\" "\\\\" _data_dir "${_dir}") - file(TO_NATIVE_PATH "${CMAKE_INSTALL_DOCDIR}" _dir) - string(REPLACE "\\" "\\\\" _doc_dir "${_dir}") - elseif(UNIX) - set(_plugin_dir "${PLUGIN_INSTALL_FULL_LIBDIR}") - set(_extcap_dir "${EXTCAP_INSTALL_FULL_LIBDIR}") - set(_data_dir "${CMAKE_INSTALL_FULL_DATADIR}") - set(_doc_dir "${CMAKE_INSTALL_FULL_DOCDIR}") - endif() - add_definitions(-DPLUGIN_DIR=\"${_plugin_dir}\") - add_definitions(-DEXTCAP_DIR=\"${_extcap_dir}\") - add_definitions(-DDATA_DIR=\"${_data_dir}\") - add_definitions(-DDOC_DIR=\"${_doc_dir}\") -endif() +file(TO_NATIVE_PATH "${CMAKE_INSTALL_PREFIX}" PATH_INSTALL_PREFIX) +string(REPLACE "\\" "\\\\" PATH_INSTALL_PREFIX "${PATH_INSTALL_PREFIX}") +file(TO_NATIVE_PATH "${CMAKE_INSTALL_DATADIR}" PATH_DATA_DIR) +string(REPLACE "\\" "\\\\" PATH_DATA_DIR "${PATH_DATA_DIR}") +file(TO_NATIVE_PATH "${CMAKE_INSTALL_DOCDIR}" PATH_DOC_DIR) +string(REPLACE "\\" "\\\\" PATH_DOC_DIR "${PATH_DOC_DIR}") +file(TO_NATIVE_PATH "${PLUGIN_INSTALL_LIBDIR}" PATH_PLUGIN_DIR) +string(REPLACE "\\" "\\\\" PATH_PLUGIN_DIR "${PATH_PLUGIN_DIR}") +file(TO_NATIVE_PATH "${EXTCAP_INSTALL_LIBDIR}" PATH_EXTCAP_DIR) +string(REPLACE "\\" "\\\\" PATH_EXTCAP_DIR "${PATH_EXTCAP_DIR}") + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/path_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/path_config.h) + +include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(wmem) diff --git a/wsutil/filesystem.c b/wsutil/filesystem.c index e905fc5e4d..75bd233c4b 100644 --- a/wsutil/filesystem.c +++ b/wsutil/filesystem.c @@ -47,6 +47,8 @@ #include /* for WTAP_ERR_SHORT_WRITE */ +#include "path_config.h" + #define PROFILES_DIR "profiles" #define PLUGINS_DIR_NAME "plugins" #define EXTCAP_DIR_NAME "extcap" @@ -79,9 +81,7 @@ char *doc_dir = NULL; /* Directory from which the executable came. */ static char *progfile_dir = NULL; -#ifdef __MINGW64__ static char *install_prefix = NULL; -#endif static gboolean do_store_persconffiles = FALSE; static GHashTable *profile_files = NULL; @@ -536,7 +536,6 @@ static void trim_progfile_dir(void) g_free(extcap_progfile_dir); } -#ifdef __MINGW64__ static char * trim_last_dir_from_path(const char *_path) { @@ -547,7 +546,6 @@ trim_last_dir_from_path(const char *_path) } return path; } -#endif /* * Construct the path name of a non-extcap Wireshark executable file, @@ -680,6 +678,9 @@ configuration_init_posix(const char* arg0) char *path; char *dir_end; + /* Hard-coded value used if we cannot obtain the path of the running executable. */ + install_prefix = g_strdup(INSTALL_PREFIX); + /* * Check whether XXX_RUN_FROM_BUILD_DIRECTORY is set in the * environment; if so, set running_in_build_directory_flag if we @@ -888,7 +889,6 @@ configuration_init_posix(const char* arg0) */ progfile_dir = prog_pathname; trim_progfile_dir(); - return NULL; } else { /* * This "shouldn't happen"; we apparently @@ -899,6 +899,24 @@ configuration_init_posix(const char* arg0) g_free(prog_pathname); return retstr; } + + /* + * We already have the program_dir. Find the installation prefix. + * This is one level up from the bin_dir. If the program_dir does + * not end with "bin" then assume we are running in the build directory + * and the "installation prefix" (staging directory) is the same as + * the program_dir. + */ + g_free(install_prefix); + if (g_str_has_suffix(progfile_dir, _S"bin")) { + install_prefix = trim_last_dir_from_path(progfile_dir); + } + else { + install_prefix = g_strdup(progfile_dir); + running_in_build_directory_flag = TRUE; + } + + return NULL; } #endif /* ?_WIN32 */ @@ -1035,12 +1053,7 @@ get_datafile_dir(void) */ datafile_dir = g_strdup(progfile_dir); } else { - /* - * XXX We might want want to make this relative to progfile_dir, which would - * allow installation into arbitrary directories and provide better AppImage - * support. - */ - datafile_dir = g_strdup(DATA_DIR); + datafile_dir = g_build_filename(install_prefix, DATA_DIR, (char *)NULL); } #endif return datafile_dir; @@ -1093,7 +1106,7 @@ get_doc_dir(void) */ doc_dir = g_strdup(progfile_dir); } else { - doc_dir = g_strdup(DOC_DIR); + doc_dir = g_build_filename(install_prefix, DOC_DIR, (char *)NULL); } #endif return doc_dir; @@ -1203,12 +1216,7 @@ init_plugin_dir(void) } #endif else { - /* - * XXX We might want want to make this relative to progfile_dir, which would - * allow installation into arbitrary directories and provide better AppImage - * support. - */ - plugin_dir = g_strdup(PLUGIN_DIR); + plugin_dir = g_build_filename(install_prefix, PLUGIN_DIR, (char *)NULL); } } #endif @@ -1343,12 +1351,7 @@ init_extcap_dir(void) } #endif else { - /* - * XXX We might want want to make this relative to progfile_dir, which would - * allow installation into arbitrary directories and provide better AppImage - * support. - */ - extcap_dir = g_strdup(EXTCAP_DIR); + extcap_dir = g_build_filename(install_prefix, EXTCAP_DIR, (char *)NULL); } #endif } diff --git a/wsutil/path_config.h.in b/wsutil/path_config.h.in new file mode 100644 index 0000000000..6539a5ab58 --- /dev/null +++ b/wsutil/path_config.h.in @@ -0,0 +1,10 @@ +#ifndef __PATH_CONFIG_H__ +#define __PATH_CONFIG_H__ + +#define INSTALL_PREFIX "@PATH_INSTALL_PREFIX@" +#define DATA_DIR "@PATH_DATA_DIR@" +#define DOC_DIR "@PATH_DOC_DIR@" +#define PLUGIN_DIR "@PATH_PLUGIN_DIR@" +#define EXTCAP_DIR "@PATH_EXTCAP_DIR@" + +#endif