> 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 ();



Reply via email to