Hello Samuli, Curios: Did you manage to get it work using master without my patch?
If not, to make it easy... Use Windows Explorer and rename the key file to something non-ascii. Then open openvpn configuration using UTF-8 editor and modify key file there. This should work, as we do not use unicode/conversion command-line. Next step would be to remove the key from configuration and use it in command-line. Alon. 2012/4/27 Samuli Seppänen <sam...@openvpn.net>: > 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 (); >