aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorulfl <ulfl@f5534014-38df-0310-8fa8-9805f1628bb7>2007-01-12 03:05:28 +0000
committerulfl <ulfl@f5534014-38df-0310-8fa8-9805f1628bb7>2007-01-12 03:05:28 +0000
commit6e51586ef635711e2c26051f36fcced3de408272 (patch)
tree7258f1ecfd45f0c00809ca4fd05377f799dec282
parent329c28c3881f611a67522a24f96cdeb8e5dc068b (diff)
Win32: MSVC > 6 doesn't work well with Unicode filenames!
fix this, by providing required functions in the new file file_util.c - it's mostly copied from GLib (g_open alike - that take UTF8 as filename format but don't use msvcrt.dll V6 for this as the glib files do) "link" to these functions in file_util.h: #define eth_open eth_stdio_open revert changes (from SVN 20282) throughout the code related to these file functions which were introduced with the first tries of MSVC 2005 ... Hopefully I've done everything right with the new file_util.c ... git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@20402 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r--capture_opts.c2
-rw-r--r--epan/filesystem.c11
-rw-r--r--gtk/main.c4
-rw-r--r--plugins/asn1/Makefile.nmake2
-rw-r--r--plugins/mate/Makefile.nmake2
-rw-r--r--tempfile.c12
-rw-r--r--wiretap/Makefile.common3
-rw-r--r--wiretap/Makefile.nmake2
-rw-r--r--wiretap/file_util.c475
-rw-r--r--wiretap/file_util.h51
-rw-r--r--wiretap/file_wrappers.h2
-rw-r--r--wiretap/wtap.def9
12 files changed, 527 insertions, 48 deletions
diff --git a/capture_opts.c b/capture_opts.c
index 22a912379f..37db6321df 100644
--- a/capture_opts.c
+++ b/capture_opts.c
@@ -363,7 +363,7 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg,
case 'w': /* Write to capture file x */
capture_opts->saving_to_file = TRUE;
g_free(capture_opts->save_file);
-#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6)) && (!defined _MSC_VER || _MSC_VER < 1300)
+#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6))
/* since GLib 2.6, we need to convert filenames to utf8 for Win32 */
capture_opts->save_file = g_locale_to_utf8(optarg, -1, NULL, NULL, NULL);
#else
diff --git a/epan/filesystem.c b/epan/filesystem.c
index 70673380a5..e81def0a03 100644
--- a/epan/filesystem.c
+++ b/epan/filesystem.c
@@ -721,16 +721,7 @@ char *getenv_utf8(const char *varname)
envvar = getenv(varname);
/* since GLib 2.6 we need an utf8 version of the filename */
-#if (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6)) && (!defined _MSC_VER || _MSC_VER < 1300)
- if (!G_WIN32_HAVE_WIDECHAR_API ()) {
- /* Windows OT (9x, ME), convert from current code page to utf8 */
- /* it's the best we can do here ... */
- envvar = g_locale_to_utf8(envvar, -1, NULL, NULL, NULL);
- /* XXX - memleak */
- return envvar;
- }
-
- /* Windows NT, 2000, XP, ... */
+#if (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6))
/* using the wide char version of getenv should work under all circumstances */
/* convert given varname to utf16, needed by _wgetenv */
diff --git a/gtk/main.c b/gtk/main.c
index 852cc5d52a..63f8ce4999 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -2620,7 +2620,7 @@ main(int argc, char *argv[])
/* We may set "last_open_dir" to "cf_name", and if we change
"last_open_dir" later, we free the old value, so we have to
set "cf_name" to something that's been allocated. */
-#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6)) && (!defined _MSC_VER || _MSC_VER < 1300)
+#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6))
/* since GLib 2.6, we need to convert filenames to utf8 for Win32 */
cf_name = g_locale_to_utf8(optarg, -1, NULL, NULL, NULL);
#else
@@ -2691,7 +2691,7 @@ main(int argc, char *argv[])
* file - yes, you could have "-r" as the last part of the command,
* but that's a bit ugly.
*/
-#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6)) && (!defined _MSC_VER || _MSC_VER < 1300)
+#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6))
/* since GLib 2.6, we need to convert filenames to utf8 for Win32 */
cf_name = g_locale_to_utf8(argv[0], -1, NULL, NULL, NULL);
#else
diff --git a/plugins/asn1/Makefile.nmake b/plugins/asn1/Makefile.nmake
index a7aaa73d07..5ca3f9578f 100644
--- a/plugins/asn1/Makefile.nmake
+++ b/plugins/asn1/Makefile.nmake
@@ -15,7 +15,7 @@ CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \
LDFLAGS = $(PLUGIN_LDFLAGS)
!IFDEF ENABLE_LIBWIRESHARK
-LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib
+LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib ..\..\wiretap\wiretap-$(WTAP_VERSION).lib
CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS)
DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj)
diff --git a/plugins/mate/Makefile.nmake b/plugins/mate/Makefile.nmake
index d2b9333dba..382876700a 100644
--- a/plugins/mate/Makefile.nmake
+++ b/plugins/mate/Makefile.nmake
@@ -20,7 +20,7 @@ CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) /I$(LEMON)\
LDFLAGS = $(PLUGIN_LDFLAGS)
!IFDEF ENABLE_LIBWIRESHARK
-LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib
+LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib ..\..\wiretap\wiretap-$(WTAP_VERSION).lib
CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS)
DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj)
diff --git a/tempfile.c b/tempfile.c
index 971f6d5b0e..61495281ce 100644
--- a/tempfile.c
+++ b/tempfile.c
@@ -39,20 +39,12 @@
#include "file_util.h"
-#if (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6)) && (!defined _MSC_VER || _MSC_VER < 1300)
-#include <glib/gstdio.h> /* available since GLib 2.6 only! */
-
-/* GLib2.6 or above, using new wrapper functions */
-#define eth_mkstemp g_mkstemp
-#else
-#define eth_mkstemp mkstemp
-#endif
-
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif
#include "tempfile.h"
+#include "mkstemp.h"
static const char *
setup_tmpdir(const char *dir)
@@ -99,7 +91,7 @@ try_tempfile(char *namebuf, int namebuflen, const char *dir, const char *pfx)
permissions, attempt to create the file, and then put
the umask back. */
old_umask = umask(0077);
- tmp_fd = eth_mkstemp(namebuf);
+ tmp_fd = mkstemp(namebuf);
umask(old_umask);
return tmp_fd;
}
diff --git a/wiretap/Makefile.common b/wiretap/Makefile.common
index 176adf7f54..dc97cae87d 100644
--- a/wiretap/Makefile.common
+++ b/wiretap/Makefile.common
@@ -105,6 +105,9 @@ NONGENERATED_HEADER_FILES = \
wtap-capture.h \
wtap-int.h
+EXTRA_DIST = \
+ file_util.c
+
# Files that generate compileable files
GENERATOR_SOURCES = \
ascend-grammar.y \
diff --git a/wiretap/Makefile.nmake b/wiretap/Makefile.nmake
index cf97f218af..9ace44d74a 100644
--- a/wiretap/Makefile.nmake
+++ b/wiretap/Makefile.nmake
@@ -17,7 +17,7 @@ CVARSDLL=-DWIN32 -DNULL=0 -D_MT -D_DLL
.c.obj::
$(CC) $(CVARSDLL) $(CFLAGS) -Fd.\ -c $<
-OBJECTS=$(NONGENERATED_C_FILES:.c=.obj) $(GENERATED_C_FILES:.c=.obj)
+OBJECTS=$(NONGENERATED_C_FILES:.c=.obj) $(GENERATED_C_FILES:.c=.obj) $(EXTRA_DIST:.c=.obj)
wiretap_LIBS = \
$(GLIB_LIBS) \
diff --git a/wiretap/file_util.c b/wiretap/file_util.c
new file mode 100644
index 0000000000..c097868667
--- /dev/null
+++ b/wiretap/file_util.c
@@ -0,0 +1,475 @@
+/* file_util.c
+ *
+ * $Id$
+ *
+ * Wiretap Library
+ * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+/* file wrapper functions to prevent the file functions from GLib like g_open(),
+ * as code compiled with MSVC 7 and above will collide with libs linked with msvcrt.dll (MSVC 6), lib GLib is
+ *
+ * DO NOT USE THESE FUNCTIONS DIRECTLY, USE eth_open() AND ALIKE FUNCTIONS FROM file_util.h INSTEAD!!!
+ *
+ * the following code is stripped down code copied from the GLib file glib/gstdio.h
+ * stipped down, because this is used on _WIN32 only and we use only wide char functions */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#include <errno.h>
+#include <wchar.h>
+/*#include <direct.h>*/
+#include <io.h>
+#endif
+
+#include "file_util.h"
+
+
+
+
+/**
+ * g_open:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @flags: as in open()
+ * @mode: as in open()
+ *
+ * A wrapper for the POSIX open() function. The open() function is
+ * used to convert a pathname into a file descriptor. Note that on
+ * POSIX systems file descriptors are implemented by the operating
+ * system. On Windows, it's the C library that implements open() and
+ * file descriptors. The actual Windows API for opening files is
+ * something different.
+ *
+ * See the C library manual for more details about open().
+ *
+ * Returns: a new file descriptor, or -1 if an error occurred. The
+ * return value can be used exactly like the return value from open().
+ *
+ * Since: 2.6
+ */
+int
+eth_stdio_open (const gchar *filename,
+ int flags,
+ int mode)
+{
+#ifdef _WIN32
+ {
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wopen (wfilename, flags, mode);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+ }
+#else
+ return open (filename, flags, mode);
+#endif
+}
+
+
+/**
+ * g_rename:
+ * @oldfilename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @newfilename: a pathname in the GLib file name encoding
+ *
+ * A wrapper for the POSIX rename() function. The rename() function
+ * renames a file, moving it between directories if required.
+ *
+ * See your C library manual for more details about how rename() works
+ * on your system. Note in particular that on Win9x it is not possible
+ * to rename a file if a file with the new name already exists. Also
+ * it is not possible in general on Windows to rename an open file.
+ *
+ * Returns: 0 if the renaming succeeded, -1 if an error occurred
+ *
+ * Since: 2.6
+ */
+int
+eth_stdio_rename (const gchar *oldfilename,
+ const gchar *newfilename)
+{
+#ifdef _WIN32
+ wchar_t *woldfilename = g_utf8_to_utf16 (oldfilename, -1, NULL, NULL, NULL);
+ wchar_t *wnewfilename;
+ int retval;
+ int save_errno = 0;
+
+ if (woldfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ wnewfilename = g_utf8_to_utf16 (newfilename, -1, NULL, NULL, NULL);
+
+ if (wnewfilename == NULL)
+ {
+ g_free (woldfilename);
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (MoveFileExW (woldfilename, wnewfilename, MOVEFILE_REPLACE_EXISTING))
+ retval = 0;
+ else
+ {
+ retval = -1;
+ switch (GetLastError ())
+ {
+#define CASE(a,b) case ERROR_##a: save_errno = b; break
+ CASE (FILE_NOT_FOUND, ENOENT);
+ CASE (PATH_NOT_FOUND, ENOENT);
+ CASE (ACCESS_DENIED, EACCES);
+ CASE (NOT_SAME_DEVICE, EXDEV);
+ CASE (LOCK_VIOLATION, EACCES);
+ CASE (SHARING_VIOLATION, EACCES);
+ CASE (FILE_EXISTS, EEXIST);
+ CASE (ALREADY_EXISTS, EEXIST);
+#undef CASE
+ default: save_errno = EIO;
+ }
+ }
+
+ g_free (woldfilename);
+ g_free (wnewfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return rename (oldfilename, newfilename);
+#endif
+}
+
+/**
+ * g_mkdir:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: permissions to use for the newly created directory
+ *
+ * A wrapper for the POSIX mkdir() function. The mkdir() function
+ * attempts to create a directory with the given name and permissions.
+ *
+ * See the C library manual for more details about mkdir().
+ *
+ * Returns: 0 if the directory was successfully created, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+eth_stdio_mkdir (const gchar *filename,
+ int mode)
+{
+#ifdef _WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wmkdir (wfilename);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return mkdir (filename, mode);
+#endif
+}
+
+/**
+ * g_stat:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @buf: a pointer to a <structname>stat</structname> struct, which
+ * will be filled with the file information
+ *
+ * A wrapper for the POSIX stat() function. The stat() function
+ * returns information about a file.
+ *
+ * See the C library manual for more details about stat().
+ *
+ * Returns: 0 if the information was successfully retrieved, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+eth_stdio_stat (const gchar *filename,
+ struct stat *buf)
+{
+#ifdef _WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+ int len;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ len = wcslen (wfilename);
+ while (len > 0 && G_IS_DIR_SEPARATOR (wfilename[len-1]))
+ len--;
+ if (len > 0 &&
+ (!g_path_is_absolute (filename) || len > g_path_skip_root (filename) - filename))
+ wfilename[len] = '\0';
+
+ retval = _wstat (wfilename, (struct _stat *) buf);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return stat (filename, buf);
+#endif
+}
+
+/**
+ * g_unlink:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ *
+ * A wrapper for the POSIX unlink() function. The unlink() function
+ * deletes a name from the filesystem. If this was the last link to the
+ * file and no processes have it opened, the diskspace occupied by the
+ * file is freed.
+ *
+ * See your C library manual for more details about unlink(). Note
+ * that on Windows, it is in general not possible to delete files that
+ * are open to some process, or mapped into memory.
+ *
+ * Returns: 0 if the name was successfully deleted, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+eth_stdio_unlink (const gchar *filename)
+{
+#ifdef _WIN32
+ gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (cp_filename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = unlink (cp_filename);
+ save_errno = errno;
+
+ g_free (cp_filename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return unlink (filename);
+#endif
+}
+
+/**
+ * g_remove:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ *
+ * A wrapper for the POSIX remove() function. The remove() function
+ * deletes a name from the filesystem.
+ *
+ * See your C library manual for more details about how remove() works
+ * on your system. On Unix, remove() removes also directories, as it
+ * calls unlink() for files and rmdir() for directories. On Windows,
+ * although remove() in the C library only works for files, this
+ * function tries first remove() and then if that fails rmdir(), and
+ * thus works for both files and directories. Note however, that on
+ * Windows, it is in general not possible to remove a file that is
+ * open to some process, or mapped into memory.
+ *
+ * If this function fails on Windows you can't infer too much from the
+ * errno value. rmdir() is tried regardless of what caused remove() to
+ * fail. Any errno value set by remove() will be overwritten by that
+ * set by rmdir().
+ *
+ * Returns: 0 if the file was successfully removed, -1 if an error
+ * occurred
+ *
+ * Since: 2.6
+ */
+int
+eth_stdio_remove (const gchar *filename)
+{
+#ifdef _WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wremove (wfilename);
+ if (retval == -1)
+ retval = _wrmdir (wfilename);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return remove (filename);
+#endif
+}
+
+/**
+ * g_fopen:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: a string describing the mode in which the file should be
+ * opened
+ *
+ * A wrapper for the POSIX fopen() function. The fopen() function opens
+ * a file and associates a new stream with it.
+ *
+ * See the C library manual for more details about fopen().
+ *
+ * Returns: A <type>FILE</type> pointer if the file was successfully
+ * opened, or %NULL if an error occurred
+ *
+ * Since: 2.6
+ */
+FILE *
+eth_stdio_fopen (const gchar *filename,
+ const gchar *mode)
+{
+#ifdef _WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ wchar_t *wmode;
+ FILE *retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
+
+ if (wmode == NULL)
+ {
+ g_free (wfilename);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ retval = _wfopen (wfilename, wmode);
+ save_errno = errno;
+
+ g_free (wfilename);
+ g_free (wmode);
+
+ errno = save_errno;
+ return retval;
+#else
+ return fopen (filename, mode);
+#endif
+}
+
+/**
+ * g_freopen:
+ * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows)
+ * @mode: a string describing the mode in which the file should be
+ * opened
+ * @stream: an existing stream which will be reused, or %NULL
+ *
+ * A wrapper for the POSIX freopen() function. The freopen() function
+ * opens a file and associates it with an existing stream.
+ *
+ * See the C library manual for more details about freopen().
+ *
+ * Returns: A <type>FILE</type> pointer if the file was successfully
+ * opened, or %NULL if an error occurred.
+ *
+ * Since: 2.6
+ */
+FILE *
+eth_stdio_freopen (const gchar *filename,
+ const gchar *mode,
+ FILE *stream)
+{
+#ifdef _WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ wchar_t *wmode;
+ FILE *retval;
+ int save_errno;
+
+ if (wfilename == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
+
+ if (wmode == NULL)
+ {
+ g_free (wfilename);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ retval = _wfreopen (wfilename, wmode, stream);
+ save_errno = errno;
+
+ g_free (wfilename);
+ g_free (wmode);
+
+ errno = save_errno;
+ return retval;
+#else
+ return freopen (filename, mode, stream);
+#endif
+}
+
diff --git a/wiretap/file_util.h b/wiretap/file_util.h
index 2978fc72d6..d3a2258f41 100644
--- a/wiretap/file_util.h
+++ b/wiretap/file_util.h
@@ -40,22 +40,30 @@ extern "C" {
#endif
-/* Since GLib2.6, wrappers were added around functions which provides filenames to library functions,
- like open() does. */
-#if (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6)) && (!defined _MSC_VER || _MSC_VER < 1300)
-#include <glib/gstdio.h> /* available since GLib 2.6 only! */
-
-/* GLib2.6 or above, using new wrapper functions */
-#define eth_open g_open
-#define eth_rename g_rename
-#define eth_mkdir g_mkdir
-#define eth_stat g_stat
-#define eth_unlink g_unlink
-#define eth_remove g_remove
-#define eth_fopen g_fopen
-#define eth_freopen g_freopen
-
-#else /* GLIB_MAJOR_VERSION */
+/* Win32: Since GLib2.6, we use UTF8 throughout the code, so file functions must tweak a given filename
+ from UTF8 to UTF16 as we use NT Unicode (Win9x - now unsupported - used locale based encoding here). */
+#if defined _WIN32 && (GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6))
+#include <stdio.h>
+
+extern int eth_stdio_open (const gchar *filename, int flags, int mode);
+extern int eth_stdio_rename (const gchar *oldfilename, const gchar *newfilename);
+extern int eth_stdio_mkdir (const gchar *filename, int mode);
+extern int eth_stdio_stat (const gchar *filename, struct stat *buf);
+extern int eth_stdio_unlink (const gchar *filename);
+extern int eth_stdio_remove (const gchar *filename);
+extern FILE * eth_stdio_fopen (const gchar *filename, const gchar *mode);
+extern FILE * eth_stdio_freopen (const gchar *filename, const gchar *mode, FILE *stream);
+
+#define eth_open eth_stdio_open
+#define eth_rename eth_stdio_rename
+#define eth_mkdir eth_stdio_mkdir
+#define eth_stat eth_stdio_stat
+#define eth_unlink eth_stdio_unlink
+#define eth_remove eth_stdio_remove
+#define eth_fopen eth_stdio_fopen
+#define eth_freopen eth_stdio_freopen
+
+#else /* _WIN32 && GLIB_MAJOR_VERSION */
/* GLib 2.4 or below, using "old school" functions */
#ifdef _WIN32
@@ -68,17 +76,17 @@ extern "C" {
#define eth_stat stat
#define eth_unlink unlink
#define eth_mkdir(dir,mode) mkdir(dir,mode)
-#endif
+#endif /* _WIN32 */
#define eth_rename rename
#define eth_remove remove
#define eth_fopen fopen
#define eth_freopen freopen
-#endif /* GLIB_MAJOR_VERSION */
+#endif /* _WIN32 && GLIB_MAJOR_VERSION */
-/* some common differences between UNIX and WIN32 */
+/* some common file function differences between UNIX and WIN32 */
#ifdef _WIN32
/* the Win32 API prepends underscores for whatever reasons */
#define eth_read _read
@@ -93,8 +101,9 @@ extern "C" {
#define eth_dup dup
#define eth_lseek lseek
#define O_BINARY 0 /* Win32 needs the O_BINARY flag for open() */
-#endif
+#endif /* _WIN32 */
+/* directory handling */
#if GLIB_MAJOR_VERSION >= 2
#define ETH_DIR GDir
#define ETH_DIRENT const char
@@ -111,7 +120,7 @@ extern "C" {
#define eth_dir_get_name(dirent) (gchar *)file->d_name
#define eth_dir_rewind rewinddir
#define eth_dir_close closedir
-#endif
+#endif /* GLIB_MAJOR_VERSION */
/* XXX - remove include "dirent.h" */
/* XXX - remove include "direct.h" */
diff --git a/wiretap/file_wrappers.h b/wiretap/file_wrappers.h
index 9dcf643ff6..22d4a24b8c 100644
--- a/wiretap/file_wrappers.h
+++ b/wiretap/file_wrappers.h
@@ -40,7 +40,7 @@ extern FILE_T file_open(const char *path, const char *mode);
#define file_eof gzeof
#else /* No zLib */
-/* XXX - mixing eth_xxx and fxxx calls might not be a good idea with MSVC 2005! */
+
#define file_open(path, mode) eth_fopen(path, mode)
#define filed_open fdopen
#define file_read fread
diff --git a/wiretap/wtap.def b/wiretap/wtap.def
index 6e7d354f86..f893332ac6 100644
--- a/wiretap/wtap.def
+++ b/wiretap/wtap.def
@@ -34,3 +34,12 @@ wtap_short_string_to_encap
wtap_short_string_to_file_type
wtap_snapshot_length
wtap_strerror
+
+eth_stdio_open
+eth_stdio_rename
+eth_stdio_mkdir
+eth_stdio_stat
+eth_stdio_unlink
+eth_stdio_remove
+eth_stdio_fopen
+eth_stdio_freopen