diff options
author | Heiko Hund <heiko.hund@sophos.com> | 2012-02-10 15:13:42 +0100 |
---|---|---|
committer | David Sommerseth <davids@redhat.com> | 2012-02-13 17:11:50 +0100 |
commit | 71bbbd76c62630c88441237d72fe5b61f0b45b2a (patch) | |
tree | 715f8c8183c6e47bb26f0a10c0f6b14f9b9f83a2 /error.c | |
parent | 2ee0dc2bd72ec318fcc227af54e5ca7e1384a6cc (diff) | |
download | openvpn-71bbbd76c62630c88441237d72fe5b61f0b45b2a.tar.gz openvpn-71bbbd76c62630c88441237d72fe5b61f0b45b2a.tar.xz openvpn-71bbbd76c62630c88441237d72fe5b61f0b45b2a.zip |
handle Windows unicode paths
Openvpn for Windows is not compiled as a Unicode binary and thus cannot
handle paths which contain non-ASCII characters using the argv vector.
Characters that are not present in the system codepage are simply replaced
with a question mark, e.g. if started as 'openvpn --config домой.ovpn'
the file '?????.ovpn' is tried to be opened as configuration.
The same applies to paths in config files which need to be UTF-8
encoded if they contain non ASCII characters. The option line
'key лев.pem' will lead to openvpn trying to open 'лев.pem' on a
system with codepage 1252.
This patch makes openvpn read the command line in UCS-2 and convert
it to UTF-8 internally. Windows stores names in the filesystem in UCS-2.
When using a paths openvpn converts it from UTF-8 to UCS-2 and uses the
wide character Windows API function.
Signed-off-by: Heiko Hund <heiko.hund@sophos.com>
Acked-by: David Sommerseth <davids@redhat.com>
Signed-off-by: David Sommerseth <davids@redhat.com>
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -465,6 +465,7 @@ redirect_stdout_stderr (const char *file, bool append) #if defined(WIN32) if (!std_redir) { + struct gc_arena gc = gc_new (); HANDLE log_handle; int log_fd; @@ -473,13 +474,15 @@ redirect_stdout_stderr (const char *file, bool append) saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; - log_handle = CreateFile (file, - GENERIC_WRITE, - FILE_SHARE_READ, - &saAttr, - append ? OPEN_ALWAYS : CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); + log_handle = CreateFileW (wide_string (file, &gc), + GENERIC_WRITE, + FILE_SHARE_READ, + &saAttr, + append ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); + + gc_free (&gc); if (log_handle == INVALID_HANDLE_VALUE) { |