Skip to content

Commit

Permalink
curl_setup: support Unicode functions to open files on Windows
Browse files Browse the repository at this point in the history
Use them only if `_UNICODE` is defined, in which case command-line
arguments have been converted to UTF-8.

Closes curl#3784
  • Loading branch information
MarcelRaad committed Apr 26, 2020
1 parent e3adf1e commit bd63779
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 2 deletions.
51 changes: 51 additions & 0 deletions lib/curl_multibyte.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,54 @@ char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w)
}

#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 */
10 changes: 8 additions & 2 deletions lib/curl_setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -331,9 +331,12 @@
# undef fstat
# define fstat(fdes,stp) _fstati64(fdes, stp)
# undef stat
# define stat(fname,stp) _stati64(fname, stp)
# define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stati64
# 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

/*
Expand All @@ -348,8 +351,11 @@
# undef lseek
# define lseek(fdes,offset,whence) _lseek(fdes, (long)offset, whence)
# 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 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
# define LSEEK_ERROR (long)-1
#endif
Expand Down

0 comments on commit bd63779

Please sign in to comment.