Please review/test.
On Sat, Mar 24, 2012 at 10:31 PM, Alon Bar-Lev <alon.bar...@gmail.com> wrote:
> Discussed at [1].
>
> Use wmain under windows, drop the custom parsing and shell32 linkage.
>
> There is no need for gc magic as this allocation is static.
>
> [1] http://permalink.gmane.org/gmane.network.openvpn.devel/5433
>
> Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com>
> ---
> src/openvpn/Makefile.am | 6 +++++-
> src/openvpn/openvpn.c | 37 ++++++++++++++++++++++++++++++++++++-
> src/openvpn/openvpn.vcxproj | 10 ++++++----
> src/openvpn/options.c | 27 ---------------------------
> 4 files changed, 47 insertions(+), 33 deletions(-)
> mode change 100644 => 100755 src/openvpn/openvpn.vcxproj
>
> diff --git a/src/openvpn/Makefile.am b/src/openvpn/Makefile.am
> index 4e485e7..0506b11 100644
> --- a/src/openvpn/Makefile.am
> +++ b/src/openvpn/Makefile.am
> @@ -27,6 +27,10 @@ AM_CFLAGS = \
> $(OPTIONAL_CRYPTO_CFLAGS) \
> $(OPTIONAL_LZO_CFLAGS) \
> $(OPTIONAL_PKCS11_HELPER_CFLAGS)
> +if WIN32
> +# we want unicode entry point but not the macro
> +AM_CFLAGS += -municode -UUNICODE
> +endif
>
> sbin_PROGRAMS = openvpn
>
> @@ -118,5 +122,5 @@ openvpn_LDADD = \
> $(OPTIONAL_DL_LIBS)
> if WIN32
> openvpn_SOURCES += openvpn_win32_resources.rc
> -openvpn_LDADD += -lgdi32 -lws2_32 -lwininet -lcrypt32 -liphlpapi -lwinmm
> -lshell32
> +openvpn_LDADD += -lgdi32 -lws2_32 -lwininet -lcrypt32 -liphlpapi -lwinmm
> endif
> diff --git a/src/openvpn/openvpn.c b/src/openvpn/openvpn.c
> index 3db1b86..6e70a58 100644
> --- a/src/openvpn/openvpn.c
> +++ b/src/openvpn/openvpn.c
> @@ -127,8 +127,9 @@ tunnel_point_to_point (struct context *c)
> * @param argc - Commandline argument count.
> * @param argv - Commandline argument values.
> */
> +static
> int
> -main (int argc, char *argv[])
> +openvpn_main (int argc, char *argv[])
> {
> struct context c;
>
> @@ -289,3 +290,37 @@ main (int argc, char *argv[])
> openvpn_exit (OPENVPN_EXIT_STATUS_GOOD); /* exit point */
> return 0; /* NOTREACHED */
> }
> +
> +#ifdef WIN32
> +int
> +wmain (int argc, wchar_t *wargv[]) {
> + char **argv;
> + int ret;
> + int i;
> +
> + if ((argv = calloc(argc+1, sizeof(char*))) == NULL)
> + return 1;
> +
> + for (i = 0; i < argc; i++)
> + {
> + int n = WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL,
> NULL);
> + argv[i] = malloc (n);
> + WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, argv[i], n, NULL, NULL);
> + }
> +
> + ret = openvpn_main(argc, argv);
> +
> + for (i=0; i < argc; i++ )
> + {
> + free (argv[i]);
> + }
> + free(argv);
> +
> + return ret;
> +}
> +#else
> +int
> +main (int argc, char *argv[]) {
> + return openvpn_main(argc, argv);
> +}
> +#endif
> diff --git a/src/openvpn/openvpn.vcxproj b/src/openvpn/openvpn.vcxproj
> old mode 100644
> new mode 100755
> index 51e19af..452876f
> --- a/src/openvpn/openvpn.vcxproj
> +++ b/src/openvpn/openvpn.vcxproj
> @@ -18,12 +18,12 @@
> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"
> Label="Configuration">
> <ConfigurationType>Application</ConfigurationType>
> - <CharacterSet>MultiByte</CharacterSet>
> <WholeProgramOptimization>true</WholeProgramOptimization>
> + <CharacterSet>Unicode</CharacterSet>
> </PropertyGroup>
> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"
> Label="Configuration">
> <ConfigurationType>Application</ConfigurationType>
> - <CharacterSet>MultiByte</CharacterSet>
> + <CharacterSet>Unicode</CharacterSet>
> </PropertyGroup>
> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
> <ImportGroup Label="ExtensionSettings">
> @@ -56,12 +56,13 @@
> </PrecompiledHeader>
> <WarningLevel>Level3</WarningLevel>
> <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
> +
> <UndefinePreprocessorDefinitions>UNICODE</UndefinePreprocessorDefinitions>
> </ClCompile>
> <ResourceCompile>
>
> <AdditionalIncludeDirectories>$(SOURCEBASE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
> </ResourceCompile>
> <Link>
> -
> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
> +
> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
>
> <AdditionalLibraryDirectories>$(OPENSSL_HOME)/lib;$(LZO_HOME)/lib;$(PKCS11H_HOME)/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
> <GenerateDebugInformation>true</GenerateDebugInformation>
> <SubSystem>Console</SubSystem>
> @@ -80,12 +81,13 @@
> </PrecompiledHeader>
> <WarningLevel>Level3</WarningLevel>
> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
> +
> <UndefinePreprocessorDefinitions>UNICODE</UndefinePreprocessorDefinitions>
> </ClCompile>
> <ResourceCompile>
>
> <AdditionalIncludeDirectories>$(SOURCEBASE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
> </ResourceCompile>
> <Link>
> -
> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
> +
> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
>
> <AdditionalLibraryDirectories>$(OPENSSL_HOME)/lib;$(LZO_HOME)/lib;$(PKCS11H_HOME)/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
> <GenerateDebugInformation>true</GenerateDebugInformation>
> <SubSystem>Console</SubSystem>
> diff --git a/src/openvpn/options.c b/src/openvpn/options.c
> index 25786f6..66241b4 100644
> --- a/src/openvpn/options.c
> +++ b/src/openvpn/options.c
> @@ -3832,33 +3832,6 @@ parse_argv (struct options *options,
> {
> int i, j;
>
> -#ifdef WIN32
> - /*
> - * Windows replaces Unicode characters in argv[] that are not present
> - * in the current codepage with '?'. Get the wide char command line and
> - * convert it to UTF-8 ourselves.
> - */
> - int wargc;
> - WCHAR **wargv;
> - char **uargv;
> -
> - wargv = CommandLineToArgvW (GetCommandLineW (), &wargc);
> - if (wargv == NULL || wargc != argc)
> - usage ();
> -
> - uargv = gc_malloc (wargc * sizeof (*uargv), false, &options->gc);
> -
> - for (i = 0; i < wargc; i++)
> - {
> - int n = WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL,
> NULL);
> - uargv[i] = gc_malloc (n, false, &options->gc);
> - WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, uargv[i], n, NULL,
> NULL);
> - }
> -
> - LocalFree (wargv);
> - argv = uargv;
> -#endif
> -
> /* usage message */
> if (argc <= 1)
> usage ();
> --
> 1.7.3.4
>