Put the main() and wmain() routines for CLI programs into a separate file.

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>
This commit is contained in:
Guy Harris 2018-12-12 02:53:08 -08:00
parent 17b721e451
commit a34cc98b2a
22 changed files with 148 additions and 314 deletions

View 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

View 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>
@ -80,10 +81,6 @@
#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
*

View File

@ -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
@ -42,10 +43,6 @@
#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
*

73
cli_main.c Normal file
View File

@ -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

19
cli_main.h Normal file
View File

@ -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[]);

View File

@ -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
@ -65,10 +66,6 @@
#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_)

View File

@ -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

View 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
)

View 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
*

View 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
*

View File

@ -29,7 +29,6 @@
#ifdef _WIN32
#include <io.h>
#include <wsutil/unicode-utils.h> // arg_list_utf_16to8
#endif
#include <wsutil/socket.h>

View 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
*

View 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
*

View 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
*

View 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
@ -47,10 +49,6 @@
#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
*

View File

@ -17,10 +17,10 @@
#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
*

View 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.

View 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
*

View File

@ -101,6 +101,7 @@
#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>
@ -132,10 +133,6 @@
#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
*

View File

@ -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"
@ -66,10 +67,6 @@
#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)
{

View 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

View File

@ -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>
@ -104,7 +105,6 @@
#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