> Hello Samuli, > > Curios: Did you manage to get it work using master without my patch?
Nope, although I only tested it briefly. I'll try that again just in case. > 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. Thanks, I'll try that. Samuli > > 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 ();