summaryrefslogtreecommitdiff
path: root/epan
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2013-11-17 02:55:14 +0000
committerGuy Harris <guy@alum.mit.edu>2013-11-17 02:55:14 +0000
commitdb25270df8bb4e4800e4d2c8a9f930b7a9fbc8df (patch)
tree93833061315be739594ff3614850eb4ca63266ec /epan
parentdd1034e1f5f2285721a9deb8b95ea17222e50939 (diff)
downloadwireshark-db25270df8bb4e4800e4d2c8a9f930b7a9fbc8df.tar.gz
Move the epan/filesystem.c routines to wsutil; they're not specific to
packet dissection, they're specific to the entire Wireshark suite of programs. svn path=/trunk/; revision=53377
Diffstat (limited to 'epan')
-rw-r--r--epan/CMakeLists.txt3
-rw-r--r--epan/Makefile.am3
-rw-r--r--epan/Makefile.common2
-rw-r--r--epan/addr_resolv.c2
-rw-r--r--epan/disabled_protos.c2
-rw-r--r--epan/dissectors/packet-diameter.c2
-rw-r--r--epan/dissectors/packet-lwapp.c2
-rw-r--r--epan/dissectors/packet-radius.c2
-rw-r--r--epan/dissectors/packet-ssl.c2
-rw-r--r--epan/dissectors/packet-tpncp.c2
-rw-r--r--epan/dissectors/packet-xml.c2
-rw-r--r--epan/filesystem.c2209
-rw-r--r--epan/filesystem.h306
-rw-r--r--epan/oids.c2
-rw-r--r--epan/plugins.c2
-rw-r--r--epan/prefs.c2
-rw-r--r--epan/print.c2
-rw-r--r--epan/uat.c2
-rw-r--r--epan/wslua/wslua.h2
19 files changed, 15 insertions, 2536 deletions
diff --git a/epan/CMakeLists.txt b/epan/CMakeLists.txt
index f287bd58d7..b9424dbd94 100644
--- a/epan/CMakeLists.txt
+++ b/epan/CMakeLists.txt
@@ -1480,7 +1480,6 @@ set(LIBWIRESHARK_FILES
except.c
expert.c
exported_pdu.c
- filesystem.c
filter_expressions.c
follow.c
frame_data.c
@@ -1682,8 +1681,6 @@ if(NOT ${ENABLE_STATIC})
)
endif()
-add_definitions( -DTOP_SRCDIR=\"${CMAKE_SOURCE_DIR}\" )
-
#
# Editor modelines - http://www.wireshark.org/tools/modelines.html
#
diff --git a/epan/Makefile.am b/epan/Makefile.am
index 907ae666df..69bd961a98 100644
--- a/epan/Makefile.am
+++ b/epan/Makefile.am
@@ -62,8 +62,7 @@ include Makefile.common
AM_CPPFLAGS = -I$(srcdir)/.. -I$(srcdir)/$(LEMON) -I$(builddir)/wslua \
@LUA_INCLUDES@ $(LIBGNUTLS_CFLAGS) $(LIBGCRYPT_CFLAGS) \
- $(LIBSMI_CFLAGS) $(LIBGEOIP_CFLAGS) $(PY_CFLAGS) \
- -DTOP_SRCDIR=\"$(abs_top_srcdir)\"
+ $(LIBSMI_CFLAGS) $(LIBGEOIP_CFLAGS) $(PY_CFLAGS)
AM_NON_GENERATED_CFLAGS =-DWS_BUILD_DLL
diff --git a/epan/Makefile.common b/epan/Makefile.common
index a18a468fb0..d4946abe60 100644
--- a/epan/Makefile.common
+++ b/epan/Makefile.common
@@ -51,7 +51,6 @@ LIBWIRESHARK_SRC = \
except.c \
expert.c \
exported_pdu.c \
- filesystem.c \
filter_expressions.c \
follow.c \
frame_data.c \
@@ -189,7 +188,6 @@ LIBWIRESHARK_INCLUDES = \
expert.h \
exported_pdu.h \
filter_expressions.h \
- filesystem.h \
follow.h \
frame_data.h \
frame_data_sequence.h \
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c
index 4322d1cb2a..98b969c7f2 100644
--- a/epan/addr_resolv.c
+++ b/epan/addr_resolv.c
@@ -122,7 +122,7 @@
#include "addr_and_mask.h"
#include "ipv6-utils.h"
#include "addr_resolv.h"
-#include "filesystem.h"
+#include "wsutil/filesystem.h"
#include <wsutil/report_err.h>
#include <wsutil/file_util.h>
diff --git a/epan/disabled_protos.c b/epan/disabled_protos.c
index 56b2622692..23f7b26547 100644
--- a/epan/disabled_protos.c
+++ b/epan/disabled_protos.c
@@ -35,7 +35,7 @@
#include <glib.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/proto.h>
#include "disabled_protos.h"
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index 8f28b29d60..e984bfbb3a 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -52,7 +52,7 @@
#include <epan/packet.h>
#include <epan/exceptions.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/prefs.h>
#include <epan/sminmpec.h>
#include <epan/wmem/wmem.h>
diff --git a/epan/dissectors/packet-lwapp.c b/epan/dissectors/packet-lwapp.c
index 06423ae988..b148ea4afb 100644
--- a/epan/dissectors/packet-lwapp.c
+++ b/epan/dissectors/packet-lwapp.c
@@ -29,7 +29,7 @@
#include "config.h"
#include <glib.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/packet.h>
#include <epan/addr_resolv.h>
#include <epan/prefs.h>
diff --git a/epan/dissectors/packet-radius.c b/epan/dissectors/packet-radius.c
index 32a01d1291..08c2c88ea5 100644
--- a/epan/dissectors/packet-radius.c
+++ b/epan/dissectors/packet-radius.c
@@ -69,7 +69,7 @@
#include <epan/exceptions.h>
#include <epan/prefs.h>
#include <epan/sminmpec.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/conversation.h>
#include <epan/tap.h>
#include <epan/addr_resolv.h>
diff --git a/epan/dissectors/packet-ssl.c b/epan/dissectors/packet-ssl.c
index 9406c78807..dfd5773c23 100644
--- a/epan/dissectors/packet-ssl.c
+++ b/epan/dissectors/packet-ssl.c
@@ -103,7 +103,7 @@
#include <epan/dissectors/packet-x509af.h>
#include <epan/dissectors/packet-ocsp.h>
#include <epan/tap.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/expert.h>
#include "packet-x509if.h"
#include "packet-ssl.h"
diff --git a/epan/dissectors/packet-tpncp.c b/epan/dissectors/packet-tpncp.c
index fe48c4aea7..1b03430c7b 100644
--- a/epan/dissectors/packet-tpncp.c
+++ b/epan/dissectors/packet-tpncp.c
@@ -40,7 +40,7 @@
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/emem.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/dissectors/packet-tcp.h>
#include <epan/strutil.h>
diff --git a/epan/dissectors/packet-xml.c b/epan/dissectors/packet-xml.c
index 4e34e991d9..9f34ca53ee 100644
--- a/epan/dissectors/packet-xml.c
+++ b/epan/dissectors/packet-xml.c
@@ -45,7 +45,7 @@
#include <epan/packet.h>
#include <epan/tvbparse.h>
#include <epan/dtd.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/prefs.h>
#include <epan/garrayfix.h>
diff --git a/epan/filesystem.c b/epan/filesystem.c
deleted file mode 100644
index fa292da4ce..0000000000
--- a/epan/filesystem.c
+++ /dev/null
@@ -1,2209 +0,0 @@
-/* filesystem.c
- * Filesystem utility routines
- *
- * $Id$
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-/*
- * Required with GNU libc to get dladdr().
- * We define it here because <dlfcn.h> apparently gets included by
- * one of the headers we include below.
- */
-#define _GNU_SOURCE
-
-#ifdef HAVE_DIRENT_H
-#include <dirent.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include <glib.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#ifdef _WIN32
-#include <windows.h>
-#include <tchar.h>
-#include <shlobj.h>
-#include <wsutil/unicode-utils.h>
-#else /* _WIN32 */
-#ifdef __APPLE__
-#include <mach-o/dyld.h>
-#endif
-#ifdef __linux__
-#include <sys/utsname.h>
-#endif
-#ifdef __FreeBSD__
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#endif
-#ifdef HAVE_DLADDR
-#include <dlfcn.h>
-#endif
-#include <pwd.h>
-#endif /* _WIN32 */
-
-#include "filesystem.h"
-#include <wsutil/report_err.h>
-#include <wsutil/privileges.h>
-#include <wsutil/file_util.h>
-
-#include <wiretap/wtap.h> /* for WTAP_ERR_SHORT_WRITE */
-
-#define PROFILES_DIR "profiles"
-#define PLUGINS_DIR_NAME "plugins"
-
-#define U3_MY_CAPTURES "\\My Captures"
-
-char *persconffile_dir = NULL;
-char *persdatafile_dir = NULL;
-char *persconfprofile = NULL;
-
-static gboolean do_store_persconffiles = FALSE;
-static GHashTable *profile_files = NULL;
-
-/*
- * Given a pathname, return a pointer to the last pathname separator
- * character in the pathname, or NULL if the pathname contains no
- * separators.
- */
-char *
-find_last_pathname_separator(const char *path)
-{
- char *separator;
-
-#ifdef _WIN32
- char c;
-
- /*
- * We have to scan for '\' or '/'.
- * Get to the end of the string.
- */
- separator = strchr(path, '\0'); /* points to ending '\0' */
- while (separator > path) {
- c = *--separator;
- if (c == '\\' || c == '/')
- return separator; /* found it */
- }
-
- /*
- * OK, we didn't find any, so no directories - but there might
- * be a drive letter....
- */
- return strchr(path, ':');
-#else
- separator = strrchr(path, '/');
- return separator;
-#endif
-}
-
-/*
- * Given a pathname, return the last component.
- */
-const char *
-get_basename(const char *path)
-{
- const char *filename;
-
- g_assert(path != NULL);
- filename = find_last_pathname_separator(path);
- if (filename == NULL) {
- /*
- * There're no directories, drive letters, etc. in the
- * name; the pathname *is* the file name.
- */
- filename = path;
- } else {
- /*
- * Skip past the pathname or drive letter separator.
- */
- filename++;
- }
- return filename;
-}
-
-/*
- * Given a pathname, return a string containing everything but the
- * last component. NOTE: this overwrites the pathname handed into
- * it....
- */
-char *
-get_dirname(char *path)
-{
- char *separator;
-
- g_assert(path != NULL);
- separator = find_last_pathname_separator(path);
- if (separator == NULL) {
- /*
- * There're no directories, drive letters, etc. in the
- * name; there is no directory path to return.
- */
- return NULL;
- }
-
- /*
- * Get rid of the last pathname separator and the final file
- * name following it.
- */
- *separator = '\0';
-
- /*
- * "path" now contains the pathname of the directory containing
- * the file/directory to which it referred.
- */
- return path;
-}
-
-/*
- * Given a pathname, return:
- *
- * the errno, if an attempt to "stat()" the file fails;
- *
- * EISDIR, if the attempt succeeded and the file turned out
- * to be a directory;
- *
- * 0, if the attempt succeeded and the file turned out not
- * to be a directory.
- */
-
-/*
- * Visual C++ on Win32 systems doesn't define these. (Old UNIX systems don't
- * define them either.)
- *
- * Visual C++ on Win32 systems doesn't define S_IFIFO, it defines _S_IFIFO.
- */
-#ifndef S_ISREG
-#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
-#endif
-#ifndef S_IFIFO
-#define S_IFIFO _S_IFIFO
-#endif
-#ifndef S_ISFIFO
-#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
-#endif
-#ifndef S_ISDIR
-#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
-#endif
-
-int
-test_for_directory(const char *path)
-{
- ws_statb64 statb;
-
- if (ws_stat64(path, &statb) < 0)
- return errno;
-
- if (S_ISDIR(statb.st_mode))
- return EISDIR;
- else
- return 0;
-}
-
-int
-test_for_fifo(const char *path)
-{
- ws_statb64 statb;
-
- if (ws_stat64(path, &statb) < 0)
- return errno;
-
- if (S_ISFIFO(statb.st_mode))
- return ESPIPE;
- else
- return 0;
-}
-
-/*
- * Directory from which the executable came.
- */
-static char *progfile_dir;
-
-#ifdef __APPLE__
-/*
- * Directory of the application bundle in which we're contained,
- * if we're contained in an application bundle. Otherwise, NULL.
- *
- * Note: Table 2-5 "Subdirectories of the Contents directory" of
- *
- * https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1
- *
- * says that the "Frameworks" directory
- *
- * Contains any private shared libraries and frameworks used by the
- * executable. The frameworks in this directory are revision-locked
- * to the application and cannot be superseded by any other, even
- * newer, versions that may be available to the operating system. In
- * other words, the frameworks included in this directory take precedence
- * over any other similarly named frameworks found in other parts of
- * the operating system. For information on how to add private
- * frameworks to your application bundle, see Framework Programming Guide.
- *
- * so if we were to ship with any frameworks (e.g. Qt) we should
- * perhaps put them in a Frameworks directory rather than under
- * Resources.
- *
- * It also says that the "PlugIns" directory
- *
- * Contains loadable bundles that extend the basic features of your
- * application. You use this directory to include code modules that
- * must be loaded into your applicationbs process space in order to
- * be used. You would not use this directory to store standalone
- * executables.
- *
- * Our plugins are just raw .so/.dylib files; I don't know whether by
- * "bundles" they mean application bundles (i.e., directory hierarchies)
- * or just "bundles" in the Mach-O sense (which are an image type that
- * can be loaded with dlopen() but not linked as libraries; our plugins
- * are, I think, built as dylibs and can be loaded either way).
- *
- * And it says that the "SharedSupport" directory
- *
- * Contains additional non-critical resources that do not impact the
- * ability of the application to run. You might use this directory to
- * include things like document templates, clip art, and tutorials
- * that your application expects to be present but that do not affect
- * the ability of your application to run.
- *
- * I don't think I'd put the files that currently go under Resources/share
- * into that category; they're not, for example, sample Lua scripts that
- * don't actually get run by Wireshark, they're configuration/data files
- * for Wireshark whose absence might not prevent Wireshark from running
- * but that would affect how it behaves when run.
- */
-static char *appbundle_dir;
-#endif
-
-/*
- * TRUE if we're running from the build directory and we aren't running
- * with special privileges.
- */
-static gboolean running_in_build_directory_flag = FALSE;
-
-#ifndef _WIN32
-/*
- * Get the pathname of the executable using various platform-
- * dependent mechanisms for various UN*Xes.
- *
- * These calls all should return something independent of the argv[0]
- * passed to the program, so it shouldn't be fooled by an argv[0]
- * that doesn't match the executable path.
- *
- * Sadly, not all UN*Xes necessarily have dladdr(), and those that
- * do don't necessarily have dladdr(main) return information about
- * the executable image, and those that do aren't necessarily running
- * on a platform wherein the executable image can get its own path
- * from the kernel (either by a call or by it being handed to it along
- * with argv[] and the environment), and those that can don't
- * necessarily use that to supply the path you get from dladdr(main),
- * so we try this first and, if that fails, use dladdr(main) if
- * available.
- *
- * In particular, some dynamic linkers supply a dladdr() such that
- * dladdr(main) just returns something derived from argv[0], so
- * just using dladdr(main) is the wrong thing to do if there's
- * another mechanism that can get you a more reliable version of
- * the executable path.
- *
- * However, at least in newer versions of DragonFly BSD, the dynamic
- * linker *does* get it from the aux vector passed to the program
- * by the kernel, readlink /proc/curproc/file - which came first?
- *
- * On OpenBSD, dladdr(main) returns a value derived from argv[0],
- * and there doesn't appear to be any way to get the executable path
- * from the kernel, so we're out of luck there.
- *
- * So, on platforms where some versions have a version of dladdr()
- * that gives an argv[0]-based path and that also have a mechanism
- * to get a more reliable version of the path, we try that. On
- * other platforms, we return NULL. If our caller gets back a NULL
- * from us, it falls back on dladdr(main) if dladdr() is available,
- * and if that fails or is unavailable, it falls back on processing
- * argv[0] itself.
- *
- * This is not guaranteed to return an absolute path; if it doesn't,
- * our caller must prepend the current directory if it's a path.
- *
- * This is not guaranteed to return the "real path"; it might return
- * something with symbolic links in the path. Our caller must
- * use realpath() if they want the real thing, but that's also true of
- * something obtained by looking at argv[0].
- */
-const char *
-get_executable_path(void)
-{
-#if defined(__APPLE__)
- char *executable_path;
- uint32_t path_buf_size;
-
- path_buf_size = PATH_MAX;
- executable_path = (char *)g_malloc(path_buf_size);
- if (_NSGetExecutablePath(executable_path, &path_buf_size) == -1) {
- executable_path = (char *)g_realloc(executable_path, path_buf_size);
- if (_NSGetExecutablePath(executable_path, &path_buf_size) == -1)
- return NULL;
- }
- return executable_path;
-#elif defined(__linux__)
- /*
- * In older versions of GNU libc's dynamic linker, as used on Linux,
- * dladdr(main) supplies a path based on argv[0], so we use
- * /proc/self/exe instead; there are Linux distributions with
- * kernels that support /proc/self/exe and those older versions
- * of the dynamic linker, and this will get a better answer on
- * those versions.
- *
- * It only works on Linux 2.2 or later, so we just give up on
- * earlier versions.
- *
- * XXX - are there OS versions that support "exe" but not "self"?
- */
- struct utsname name;
- static char executable_path[PATH_MAX];
-
- if (uname(&name) == -1)
- return NULL;
- if (strncmp(name.release, "1.", 2) == 0)
- return NULL; /* Linux 1.x */
- if (strcmp(name.release, "2.0") == 0 ||
- strncmp(name.release, "2.0.", 4) == 0 ||
- strcmp(name.release, "2.1") == 0 ||
- strncmp(name.release, "2.1.", 4) == 0)
- return NULL; /* Linux 2.0.x or 2.1.x */
- if (readlink("/proc/self/exe", executable_path, sizeof executable_path) == -1)
- return NULL;
- return executable_path;
-#elif defined(__FreeBSD__) && defined(KERN_PROC_PATHNAME)
- /*
- * In older versions of FreeBSD's dynamic linker, dladdr(main)
- * supplies a path based on argv[0], so we use the KERN_PROC_PATHNAME
- * sysctl instead; there are, I think, versions of FreeBSD
- * that support the sysctl that have and those older versions
- * of the dynamic linker, and this will get a better answer on
- * those versions.
- */
- int mib[4];
- char *executable_path;
- size_t path_buf_size;
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PATHNAME;
- mib[3] = -1;
- path_buf_size = PATH_MAX;
- executable_path = (char *)g_malloc(path_buf_size);
- if (sysctl(mib, 4, executable_path, &path_buf_size, NULL, 0) == -1) {
- if (errno != ENOMEM)
- return NULL;
- executable_path = (char *)g_realloc(executable_path, path_buf_size);
- if (sysctl(mib, 4, executable_path, &path_buf_size, NULL, 0) == -1)
- return NULL;
- }
- return executable_path;
-#elif defined(__NetBSD__)
- /*
- * In all versions of NetBSD's dynamic linker as of 2013-08-12,
- * dladdr(main) supplies a path based on argv[0], so we use
- * /proc/curproc/exe instead.
- *
- * XXX - are there OS versions that support "exe" but not "curproc"
- * or "self"? Are there any that support "self" but not "curproc"?
- */
- static char executable_path[PATH_MAX];
-
- if (readlink("/proc/curproc/exe", executable_path, sizeof executable_path) == -1)
- return NULL;
- return executable_path;
-#elif defined(__DragonFly__)
- /*
- * In older versions of DragonFly BSD's dynamic linker, dladdr(main)
- * supplies a path based on argv[0], so we use /proc/curproc/file
- * instead; it appears to be supported by all versions of DragonFly
- * BSD.
- */
- static char executable_path[PATH_MAX];
-
- if (readlink("/proc/curproc/file", executable_path, sizeof executable_path) == -1)
- return NULL;
- return executable_path;
-#elif (defined(sun) || defined(__sun)) && defined(HAVE_GETEXECNAME)
- /*
- * It appears that getexecname() dates back to at least Solaris 8,
- * but /proc/{pid}/path is first documented in the Solaris 10 documentation,
- * so we use getexecname() if available, rather than /proc/self/path/a.out
- * (which isn't documented, but appears to be a symlink to the
- * executable image file).
- */
- return getexecname();
-#else
- /* Fill in your favorite UN*X's code here, if there is something */
- return NULL;
-#endif
-}
-#endif /* _WIN32 */
-
-/*
- * Get the pathname of the directory from which the executable came,
- * and save it for future use. Returns NULL on success, and a
- * g_mallocated string containing an error on failure.
- */
-char *
-init_progfile_dir(const char *arg0
-#ifdef _WIN32
- _U_
-#endif
-, int (*main_addr)(int, char **)
-#if defined(_WIN32) || !defined(HAVE_DLADDR)
- _U_
-#endif
-)
-{
-#ifdef _WIN32
- TCHAR prog_pathname_w[_MAX_PATH+2];
- char *prog_pathname;
- DWORD error;
- TCHAR *msg_w;
- guchar *msg;
- size_t msglen;
-
- /*
- * Attempt to get the full pathname of the currently running
- * program.
- */
- if (GetModuleFileName(NULL, prog_pathname_w, G_N_ELEMENTS(prog_pathname_w)) != 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
- /*
- * XXX - Should we use g_utf16_to_utf8(), as in
- * getenv_utf8()?
- */
- prog_pathname = utf_16to8(prog_pathname_w);
- /*
- * We got it; strip off the last component, which would be
- * the file name of the executable, giving us the pathname
- * of the directory where the executable resides.
- */
- progfile_dir = g_path_get_dirname(prog_pathname);
- if (progfile_dir != NULL) {
- return NULL; /* we succeeded */
- } else {
- /*
- * OK, no. What do we do now?
- */
- return g_strdup_printf("No \\ in executable pathname \"%s\"",
- prog_pathname);
- }
- } else {
- /*
- * Oh, well. Return an indication of the error.
- */
- error = GetLastError();
- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, error, 0, (LPTSTR) &msg_w, 0, NULL) == 0) {
- /*
- * Gak. We can't format the message.
- */
- return g_strdup_printf("GetModuleFileName failed: %u (FormatMessage failed: %u)",
- error, GetLastError());
- }
- msg = utf_16to8(msg_w);
- LocalFree(msg_w);
- /*
- * "FormatMessage()" "helpfully" sticks CR/LF at the
- * end of the message. Get rid of it.
- */
- msglen = strlen(msg);
- if (msglen >= 2) {
- msg[msglen - 1] = '\0';
- msg[msglen - 2] = '\0';
- }
- return g_strdup_printf("GetModuleFileName failed: %s (%u)",
- msg, error);
- }
-#else
-#ifdef HAVE_DLADDR
- Dl_info info;
-#endif
- const char *execname;
- char *prog_pathname;
- char *curdir;
- long path_max;
- char *pathstr;
- char *path_start, *path_end;
- size_t path_component_len;
- char *retstr;
- char *path;
- char *dir_end;
-
- /*
- * Check whether WIRESHARK_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
- * us to some other directory; running_in_build_directory_flag, when
- * set, causes us to look for plugins and the like in the build
- * directory.)
- */
- if (getenv("WIRESHARK_RUN_FROM_BUILD_DIRECTORY") != NULL
- && !started_with_special_privs())
- running_in_build_directory_flag = TRUE;
-
- execname = get_executable_path();
-#ifdef HAVE_DLADDR
- if (main_addr != NULL && execname == NULL) {
- /*
- * Try to use dladdr() to find the pathname of the executable.
- * dladdr() is not guaranteed to give you anything better than
- * argv[0] (i.e., it might not contain a / at all, much less
- * being an absolute path), and doesn't appear to do so on
- * Linux, but on other platforms it could give you an absolute
- * path and obviate the need for us to determine the absolute
- * path.
- */
- if (dladdr((void *)main_addr, &info))
- execname = info.dli_fname;
- }
-#endif
- if (execname == NULL) {
- /*
- * OK, guess based on argv[0].
- */
- execname = arg0;
- }
-
- /*
- * Try to figure out the directory in which the currently running
- * program resides, given something purporting to be the executable
- * name (from dladdr() or from the argv[0] it was started with.
- * That might be the absolute path of the program, or a path relative
- * to the current directory of the process that started it, or
- * just a name for the program if it was started from the command
- * line and was searched for in $PATH. It's not guaranteed to be
- * any of those, however, so there are no guarantees....
- */
- if (execname[0] == '/') {
- /*
- * It's an absolute path.
- */
- prog_pathname = g_strdup(execname);
- } else if (strchr(execname, '/') != NULL) {
- /*
- * It's a relative path, with a directory in it.
- * Get the current directory, and combine it
- * with that directory.
- */
- path_max = pathconf(".", _PC_PATH_MAX);
- if (path_max == -1) {
- /*
- * We have no idea how big a buffer to
- * allocate for the current directory.
- */
- return g_strdup_printf("pathconf failed: %s\n",
- g_strerror(errno));
- }
- curdir = (char *)g_malloc(path_max);
- if (getcwd(curdir, path_max) == NULL) {
- /*
- * It failed - give up, and just stick
- * with DATAFILE_DIR.
- */
- g_free(curdir);
- return g_strdup_printf("getcwd failed: %s\n",
- g_strerror(errno));
- }
- path = g_strdup_printf("%s/%s", curdir, execname);
- g_free(curdir);
- prog_pathname = path;
- } else {
- /*
- * It's just a file name.
- * Search the path for a file with that name
- * that's executable.
- */
- prog_pathname = NULL; /* haven't found it yet */
- pathstr = getenv("PATH");
- path_start = pathstr;
- if (path_start != NULL) {
- while (*path_start != '\0') {
- path_end = strchr(path_start, ':');
- if (path_end == NULL)
- path_end = path_start + strlen(path_start);
- path_component_len = path_end - path_start;
- path = (char *)g_malloc(path_component_len + 1
- + strlen(execname) + 1);
- memcpy(path, path_start, path_component_len);
- path[path_component_len] = '\0';
- strncat(path, "/", 2);
- strncat(path, execname, strlen(execname) + 1);
- if (access(path, X_OK) == 0) {
- /*
- * Found it!
- */
- prog_pathname = path;
- break;
- }
-
- /*
- * That's not it. If there are more
- * path components to test, try them.
- */
- if (*path_end == '\0') {
- /*
- * There's nothing more to try.
- */
- break;
- }
- if (*path_end == ':')
- path_end++;
- path_start = path_end;
- g_free(path);
- }
- if (prog_pathname == NULL) {
- /*
- * Program not found in path.
- */
- return g_strdup_printf("\"%s\" not found in \"%s\"",
- execname, pathstr);
- }
- } else {
- /*
- * PATH isn't set.
- * XXX - should we pick a default?
- */
- return g_strdup("PATH isn't set");
- }
- }
-
- /*
- * OK, we have what we think is the pathname
- * of the program.
- *
- * First, find the last "/" in the directory,
- * as that marks the end of the directory pathname.
- */
- dir_end = strrchr(prog_pathname, '/');
- if (dir_end != NULL) {
- /*
- * Found it. Strip off the last component,
- * as that's the path of the program.
- */
- *dir_end = '\0';
-
- /*
- * Is there a "/.libs" at the end?
- */
- dir_end = strrchr(prog_pathname, '/');
- if (dir_end != NULL) {
- if (strcmp(dir_end, "/.libs") == 0) {
- /*
- * Yup, it's ".libs".
- * Strip that off; it's an
- * artifact of libtool.
- */
- *dir_end = '\0';
-
- /*
- * This presumably means we're run from
- * the libtool wrapper, which probably
- * means we're being run from the build
- * directory. If we weren't started
- * with special privileges, set
- * running_in_build_directory_flag.
- *
- * XXX - should we check whether what
- * follows ".libs/" begins with "lt-"?
- */
- if (!started_with_special_privs())
- running_in_build_directory_flag = TRUE;
- }
-#ifdef __APPLE__
- else {
- if (!started_with_special_privs()) {
- /*
- * Scan up the path looking for a component
- * named "Contents". If we find it, we assume
- * we're in a bundle, and that the top-level
- * directory of the bundle is the one containing
- * "Contents".
- *
- * Not all executables are in the Contents/MacOS
- * directory, so we can't just check for those
- * in the path and strip them off.
- *
- * XXX - should we assume that it's either
- * Contents/MacOS or Resources/bin?
- */
- char *component_end, *p;
-
- component_end = strchr(prog_pathname, '\0');
- p = component_end;
- for (;;) {
- while (p >= prog_pathname && *p != '/')
- p--;
- if (p == prog_pathname) {
- /*
- * We're looking at the first component of
- * the pathname now, so we're definitely
- * not in a bundle, even if we're in
- * "/Contents".
- */
- break;
- }
- if (strncmp(p, "/Contents", component_end - p) == 0) {
- /* Found it. */
- appbundle_dir = (char *)g_malloc(p - prog_pathname + 1);
- memcpy(appbundle_dir, prog_pathname, p - prog_pathname);
- appbundle_dir[p - prog_pathname] = '\0';
- break;
- }
- component_end = p;
- p--;
- }
- }
- }
-#endif
- }
-
- /*
- * OK, we have the path we want.
- */
- progfile_dir = prog_pathname;
- return NULL;
- } else {
- /*
- * This "shouldn't happen"; we apparently
- * have no "/" in the pathname.
- * Just free up prog_pathname.
- */
- retstr = g_strdup_printf("No / found in \"%s\"", prog_pathname);
- g_free(prog_pathname);
- return retstr;
- }
-#endif
-}
-
-/*
- * Get the directory in which the program resides.
- */
-const char *
-get_progfile_dir(void)
-{
- return progfile_dir;
-}
-
-/*
- * Get the directory in which the global configuration and data files are
- * stored.
- *
- * On Windows, we use the directory in which the executable for this
- * process resides.
- *
- * On UN*X, we use the DATAFILE_DIR value supplied by the configure
- * script, unless we think we're being run from the build directory,
- * in which case we use the directory in which the executable for this
- * process resides.
- *
- * XXX - if we ever make libwireshark a real library, used by multiple
- * applications (more than just TShark and versions of Wireshark with
- * various UIs), should the configuration files belong to the library
- * (and be shared by all those applications) or to the applications?
- *
- * If they belong to the library, that could be done on UNIX by the
- * configure script, but it's trickier on Windows, as you can't just
- * use the pathname of the executable.
- *
- * If they belong to the application, that could be done on Windows
- * by using the pathname of the executable, but we'd have to have it
- * passed in as an argument, in some call, on UNIX.
- *
- * Note that some of those configuration files might be used by code in
- * libwireshark, some of them might be used by dissectors (would they
- * belong to libwireshark, the application, or a separate library?),
- * and some of them might be used by other code (the Wireshark preferences
- * file includes resolver preferences that control the behavior of code
- * in libwireshark, dissector preferences, and UI preferences, for
- * example).
- */
-const char *
-get_datafile_dir(void)
-{
-#ifdef _WIN32
- char *u3deviceexecpath;
-#endif
- static const char *datafile_dir = NULL;
-
- if (datafile_dir != NULL)
- return datafile_dir;
-
-#ifdef _WIN32
- /*
- * See if we are running in a U3 environment.
- */
- u3deviceexecpath = getenv_utf8("U3_DEVICE_EXEC_PATH");
-
- if (u3deviceexecpath != NULL) {
- /*
- * We are; use the U3 device executable path.
- */
- datafile_dir = u3deviceexecpath;
- } else {
- /*
- * Do we have the pathname of the program? If so, assume we're
- * running an installed version of the program. If we fail,
- * we don't change "datafile_dir", and thus end up using the
- * default.
- *
- * XXX - does NSIS put the installation directory into
- * "\HKEY_LOCAL_MACHINE\SOFTWARE\Wireshark\InstallDir"?
- * If so, perhaps we should read that from the registry,
- * instead.
- */
- if (progfile_dir != NULL) {
- /*
- * Yes, we do; use that.
- */
- datafile_dir = progfile_dir;
- } else {
- /*
- * No, we don't.
- * Fall back on the default installation directory.
- */
- datafile_dir = "C:\\Program Files\\Wireshark\\";
- }
- }
-#else
-
- if (running_in_build_directory_flag) {
- /*
- * We're (probably) being run from the build directory and
- * weren't started with special privileges.
- *
- * (running_in_build_directory_flag is never set to TRUE
- * if we're started with special privileges, so we need
- * only check it; we don't need to call started_with_special_privs().)
- *
- * Use the top-level source directory as the datafile directory
- * because most of our data files (radius/, COPYING) are there.
- */
- datafile_dir = g_strdup(TOP_SRCDIR);
- return datafile_dir;
- } else {
- if (getenv("WIRESHARK_DATA_DIR") && !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(getenv("WIRESHARK_DATA_DIR"));
- }
-#ifdef __APPLE__
- /*
- * If we're running from an app bundle and weren't started
- * with special privileges, use the Contents/Resources/share/wireshark
- * subdirectory of the app bundle.
- *
- * (appbundle_dir is not set to a non-null value if we're
- * started with special privileges, so we need only check
- * it; we don't need to call started_with_special_privs().)
- */
- else if (appbundle_dir != NULL) {
- datafile_dir = g_strdup_printf("%s/Contents/Resources/share/wireshark",
- appbundle_dir);
- }
-#endif
- else {
- datafile_dir = DATAFILE_DIR;
- }
- }
-
-#endif
- return datafile_dir;
-}
-
-#ifdef HAVE_PYTHON
-/*
- * Find the directory where the python dissectors are stored.
- *
- * On Windows, we use the "py_dissector" subdirectory of the datafile directory.
- *
- * On UN*X, we use the PYTHON_DIR value supplied by the configure
- * script, unless we think we're being run from the build directory,
- * in which case we use the "py_dissector" subdirectory of the datafile directory.
- *
- * In both cases, we then use the subdirectory of that directory whose
- * name is the version number.
- *
- * XXX - if we think we're being run from the build directory, perhaps we
- * should have the plugin code not look in the version subdirectory
- * of the plugin directory, but look in all of the subdirectories
- * of the plugin directory, so it can just fetch the plugins built
- * as part of the build process.
- */
-static const char *wspython_dir = NULL;
-
-static void
-init_wspython_dir(void)
-{
-#ifdef _WIN32
- /*
- * On Windows, the data file directory is the installation
- * directory; the python dissectors are stored under it.
- *
- * Assume we're running the installed version of Wireshark;
- * on Windows, the data file directory is the directory
- * in which the Wireshark binary resides.
- */
- wspython_dir = g_strdup_printf("%s\\python\\%s", get_datafile_dir(),
- VERSION);
-
- /*
- * Make sure that pathname refers to a directory.
- */
- if (test_for_directory(wspython_dir) != EISDIR) {
- /*
- * Either it doesn't refer to a directory or it
- * refers to something that doesn't exist.
- *
- * Assume that means we're running a version of
- * Wireshark we've built in a build directory,
- * in which case {datafile dir}\python is the
- * top-level plugins source directory, and use
- * that directory and set the "we're running in
- * a build directory" flag, so the plugin
- * scanner will check all subdirectories of that
- * directory for python dissectors.
- */
- g_free( (gpointer) wspython_dir);
- wspython_dir = g_strdup_printf("%s\\python", get_datafile_dir());
- running_in_build_directory_flag = TRUE;
- }
-#else
- if (running_in_build_directory_flag) {
- /*
- * We're (probably) being run from the build directory and
- * weren't started with special privileges, so we'll use
- * the "python" subdirectory of the datafile directory
- * (the datafile directory is the build directory).
- */
- wspython_dir = g_strdup_printf("%s/epan/wspython/", get_datafile_dir());
- } else {
- if (getenv("WIRESHARK_PYTHON_DIR") && !started_with_special_privs()) {
- /*
- * The user specified a different directory for plugins
- * and we aren't running with special privileges.
- */
- wspython_dir = g_strdup(getenv("WIRESHARK_PYTHON_DIR"));
- }
-#ifdef __APPLE__
- /*
- * If we're running from an app bundle and weren't started
- * with special privileges, use the Contents/Resources/lib/wireshark/python
- * subdirectory of the app bundle.
- *
- * (appbundle_dir is not set to a non-null value if we're
- * started with special privileges, so we need only check
- * it; we don't need to call started_with_special_privs().)
- */
- else if (appbundle_dir != NULL) {
- wspython_dir = g_strdup_printf("%s/Contents/Resources/lib/wireshark/python",
- appbundle_dir);
- }
-#endif
- else {
- wspython_dir = PYTHON_DIR;
- }
- }
-#endif
-}
-#endif /* HAVE_PYTHON */
-
-/*
- * Get the directory in which the python dissectors are stored.
- */
-const char *
-get_wspython_dir(void)
-{
-#ifdef HAVE_PYTHON
- if (!wspython_dir) init_wspython_dir();
- return wspython_dir;
-#else
- return NULL;
-#endif
-}
-
-
-#if defined(HAVE_PLUGINS) || defined(HAVE_LUA)
-/*
- * Find the directory where the plugins are stored.
- *
- * On Windows, we use the "plugin" subdirectory of the datafile directory.
- *
- * On UN*X, we use the PLUGIN_DIR value supplied by the configure
- * script, unless we think we're being run from the build directory,
- * in which case we use the "plugin" subdirectory of the datafile directory.
- *
- * In both cases, we then use the subdirectory of that directory whose
- * name is the version number.
- *
- * XXX - if we think we're being run from the build directory, perhaps we
- * should have the plugin code not look in the version subdirectory
- * of the plugin directory, but look in all of the subdirectories
- * of the plugin directory, so it can just fetch the plugins built
- * as part of the build process.
- */
-static const char *plugin_dir = NULL;
-
-static void
-init_plugin_dir(void)
-{
-#ifdef _WIN32
- /*
- * On Windows, the data file directory is the installation
- * directory; the plugins are stored under it.
- *
- * Assume we're running the installed version of Wireshark;
- * on Windows, the data file directory is the directory
- * in which the Wireshark binary resides.
- */
- plugin_dir = g_strdup_printf("%s\\plugins\\%s", get_datafile_dir(),
- VERSION);
-
- /*
- * Make sure that pathname refers to a directory.
- */
- if (test_for_directory(plugin_dir) != EISDIR) {
- /*
- * Either it doesn't refer to a directory or it
- * refers to something that doesn't exist.
- *
- * Assume that means we're running a version of
- * Wireshark we've built in a build directory,
- * in which case {datafile dir}\plugins is the
- * top-level plugins source directory, and use
- * that directory and set the "we're running in
- * a build directory" flag, so the plugin
- * scanner will check all subdirectories of that
- * directory for plugins.
- */
- g_free( (gpointer) plugin_dir);
- plugin_dir = g_strdup_printf("%s\\plugins", get_datafile_dir());
- running_in_build_directory_flag = TRUE;
- }
-#else
- if (running_in_build_directory_flag) {
- /*
- * We're (probably) being run from the build directory and
- * weren't started with special privileges, so we'll use
- * the "plugins" subdirectory of the directory where the program
- * we're running is (that's the build directory).
- */
- plugin_dir = g_strdup_printf("%s/plugins", get_progfile_dir());
- } else {
- if (getenv("WIRESHARK_PLUGIN_DIR") && !started_with_special_privs()) {
- /*
- * The user specified a different directory for plugins
- * and we aren't running with special privileges.
- */
- plugin_dir = g_strdup(getenv("WIRESHARK_PLUGIN_DIR"));
- }
-#ifdef __APPLE__
- /*
- * If we're running from an app bundle and weren't started
- * with special privileges, use the Contents/Resources/lib/wireshark/plugins
- * subdirectory of the app bundle.
- *
- * (appbundle_dir is not set to a non-null value if we're
- * started with special privileges, so we need only check
- * it; we don't need to call started_with_special_privs().)
- */
- else if (appbundle_dir != NULL) {
- plugin_dir = g_strdup_printf("%s/Contents/Resources/lib/wireshark/plugins",
- appbundle_dir);
- }
-#endif
- else {
- plugin_dir = PLUGIN_DIR;
- }
- }
-#endif
-}
-#endif /* HAVE_PLUGINS || HAVE_LUA */
-
-/*
- * Get the directory in which the plugins are stored.
- */
-const char *
-get_plugin_dir(void)
-{
-#if defined(HAVE_PLUGINS) || defined(HAVE_LUA)
- if (!plugin_dir) init_plugin_dir();
- return plugin_dir;
-#else
- return NULL;
-#endif
-}
-
-/*
- * Get the flag indicating whether we're running from a build
- * directory.
- */
-gboolean
-running_in_build_directory(void)
-{
- return running_in_build_directory_flag;
-}
-
-/*
- * Get the directory in which files that, at least on UNIX, are
- * system files (such as "/etc/ethers") are stored; on Windows,
- * there's no "/etc" directory, so we get them from the global
- * configuration and data file directory.
- */
-const char *
-get_systemfile_dir(void)
-{
-#ifdef _WIN32
- return get_datafile_dir();
-#else
- return "/etc";
-#endif
-}
-
-/*
- * Name of directory, under the user's home directory, in which
- * personal configuration files are stored.
- */
-#ifdef _WIN32
-#define PF_DIR "Wireshark"
-#else
-/*
- * XXX - should this be ".libepan"? For backwards-compatibility, I'll keep
- * it ".wireshark" for now.
- */
-#define PF_DIR ".wireshark"
-#endif
-
-void
-set_profile_name(const gchar *profilename)
-{
- g_free (persconfprofile);
-
- if (profilename && strlen(profilename) > 0 &&
- strcmp(profilename, DEFAULT_PROFILE) != 0) {
- persconfprofile = g_strdup (profilename);
- } else {
- /* Default Profile */
- persconfprofile = NULL;
- }
-}
-
-const char *
-get_profile_name(void)
-{
- if (persconfprofile) {
- return persconfprofile;
- } else {
- return DEFAULT_PROFILE;
- }
-}
-
-gboolean
-is_default_profile(void)
-{
- return (!persconfprofile || strcmp(persconfprofile, DEFAULT_PROFILE) == 0) ? TRUE : FALSE;
-}
-
-gboolean
-has_global_profiles(void)
-{
- WS_DIR *dir;
- WS_DIRENT *file;
- const gchar *global_dir = get_global_profiles_dir();
- gchar *filename;
- gboolean has_global = FALSE;
-
- if ((test_for_directory(global_dir) == EISDIR) &&
- ((dir = ws_dir_open(global_dir, 0, NULL)) != NULL))
- {
- while ((file = ws_dir_read_name(dir)) != NULL) {
- filename = g_strdup_printf ("%s%s%s", global_dir, G_DIR_SEPARATOR_S,
- ws_dir_get_name(file));
- if (test_for_directory(filename) == EISDIR) {
- has_global = TRUE;
- g_free (filename);
- break;
- }
- g_free (filename);
- }
- ws_dir_close(dir);
- }
-
- return has_global;
-}
-
-void
-profile_store_persconffiles(gboolean store)
-{
- if (store) {
- profile_files = g_hash_table_new (g_str_hash, g_str_equal);
- }
- do_store_persconffiles = store;
-}
-
-/*
- * Get the directory in which personal configuration files reside;
- * in UNIX-compatible systems, it's ".wireshark", under the user's home
- * directory, and on Windows systems, it's "Wireshark", under %APPDATA%
- * or, if %APPDATA% isn't set, it's "%USERPROFILE%\Application Data"
- * (which is what %APPDATA% normally is on Windows 2000).
- */
-static const char *
-get_persconffile_dir_no_profile(void)
-{
-#ifdef _WIN32
- char *appdatadir;
- char *userprofiledir;
- char *altappdatapath;
-#else
- const char *homedir;
- struct passwd *pwd;
-#endif
-
- /* Return the cached value, if available */
- if (persconffile_dir != NULL)
- return persconffile_dir;
-
-#ifdef _WIN32
- /*
- * See if the user has selected an alternate environment.
- */
- altappdatapath = getenv_utf8("WIRESHARK_APPDATA");
- if (altappdatapath != NULL) {
- persconffile_dir = altappdatapath;
- return persconffile_dir;
- }
-
- /*
- * See if we are running in a U3 environment.
- */
- altappdatapath = getenv_utf8("U3_APP_DATA_PATH");
- if (altappdatapath != NULL) {
- /*
- * We are; use the U3 application data path.
- */
- persconffile_dir = altappdatapath;
- } else {
- /*
- * Use %APPDATA% or %USERPROFILE%, so that configuration
- * files are stored in the user profile, rather than in
- * the home directory. The Windows convention is to store
- * configuration information in the user profile, and doing
- * so means you can use Wireshark even if the home directory
- * is an inaccessible network drive.
- */
- appdatadir = getenv_utf8("APPDATA");
- if (appdatadir != NULL) {
- /*
- * Concatenate %APPDATA% with "\Wireshark".
- */
- persconffile_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s",
- appdatadir, PF_DIR);
- } else {
- /*
- * OK, %APPDATA% wasn't set, so use
- * %USERPROFILE%\Application Data.
- */
- userprofiledir = getenv_utf8("USERPROFILE");
- if (userprofiledir != NULL) {
- persconffile_dir = g_strdup_printf(
- "%s" G_DIR_SEPARATOR_S "Application Data" G_DIR_SEPARATOR_S "%s",
- userprofiledir, PF_DIR);
- } else {
- /*
- * Give up and use "C:".
- */
- persconffile_dir = g_strdup_printf("C:" G_DIR_SEPARATOR_S "%s", PF_DIR);
- }
- }
- }
-#else
- /*
- * If $HOME is set, use that.
- */
- homedir = getenv("HOME");
- if (homedir == NULL) {
- /*
- * Get their home directory from the password file.
- * If we can't even find a password file entry for them,
- * use "/tmp".
- */
- pwd = getpwuid(getuid());
- if (pwd != NULL) {
- homedir = pwd->pw_dir;
- } else {
- homedir = "/tmp";
- }
- }
- persconffile_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", homedir, PF_DIR);
-#endif
-
- return persconffile_dir;
-}
-
-const char *
-get_profiles_dir(void)
-{
- static char *profiles_dir = NULL;
-
- g_free (profiles_dir);
- profiles_dir = g_strdup_printf ("%s%s%s", get_persconffile_dir_no_profile (),
- G_DIR_SEPARATOR_S, PROFILES_DIR);
-
- return profiles_dir;
-}
-
-const char *
-get_global_profiles_dir(void)
-{
- static char *global_profiles_dir = NULL;
-
- if (!global_profiles_dir) {
- global_profiles_dir = g_strdup_printf ("%s%s%s", get_datafile_dir(),
- G_DIR_SEPARATOR_S, PROFILES_DIR);
- }
-
- return global_profiles_dir;
-}
-
-static const char *
-get_persconffile_dir(const gchar *profilename)
-{
- static char *persconffile_profile_dir = NULL;
-
- g_free (persconffile_profile_dir);
-
- if (profilename && strlen(profilename) > 0 &&
- strcmp(profilename, DEFAULT_PROFILE) != 0) {
- persconffile_profile_dir = g_strdup_printf ("%s%s%s", get_profiles_dir (),
- G_DIR_SEPARATOR_S, profilename);
- } else {
- persconffile_profile_dir = g_strdup (get_persconffile_dir_no_profile ());
- }
-
- return persconffile_profile_dir;
-}
-
-gboolean
-profile_exists(const gchar *profilename, gboolean global)
-{
- if (global) {
- gchar *path = g_strdup_printf ("%s%s%s", get_global_profiles_dir(),
- G_DIR_SEPARATOR_S, profilename);
- if (test_for_directory (path) == EISDIR) {
- g_free (path);
- return TRUE;
- }
- g_free (path);
- } else {
- if (test_for_directory (get_persconffile_dir (profilename)) == EISDIR) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static int
-delete_directory (const char *directory, char **pf_dir_path_return)
-{
- WS_DIR *dir;
- WS_DIRENT *file;
- gchar *filename;
- int ret = 0;
-
- if ((dir = ws_dir_open(directory, 0, NULL)) != NULL) {
- while ((file = ws_dir_read_name(dir)) != NULL) {
- filename = g_strdup_printf ("%s%s%s", directory, G_DIR_SEPARATOR_S,
- ws_dir_get_name(file));
- if (test_for_directory(filename) != EISDIR) {
- ret = ws_remove(filename);
-#if 0
- } else {
- /* The user has manually created a directory in the profile directory */
- /* I do not want to delete the directory recursively yet */
- ret = delete_directory (filename, pf_dir_path_return);
-#endif
- }
- if (ret != 0) {
- *pf_dir_path_return = filename;
- break;
- }
- g_free (filename);
- }
- ws_dir_close(dir);
- }
-
- if (ret == 0 && (ret = ws_remove(directory)) != 0) {
- *pf_dir_path_return = g_strdup (directory);
- }
-
- return ret;
-}
-
-int
-delete_persconffile_profile(const char *profilename, char **pf_dir_path_return)
-{
- const char *profile_dir = get_persconffile_dir(profilename);
- int ret = 0;
-
- if (test_for_directory (profile_dir) == EISDIR) {
- ret = delete_directory (profile_dir, pf_dir_path_return);
- }
-
- return ret;
-}
-
-int
-rename_persconffile_profile(const char *fromname, const char *toname,
- char **pf_from_dir_path_return, char **pf_to_dir_path_return)
-{
- char *from_dir = g_strdup (get_persconffile_dir(fromname));
- char *to_dir = g_strdup (get_persconffile_dir(toname));
- int ret = 0;
-
- ret = ws_rename (from_dir, to_dir);
- if (ret != 0) {
- *pf_from_dir_path_return = g_strdup (from_dir);
- *pf_to_dir_path_return = g_strdup (to_dir);
- }
-
- g_free (from_dir);
- g_free (to_dir);
-
- return ret;
-}
-
-/*
- * Create the directory that holds personal configuration files, if
- * necessary. If we attempted to create it, and failed, return -1 and
- * set "*pf_dir_path_return" to the pathname of the directory we failed
- * to create (it's g_mallocated, so our caller should free it); otherwise,
- * return 0.
- */
-int
-create_persconffile_profile(const char *profilename, char **pf_dir_path_return)
-{
- const char *pf_dir_path;
-#ifdef _WIN32
- char *pf_dir_path_copy, *pf_dir_parent_path;
- size_t pf_dir_parent_path_len;
-#endif
- ws_statb64 s_buf;
- int ret;
-
- if (profilename) {
- /*
- * Create the "Default" personal configuration files directory, if necessary.
- */
- if (create_persconffile_profile (NULL, pf_dir_path_return) == -1) {
- return -1;
- }
-
- /*
- * Check if profiles directory exists.
- * If not then create it.
- */
- pf_dir_path = get_profiles_dir ();
- if (ws_stat64(pf_dir_path, &s_buf) != 0 && errno == ENOENT) {
- ret = ws_mkdir(pf_dir_path, 0755);
- if (ret == -1) {
- *pf_dir_path_return = g_strdup(pf_dir_path);
- return ret;
- }
- }
- }
-
- pf_dir_path = get_persconffile_dir(profilename);
- if (ws_stat64(pf_dir_path, &s_buf) != 0 && errno == ENOENT) {
-#ifdef _WIN32
- /*
- * Does the parent directory of that directory
- * exist? %APPDATA% may not exist even though
- * %USERPROFILE% does.
- *
- * We check for the existence of the directory
- * by first checking whether the parent directory
- * is just a drive letter and, if it's not, by
- * doing a "stat()" on it. If it's a drive letter,
- * or if the "stat()" succeeds, we assume it exists.
- */
- pf_dir_path_copy = g_strdup(pf_dir_path);
- pf_dir_parent_path = get_dirname(pf_dir_path_copy);
- pf_dir_parent_path_len = strlen(pf_dir_parent_path);
- if (pf_dir_parent_path_len > 0
- && pf_dir_parent_path[pf_dir_parent_path_len - 1] != ':'
- && ws_stat64(pf_dir_parent_path, &s_buf) != 0) {
- /*
- * No, it doesn't exist - make it first.
- */
- ret = ws_mkdir(pf_dir_parent_path, 0755);
- if (ret == -1) {
- *pf_dir_path_return = pf_dir_parent_path;
- return -1;
- }
- }
- g_free(pf_dir_path_copy);
- ret = ws_mkdir(pf_dir_path, 0755);
-#else
- ret = ws_mkdir(pf_dir_path, 0755);
-#endif
- } else {
- /*
- * Something with that pathname exists; if it's not
- * a directory, we'll get an error if we try to put
- * something in it, so we don't fail here, we wait
- * for that attempt fo fail.
- */
- ret = 0;
- }
- if (ret == -1)
- *pf_dir_path_return = g_strdup(pf_dir_path);
- return ret;
-}
-
-int
-create_persconffile_dir(char **pf_dir_path_return)
-{
- return create_persconffile_profile(persconfprofile, pf_dir_path_return);
-}
-
-int
-copy_persconffile_profile(const char *toname, const char *fromname, gboolean from_global,
- char **pf_filename_return, char **pf_to_dir_path_return, char **pf_from_dir_path_return)
-{
- gchar *from_dir;
- gchar *to_dir = g_strdup (get_persconffile_dir(toname));
- gchar *filename, *from_file, *to_file;
- GList *files, *file;
-
- if (from_global) {
- if (strcmp(fromname, DEFAULT_PROFILE) == 0) {
- from_dir = g_strdup (get_global_profiles_dir());
- } else {
- from_dir = g_strdup_printf ("%s%s%s", get_global_profiles_dir(), G_DIR_SEPARATOR_S, fromname);
- }
- } else {
- from_dir = g_strdup (get_persconffile_dir(fromname));
- }
-
- files = g_hash_table_get_keys(profile_files);
- file = g_list_first(files);
- while (file) {
- filename = (gchar *)file->data;
- from_file = g_strdup_printf ("%s%s%s", from_dir, G_DIR_SEPARATOR_S, filename);
- to_file = g_strdup_printf ("%s%s%s", to_dir, G_DIR_SEPARATOR_S, filename);
-
- if (file_exists(from_file) && !copy_file_binary_mode(from_file, to_file)) {
- *pf_filename_return = g_strdup(filename);
- *pf_to_dir_path_return = to_dir;
- *pf_from_dir_path_return = from_dir;
- g_free (from_file);
- g_free (to_file);
- return -1;
- }
-
- g_free (from_file);
- g_free (to_file);
-
- file = g_list_next(file);
- }
-
- g_list_free (files);
- g_free (from_dir);
- g_free (to_dir);
-
- return 0;
-}
-
-/*
- * Get the (default) directory in which personal data is stored.
- *
- * On Win32, this is the "My Documents" folder in the personal profile,
- * except that, if we're running from a U3 device, this is the
- * "$U3_DEVICE_DOCUMENT_PATH\My Captures" folder.
- * On UNIX this is simply the current directory.
- */
-/* XXX - should this and the get_home_dir() be merged? */
-extern const char *
-get_persdatafile_dir(void)
-{
-#ifdef _WIN32
- char *u3devicedocumentpath;
- TCHAR tszPath[MAX_PATH];
- char *szPath;
- BOOL bRet;
-
- /* Return the cached value, if available */
- if (persdatafile_dir != NULL)
- return persdatafile_dir;
-
- /*
- * See if we are running in a U3 environment.
- */
- u3devicedocumentpath = getenv_utf8("U3_DEVICE_DOCUMENT_PATH");
-
- if (u3devicedocumentpath != NULL) {
- /* the "My Captures" sub-directory is created (if it doesn't
- exist) by u3util.exe when the U3 Wireshark is first run */
-
- szPath = g_strdup_printf("%s%s", u3devicedocumentpath, U3_MY_CAPTURES);
-
- persdatafile_dir = szPath;
- return szPath;
- } else {
- /*
- * Hint: SHGetFolderPath is not available on MSVC 6 - without
- * Platform SDK
- */
- bRet = SHGetSpecialFolderPath(NULL, tszPath, CSIDL_PERSONAL,
- FALSE);
- if(bRet == TRUE) {
- szPath = utf_16to8(tszPath);
- persdatafile_dir = szPath;
- return szPath;
- } else {
- return "";
- }
- }
-#else
- return "";
-#endif
-}
-
-#ifdef _WIN32
-/*
- * Returns the user's home directory on Win32.
- */
-static const char *
-get_home_dir(void)
-{
- static const char *home = NULL;
- char *homedrive, *homepath;
- char *homestring;
- char *lastsep;
-
- /* Return the cached value, if available */
- if (home)
- return home;
-
- /*
- * XXX - should we use USERPROFILE anywhere in this process?
- * Is there a chance that it might be set but one or more of
- * HOMEDRIVE or HOMEPATH isn't set?
- */
- homedrive = getenv_utf8("HOMEDRIVE");
- if (homedrive != NULL) {
- homepath = getenv_utf8("HOMEPATH");
- if (homepath != NULL) {
- /*
- * This is cached, so we don't need to worry about
- * allocating multiple ones of them.
- */
- homestring = g_strdup_printf("%s%s", homedrive, homepath);
-
- /*
- * Trim off any trailing slash or backslash.
- */
- lastsep = find_last_pathname_separator(homestring);
- if (lastsep != NULL && *(lastsep + 1) == '\0') {
- /*
- * Last separator is the last character
- * in the string. Nuke it.
- */
- *lastsep = '\0';
- }
- home = homestring;
- } else
- home = homedrive;
- } else {
- /*
- * Give up and use C:.
- */
- home = "C:";
- }
-
- return home;
-}
-#endif
-
-/*
- * Construct the path name of a personal configuration file, given the
- * file name.
- *
- * On Win32, if "for_writing" is FALSE, we check whether the file exists
- * and, if not, construct a path name relative to the ".wireshark"
- * subdirectory of the user's home directory, and check whether that
- * exists; if it does, we return that, so that configuration files
- * from earlier versions can be read.
- *
- * The returned file name was g_malloc()'d so it must be g_free()d when the
- * caller is done with it.
- */
-char *
-get_persconffile_path(const char *filename, gboolean from_profile)
-{
- char *path;
- if (do_store_persconffiles && from_profile && !g_hash_table_lookup (profile_files, filename)) {
- /* Store filenames so we know which filenames belongs to a configuration profile */
- g_hash_table_insert (profile_files, g_strdup(filename), g_strdup(filename));
- }
-
- if (from_profile) {
- path = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s",
- get_persconffile_dir(persconfprofile), filename);
- } else {
- path = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s",
- get_persconffile_dir(NULL), filename);
- }
-
- return path;
-}
-
-/*
- * process command line option belonging to the filesystem settings
- * (move this e.g. to main.c and have set_persconffile_dir() instead in this file?)
- */
-int
-filesystem_opt(int opt _U_, const char *optstr)
-{
- gchar *p, *colonp;
-
- colonp = strchr(optstr, ':');
- if (colonp == NULL) {
- return 1;
- }
-
- p = colonp;
- *p++ = '\0';
-
- /*
- * Skip over any white space (there probably won't be any, but
- * as we allow it in the preferences file, we might as well
- * allow it here).
- */
- while (isspace((guchar)*p))
- p++;
- if (*p == '\0') {
- /*
- * Put the colon back, so if our caller uses, in an
- * error message, the string they passed us, the message
- * looks correct.
- */
- *colonp = ':';
- return 1;
- }
-
- /* directory should be existing */
- /* XXX - is this a requirement? */
- if(test_for_directory(p) != EISDIR) {
- /*
- * Put the colon back, so if our caller uses, in an
- * error message, the string they passed us, the message
- * looks correct.
- */
- *colonp = ':';
- return 1;
- }
-
- if (strcmp(optstr,"persconf") == 0) {
- persconffile_dir = p;
- } else if (strcmp(optstr,"persdata") == 0) {
- persdatafile_dir = p;
- /* XXX - might need to add the temp file path */
- } else {
- return 1;
- }
- *colonp = ':'; /* put the colon back */
- return 0;
-}
-
-/*
- * Construct the path name of a global configuration file, given the
- * file name.
- *
- * The returned file name was g_malloc()'d so it must be g_free()d when the
- * caller is done with it.
- */
-char *
-get_datafile_path(const char *filename)
-{
- if (running_in_build_directory_flag && !strcmp(filename, "AUTHORS-SHORT")) {
- /* We're running in the build directory and the requested file is a
- * generated file. Return the file name in the build directory (not
- * in the source/data directory).
- */
- return g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", get_progfile_dir(), filename);
- } else {
- return g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", get_datafile_dir(), filename);
- }
-}
-
-/* Get the personal plugin dir */
-/* Return value is malloced so the caller should g_free() it. */
-char *
-get_plugins_pers_dir(void)
-{
- return get_persconffile_path(PLUGINS_DIR_NAME, FALSE);
-}
-
-/* Delete a file */
-gboolean
-deletefile(const char *path)
-{
- return ws_unlink(path) == 0;
-}
-
-/*
- * Construct and return the path name of a file in the
- * appropriate temporary file directory.
- */
-char *get_tempfile_path(const char *filename)
-{
- return g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", g_get_tmp_dir(), filename);
-}
-
-/*
- * Return an error message for UNIX-style errno indications on open or
- * create operations.
- */
-const char *
-file_open_error_message(int err, gboolean for_writing)
-{
- const char *errmsg;
- static char errmsg_errno[1024+1];
-
- switch (err) {
-
- case ENOENT:
- if (for_writing)
- errmsg = "The path to the file \"%s\" doesn't exist.";
- else
- errmsg = "The file \"%s\" doesn't exist.";
- break;
-
- case EACCES:
- if (for_writing)
- errmsg = "You don't have permission to create or write to the file \"%s\".";
- else
- errmsg = "You don't have permission to read the file \"%s\".";
- break;
-
- case EISDIR:
- errmsg = "\"%s\" is a directory (folder), not a file.";
- break;
-
- case ENOSPC:
- errmsg = "The file \"%s\" could not be created because there is no space left on the file system.";
- break;
-
-#ifdef EDQUOT
- case EDQUOT:
- errmsg = "The file \"%s\" could not be created because you are too close to, or over, your disk quota.";
- break;
-#endif
-
- case EINVAL:
- errmsg = "The file \"%s\" could not be created because an invalid filename was specified.";
- break;
-
- case ENOMEM:
- /*
- * The problem probably has nothing to do with how much RAM the
- * user has on their machine, so don't confuse them by saying
- * "memory". The problem is probably either virtual address
- * space or swap space.
- */
-#if GLIB_SIZEOF_VOID_P == 4
- /*
- * ILP32; we probably ran out of virtual address space.
- */
-#define ENOMEM_REASON "it can't be handled by a 32-bit application"
-#else
- /*
- * LP64 or LLP64; we probably ran out of swap space.
- */
-#if defined(_WIN32)
- /*
- * You need to make the pagefile bigger.
- */
-#define ENOMEM_REASON "the pagefile is too small"
-#elif defined(__APPLE__)
- /*
- * dynamic_pager couldn't, or wouldn't, create more swap files.
- */
-#define ENOMEM_REASON "your system ran out of swap file space"
-#else
- /*
- * Either you have a fixed swap partition or a fixed swap file,
- * and it needs to be made bigger.
- *
- * This is UN*X, but it's not OS X, so we assume the user is
- * *somewhat* nerdy.
- */
-#define ENOMEM_REASON "your system is out of swap space"
-#endif
-#endif /* GLIB_SIZEOF_VOID_P == 4 */
- if (for_writing)
- errmsg = "The file \"%s\" could not be created because " ENOMEM_REASON ".";
- else
- errmsg = "The file \"%s\" could not be opened because " ENOMEM_REASON ".";
- break;
-
- default:
- g_snprintf(errmsg_errno, sizeof(errmsg_errno),
- "The file \"%%s\" could not be %s: %s.",
- for_writing ? "created" : "opened",
- g_strerror(err));
- errmsg = errmsg_errno;
- break;
- }
- return errmsg;
-}
-
-/*
- * Return an error message for UNIX-style errno indications on write
- * operations.
- */
-const char *
-file_write_error_message(int err)
-{
- const char *errmsg;
- static char errmsg_errno[1024+1];
-
- switch (err) {
-
- case ENOSPC:
- errmsg = "The file \"%s\" could not be saved because there is no space left on the file system.";
- break;
-
-#ifdef EDQUOT
- case EDQUOT:
- errmsg = "The file \"%s\" could not be saved because you are too close to, or over, your disk quota.";
- break;
-#endif
-
- default:
- g_snprintf(errmsg_errno, sizeof(errmsg_errno),
- "An error occurred while writing to the file \"%%s\": %s.",
- g_strerror(err));
- errmsg = errmsg_errno;
- break;
- }
- return errmsg;
-}
-
-
-gboolean
-file_exists(const char *fname)
-{
- ws_statb64 file_stat;
-
- if (!fname) {
- return FALSE;
- }
-
-#ifdef _WIN32
- /*
- * This is a bit tricky on win32. The st_ino field is documented as:
- * "The inode, and therefore st_ino, has no meaning in the FAT, ..."
- * but it *is* set to zero if stat() returns without an error,
- * so this is working, but maybe not quite the way expected. ULFL
- */
- file_stat.st_ino = 1; /* this will make things work if an error occurred */
- ws_stat64(fname, &file_stat);
- if (file_stat.st_ino == 0) {
- return TRUE;
- } else {
- return FALSE;
- }
-#else
- if (ws_stat64(fname, &file_stat) != 0 && errno == ENOENT) {
- return FALSE;
- } else {
- return TRUE;
- }
-#endif
-}
-
-/*
- * Check that the from file is not the same as to file
- * We do it here so we catch all cases ...
- * Unfortunately, the file requester gives us an absolute file
- * name and the read file name may be relative (if supplied on
- * the command line), so we can't just compare paths. From Joerg Mayer.
- */
-gboolean
-files_identical(const char *fname1, const char *fname2)
-{
- /* Two different implementations, because:
- *
- * - _fullpath is not available on UN*X, so we can't get full
- * paths and compare them (which wouldn't work with hard links
- * in any case);
- *
- * - st_ino isn't filled in with a meaningful value on Windows.
- */
-#ifdef _WIN32
- char full1[MAX_PATH], full2[MAX_PATH];
-
- /*
- * Get the absolute full paths of the file and compare them.
- * That won't work if you have hard links, but those aren't
- * much used on Windows, even though NTFS supports them.
- *
- * XXX - will _fullpath work with UNC?
- */
- if( _fullpath( full1, fname1, MAX_PATH ) == NULL ) {
- return FALSE;
- }
-
- if( _fullpath( full2, fname2, MAX_PATH ) == NULL ) {
- return FALSE;
- }
-
- if(strcmp(full1, full2) == 0) {
- return TRUE;
- } else {
- return FALSE;
- }
-#else
- ws_statb64 filestat1, filestat2;
-
- /*
- * Compare st_dev and st_ino.
- */
- if (ws_stat64(fname1, &filestat1) == -1)
- return FALSE; /* can't get info about the first file */
- if (ws_stat64(fname2, &filestat2) == -1)
- return FALSE; /* can't get info about the second file */
- return (filestat1.st_dev == filestat2.st_dev &&
- filestat1.st_ino == filestat2.st_ino);
-#endif
-}
-
-/*
- * Copy a file in binary mode, for those operating systems that care about
- * such things. This should be OK for all files, even text files, as
- * we'll copy the raw bytes, and we don't look at the bytes as we copy
- * them.
- *
- * Returns TRUE on success, FALSE on failure. If a failure, it also
- * displays a simple dialog window with the error message.
- */
-gboolean
-copy_file_binary_mode(const char *from_filename, const char *to_filename)
-{
- int from_fd, to_fd, err;
- ssize_t nread, nwritten;
- guint8 *pd = NULL;
-
- /* Copy the raw bytes of the file. */
- from_fd = ws_open(from_filename, O_RDONLY | O_BINARY, 0000 /* no creation so don't matter */);
- if (from_fd < 0) {
- report_open_failure(from_filename, errno, FALSE);
- goto done;
- }
-
- /* Use open() instead of creat() so that we can pass the O_BINARY
- flag, which is relevant on Win32; it appears that "creat()"
- may open the file in text mode, not binary mode, but we want
- to copy the raw bytes of the file, so we need the output file
- to be open in binary mode. */
- to_fd = ws_open(to_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
- if (to_fd < 0) {
- report_open_failure(to_filename, errno, TRUE);
- ws_close(from_fd);
- goto done;
- }
-
-#define FS_READ_SIZE 65536
- pd = (guint8 *)g_malloc(FS_READ_SIZE);
- while ((nread = ws_read(from_fd, pd, FS_READ_SIZE)) > 0) {
- nwritten = ws_write(to_fd, pd, nread);
- if (nwritten < nread) {
- if (nwritten < 0)
- err = errno;
- else
- err = WTAP_ERR_SHORT_WRITE;
- report_write_failure(to_filename, err);
- ws_close(from_fd);
- ws_close(to_fd);
- goto done;
- }
- }
- if (nread < 0) {
- err = errno;
- report_read_failure(from_filename, err);
- ws_close(from_fd);
- ws_close(to_fd);
- goto done;
- }
- ws_close(from_fd);
- if (ws_close(to_fd) < 0) {
- report_write_failure(to_filename, errno);
- goto done;
- }
-
- g_free(pd);
- pd = NULL;
- return TRUE;
-
-done:
- g_free(pd);
- return FALSE;
-}
-
-/*
- * Editor modelines
- *
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set shiftwidth=4 tabstop=8 expandtab:
- * :indentSize=4:tabSize=8:noTabs=true:
- */
diff --git a/epan/filesystem.h b/epan/filesystem.h
deleted file mode 100644
index 6b76bab4fc..0000000000
--- a/epan/filesystem.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/* filesystem.h
- * Filesystem utility definitions
- *
- * $Id$
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef FILESYSTEM_H
-#define FILESYSTEM_H
-
-#include "ws_symbol_export.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
- * Default profile name.
- */
-#define DEFAULT_PROFILE "Default"
-
-
-/*
- * Get the pathname of the directory from which the executable came,
- * and save it for future use. Returns NULL on success, and a
- * g_mallocated string containing an error on failure.
- */
-WS_DLL_PUBLIC char *init_progfile_dir(const char *arg0, int (*main)(int, char **));
-
-/*
- * Get the directory in which the program resides.
- */
-WS_DLL_PUBLIC const char *get_progfile_dir(void);
-
-/*
- * Get the directory in which plugins are stored; this must not be called
- * before init_progfile_dir() is called, as they might be stored in a
- * subdirectory of the program file directory.
- */
-WS_DLL_PUBLIC const char *get_plugin_dir(void);
-
-/*
- * Get the directory in which python plugins are stored; this must not be
- * called before init_progfile_dir() is called, as they might be stored in a
- * subdirectory of the program file directory.
- */
-WS_DLL_PUBLIC const char *get_wspython_dir(void);
-
-/*
- * Get the flag indicating whether we're running from a build
- * directory.
- */
-WS_DLL_PUBLIC gboolean running_in_build_directory(void);
-
-/*
- * Get the directory in which global configuration files are
- * stored.
- */
-WS_DLL_PUBLIC const char *get_datafile_dir(void);
-
-/*
- * Construct the path name of a global configuration file, given the
- * file name.
- *
- * The returned file name was g_malloc()'d so it must be g_free()d when the
- * caller is done with it.
- */
-WS_DLL_PUBLIC char *get_datafile_path(const char *filename);
-
-/*
- * Get the personal plugin dir.
- */
-WS_DLL_PUBLIC char *get_plugins_pers_dir(void);
-
-/*
- * Get the directory in which files that, at least on UNIX, are
- * system files (such as "/etc/ethers") are stored; on Windows,
- * there's no "/etc" directory, so we get them from the Wireshark
- * global configuration and data file directory.
- */
-WS_DLL_PUBLIC const char *get_systemfile_dir(void);
-
-/*
- * Set the configuration profile name to be used for storing
- * personal configuration files.
- */
-WS_DLL_PUBLIC void set_profile_name(const gchar *profilename);
-
-/*
- * Get the current configuration profile name used for storing
- * personal configuration files.
- */
-WS_DLL_PUBLIC const char *get_profile_name(void);
-
-/*
- * Check if current profile is default profile.
- */
-WS_DLL_PUBLIC gboolean is_default_profile(void);
-
-/*
- * Check if we have global profiles.
- */
-WS_DLL_PUBLIC gboolean has_global_profiles(void);
-
-/*
- * Get the directory used to store configuration profile directories.
- */
-WS_DLL_PUBLIC const char *get_profiles_dir(void);
-
-/*
- * Get the directory used to store global configuration profile directories.
- */
-WS_DLL_PUBLIC const char *get_global_profiles_dir(void);
-
-
-/*
- * Store filenames used for personal config files so we know which
- * files to copy when duplicate a configuration profile.
- */
-WS_DLL_PUBLIC void profile_store_persconffiles(gboolean store);
-
-/*
- * Check if given configuration profile exists.
- */
-WS_DLL_PUBLIC gboolean profile_exists(const gchar *profilename, gboolean global);
-
-/*
- * Create a directory for the given configuration profile.
- * If we attempted to create it, and failed, return -1 and
- * set "*pf_dir_path_return" to the pathname of the directory we failed
- * to create (it's g_mallocated, so our caller should free it); otherwise,
- * return 0.
- */
-WS_DLL_PUBLIC int create_persconffile_profile(const char *profilename,
- char **pf_dir_path_return);
-
-/*
- * Delete the directory for the given configuration profile.
- * If we attempted to delete it, and failed, return -1 and
- * set "*pf_dir_path_return" to the pathname of the directory we failed
- * to delete (it's g_mallocated, so our caller should free it); otherwise,
- * return 0.
- */
-WS_DLL_PUBLIC int delete_persconffile_profile(const char *profilename,
- char **pf_dir_path_return);
-
-/*
- * Rename the directory for the given confinguration profile.
- */
-WS_DLL_PUBLIC int rename_persconffile_profile(const char *fromname, const char *toname,
- char **pf_from_dir_path_return,
- char **pf_to_dir_path_return);
-
-/*
- * Copy files in one profile to the other.
- */
-WS_DLL_PUBLIC int copy_persconffile_profile(const char *toname, const char *fromname,
- gboolean from_global,
- char **pf_filename_return,
- char **pf_to_dir_path_return,
- char **pf_from_dir_path_return);
-
-/*
- * Create the directory that holds personal configuration files, if
- * necessary. If we attempted to create it, and failed, return -1 and
- * set "*pf_dir_path_return" to the pathname of the directory we failed
- * to create (it's g_mallocated, so our caller should free it); otherwise,
- * return 0.
- */
-WS_DLL_PUBLIC int create_persconffile_dir(char **pf_dir_path_return);
-
-/*
- * Construct the path name of a personal configuration file, given the
- * file name. If using configuration profiles this directory will be
- * used if "from_profile" is TRUE.
- *
- * The returned file name was g_malloc()'d so it must be g_free()d when the
- * caller is done with it.
- */
-WS_DLL_PUBLIC char *get_persconffile_path(const char *filename, gboolean from_profile);
-
-/*
- * Get the (default) directory in which personal data is stored.
- *
- * On Win32, this is the "My Documents" folder in the personal profile.
- * On UNIX this is simply the current directory.
- */
-WS_DLL_PUBLIC const char *get_persdatafile_dir(void);
-
-/*
- * Construct the path name of a file in $TMP/%TEMP% directory.
- * Or "/tmp/<filename>" (C:\<filename>) if that fails.
- *
- * Return value is g_malloced so the caller should g_free it.
- */
-WS_DLL_PUBLIC char *get_tempfile_path(const char *filename);
-
-/*
- * process command line option belonging to the filesystem settings
- */
-WS_DLL_PUBLIC int filesystem_opt(int opt, const char *optstr);
-
-/*
- * Return an error message for UNIX-style errno indications on open or
- * create operations.
- */
-WS_DLL_PUBLIC const char *file_open_error_message(int err, gboolean for_writing);
-
-/*
- * Return an error message for UNIX-style errno indications on write
- * operations.
- */
-WS_DLL_PUBLIC const char *file_write_error_message(int err);
-
-/*
- * Given a pathname, return the last component.
- */
-WS_DLL_PUBLIC const char *get_basename(const char *);
-
- /*
- * Given a pathname, return a pointer to the last pathname separator
- * character in the pathname, or NULL if the pathname contains no
- * separators.
- */
-WS_DLL_PUBLIC char *find_last_pathname_separator(const char *path);
-
-/*
- * Given a pathname, return a string containing everything but the
- * last component. NOTE: this overwrites the pathname handed into
- * it....
- */
-WS_DLL_PUBLIC char *get_dirname(char *);
-
-/*
- * Given a pathname, return:
- *
- * the errno, if an attempt to "stat()" the file fails;
- *
- * EISDIR, if the attempt succeeded and the file turned out
- * to be a directory;
- *
- * 0, if the attempt succeeded and the file turned out not
- * to be a directory.
- */
-WS_DLL_PUBLIC int test_for_directory(const char *);
-
-/*
- * Given a pathname, return:
- *
- * the errno, if an attempt to "stat()" the file fails;
- *
- * ESPIPE, if the attempt succeeded and the file turned out
- * to be a FIFO;
- *
- * 0, if the attempt succeeded and the file turned out not
- * to be a FIFO.
- */
-WS_DLL_PUBLIC int test_for_fifo(const char *);
-
-/* Delete a file */
-WS_DLL_PUBLIC gboolean deletefile (const char *path);
-
-/*
- * Check, if file is existing.
- */
-WS_DLL_PUBLIC gboolean file_exists(const char *fname);
-
-/*
- * Check if two filenames are identical (with absolute and relative paths).
- */
-WS_DLL_PUBLIC gboolean files_identical(const char *fname1, const char *fname2);
-
-/*
- * Copy a file in binary mode, for those operating systems that care about
- * such things. This should be OK for all files, even text files, as
- * we'll copy the raw bytes, and we don't look at the bytes as we copy
- * them.
- *
- * Returns TRUE on success, FALSE on failure. If a failure, it also
- * displays a simple dialog window with the error message.
- */
-WS_DLL_PUBLIC gboolean copy_file_binary_mode(const char *from_filename,
- const char *to_filename);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* FILESYSTEM_H */
diff --git a/epan/oids.c b/epan/oids.c
index b34f9593bb..b5c9b63d32 100644
--- a/epan/oids.c
+++ b/epan/oids.c
@@ -39,7 +39,7 @@
#include "prefs.h"
#include "proto.h"
#include "packet.h"
-#include "filesystem.h"
+#include "wsutil/filesystem.h"
#include "dissectors/packet-ber.h"
#ifdef HAVE_LIBSMI
diff --git a/epan/plugins.c b/epan/plugins.c
index c5995b84e5..51955e06ca 100644
--- a/epan/plugins.c
+++ b/epan/plugins.c
@@ -50,7 +50,7 @@ wslua_plugin *wslua_plugin_list = NULL;
#include <unistd.h>
#endif
-#include "filesystem.h"
+#include "wsutil/filesystem.h"
#include <wsutil/privileges.h>
#include <wsutil/file_util.h>
#include <wsutil/report_err.h>
diff --git a/epan/prefs.c b/epan/prefs.c
index 1476dc9e87..d0cf5817bc 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -36,7 +36,7 @@
#include <glib.h>
#include <stdio.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/address.h>
#include <epan/addr_resolv.h>
#include <epan/oids.h>
diff --git a/epan/print.c b/epan/print.c
index d4a84d3d8a..5a45d58fdc 100644
--- a/epan/print.c
+++ b/epan/print.c
@@ -50,7 +50,7 @@
#include <epan/charsets.h>
#include <epan/dissectors/packet-data.h>
#include <epan/dissectors/packet-frame.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#define PDML_VERSION "0"
#define PSML_VERSION "0"
diff --git a/epan/uat.c b/epan/uat.c
index 2bbc7f77b8..fdf93f5524 100644
--- a/epan/uat.c
+++ b/epan/uat.c
@@ -42,7 +42,7 @@
#include <wsutil/report_err.h>
#include <epan/emem.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/packet.h>
#include <epan/range.h>
diff --git a/epan/wslua/wslua.h b/epan/wslua/wslua.h
index 7eb4a39378..237a224416 100644
--- a/epan/wslua/wslua.h
+++ b/epan/wslua/wslua.h
@@ -50,7 +50,7 @@
#include <epan/proto.h>
#include <epan/epan_dissect.h>
#include <epan/tap.h>
-#include <epan/filesystem.h>
+#include <wsutil/filesystem.h>
#include <epan/funnel.h>
#include <epan/tvbparse.h>
#include <epan/epan.h>