Put the main() and wmain() routines for CLI programs into a separate file.
authorGuy Harris <guy@alum.mit.edu>
Wed, 12 Dec 2018 10:53:08 +0000 (02:53 -0800)
committerGuy Harris <guy@alum.mit.edu>
Thu, 13 Dec 2018 00:52:11 +0000 (00:52 +0000)
That means that code is only in one place, rather than having copies of
it in each of those programs.

CLI programs that, on Windows, should get UTF-8 arguments rather than
arguments in the local code page should:

include the top-level cli_main.h header;

define the main function as real_main();

be built with the top-level cli_main.c file.

On UN*X, cli_main.c has a main() program, and just passes the arguments
on to real_main().

On Windows, cli_main.c has a wmain() function that converts the UTF-16
arguments it's handed to UTF-8 arguments, using WideCharToMultiByte() so
that it doesn't use any functions other than those provided by the
system, and then calls real_main() with the argument count and UTF-8
arguments.

Change-Id: I8b11f01dbc5c63fce599d1bef9ad96cd92c3c01e
Reviewed-on: https://code.wireshark.org/review/31017
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot
Reviewed-by: Guy Harris <guy@alum.mit.edu>
22 files changed:
CMakeLists.txt
capinfos.c
captype.c
cli_main.c [new file with mode: 0644]
cli_main.h [new file with mode: 0644]
dumpcap.c
editcap.c
extcap/CMakeLists.txt
extcap/androiddump.c
extcap/ciscodump.c
extcap/extcap-base.h
extcap/randpktdump.c
extcap/sshdump.c
extcap/udpdump.c
mergecap.c
randpkt.c
rawshark.c
reordercap.c
text2pcap.c
tfshark.c
tools/pre-commit-ignore.conf
tshark.c

index 0a26f26..dee3c45 100644 (file)
@@ -2304,6 +2304,7 @@ if(BUILD_tshark)
                ${M_LIBRARIES}
        )
        set(tshark_FILES
+               cli_main.c
                capture_opts.c
                tshark-tap-register.c
                tshark.c
@@ -2329,6 +2330,7 @@ if(BUILD_tfshark)
                ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
        )
        set(tfshark_FILES
+               cli_main.c
                tfshark.c
                ${TSHARK_TAP_SRC}
                ${SHARK_COMMON_SRC}
@@ -2352,6 +2354,7 @@ if(BUILD_rawshark AND PCAP_FOUND)
                ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
        )
        set(rawshark_FILES
+               cli_main.c
                ${SHARK_COMMON_SRC}
                rawshark.c
        )
@@ -2374,6 +2377,10 @@ if(BUILD_sharkd)
                ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
        )
        set(sharkd_FILES
+               #
+               # XXX - currently doesn't work on Windows if it uses
+               # cli_main.c and has real_main().
+               #
                sharkd.c
                sharkd_daemon.c
                sharkd_session.c
@@ -2419,6 +2426,7 @@ if(BUILD_randpkt)
                ${ZLIB_LIBRARIES}
        )
        set(randpkt_FILES
+               cli_main.c
                randpkt.c
                version_info.c
        )
@@ -2441,6 +2449,7 @@ if(BUILD_text2pcap)
                ${ZLIB_LIBRARIES}
        )
        set(text2pcap_FILES
+               cli_main.c
                text2pcap.c
                version_info.c
        )
@@ -2464,6 +2473,7 @@ if(BUILD_mergecap)
                ${CMAKE_DL_LIBS}
        )
        set(mergecap_FILES
+               cli_main.c
                mergecap.c
                version_info.c
        )
@@ -2483,6 +2493,7 @@ if(BUILD_reordercap)
                ${CMAKE_DL_LIBS}
        )
        set(reordercap_FILES
+               cli_main.c
                reordercap.c
                version_info.c
        )
@@ -2504,6 +2515,7 @@ if(BUILD_capinfos)
                ${CMAKE_DL_LIBS}
        )
        set(capinfos_FILES
+               cli_main.c
                capinfos.c
                version_info.c
        )
@@ -2524,6 +2536,7 @@ if(BUILD_captype)
                ${CMAKE_DL_LIBS}
        )
        set(captype_FILES
+               cli_main.c
                captype.c
                version_info.c
        )
@@ -2544,6 +2557,7 @@ if(BUILD_editcap)
                ${CMAKE_DL_LIBS}
        )
        set(editcap_FILES
+               cli_main.c
                editcap.c
                version_info.c
        )
@@ -2571,6 +2585,7 @@ if(BUILD_dumpcap AND PCAP_FOUND)
                ${NL_LIBRARIES}
        )
        set(dumpcap_FILES
+               cli_main.c
                capture_opts.c
                dumpcap.c
                ringbuffer.c
@@ -2924,6 +2939,7 @@ install(
 
 set(SHARK_PUBLIC_HEADERS
        cfile.h
+       cli_main.h
        file.h
        globals.h
        log.h
index ddcf1f5..0b06e42 100644 (file)
@@ -63,6 +63,7 @@
 #include <wsutil/crash_info.h>
 #include <wsutil/filesystem.h>
 #include <wsutil/privileges.h>
+#include <cli_main.h>
 #include <version_info.h>
 #include <wiretap/wtap_opttypes.h>
 
 #include "wsutil/wsgetopt.h"
 #endif
 
-#ifdef _WIN32
-#include <wsutil/unicode-utils.h>
-#endif /* _WIN32 */
-
 #include "ui/failure_message.h"
 
 #define INVALID_OPTION 1
@@ -1403,7 +1400,7 @@ hash_to_str(const unsigned char *hash, size_t length, char *str) {
   }
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
   GString *comp_info_str;
@@ -1730,23 +1727,6 @@ exit:
   return overall_error_status;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-  char **argv;
-
-  argv = arg_list_utf_16to8(argc, wc_argv);
-  return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-  return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index 99d8251..50de540 100644 (file)
--- a/captype.c
+++ b/captype.c
@@ -33,6 +33,7 @@
 #include <wsutil/file_util.h>
 #include <wsutil/filesystem.h>
 #include <wsutil/privileges.h>
+#include <cli_main.h>
 #include <version_info.h>
 
 #ifdef HAVE_PLUGINS
 #include <wsutil/report_message.h>
 #include <wsutil/str_util.h>
 
-#ifdef _WIN32
-#include <wsutil/unicode-utils.h>
-#endif /* _WIN32 */
-
 #ifndef HAVE_GETOPT_LONG
 #include "wsutil/wsgetopt.h"
 #endif
@@ -81,7 +78,7 @@ failure_message_cont(const char *msg_format, va_list ap)
   fprintf(stderr, "\n");
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
   GString *comp_info_str;
@@ -205,23 +202,6 @@ real_main(int argc, char *argv[])
   return overall_error_status;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-  char **argv;
-
-  argv = arg_list_utf_16to8(argc, wc_argv);
-  return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-  return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
diff --git a/cli_main.c b/cli_main.c
new file mode 100644 (file)
index 0000000..ee5f67e
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Compile and link this with all CLI programs where the main routine
+ * should get UTF-8 arguments on Windows.  In those programs, declare
+ * the main program as real_main() rather than main().
+ *
+ * This is used in software licensed under the GPLv2, and its license MUST
+ * be compatible with that license.
+ *
+ * This is used in software licensed under the Apache 2.0 license, and its
+ * license MUST be compatible with that license.
+ *
+ * For that purpose, we use the MIT (X11) license.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "cli_main.h"
+
+#ifdef _WIN32
+#include <stdlib.h>
+#include <stdio.h>
+#include <windows.h>
+
+int
+wmain(int argc, wchar_t *wc_argv[])
+{
+       char **argv;
+       int i;
+
+       argv = (char **)malloc((argc + 1) * sizeof(char *));
+       if (argv == NULL) {
+               fprintf(stderr, "Out of memory for converted argument list\n");
+               return 2;
+       }
+       for (i = 0; i < argc; i++) {
+               /*
+                * XXX = use WC_ERR_INVALID_CHARS rather than 0, and fail if
+                * the argument isn't valid UTF-16?
+                */
+               int width;
+               char *utf8_string;
+
+               width = WideCharToMultiByte(CP_UTF8, 0, wc_argv[i], -1, NULL, 0,
+                   NULL, NULL);
+               if (width == 0) {
+                       fprintf(stderr, "WideCharToMultiByte failed: %d\n",
+                           width);
+                       return 2;
+               }
+               utf8_string = malloc(width);
+               if (utf8_string == NULL) {
+                       fprintf(stderr,
+                           "Out of memory for converted argument list\n");
+                       return 2;
+               }
+               if (WideCharToMultiByte(CP_UTF8, 0, wc_argv[i], -1, utf8_string,
+                   width, NULL, NULL) == 0) {
+                       fprintf(stderr, "WideCharToMultiByte failed: %d\n",
+                           width);
+                       return 2;
+               }
+               argv[i] = utf8_string;
+       }
+       argv[i] = NULL;
+       return real_main(argc, argv);
+}
+#else /* _WIN32 */
+int
+main(int argc, char *argv[])
+{
+       return real_main(argc, argv);
+}
+#endif
diff --git a/cli_main.h b/cli_main.h
new file mode 100644 (file)
index 0000000..fc947b4
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Declaration of the real main routine, for all CLI programs where the
+ * main routine should get UTF-8 arguments on Windows.  In those programs,
+ * in the file that defines the main routine, include this header and define
+ * the main routine as real_main() rather than main(), and build those
+ * programs with cli_main.c and link with the object file.
+ *
+ * This is used in software licensed under the GPLv2, and its license MUST
+ * be compatible with that license.
+ *
+ * This is used in software licensed under the Apache 2.0 license, and its
+ * license MUST be compatible with that license.
+ *
+ * For that purpose, we use the MIT (X11) license.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+extern int real_main(int argc, char *argv[]);
index 31652fe..f36ce58 100644 (file)
--- a/dumpcap.c
+++ b/dumpcap.c
@@ -43,6 +43,7 @@
 #include <wsutil/cmdarg_err.h>
 #include <wsutil/crash_info.h>
 #include <wsutil/strtoi.h>
+#include <cli_main.h>
 #include <version_info.h>
 
 #ifndef HAVE_GETOPT_LONG
 
 #include "writecap/pcapio.h"
 
-#ifdef _WIN32
-#include <wsutil/unicode-utils.h>
-#endif
-
 #ifndef _WIN32
 #include <sys/un.h>
 #endif
@@ -4613,7 +4610,7 @@ get_dumpcap_runtime_info(GString *str)
 }
 
 /* And now our feature presentation... [ fade to music ] */
-static int
+int
 real_main(int argc, char *argv[])
 {
     GString          *comp_info_str;
@@ -5385,23 +5382,6 @@ real_main(int argc, char *argv[])
     return 0; /* never here, make compiler happy */
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-  char **argv;
-
-  argv = arg_list_utf_16to8(argc, wc_argv);
-  return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-  return real_main(argc, argv);
-}
-#endif
-
 static void
 console_log_handler(const char *log_domain, GLogLevelFlags log_level,
                     const char *message, gpointer user_data _U_)
index a963822..78b83b6 100644 (file)
--- a/editcap.c
+++ b/editcap.c
@@ -54,7 +54,6 @@
 #endif
 
 #ifdef _WIN32
-#include <wsutil/unicode-utils.h>
 #include <process.h>    /* getpid */
 #include <winsock2.h>
 #endif
@@ -74,6 +73,7 @@
 #include <wsutil/report_message.h>
 #include <wsutil/strnatcmp.h>
 #include <wsutil/str_util.h>
+#include <cli_main.h>
 #include <version_info.h>
 #include <wsutil/pint.h>
 #include <wsutil/strtoi.h>
@@ -982,7 +982,7 @@ editcap_dump_open(const char *filename, const wtap_dump_params *params,
   return pdh;
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
     GString      *comp_info_str;
@@ -2055,23 +2055,6 @@ clean_exit:
     return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /* Skip meta-information read from file to return offset of real
  * protocol data */
 static int
index 8475a39..93581b5 100644 (file)
@@ -96,6 +96,7 @@ if(BUILD_androiddump)
                )
        endif()
        set(androiddump_FILES
+               ../cli_main.c
                androiddump.c
                extcap-base.c
        )
@@ -117,6 +118,7 @@ if(BUILD_sshdump AND LIBSSH_FOUND)
                ${LIBSSH_LIBRARIES}
        )
        set(sshdump_FILES
+               ../cli_main.c
                sshdump.c
                extcap-base.c
                ssh-base.c
@@ -142,6 +144,7 @@ if(BUILD_ciscodump AND LIBSSH_FOUND)
                ${LIBSSH_LIBRARIES}
        )
        set(ciscodump_FILES
+               ../cli_main.c
                ciscodump.c
                extcap-base.c
                ssh-base.c
@@ -190,6 +193,7 @@ if(BUILD_udpdump)
                writecap
        )
        set(udpdump_FILES
+               ../cli_main.c
                udpdump.c
                extcap-base.c
        )
@@ -212,6 +216,7 @@ if(BUILD_randpktdump)
                ${CMAKE_DL_LIBS}
        )
        set(randpktdump_FILES
+               ../cli_main.c
                extcap-base.c
                randpktdump.c
        )
index 979a370..5b2d1df 100644 (file)
@@ -76,6 +76,8 @@
     #include "wiretap/pcap-encap.h"
 #endif
 
+#include <cli_main.h>
+
 #ifdef ANDROIDDUMP_USE_LIBPCAP
     #define EXTCAP_ENCAP_BLUETOOTH_H4_WITH_PHDR DLT_BLUETOOTH_H4_WITH_PHDR
     #define EXTCAP_ENCAP_WIRESHARK_UPPER_PDU    DLT_WIRESHARK_UPPER_PDU
@@ -2743,23 +2745,6 @@ end:
     return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index 49c3ecb..798cb7a 100644 (file)
@@ -23,6 +23,8 @@
 #include <string.h>
 #include <fcntl.h>
 
+#include <cli_main.h>
+
 #define CISCODUMP_VERSION_MAJOR "1"
 #define CISCODUMP_VERSION_MINOR "0"
 #define CISCODUMP_VERSION_RELEASE "0"
@@ -706,23 +708,6 @@ end:
        return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
  *
index 021c2f5..f5112ab 100644 (file)
@@ -29,7 +29,6 @@
 
 #ifdef _WIN32
        #include <io.h>
-       #include <wsutil/unicode-utils.h> // arg_list_utf_16to8
 #endif
 
 #include <wsutil/socket.h>
index f7639dc..647d291 100644 (file)
@@ -18,6 +18,8 @@
 #include <wsutil/strtoi.h>
 #include <wsutil/filesystem.h>
 
+#include <cli_main.h>
+
 #define RANDPKT_EXTCAP_INTERFACE "randpkt"
 #define RANDPKTDUMP_VERSION_MAJOR "0"
 #define RANDPKTDUMP_VERSION_MINOR "1"
@@ -318,23 +320,6 @@ end:
        return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
  *
index 4796b85..67ee1ee 100644 (file)
@@ -23,6 +23,8 @@
 #include <string.h>
 #include <fcntl.h>
 
+#include <cli_main.h>
+
 #define SSHDUMP_VERSION_MAJOR "1"
 #define SSHDUMP_VERSION_MINOR "0"
 #define SSHDUMP_VERSION_RELEASE "0"
@@ -531,23 +533,6 @@ end:
        return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-       char **argv;
-
-       argv = arg_list_utf_16to8(argc, wc_argv);
-       return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-       return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
  *
index ac74f24..444f637 100644 (file)
@@ -48,6 +48,8 @@
 #include <wsutil/inet_addr.h>
 #include <wsutil/filesystem.h>
 
+#include <cli_main.h>
+
 #define PCAP_SNAPLEN 0xffff
 
 #define UDPDUMP_DEFAULT_PORT 5555
@@ -475,23 +477,6 @@ end:
        return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-       char **argv;
-
-       argv = arg_list_utf_16to8(argc, wc_argv);
-       return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-       return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index 0425efc..21798ad 100644 (file)
@@ -37,6 +37,8 @@
 #include <wsutil/file_util.h>
 #include <wsutil/privileges.h>
 #include <wsutil/strnatcmp.h>
+
+#include <cli_main.h>
 #include <version_info.h>
 
 #ifdef HAVE_PLUGINS
 
 #include <wiretap/merge.h>
 
-#ifdef _WIN32
-#include <wsutil/unicode-utils.h>
-#endif /* _WIN32 */
-
 #include "ui/failure_message.h"
 
 /*
@@ -229,7 +227,7 @@ merge_callback(merge_event event, int num,
   return FALSE;
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
   GString            *comp_info_str;
@@ -479,23 +477,6 @@ clean_exit:
   return (status == MERGE_OK) ? 0 : 2;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-  char **argv;
-
-  argv = arg_list_utf_16to8(argc, wc_argv);
-  return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-  return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index a39cbf5..ce98df6 100644 (file)
--- a/randpkt.c
+++ b/randpkt.c
 #include <stdlib.h>
 #include <wsutil/clopts_common.h>
 #include <wsutil/cmdarg_err.h>
-#include <wsutil/unicode-utils.h>
 #include <wsutil/file_util.h>
 #include <wsutil/filesystem.h>
 #include <wsutil/privileges.h>
+#include <cli_main.h>
 
 #ifdef HAVE_PLUGINS
 #include <wsutil/plugins.h>
@@ -99,7 +99,7 @@ usage(gboolean is_error)
        fprintf(output, "\nIf type is not specified, a random packet will be chosen\n\n");
 }
 
-static int
+int
 real_main(int argc, char **argv)
 {
        char                   *init_progfile_dir_error;
@@ -246,23 +246,6 @@ clean_exit:
        return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t **wc_argv)
-{
-       char **argv;
-
-       argv = arg_list_utf_16to8(argc, wc_argv);
-       return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char **argv)
-{
-       return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index 317e6bf..15b7b4c 100644 (file)
@@ -53,6 +53,7 @@
 #include <wsutil/plugins.h>
 #include <wsutil/privileges.h>
 #include <wsutil/report_message.h>
+#include <wsutil/clopts_common.h>
 
 #include "globals.h"
 #include <epan/packet.h>
@@ -73,7 +74,6 @@
 #include <epan/epan_dissect.h>
 #include <epan/stat_tap_ui.h>
 #include <epan/timestamp.h>
-#include <wsutil/unicode-utils.h>
 #include "epan/column-utils.h"
 #include "epan/proto.h"
 #include <epan/tap.h>
@@ -82,7 +82,7 @@
 #include <wiretap/libpcap.h>
 #include <wiretap/pcap-encap.h>
 
-#include <wsutil/clopts_common.h>
+#include <cli_main.h>
 #include <version_info.h>
 
 #include "caputils/capture-pcap-util.h"
@@ -403,7 +403,7 @@ set_link_type(const char *lt_arg) {
     return FALSE;
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
     GString             *comp_info_str;
@@ -828,23 +828,6 @@ clean_exit:
     return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /**
  * Read data from a raw pipe.  The "raw" data consists of a libpcap
  * packet header followed by the payload.
index 56d4ae5..ce85acb 100644 (file)
@@ -30,7 +30,7 @@
 #include <wsutil/filesystem.h>
 #include <wsutil/file_util.h>
 #include <wsutil/privileges.h>
-#include <wsutil/unicode-utils.h>
+#include <cli_main.h>
 #include <version_info.h>
 #include <wiretap/wtap_opttypes.h>
 
@@ -161,7 +161,7 @@ failure_message_cont(const char *msg_format, va_list ap)
 /********************************************************************/
 /* Main function.                                                   */
 /********************************************************************/
-static int
+int
 real_main(int argc, char *argv[])
 {
     GString *comp_info_str;
@@ -380,23 +380,6 @@ clean_exit:
     return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index 0eaf158..5ac0e9c 100644 (file)
 #include <string.h>
 #include <wsutil/file_util.h>
 #include <wsutil/crash_info.h>
+#include <cli_main.h>
 #include <version_info.h>
 #include <wsutil/inet_addr.h>
 
 
 #include "wiretap/wtap.h"
 
-#ifdef _WIN32
-#include <wsutil/unicode-utils.h>
-#endif /* _WIN32 */
-
 /*--- Options --------------------------------------------------------------------*/
 
 /* File format */
@@ -1874,7 +1871,7 @@ parse_options (int argc, char *argv[])
     return EXIT_SUCCESS;
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
     int ret = EXIT_SUCCESS;
@@ -1946,23 +1943,6 @@ clean_exit:
     return ret;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-    char **argv;
-
-    argv = arg_list_utf_16to8(argc, wc_argv);
-    return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-    return real_main(argc, argv);
-}
-#endif
-
 /*
  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
  *
index 0a44c4e..52f8fb1 100644 (file)
--- a/tfshark.c
+++ b/tfshark.c
@@ -39,6 +39,7 @@
 #include <wsutil/file_util.h>
 #include <wsutil/privileges.h>
 #include <wsutil/report_message.h>
+#include <cli_main.h>
 #include <version_info.h>
 
 #include "globals.h"
 #include <wiretap/wtap-int.h>
 #include <wiretap/file_wrappers.h>
 
-#ifdef _WIN32
-#include <wsutil/unicode-utils.h>
-#endif /* _WIN32 */
-
 #include "log.h"
 #include <epan/funnel.h>
 
@@ -303,7 +300,7 @@ get_tfshark_runtime_version_info(GString *str)
   epan_get_runtime_version_info(str);
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
   GString             *comp_info_str;
@@ -1005,23 +1002,6 @@ clean_exit:
   return exit_status;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-  char **argv;
-
-  argv = arg_list_utf_16to8(argc, wc_argv);
-  return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-  return real_main(argc, argv);
-}
-#endif
-
 static const nstime_t *
 tfshark_get_frame_ts(struct packet_provider_data *prov, guint32 frame_num)
 {
index 7fd7916..6adee4c 100644 (file)
@@ -18,6 +18,7 @@ epan/wmem/wmem_strutil.c
 epan/wslua/init_wslua.c
 extcap/*
 image/stock_icons/*
+cli_main.c
 mmdbresolve.c
 tools/lemon/*
 wsutil/file_util.h
index 9ee2180..eb0304d 100644 (file)
--- a/tshark.c
+++ b/tshark.c
@@ -52,6 +52,7 @@
 #include <wsutil/file_util.h>
 #include <wsutil/privileges.h>
 #include <wsutil/report_message.h>
+#include <cli_main.h>
 #include <version_info.h>
 #include <wiretap/wtap_opttypes.h>
 #include <wiretap/pcapng.h>
 #include "caputils/capture_ifinfo.h"
 #ifdef _WIN32
 #include "caputils/capture-wpcap.h"
-#include <wsutil/unicode-utils.h>
 #endif /* _WIN32 */
 #include <capchild/capture_session.h>
 #include <capchild/capture_sync.h>
@@ -670,7 +670,7 @@ must_do_dissection(dfilter_t *rfcode, dfilter_t *dfcode,
       tap_listeners_require_dissection() || dissect_color;
 }
 
-static int
+int
 real_main(int argc, char *argv[])
 {
   GString             *comp_info_str;
@@ -2255,23 +2255,6 @@ clean_exit:
   return exit_status;
 }
 
-#ifdef _WIN32
-int
-wmain(int argc, wchar_t *wc_argv[])
-{
-  char **argv;
-
-  argv = arg_list_utf_16to8(argc, wc_argv);
-  return real_main(argc, argv);
-}
-#else
-int
-main(int argc, char *argv[])
-{
-  return real_main(argc, argv);
-}
-#endif
-
 /*#define USE_BROKEN_G_MAIN_LOOP*/
 
 #ifdef USE_BROKEN_G_MAIN_LOOP