path: root/tshark.c
diff options
authorGuy Harris <guy@alum.mit.edu>2018-10-07 10:06:00 -0700
committerGuy Harris <guy@alum.mit.edu>2018-10-07 18:57:54 +0000
commita679ae6f791ac6b02f342d3b73d6b4aecb9ca6e9 (patch)
treed2f21c87ea7422fa56ba8cc2ff6f23d18bea36f2 /tshark.c
parentce53b4c170e0b0b1c7bb521fe677db1eadc7792b (diff)
Use wsetargv.obj, and wmain() rather than main(), on Windows.
Doing so for command-line programs means that the argument list doesn't ever get converted to the local code page; converting to the local code page can mangle file names that *can't* be converted to the local code page. Furthermore, code that uses setargv.obj rather than wsetargv.obj has issues in some versions of Windows 10; see bug 15151. That means that converting the argument list to UTF-8 is a bit simpler - we don't need to call GetCommandLineW() or CommandLineToArgvW(), we just loop over the UTF-16LE argument strings in argv[]. While we're at it, note in Wireshark's main() why we discard argv on Windows (Qt does the same "convert-to-the-local-code-page" stuff); that means we *do* need to call GetCommandLineW() and CommandLineToArgvW() in main() (i.e., we duplicate what Qt's WinMain() does, but converting to UTF-8 rather than to the local code page). Change-Id: I35b57c1b658fb3e9b0c685097afe324e9fe98649 Ping-Bug: 15151 Reviewed-on: https://code.wireshark.org/review/30051 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'tshark.c')
1 files changed, 22 insertions, 3 deletions
diff --git a/tshark.c b/tshark.c
index 2d84153611..e716aa9db3 100644
--- a/tshark.c
+++ b/tshark.c
@@ -667,8 +667,8 @@ must_do_dissection(dfilter_t *rfcode, dfilter_t *dfcode,
tap_listeners_require_dissection() || dissect_color;
-main(int argc, char *argv[])
+static int
+real_main(int argc, char *argv[])
GString *comp_info_str;
GString *runtime_info_str;
@@ -764,7 +764,6 @@ main(int argc, char *argv[])
cmdarg_err_init(failure_warning_message, failure_message_cont);
#ifdef _WIN32
- arg_list_utf_16to8(argc, argv);
#endif /* _WIN32 */
@@ -2259,6 +2258,26 @@ clean_exit:
return exit_status;
+#ifdef _WIN32
+wmain(int argc, wchar_t *argv[])
+ char **argv_utf8;
+ /* Convert our arg list from UTF-16LE to UTF-8. */
+ argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
+ for (int i = 0; i < argc; i++)
+ argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
+ return real_main(argc, argv_utf8);
+main(int argc, char *argv[])
+ return real_main(argc, argv);