aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil/filesystem.c
diff options
context:
space:
mode:
Diffstat (limited to 'wsutil/filesystem.c')
-rw-r--r--wsutil/filesystem.c107
1 files changed, 82 insertions, 25 deletions
diff --git a/wsutil/filesystem.c b/wsutil/filesystem.c
index eb384a8594..25d6f1e499 100644
--- a/wsutil/filesystem.c
+++ b/wsutil/filesystem.c
@@ -11,6 +11,8 @@
#include "config.h"
#include "filesystem.h"
+#define WS_LOG_DOMAIN LOG_DOMAIN_WSUTIL
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -49,7 +51,19 @@
#define PLUGINS_DIR_NAME "plugins"
#define PROFILES_INFO_NAME "profile_files.txt"
-#define ENV_CONFIG_PATH_VAR "WIRESHARK_CONFIG_DIR"
+/*
+ * Application configuration namespace. Used to construct configuration
+ * paths and environment variables.
+ */
+enum configuration_namespace_e {
+ CONFIGURATION_NAMESPACE_UNINITIALIZED,
+ CONFIGURATION_NAMESPACE_WIRESHARK,
+ CONFIGURATION_NAMESPACE_LOGWOLF
+};
+enum configuration_namespace_e configuration_namespace = CONFIGURATION_NAMESPACE_UNINITIALIZED;
+
+#define CONFIGURATION_NAMESPACE_LOWER (configuration_namespace == CONFIGURATION_NAMESPACE_WIRESHARK ? "wireshark" : "logwolf")
+#define CONFIGURATION_ENVIRONMENT_VARIABLE(suffix) (configuration_namespace == CONFIGURATION_NAMESPACE_WIRESHARK ? "WIRESHARK_" suffix : "LOGWOLF_" suffix)
char *persconffile_dir = NULL;
char *datafile_dir = NULL;
@@ -258,6 +272,35 @@ static char *appbundle_dir;
*/
static gboolean running_in_build_directory_flag = FALSE;
+/*
+ * Set our configuration namespace. This will be used for top-level
+ * configuration directory names and environment variable prefixes.
+ */
+static void
+set_configuration_namespace(const char *namespace_name)
+{
+
+ if (namespace_name != CONFIGURATION_NAMESPACE_UNINITIALIZED) {
+ return;
+ }
+
+ if (!namespace_name || g_ascii_strcasecmp(namespace_name, "wireshark") == 0)
+ {
+ configuration_namespace = CONFIGURATION_NAMESPACE_WIRESHARK;
+ }
+ else if (namespace_name && g_ascii_strcasecmp(namespace_name, "logwolf") == 0)
+ {
+ configuration_namespace = CONFIGURATION_NAMESPACE_LOGWOLF;
+ }
+ else
+ {
+ ws_error("Unknown configuration namespace %s", namespace_name);
+ }
+
+ ws_debug("Using configuration namespace %s.",
+ configuration_namespace == CONFIGURATION_NAMESPACE_WIRESHARK ? "Wireshark" : "Logwolf");
+}
+
#ifndef _WIN32
/*
* Get the pathname of the executable using various platform-
@@ -467,14 +510,17 @@ get_executable_path(void)
* g_mallocated string containing an error on failure.
*/
char *
-init_progfile_dir(
+configuration_init(
#ifdef _WIN32
- const char* arg0 _U_
+ const char* arg0 _U_,
#else
- const char* arg0
+ const char* arg0,
#endif
+ const char *namespace_name
)
{
+ set_configuration_namespace(namespace_name);
+
#ifdef _WIN32
TCHAR prog_pathname_w[_MAX_PATH+2];
char *prog_pathname;
@@ -547,7 +593,7 @@ init_progfile_dir(
char *dir_end;
/*
- * Check whether WIRESHARK_RUN_FROM_BUILD_DIRECTORY is set in the
+ * Check whether XXX_RUN_FROM_BUILD_DIRECTORY is set in the
* environment; if so, set running_in_build_directory_flag if we
* weren't started with special privileges. (If we were started
* with special privileges, it's not safe to allow the user to point
@@ -555,9 +601,11 @@ init_progfile_dir(
* set, causes us to look for plugins and the like in the build
* directory.)
*/
- if (g_getenv("WIRESHARK_RUN_FROM_BUILD_DIRECTORY") != NULL
- && !started_with_special_privs())
+ const char *run_from_envar = CONFIGURATION_ENVIRONMENT_VARIABLE("RUN_FROM_BUILD_DIRECTORY");
+ if (g_getenv(run_from_envar) != NULL
+ && !started_with_special_privs()) {
running_in_build_directory_flag = TRUE;
+ }
execname = get_executable_path();
if (execname == NULL) {
@@ -841,13 +889,14 @@ get_datafile_dir(void)
}
#else
- if (g_getenv("WIRESHARK_DATA_DIR") && !started_with_special_privs()) {
+ const char *data_dir_envar = CONFIGURATION_ENVIRONMENT_VARIABLE("DATA_DIR");
+ if (g_getenv(data_dir_envar) && !started_with_special_privs()) {
/*
* The user specified a different directory for data files
* and we aren't running with special privileges.
* XXX - We might be able to dispense with the priv check
*/
- datafile_dir = g_strdup(g_getenv("WIRESHARK_DATA_DIR"));
+ datafile_dir = g_strdup(g_getenv(data_dir_envar));
}
#ifdef __APPLE__
/*
@@ -860,8 +909,8 @@ get_datafile_dir(void)
* it; we don't need to call started_with_special_privs().)
*/
else if (appbundle_dir != NULL) {
- datafile_dir = ws_strdup_printf("%s/Contents/Resources/share/wireshark",
- appbundle_dir);
+ datafile_dir = ws_strdup_printf("%s/Contents/Resources/share/%s",
+ appbundle_dir, CONFIGURATION_NAMESPACE_LOWER);
}
#endif
else if (running_in_build_directory_flag && progfile_dir != NULL) {
@@ -881,7 +930,6 @@ get_datafile_dir(void)
} else {
datafile_dir = g_strdup(DATA_DIR);
}
-
#endif
return datafile_dir;
}
@@ -959,12 +1007,13 @@ init_plugin_dir(void)
*/
plugin_dir = g_build_filename(get_progfile_dir(), "plugins", (gchar *)NULL);
} else {
- if (g_getenv("WIRESHARK_PLUGIN_DIR") && !started_with_special_privs()) {
+ const char *plugin_dir_envar = CONFIGURATION_ENVIRONMENT_VARIABLE("PLUGIN_DIR");
+ if (g_getenv(plugin_dir_envar) && !started_with_special_privs()) {
/*
* The user specified a different directory for plugins
* and we aren't running with special privileges.
*/
- plugin_dir = g_strdup(g_getenv("WIRESHARK_PLUGIN_DIR"));
+ plugin_dir = g_strdup(g_getenv(plugin_dir_envar));
}
#ifdef __APPLE__
/*
@@ -977,7 +1026,8 @@ init_plugin_dir(void)
* it; we don't need to call started_with_special_privs().)
*/
else if (appbundle_dir != NULL) {
- plugin_dir = g_build_filename(appbundle_dir, "Contents/PlugIns/wireshark", (gchar *)NULL);
+ plugin_dir = g_build_filename(appbundle_dir, "Contents/PlugIns",
+ CONFIGURATION_NAMESPACE_LOWER, (gchar *)NULL);
}
#endif
else {
@@ -995,7 +1045,8 @@ init_plugin_pers_dir(void)
#ifdef _WIN32
plugin_pers_dir = get_persconffile_path(PLUGINS_DIR_NAME, FALSE);
#else
- plugin_pers_dir = g_build_filename(g_get_home_dir(), ".local/lib/wireshark/" PLUGINS_DIR_NAME, (gchar *)NULL);
+ plugin_pers_dir = g_build_filename(g_get_home_dir(), ".local/lib",
+ CONFIGURATION_NAMESPACE_LOWER, PLUGINS_DIR_NAME, (gchar *)NULL);
#endif
#endif /* defined(HAVE_PLUGINS) || defined(HAVE_LUA) */
}
@@ -1061,12 +1112,13 @@ get_plugins_pers_dir_with_version(void)
static char *extcap_dir = NULL;
static void init_extcap_dir(void) {
- if (g_getenv("WIRESHARK_EXTCAP_DIR") && !started_with_special_privs()) {
+ const char *extcap_dir_envar = CONFIGURATION_ENVIRONMENT_VARIABLE("EXTCAP_DIR");
+ if (g_getenv(extcap_dir_envar) && !started_with_special_privs()) {
/*
* The user specified a different directory for extcap hooks
* and we aren't running with special privileges.
*/
- extcap_dir = g_strdup(g_getenv("WIRESHARK_EXTCAP_DIR"));
+ extcap_dir = g_strdup(g_getenv(extcap_dir_envar));
}
#ifdef _WIN32
else {
@@ -1255,7 +1307,8 @@ get_persconffile_dir_no_profile(void)
/*
* See if the user has selected an alternate environment.
*/
- env = g_getenv(ENV_CONFIG_PATH_VAR);
+ const char *config_dir_envar = CONFIGURATION_ENVIRONMENT_VARIABLE("CONFIG_DIR");
+ env = g_getenv(config_dir_envar);
#ifdef _WIN32
if (env == NULL) {
/* for backward compatibility */
@@ -1277,11 +1330,12 @@ get_persconffile_dir_no_profile(void)
* is an inaccessible network drive.
*/
env = g_getenv("APPDATA");
+ const char *persconf_namespace = configuration_namespace == CONFIGURATION_NAMESPACE_WIRESHARK ? "Wireshark" : "Logwolf";
if (env != NULL) {
/*
- * Concatenate %APPDATA% with "\Wireshark".
+ * Concatenate %APPDATA% with "\Wireshark" or "\Logwolf".
*/
- persconffile_dir = g_build_filename(env, "Wireshark", NULL);
+ persconffile_dir = g_build_filename(env, persconf_namespace, NULL);
return persconffile_dir;
}
@@ -1290,14 +1344,14 @@ get_persconffile_dir_no_profile(void)
*/
env = g_getenv("USERPROFILE");
if (env != NULL) {
- persconffile_dir = g_build_filename(env, "Application Data", "Wireshark", NULL);
+ persconffile_dir = g_build_filename(env, "Application Data", persconf_namespace, NULL);
return persconffile_dir;
}
/*
* Give up and use "C:".
*/
- persconffile_dir = g_build_filename("C:", "Wireshark", NULL);
+ persconffile_dir = g_build_filename("C:", persconf_namespace, NULL);
return persconffile_dir;
#else
char *xdg_path, *path;
@@ -1307,7 +1361,8 @@ get_persconffile_dir_no_profile(void)
/*
* Check if XDG_CONFIG_HOME/wireshark exists and is a directory.
*/
- xdg_path = g_build_filename(g_get_user_config_dir(), "wireshark", NULL);
+ xdg_path = g_build_filename(g_get_user_config_dir(),
+ CONFIGURATION_NAMESPACE_LOWER, NULL);
if (g_file_test(xdg_path, G_FILE_TEST_IS_DIR)) {
persconffile_dir = xdg_path;
return persconffile_dir;
@@ -1338,7 +1393,9 @@ get_persconffile_dir_no_profile(void)
homedir = "/tmp";
}
}
- path = g_build_filename(homedir, ".wireshark", NULL);
+ path = g_build_filename(homedir,
+ configuration_namespace == CONFIGURATION_NAMESPACE_WIRESHARK ? ".wireshark" : ".logwolf",
+ NULL);
if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
g_free(xdg_path);
persconffile_dir = path;