Mercurial > hg > nginx
changeset 3417:15017418fd84
disable Win32 short file names
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 28 Jan 2010 14:17:51 +0000 |
parents | ee713c767b25 |
children | a076e1823737 |
files | src/os/win32/ngx_files.c |
diffstat | 1 files changed, 50 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/os/win32/ngx_files.c Thu Jan 28 14:09:28 2010 +0000 +++ b/src/os/win32/ngx_files.c Thu Jan 28 14:17:51 2010 +0000 @@ -10,7 +10,7 @@ #define NGX_UTF16_BUFLEN 256 -static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t len); +static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len); /* FILE_FLAG_BACKUP_SEMANTICS allows to obtain a handle to a directory */ @@ -18,27 +18,60 @@ ngx_fd_t ngx_open_file(u_char *name, u_long mode, u_long create, u_long access) { - u_short *u; + size_t len; + u_long n; + u_short *u, *lu; ngx_fd_t fd; ngx_err_t err; u_short utf16[NGX_UTF16_BUFLEN]; - u = ngx_utf8_to_utf16(utf16, name, NGX_UTF16_BUFLEN); + len = NGX_UTF16_BUFLEN; + u = ngx_utf8_to_utf16(utf16, name, &len); if (u == NULL) { return INVALID_HANDLE_VALUE; } + fd = INVALID_HANDLE_VALUE; + lu = NULL; + + if (create == NGX_FILE_OPEN) { + + lu = malloc(len * 2); + if (lu == NULL) { + goto failed; + } + + n = GetLongPathNameW(u, lu, len); + + if (n == 0) { + goto failed; + } + + if (n != len - 1 || ngx_memcmp(u, lu, n) != 0) { + ngx_set_errno(NGX_ENOENT); + goto failed; + } + } + fd = CreateFileW(u, mode, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, create, FILE_FLAG_BACKUP_SEMANTICS, NULL); +failed: + + err = ngx_errno; + + if (lu) { + ngx_free(lu); + } + if (u != utf16) { - err = ngx_errno; ngx_free(u); - ngx_set_errno(err); } + ngx_set_errno(err); + return fd; } @@ -244,13 +277,16 @@ ngx_int_t ngx_file_info(u_char *file, ngx_file_info_t *sb) { + size_t len; long rc; u_short *u; ngx_err_t err; WIN32_FILE_ATTRIBUTE_DATA fa; u_short utf16[NGX_UTF16_BUFLEN]; - u = ngx_utf8_to_utf16(utf16, file, NGX_UTF16_BUFLEN); + len = NGX_UTF16_BUFLEN; + + u = ngx_utf8_to_utf16(utf16, file, &len); if (u == NULL) { return NGX_FILE_ERROR; @@ -511,7 +547,7 @@ static u_short * -ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t len) +ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len) { u_char *p; u_short *u, *last; @@ -519,18 +555,18 @@ p = utf8; u = utf16; - last = utf16 + len; + last = utf16 + *len; while (u < last) { if (*p < 0x80) { - *u = (u_short) *p; + *u++ = (u_short) *p; if (*p == 0) { + *len = u - utf16; return utf16; } - u++; p++; continue; @@ -554,21 +590,21 @@ return NULL; } - ngx_memcpy(u, utf16, len * 2); + ngx_memcpy(u, utf16, *len * 2); utf16 = u; - u += len; + u += *len; for ( ;; ) { if (*p < 0x80) { - *u = (u_short) *p; + *u++ = (u_short) *p; if (*p == 0) { + *len = u - utf16; return utf16; } - u++; p++; continue;