From a679ae6f791ac6b02f342d3b73d6b4aecb9ca6e9 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sun, 7 Oct 2018 10:06:00 -0700 Subject: 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 Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris --- randpkt.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'randpkt.c') diff --git a/randpkt.c b/randpkt.c index 2a2ce08d89..c4786c6452 100644 --- a/randpkt.c +++ b/randpkt.c @@ -99,8 +99,8 @@ usage(gboolean is_error) fprintf(output, "\nIf type is not specified, a random packet will be chosen\n\n"); } -int -main(int argc, char **argv) +static int +real_main(int argc, char **argv) { char *init_progfile_dir_error; int opt; @@ -143,7 +143,6 @@ main(int argc, char **argv) cmdarg_err_init(failure_warning_message, failure_message_cont); #ifdef _WIN32 - arg_list_utf_16to8(argc, argv); create_app_running_mutex(); #endif /* _WIN32 */ @@ -247,6 +246,26 @@ clean_exit: return ret; } +#ifdef _WIN32 +int +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); +} +#else +int +main(int argc, char **argv) +{ + return real_main(argc, argv); +} +#endif + /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * -- cgit v1.2.3