Win32: non-ASCII names support in ngx_rename_file().

This makes it possible to upload files with non-ASCII characters
when using the dav module (ticket #1433).
This commit is contained in:
Maxim Dounin 2023-02-23 20:49:55 +03:00
parent fb264ca0d2
commit 16b638ef7c
2 changed files with 56 additions and 1 deletions

View File

@ -243,6 +243,61 @@ failed:
}
ngx_int_t
ngx_rename_file(u_char *from, u_char *to)
{
long rc;
size_t len;
u_short *fu, *tu;
ngx_err_t err;
u_short utf16f[NGX_UTF16_BUFLEN];
u_short utf16t[NGX_UTF16_BUFLEN];
len = NGX_UTF16_BUFLEN;
fu = ngx_utf8_to_utf16(utf16f, from, &len, 0);
if (fu == NULL) {
return NGX_FILE_ERROR;
}
rc = NGX_FILE_ERROR;
tu = NULL;
if (ngx_win32_check_filename(fu, len, 0) != NGX_OK) {
goto failed;
}
len = NGX_UTF16_BUFLEN;
tu = ngx_utf8_to_utf16(utf16t, to, &len, 0);
if (tu == NULL) {
goto failed;
}
if (ngx_win32_check_filename(tu, len, 1) != NGX_OK) {
goto failed;
}
rc = MoveFileW(fu, tu);
failed:
if (fu != utf16f) {
err = ngx_errno;
ngx_free(fu);
ngx_set_errno(err);
}
if (tu && tu != utf16t) {
err = ngx_errno;
ngx_free(tu);
ngx_set_errno(err);
}
return rc;
}
ngx_err_t
ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
{

View File

@ -127,7 +127,7 @@ ngx_int_t ngx_delete_file(u_char *name);
#define ngx_delete_file_n "DeleteFile()"
#define ngx_rename_file(o, n) MoveFile((const char *) o, (const char *) n)
ngx_int_t ngx_rename_file(u_char *from, u_char *to);
#define ngx_rename_file_n "MoveFile()"
ngx_err_t ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log);