Hi, As promised in yesterday's IRC meeting (summary coming today), I tested this patch on Windows 7 (64-bit). So far I've had no luck, but don't think the problems have anything to do with this patch.
Anyways, I cross-compiled latest "master" with this patch applied and "bin" and "lib" directories on top of an existing openvpn-2.3-alpha1 install. The old "bin" directory was renamed to make sure none of it was used. I then renamed "openvpn.ovpn" to "ääliö.ovpn" and "ta.key" to "ääliö.key" using Windows Explorer. Then I updated the configuration file to point to these files using Notepad (and later Wordpad). OpenVPN-GUI (Heiko's new version) detected the configuration file properly, showing "ääliö" as one available connection option. However, it output the following when trying to connect: Options error: --tls-auth fails with 'ääliö.key': No such file or directory Git Bash showed the file as ??li?.key, which could mean Windows Explorer is using a single-byte character set. Windows command prompt shows the characters properly, but issuing "openvpn --config ääliö.ovpn" gives the same error as OpenVPN-GUI above, except that 'ääliö.key' shows faulty glyphs[1]. This also triggers an interesting bug in the command prompt[2] Anyways, as the Windows 7 install is English-language, I suspect it's using a single-byte character set instead of UCS-2. I'll continue debugging, but any pointers are obviously much appreciated! Samuli [1] <http://users.utu.fi/sjsepp/cmd.png> [2] Typing an "ä" or "ö" moves the (invisible) cursor forward one character, but each backspace will delete two characters instead of one. This does not happen until openvpn has been (unsuccessfully) started. > 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 ();