1
0
mirror of https://github.com/moparisthebest/curl synced 2024-11-17 15:05:02 -05:00

curl_setup: support Unicode functions to open files on Windows

Use them only if `_UNICODE` is defined, in which case command-line
arguments have been converted to UTF-8.

Closes https://github.com/curl/curl/pull/3784
This commit is contained in:
Marcel Raad 2020-01-02 22:47:33 +01:00
parent 9e5669f388
commit ffdddb45d9
No known key found for this signature in database
GPG Key ID: 33C416EFAE4D6F02
2 changed files with 59 additions and 2 deletions

View File

@ -79,3 +79,54 @@ char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w)
} }
#endif /* WIN32 */ #endif /* WIN32 */
#if defined(USE_WIN32_LARGE_FILES) || defined(USE_WIN32_SMALL_FILES)
FILE *curlx_win32_fopen(const char *filename, const char *mode)
{
#ifdef _UNICODE
FILE *result = NULL;
wchar_t *filename_w = curlx_convert_UTF8_to_wchar(filename);
wchar_t *mode_w = curlx_convert_UTF8_to_wchar(mode);
if(filename_w && mode_w)
result = _wfopen(filename_w, mode_w);
free(filename_w);
free(mode_w);
if(result)
return result;
#endif
return (fopen)(filename, mode);
}
int curlx_win32_stat(const char *path, struct_stat *buffer)
{
int result = -1;
#ifdef _UNICODE
wchar_t *path_w = curlx_convert_UTF8_to_wchar(path);
#endif /* _UNICODE */
#if defined(USE_WIN32_SMALL_FILES)
#if defined(_UNICODE)
if(path_w)
result = _wstat(path_w, buffer);
else
#endif /* _UNICODE */
result = _stat(path, buffer);
#else /* USE_WIN32_SMALL_FILES */
#if defined(_UNICODE)
if(path_w)
result = _wstati64(path_w, buffer);
else
#endif /* _UNICODE */
result = _stati64(path, buffer);
#endif /* USE_WIN32_SMALL_FILES */
#ifdef _UNICODE
free(path_w);
#endif
return result;
}
#endif /* USE_WIN32_LARGE_FILES || USE_WIN32_SMALL_FILES */

View File

@ -331,9 +331,12 @@
# undef fstat # undef fstat
# define fstat(fdes,stp) _fstati64(fdes, stp) # define fstat(fdes,stp) _fstati64(fdes, stp)
# undef stat # undef stat
# define stat(fname,stp) _stati64(fname, stp) # define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stati64 # define struct_stat struct _stati64
# define LSEEK_ERROR (__int64)-1 # define LSEEK_ERROR (__int64)-1
# define fopen(fname,mode) curlx_win32_fopen(fname, mode)
int curlx_win32_stat(const char *path, struct_stat *buffer);
FILE *curlx_win32_fopen(const char *filename, const char *mode);
#endif #endif
/* /*
@ -348,8 +351,11 @@
# undef lseek # undef lseek
# define lseek(fdes,offset,whence) _lseek(fdes, (long)offset, whence) # define lseek(fdes,offset,whence) _lseek(fdes, (long)offset, whence)
# define fstat(fdes,stp) _fstat(fdes, stp) # define fstat(fdes,stp) _fstat(fdes, stp)
# define stat(fname,stp) _stat(fname, stp) # define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stat # define struct_stat struct _stat
# define fopen(fname,mode) curlx_win32_fopen(fname, mode)
int curlx_win32_stat(const char *path, struct_stat *buffer);
FILE *curlx_win32_fopen(const char *filename, const char *mode);
# endif # endif
# define LSEEK_ERROR (long)-1 # define LSEEK_ERROR (long)-1
#endif #endif