aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2023-01-25 20:15:16 +0000
committerJoão Valverde <j@v6e.pt>2023-01-26 18:43:20 +0000
commitabdaed11030475d9b558667f91d2214258cfa105 (patch)
tree769c3c97c2ac1e5059e16178dc7fe0c98f301770 /wsutil
parentdb010b5a2758a7b76d53a3aa22414ba9d7d5419f (diff)
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.
Diffstat (limited to 'wsutil')
-rw-r--r--wsutil/CMakeLists.txt36
-rw-r--r--wsutil/filesystem.c51
-rw-r--r--wsutil/path_config.h.in10
3 files changed, 51 insertions, 46 deletions
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 <wiretap/wtap.h> /* 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