summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStephan Szabo <stephan.szabo@sony.com>2021-01-20 10:08:49 -0800
committerJay Satiro <raysatiro@yahoo.com>2021-02-09 02:45:51 -0500
commit1269c80af1dc45c3cee1dbbc76270ac7c7d6f1c3 (patch)
tree8376253c4116399f71fbfd820a940949f18117f9 /lib
parentd4a3b87c13da5db437dc66d646132bdeb902e196 (diff)
downloadcurl-1269c80af1dc45c3cee1dbbc76270ac7c7d6f1c3.tar.gz
file: Support unicode urls on windows
Closes https://github.com/curl/curl/pull/6501
Diffstat (limited to 'lib')
-rw-r--r--lib/curl_multibyte.c26
-rw-r--r--lib/curl_setup.h4
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/curl_multibyte.c b/lib/curl_multibyte.c
index d327c8ba7..571f1d38a 100644
--- a/lib/curl_multibyte.c
+++ b/lib/curl_multibyte.c
@@ -82,6 +82,32 @@ char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w)
#if defined(USE_WIN32_LARGE_FILES) || defined(USE_WIN32_SMALL_FILES)
+int curlx_win32_open(const char *filename, int oflag, ...)
+{
+ int pmode = 0;
+
+#ifdef _UNICODE
+ int result = -1;
+ wchar_t *filename_w = curlx_convert_UTF8_to_wchar(filename);
+#endif
+
+ va_list param;
+ va_start(param, oflag);
+ if(oflag & O_CREAT)
+ pmode = va_arg(param, int);
+ va_end(param);
+
+#ifdef _UNICODE
+ if(filename_w)
+ result = _wopen(filename_w, oflag, pmode);
+ free(filename_w);
+ if(result != -1)
+ return result;
+#endif
+
+ return (_open)(filename, oflag, pmode);
+}
+
FILE *curlx_win32_fopen(const char *filename, const char *mode)
{
#ifdef _UNICODE
diff --git a/lib/curl_setup.h b/lib/curl_setup.h
index 22def2def..9cef5f7d0 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -335,8 +335,10 @@
# define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stati64
# define LSEEK_ERROR (__int64)-1
+# define open curlx_win32_open
# define fopen(fname,mode) curlx_win32_fopen(fname, mode)
# define access(fname,mode) curlx_win32_access(fname, mode)
+ int curlx_win32_open(const char *filename, int oflag, ...);
int curlx_win32_stat(const char *path, struct_stat *buffer);
FILE *curlx_win32_fopen(const char *filename, const char *mode);
int curlx_win32_access(const char *path, int mode);
@@ -356,9 +358,11 @@
# define fstat(fdes,stp) _fstat(fdes, stp)
# define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stat
+# define open curlx_win32_open
# define fopen(fname,mode) curlx_win32_fopen(fname, mode)
# define access(fname,mode) curlx_win32_access(fname, mode)
int curlx_win32_stat(const char *path, struct_stat *buffer);
+ int curlx_win32_open(const char *filename, int oflag, ...);
FILE *curlx_win32_fopen(const char *filename, const char *mode);
int curlx_win32_access(const char *path, int mode);
# endif