annotate src/os/win32/ngx_files.c @ 8138:96d894b38667

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).
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 23 Feb 2023 20:49:55 +0300
parents 4b06186670ed
children e818ed227735
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4017
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 344
diff changeset
6
42
cd035a94e0b6 nginx-0.0.1-2002-12-27-10:27:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 35
diff changeset
7
cd035a94e0b6 nginx-0.0.1-2002-12-27-10:27:47 import
Igor Sysoev <igor@sysoev.ru>
parents: 35
diff changeset
8 #include <ngx_config.h>
100
7ebc8b7fb816 nginx-0.0.1-2003-06-03-19:42:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 42
diff changeset
9 #include <ngx_core.h>
8
708f8bb772ec nginx-0.0.1-2002-09-02-18:48:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
708f8bb772ec nginx-0.0.1-2002-09-02-18:48:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
12 #define NGX_UTF16_BUFLEN 256
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
13 #define NGX_UTF8_BUFLEN 512
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
14
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
15 static ngx_int_t ngx_win32_check_filename(u_short *u, size_t len,
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
16 ngx_uint_t dirname);
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
17 static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len,
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
18 size_t reserved);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
19 static u_char *ngx_utf16_to_utf8(u_char *utf8, u_short *utf16, size_t *len,
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
20 size_t *allocated);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
21 uint32_t ngx_utf16_decode(u_short **u, size_t n);
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
22
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
23
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
24 /* FILE_FLAG_BACKUP_SEMANTICS allows to obtain a handle to a directory */
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
25
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
26 ngx_fd_t
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
27 ngx_open_file(u_char *name, u_long mode, u_long create, u_long access)
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
28 {
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
29 size_t len;
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
30 u_short *u;
3137
179f6dfcb7fe preserve errno while ngx_free()
Igor Sysoev <igor@sysoev.ru>
parents: 2974
diff changeset
31 ngx_fd_t fd;
179f6dfcb7fe preserve errno while ngx_free()
Igor Sysoev <igor@sysoev.ru>
parents: 2974
diff changeset
32 ngx_err_t err;
179f6dfcb7fe preserve errno while ngx_free()
Igor Sysoev <igor@sysoev.ru>
parents: 2974
diff changeset
33 u_short utf16[NGX_UTF16_BUFLEN];
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
34
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
35 len = NGX_UTF16_BUFLEN;
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
36 u = ngx_utf8_to_utf16(utf16, name, &len, 0);
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
37
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
38 if (u == NULL) {
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
39 return INVALID_HANDLE_VALUE;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
40 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
41
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
42 fd = INVALID_HANDLE_VALUE;
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
43
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
44 if (create == NGX_FILE_OPEN
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
45 && ngx_win32_check_filename(u, len, 0) != NGX_OK)
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
46 {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
47 goto failed;
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
48 }
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
49
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
50 fd = CreateFileW(u, mode,
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
51 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
52 NULL, create, FILE_FLAG_BACKUP_SEMANTICS, NULL);
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
53
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
54 failed:
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
55
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
56 if (u != utf16) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
57 err = ngx_errno;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
58 ngx_free(u);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
59 ngx_set_errno(err);
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
60 }
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
61
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
62 return fd;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
63 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
64
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
65
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
66 ssize_t
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
67 ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
8
708f8bb772ec nginx-0.0.1-2002-09-02-18:48:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 {
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
69 u_long n;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
70 ngx_err_t err;
182
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
71 OVERLAPPED ovlp, *povlp;
8
708f8bb772ec nginx-0.0.1-2002-09-02-18:48:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72
3156
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
73 ovlp.Internal = 0;
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
74 ovlp.InternalHigh = 0;
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
75 ovlp.Offset = (u_long) offset;
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
76 ovlp.OffsetHigh = (u_long) (offset >> 32);
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
77 ovlp.hEvent = NULL;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 457
diff changeset
78
3156
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
79 povlp = &ovlp;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
80
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
81 if (ReadFile(file->fd, buf, size, &n, povlp) == 0) {
2974
63f71723cd2a handle Win32 ReadFile() EOF state in Unix way
Igor Sysoev <igor@sysoev.ru>
parents: 2901
diff changeset
82 err = ngx_errno;
63f71723cd2a handle Win32 ReadFile() EOF state in Unix way
Igor Sysoev <igor@sysoev.ru>
parents: 2901
diff changeset
83
63f71723cd2a handle Win32 ReadFile() EOF state in Unix way
Igor Sysoev <igor@sysoev.ru>
parents: 2901
diff changeset
84 if (err == ERROR_HANDLE_EOF) {
63f71723cd2a handle Win32 ReadFile() EOF state in Unix way
Igor Sysoev <igor@sysoev.ru>
parents: 2901
diff changeset
85 return 0;
63f71723cd2a handle Win32 ReadFile() EOF state in Unix way
Igor Sysoev <igor@sysoev.ru>
parents: 2901
diff changeset
86 }
63f71723cd2a handle Win32 ReadFile() EOF state in Unix way
Igor Sysoev <igor@sysoev.ru>
parents: 2901
diff changeset
87
3157
a2c1b4f74ea7 log file name for read/write errors
Igor Sysoev <igor@sysoev.ru>
parents: 3156
diff changeset
88 ngx_log_error(NGX_LOG_ERR, file->log, err,
a2c1b4f74ea7 log file name for read/write errors
Igor Sysoev <igor@sysoev.ru>
parents: 3156
diff changeset
89 "ReadFile() \"%s\" failed", file->name.data);
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
90 return NGX_ERROR;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
91 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
92
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
93 file->offset += n;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
94
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
95 return n;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
96 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
97
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
98
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
99 ssize_t
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
100 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
101 {
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
102 u_long n;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
103 OVERLAPPED ovlp, *povlp;
183
4c698194c56d nginx-0.0.1-2003-11-13-19:16:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 182
diff changeset
104
3156
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
105 ovlp.Internal = 0;
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
106 ovlp.InternalHigh = 0;
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
107 ovlp.Offset = (u_long) offset;
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
108 ovlp.OffsetHigh = (u_long) (offset >> 32);
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
109 ovlp.hEvent = NULL;
183
4c698194c56d nginx-0.0.1-2003-11-13-19:16:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 182
diff changeset
110
3156
55f006d944ba delete Win95 code
Igor Sysoev <igor@sysoev.ru>
parents: 3138
diff changeset
111 povlp = &ovlp;
183
4c698194c56d nginx-0.0.1-2003-11-13-19:16:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 182
diff changeset
112
4c698194c56d nginx-0.0.1-2003-11-13-19:16:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 182
diff changeset
113 if (WriteFile(file->fd, buf, size, &n, povlp) == 0) {
3157
a2c1b4f74ea7 log file name for read/write errors
Igor Sysoev <igor@sysoev.ru>
parents: 3156
diff changeset
114 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,
a2c1b4f74ea7 log file name for read/write errors
Igor Sysoev <igor@sysoev.ru>
parents: 3156
diff changeset
115 "WriteFile() \"%s\" failed", file->name.data);
182
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
116 return NGX_ERROR;
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
117 }
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
118
3158
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
119 if (n != size) {
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
120 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
121 "WriteFile() \"%s\" has written only %ul of %uz",
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
122 file->name.data, n, size);
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
123 return NGX_ERROR;
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
124 }
17afb68c2a9a test incomplete WriteFile()
Igor Sysoev <igor@sysoev.ru>
parents: 3157
diff changeset
125
182
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
126 file->offset += n;
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
127
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
128 return n;
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
129 }
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
130
3c49eaf3f522 nginx-0.0.1-2003-11-13-09:14:05 import
Igor Sysoev <igor@sysoev.ru>
parents: 123
diff changeset
131
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
132 ssize_t
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
133 ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
134 ngx_pool_t *pool)
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
135 {
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
136 u_char *buf, *prev;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
137 size_t size;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
138 ssize_t total, n;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
139
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
140 total = 0;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
141
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
142 while (cl) {
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
143 buf = cl->buf->pos;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
144 prev = buf;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
145 size = 0;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
146
344
e366ba5db8f8 nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 343
diff changeset
147 /* coalesce the neighbouring bufs */
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
148
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
149 while (cl && prev == cl->buf->pos) {
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
150 size += cl->buf->last - cl->buf->pos;
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
151 prev = cl->buf->last;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
152 cl = cl->next;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
153 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
154
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
155 n = ngx_write_file(file, buf, size, offset);
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
156
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
157 if (n == NGX_ERROR) {
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
158 return NGX_ERROR;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
159 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
160
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
161 total += n;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
162 offset += n;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
163 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
164
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
165 return total;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
166 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
167
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
168
1634
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
169 ssize_t
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
170 ngx_read_fd(ngx_fd_t fd, void *buf, size_t size)
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
171 {
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
172 u_long n;
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
173
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
174 if (ReadFile(fd, buf, size, &n, NULL) != 0) {
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
175 return (size_t) n;
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
176 }
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
177
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
178 return -1;
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
179 }
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
180
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
181
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
182 ssize_t
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
183 ngx_write_fd(ngx_fd_t fd, void *buf, size_t size)
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
184 {
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
185 u_long n;
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
186
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
187 if (WriteFile(fd, buf, size, &n, NULL) != 0) {
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
188 return (size_t) n;
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
189 }
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
190
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
191 return -1;
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
192 }
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
193
d3cbb96818f1 fix win32 ngx_read_fd() and ngx_write_fd()
Igor Sysoev <igor@sysoev.ru>
parents: 1632
diff changeset
194
2769
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
195 ssize_t
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
196 ngx_write_console(ngx_fd_t fd, void *buf, size_t size)
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
197 {
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
198 u_long n;
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
199
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
200 (void) CharToOemBuff(buf, buf, size);
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
201
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
202 if (WriteFile(fd, buf, size, &n, NULL) != 0) {
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
203 return (size_t) n;
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
204 }
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
205
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
206 return -1;
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
207 }
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
208
9d986c4e796f introduce ngx_write_console() to support OEM code pages
Igor Sysoev <igor@sysoev.ru>
parents: 2687
diff changeset
209
8137
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
210 ngx_int_t
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
211 ngx_delete_file(u_char *name)
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
212 {
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
213 long rc;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
214 size_t len;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
215 u_short *u;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
216 ngx_err_t err;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
217 u_short utf16[NGX_UTF16_BUFLEN];
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
218
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
219 len = NGX_UTF16_BUFLEN;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
220 u = ngx_utf8_to_utf16(utf16, name, &len, 0);
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
221
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
222 if (u == NULL) {
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
223 return NGX_FILE_ERROR;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
224 }
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
225
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
226 rc = NGX_FILE_ERROR;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
227
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
228 if (ngx_win32_check_filename(u, len, 0) != NGX_OK) {
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
229 goto failed;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
230 }
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
231
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
232 rc = DeleteFileW(u);
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
233
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
234 failed:
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
235
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
236 if (u != utf16) {
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
237 err = ngx_errno;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
238 ngx_free(u);
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
239 ngx_set_errno(err);
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
240 }
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
241
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
242 return rc;
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
243 }
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
244
4b06186670ed Win32: non-ASCII names support in ngx_delete_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8136
diff changeset
245
8138
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
246 ngx_int_t
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
247 ngx_rename_file(u_char *from, u_char *to)
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
248 {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
249 long rc;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
250 size_t len;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
251 u_short *fu, *tu;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
252 ngx_err_t err;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
253 u_short utf16f[NGX_UTF16_BUFLEN];
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
254 u_short utf16t[NGX_UTF16_BUFLEN];
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
255
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
256 len = NGX_UTF16_BUFLEN;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
257 fu = ngx_utf8_to_utf16(utf16f, from, &len, 0);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
258
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
259 if (fu == NULL) {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
260 return NGX_FILE_ERROR;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
261 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
262
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
263 rc = NGX_FILE_ERROR;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
264 tu = NULL;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
265
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
266 if (ngx_win32_check_filename(fu, len, 0) != NGX_OK) {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
267 goto failed;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
268 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
269
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
270 len = NGX_UTF16_BUFLEN;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
271 tu = ngx_utf8_to_utf16(utf16t, to, &len, 0);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
272
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
273 if (tu == NULL) {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
274 goto failed;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
275 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
276
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
277 if (ngx_win32_check_filename(tu, len, 1) != NGX_OK) {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
278 goto failed;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
279 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
280
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
281 rc = MoveFileW(fu, tu);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
282
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
283 failed:
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
284
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
285 if (fu != utf16f) {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
286 err = ngx_errno;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
287 ngx_free(fu);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
288 ngx_set_errno(err);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
289 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
290
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
291 if (tu && tu != utf16t) {
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
292 err = ngx_errno;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
293 ngx_free(tu);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
294 ngx_set_errno(err);
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
295 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
296
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
297 return rc;
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
298 }
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
299
96d894b38667 Win32: non-ASCII names support in ngx_rename_file().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8137
diff changeset
300
3382
6be1f25bae90 fix Win32 error messages when an temporary file replaces an existent file:
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
301 ngx_err_t
1693
f4eb04fd8579 use malloc() in ngx_win32_rename_file, set crit level instead of error
Igor Sysoev <igor@sysoev.ru>
parents: 1634
diff changeset
302 ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
303 {
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
304 u_char *name;
3382
6be1f25bae90 fix Win32 error messages when an temporary file replaces an existent file:
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
305 ngx_err_t err;
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
306 ngx_uint_t collision;
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
307 ngx_atomic_uint_t num;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
308
4017
4f4086cf1a07 Fix buffer overrun under Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3651
diff changeset
309 name = ngx_alloc(to->len + 1 + NGX_ATOMIC_T_LEN + 1 + sizeof("DELETE"),
4f4086cf1a07 Fix buffer overrun under Windows.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3651
diff changeset
310 log);
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
311 if (name == NULL) {
3382
6be1f25bae90 fix Win32 error messages when an temporary file replaces an existent file:
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
312 return NGX_ENOMEM;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
313 }
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
314
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
315 ngx_memcpy(name, to->data, to->len);
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
316
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
317 collision = 0;
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
318
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
319 /* mutex_lock() (per cache or single ?) */
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
320
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
321 for ( ;; ) {
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
322 num = ngx_next_temp_number(collision);
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
323
2900
812445a822e3 add trailing zero to a file name
Igor Sysoev <igor@sysoev.ru>
parents: 2782
diff changeset
324 ngx_sprintf(name + to->len, ".%0muA.DELETE%Z", num);
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
325
8136
37a184966ab3 Win32: reworked ngx_win32_rename_file() to use nginx wrappers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8135
diff changeset
326 if (ngx_rename_file(to->data, name) != NGX_FILE_ERROR) {
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
327 break;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
328 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
329
8135
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
330 err = ngx_errno;
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
331
8135
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
332 if (err == NGX_EEXIST || err == NGX_EEXIST_FILE) {
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
333 collision = 1;
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
334 continue;
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
335 }
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
336
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
337 ngx_log_error(NGX_LOG_CRIT, log, err,
2901
17da2da3a8f5 fix logging in ngx_win32_rename_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2900
diff changeset
338 "MoveFile() \"%s\" to \"%s\" failed", to->data, name);
8135
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
339 goto failed;
499
64d9afb209da nginx-0.1.24-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 467
diff changeset
340 }
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
341
8136
37a184966ab3 Win32: reworked ngx_win32_rename_file() to use nginx wrappers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8135
diff changeset
342 if (ngx_rename_file(from->data, to->data) == NGX_FILE_ERROR) {
3382
6be1f25bae90 fix Win32 error messages when an temporary file replaces an existent file:
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
343 err = ngx_errno;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
344
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
345 } else {
3382
6be1f25bae90 fix Win32 error messages when an temporary file replaces an existent file:
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
346 err = 0;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
347 }
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
348
8136
37a184966ab3 Win32: reworked ngx_win32_rename_file() to use nginx wrappers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8135
diff changeset
349 if (ngx_delete_file(name) == NGX_FILE_ERROR) {
2901
17da2da3a8f5 fix logging in ngx_win32_rename_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2900
diff changeset
350 ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
17da2da3a8f5 fix logging in ngx_win32_rename_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2900
diff changeset
351 "DeleteFile() \"%s\" failed", name);
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
352 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
353
8135
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
354 failed:
8880fe0b193c Win32: reworked ngx_win32_rename_file() to check errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8134
diff changeset
355
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
356 /* mutex_unlock() */
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
357
1693
f4eb04fd8579 use malloc() in ngx_win32_rename_file, set crit level instead of error
Igor Sysoev <igor@sysoev.ru>
parents: 1634
diff changeset
358 ngx_free(name);
f4eb04fd8579 use malloc() in ngx_win32_rename_file, set crit level instead of error
Igor Sysoev <igor@sysoev.ru>
parents: 1634
diff changeset
359
3382
6be1f25bae90 fix Win32 error messages when an temporary file replaces an existent file:
Igor Sysoev <igor@sysoev.ru>
parents: 3200
diff changeset
360 return err;
184
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
361 }
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
362
1bf718ce0dde nginx-0.0.1-2003-11-14-10:20:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 183
diff changeset
363
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
364 ngx_int_t
2462
90d5ddfedbb1 use GetFileAttributesEx() instead of GetFileAttributes()
Igor Sysoev <igor@sysoev.ru>
parents: 2459
diff changeset
365 ngx_file_info(u_char *file, ngx_file_info_t *sb)
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
366 {
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
367 size_t len;
3138
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
368 long rc;
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
369 u_short *u;
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
370 ngx_err_t err;
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
371 WIN32_FILE_ATTRIBUTE_DATA fa;
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
372 u_short utf16[NGX_UTF16_BUFLEN];
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
373
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
374 len = NGX_UTF16_BUFLEN;
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
375
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
376 u = ngx_utf8_to_utf16(utf16, file, &len, 0);
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
377
3138
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
378 if (u == NULL) {
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
379 return NGX_FILE_ERROR;
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
380 }
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
381
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
382 rc = NGX_FILE_ERROR;
3138
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
383
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
384 if (ngx_win32_check_filename(u, len, 0) != NGX_OK) {
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
385 goto failed;
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
386 }
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
387
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
388 rc = GetFileAttributesExW(u, GetFileExInfoStandard, &fa);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
389
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
390 sb->dwFileAttributes = fa.dwFileAttributes;
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
391 sb->ftCreationTime = fa.ftCreationTime;
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
392 sb->ftLastAccessTime = fa.ftLastAccessTime;
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
393 sb->ftLastWriteTime = fa.ftLastWriteTime;
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
394 sb->nFileSizeHigh = fa.nFileSizeHigh;
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
395 sb->nFileSizeLow = fa.nFileSizeLow;
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
396
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
397 failed:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
398
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
399 if (u != utf16) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
400 err = ngx_errno;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
401 ngx_free(u);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
402 ngx_set_errno(err);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
403 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
404
3138
a2479937dbd8 win32 ngx_file_info() utf8 support
Igor Sysoev <igor@sysoev.ru>
parents: 3137
diff changeset
405 return rc;
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
406 }
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
407
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
408
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
409 ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
410 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
411 {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
412 uint64_t intervals;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
413 FILETIME ft;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
414
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
415 /* 116444736000000000 is commented in src/os/win32/ngx_time.c */
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
416
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
417 intervals = s * 10000000 + 116444736000000000;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
418
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
419 ft.dwLowDateTime = (DWORD) intervals;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
420 ft.dwHighDateTime = (DWORD) (intervals >> 32);
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
421
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
422 if (SetFileTime(fd, NULL, NULL, &ft) != 0) {
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
423 return NGX_OK;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
424 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
425
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
426 return NGX_ERROR;
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
427 }
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
428
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
429
3651
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
430 ngx_int_t
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
431 ngx_create_file_mapping(ngx_file_mapping_t *fm)
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
432 {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
433 LARGE_INTEGER size;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
434
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
435 fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
436 NGX_FILE_DEFAULT_ACCESS);
7086
Sergey Kandaurov <pluknet@nginx.com>
parents: 5785
diff changeset
437
3651
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
438 if (fm->fd == NGX_INVALID_FILE) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
439 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
440 ngx_open_file_n " \"%s\" failed", fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
441 return NGX_ERROR;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
442 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
443
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
444 fm->handle = NULL;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
445
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
446 size.QuadPart = fm->size;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
447
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
448 if (SetFilePointerEx(fm->fd, size, NULL, FILE_BEGIN) == 0) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
449 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
450 "SetFilePointerEx(\"%s\", %uz) failed",
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
451 fm->name, fm->size);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
452 goto failed;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
453 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
454
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
455 if (SetEndOfFile(fm->fd) == 0) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
456 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
457 "SetEndOfFile() \"%s\" failed", fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
458 goto failed;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
459 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
460
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
461 fm->handle = CreateFileMapping(fm->fd, NULL, PAGE_READWRITE,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
462 (u_long) ((off_t) fm->size >> 32),
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
463 (u_long) ((off_t) fm->size & 0xffffffff),
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
464 NULL);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
465 if (fm->handle == NULL) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
466 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
467 "CreateFileMapping(%s, %uz) failed",
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
468 fm->name, fm->size);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
469 goto failed;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
470 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
471
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
472 fm->addr = MapViewOfFile(fm->handle, FILE_MAP_WRITE, 0, 0, 0);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
473
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
474 if (fm->addr != NULL) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
475 return NGX_OK;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
476 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
477
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
478 ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
479 "MapViewOfFile(%uz) of file mapping \"%s\" failed",
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
480 fm->size, fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
481
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
482 failed:
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
483
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
484 if (fm->handle) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
485 if (CloseHandle(fm->handle) == 0) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
486 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
487 "CloseHandle() of file mapping \"%s\" failed",
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
488 fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
489 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
490 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
491
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
492 if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
493 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
494 ngx_close_file_n " \"%s\" failed", fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
495 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
496
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
497 return NGX_ERROR;
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
498 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
499
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
500
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
501 void
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
502 ngx_close_file_mapping(ngx_file_mapping_t *fm)
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
503 {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
504 if (UnmapViewOfFile(fm->addr) == 0) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
505 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
506 "UnmapViewOfFile(%p) of file mapping \"%s\" failed",
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
507 fm->addr, &fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
508 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
509
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
510 if (CloseHandle(fm->handle) == 0) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
511 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
512 "CloseHandle() of file mapping \"%s\" failed",
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
513 &fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
514 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
515
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
516 if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
517 ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
518 ngx_close_file_n " \"%s\" failed", fm->name);
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
519 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
520 }
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
521
515d50917016 ngx_create_file_mapping()
Igor Sysoev <igor@sysoev.ru>
parents: 3614
diff changeset
522
4564
13eb3193cd63 Fixed win32 build after realpath changes in r4559.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
523 u_char *
2259
0864138899f1 $realpath_root
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
524 ngx_realpath(u_char *path, u_char *resolved)
0864138899f1 $realpath_root
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
525 {
0864138899f1 $realpath_root
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
526 /* STUB */
4564
13eb3193cd63 Fixed win32 build after realpath changes in r4559.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
527 return path;
2259
0864138899f1 $realpath_root
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
528 }
0864138899f1 $realpath_root
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
529
0864138899f1 $realpath_root
Igor Sysoev <igor@sysoev.ru>
parents: 2248
diff changeset
530
8132
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
531 size_t
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
532 ngx_getcwd(u_char *buf, size_t size)
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
533 {
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
534 u_char *p;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
535 size_t n;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
536 u_short utf16[NGX_MAX_PATH];
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
537
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
538 n = GetCurrentDirectoryW(NGX_MAX_PATH, utf16);
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
539
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
540 if (n == 0) {
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
541 return 0;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
542 }
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
543
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
544 if (n > NGX_MAX_PATH) {
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
545 ngx_set_errno(ERROR_INSUFFICIENT_BUFFER);
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
546 return 0;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
547 }
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
548
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
549 p = ngx_utf16_to_utf8(buf, utf16, &size, NULL);
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
550
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
551 if (p == NULL) {
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
552 return 0;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
553 }
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
554
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
555 if (p != buf) {
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
556 ngx_free(p);
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
557 ngx_set_errno(ERROR_INSUFFICIENT_BUFFER);
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
558 return 0;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
559 }
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
560
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
561 return size - 1;
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
562 }
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
563
8ea2e052feb4 Win32: non-ASCII directory names support in ngx_getcwd().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8131
diff changeset
564
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
565 ngx_int_t
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
566 ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
567 {
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
568 size_t len;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
569 u_short *u, *p;
7433
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
570 ngx_err_t err;
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
571 u_short utf16[NGX_UTF16_BUFLEN];
7433
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
572
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
573 len = NGX_UTF16_BUFLEN - 2;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
574 u = ngx_utf8_to_utf16(utf16, name->data, &len, 2);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
575
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
576 if (u == NULL) {
7433
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
577 return NGX_ERROR;
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
578 }
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
579
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
580 if (ngx_win32_check_filename(u, len, 0) != NGX_OK) {
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
581 goto failed;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
582 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
583
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
584 p = &u[len - 1];
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
585
7433
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
586 *p++ = '/';
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
587 *p++ = '*';
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
588 *p = '\0';
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
589
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
590 dir->dir = FindFirstFileW(u, &dir->finddata);
5749
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
591
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
592 if (dir->dir == INVALID_HANDLE_VALUE) {
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
593 goto failed;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
594 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
595
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
596 if (u != utf16) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
597 ngx_free(u);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
598 }
7433
061ec464813f Win32: removed NGX_DIR_MASK concept.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7086
diff changeset
599
457
ded1284520cc nginx-0.1.3-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
600 dir->valid_info = 1;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
601 dir->ready = 1;
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
602 dir->name = NULL;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
603 dir->allocated = 0;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
604
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
605 return NGX_OK;
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
606
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
607 failed:
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
608
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
609 if (u != utf16) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
610 err = ngx_errno;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
611 ngx_free(u);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
612 ngx_set_errno(err);
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
613 }
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
614
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
615 return NGX_ERROR;
186
c1f3a3c7c5db nginx-0.0.1-2003-11-17-00:49:42 import
Igor Sysoev <igor@sysoev.ru>
parents: 185
diff changeset
616 }
185
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
617
d5f50cefc322 nginx-0.0.1-2003-11-14-19:52:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 184
diff changeset
618
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
619 ngx_int_t
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
620 ngx_read_dir(ngx_dir_t *dir)
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
621 {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
622 u_char *name;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
623 size_t len, allocated;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
624
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
625 if (dir->ready) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
626 dir->ready = 0;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
627 goto convert;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
628 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
629
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
630 if (FindNextFileW(dir->dir, &dir->finddata) != 0) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
631 dir->type = 1;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
632 goto convert;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
633 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
634
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
635 return NGX_ERROR;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
636
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
637 convert:
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
638
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
639 name = dir->name;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
640 len = dir->allocated;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
641
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
642 name = ngx_utf16_to_utf8(name, dir->finddata.cFileName, &len, &allocated);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
643
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
644 if (name == NULL) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
645 return NGX_ERROR;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
646 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
647
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
648 if (name != dir->name) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
649
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
650 if (dir->name) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
651 ngx_free(dir->name);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
652 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
653
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
654 dir->name = name;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
655 dir->allocated = allocated;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
656 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
657
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
658 dir->namelen = len - 1;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
659
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
660 return NGX_OK;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
661 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
662
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
663
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
664 ngx_int_t
5749
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
665 ngx_close_dir(ngx_dir_t *dir)
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
666 {
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
667 if (dir->name) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
668 ngx_free(dir->name);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
669 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
670
5749
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
671 if (FindClose(dir->dir) == 0) {
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
672 return NGX_ERROR;
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
673 }
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
674
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
675 return NGX_OK;
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
676 }
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
677
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
678
a680bf4dddd5 Win32: ngx_open_dir() and ngx_close_dir() fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5501
diff changeset
679 ngx_int_t
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
680 ngx_create_dir(u_char *name, ngx_uint_t access)
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
681 {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
682 long rc;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
683 size_t len;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
684 u_short *u;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
685 ngx_err_t err;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
686 u_short utf16[NGX_UTF16_BUFLEN];
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
687
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
688 len = NGX_UTF16_BUFLEN;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
689 u = ngx_utf8_to_utf16(utf16, name, &len, 0);
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
690
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
691 if (u == NULL) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
692 return NGX_FILE_ERROR;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
693 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
694
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
695 rc = NGX_FILE_ERROR;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
696
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
697 if (ngx_win32_check_filename(u, len, 1) != NGX_OK) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
698 goto failed;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
699 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
700
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
701 rc = CreateDirectoryW(u, NULL);
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
702
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
703 failed:
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
704
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
705 if (u != utf16) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
706 err = ngx_errno;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
707 ngx_free(u);
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
708 ngx_set_errno(err);
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
709 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
710
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
711 return rc;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
712 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
713
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
714
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
715 ngx_int_t
8134
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
716 ngx_delete_dir(u_char *name)
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
717 {
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
718 long rc;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
719 size_t len;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
720 u_short *u;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
721 ngx_err_t err;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
722 u_short utf16[NGX_UTF16_BUFLEN];
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
723
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
724 len = NGX_UTF16_BUFLEN;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
725 u = ngx_utf8_to_utf16(utf16, name, &len, 0);
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
726
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
727 if (u == NULL) {
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
728 return NGX_FILE_ERROR;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
729 }
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
730
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
731 rc = NGX_FILE_ERROR;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
732
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
733 if (ngx_win32_check_filename(u, len, 0) != NGX_OK) {
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
734 goto failed;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
735 }
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
736
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
737 rc = RemoveDirectoryW(u);
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
738
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
739 failed:
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
740
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
741 if (u != utf16) {
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
742 err = ngx_errno;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
743 ngx_free(u);
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
744 ngx_set_errno(err);
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
745 }
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
746
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
747 return rc;
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
748 }
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
749
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
750
7d60e4584d9e Win32: non-ASCII directory names support in ngx_delete_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8133
diff changeset
751 ngx_int_t
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
752 ngx_open_glob(ngx_glob_t *gl)
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
753 {
2459
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
754 u_char *p;
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
755 size_t len;
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
756 u_short *u;
2459
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
757 ngx_err_t err;
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
758 u_short utf16[NGX_UTF16_BUFLEN];
1632
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
759
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
760 len = NGX_UTF16_BUFLEN;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
761 u = ngx_utf8_to_utf16(utf16, gl->pattern, &len, 0);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
762
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
763 if (u == NULL) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
764 return NGX_ERROR;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
765 }
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
766
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
767 gl->dir = FindFirstFileW(u, &gl->finddata);
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
768
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
769 if (gl->dir == INVALID_HANDLE_VALUE) {
1980
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
770
2459
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
771 err = ngx_errno;
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
772
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
773 if (u != utf16) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
774 ngx_free(u);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
775 }
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
776
2459
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
777 if ((err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
778 && gl->test)
f732b8509658 fix r1981 on win32
Igor Sysoev <igor@sysoev.ru>
parents: 2259
diff changeset
779 {
1980
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
780 gl->no_match = 1;
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
781 return NGX_OK;
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
782 }
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
783
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
784 ngx_set_errno(err);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
785
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
786 return NGX_ERROR;
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
787 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
788
1632
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
789 for (p = gl->pattern; *p; p++) {
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
790 if (*p == '/') {
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
791 gl->last = p + 1 - gl->pattern;
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
792 }
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
793 }
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
794
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
795 if (u != utf16) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
796 ngx_free(u);
1632
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
797 }
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
798
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
799 gl->ready = 1;
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
800
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
801 return NGX_OK;
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
802 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
803
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
804
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
805 ngx_int_t
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
806 ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
807 {
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
808 u_char *p;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
809 size_t len;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
810 ngx_err_t err;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
811 u_char utf8[NGX_UTF8_BUFLEN];
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
812
1980
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
813 if (gl->no_match) {
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
814 return NGX_DONE;
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
815 }
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
816
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
817 if (gl->ready) {
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
818 gl->ready = 0;
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
819 goto convert;
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
820 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
821
1632
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
822 ngx_free(gl->name.data);
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
823 gl->name.data = NULL;
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
824
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
825 if (FindNextFileW(gl->dir, &gl->finddata) != 0) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
826 goto convert;
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
827 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
828
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
829 err = ngx_errno;
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
830
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
831 if (err == NGX_ENOMOREFILES) {
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
832 return NGX_DONE;
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
833 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
834
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
835 ngx_log_error(NGX_LOG_ALERT, gl->log, err,
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
836 "FindNextFile(%s) failed", gl->pattern);
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
837
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
838 return NGX_ERROR;
8131
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
839
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
840 convert:
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
841
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
842 len = NGX_UTF8_BUFLEN;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
843 p = ngx_utf16_to_utf8(utf8, gl->finddata.cFileName, &len, NULL);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
844
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
845 if (p == NULL) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
846 return NGX_ERROR;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
847 }
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
848
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
849 gl->name.len = gl->last + len - 1;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
850
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
851 gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
852 if (gl->name.data == NULL) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
853 goto failed;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
854 }
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
855
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
856 ngx_memcpy(gl->name.data, gl->pattern, gl->last);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
857 ngx_cpystrn(gl->name.data + gl->last, p, len);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
858
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
859 if (p != utf8) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
860 ngx_free(p);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
861 }
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
862
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
863 *name = gl->name;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
864
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
865 return NGX_OK;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
866
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
867 failed:
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
868
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
869 if (p != utf8) {
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
870 err = ngx_errno;
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
871 ngx_free(p);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
872 ngx_set_errno(err);
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
873 }
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
874
751f79bd802c Win32: non-ASCII names support in "include" with wildcards.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8130
diff changeset
875 return NGX_ERROR;
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
876 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
877
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
878
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
879 void
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
880 ngx_close_glob(ngx_glob_t *gl)
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
881 {
1632
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
882 if (gl->name.data) {
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
883 ngx_free(gl->name.data);
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
884 }
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
885
1980
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
886 if (gl->dir == INVALID_HANDLE_VALUE) {
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
887 return;
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
888 }
b5263e401884 ignore glob no match error
Igor Sysoev <igor@sysoev.ru>
parents: 1693
diff changeset
889
1632
2142e5cf62da fix win32 glob
Igor Sysoev <igor@sysoev.ru>
parents: 1052
diff changeset
890 if (FindClose(gl->dir) == 0) {
727
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
891 ngx_log_error(NGX_LOG_ALERT, gl->log, ngx_errno,
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
892 "FindClose(%s) failed", gl->pattern);
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
893 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
894 }
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
895
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
896
532d15ddbe68 glob support in include
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
897 ngx_int_t
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
898 ngx_de_info(u_char *name, ngx_dir_t *dir)
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
899 {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
900 return NGX_OK;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
901 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
902
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
903
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
904 ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
905 ngx_de_link_info(u_char *name, ngx_dir_t *dir)
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
906 {
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
907 return NGX_OK;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
908 }
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
909
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
910
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
911 ngx_int_t
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
912 ngx_read_ahead(ngx_fd_t fd, size_t n)
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
913 {
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
914 return ~NGX_FILE_ERROR;
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
915 }
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
916
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
917
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
918 ngx_int_t
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2234
diff changeset
919 ngx_directio_on(ngx_fd_t fd)
2134
13652cba8633 fix building by bcc broken in r2130
Igor Sysoev <igor@sysoev.ru>
parents: 1980
diff changeset
920 {
3164
b1b1775698d5 uniform ngx_directio_on/off() interface with other file functions
Igor Sysoev <igor@sysoev.ru>
parents: 3158
diff changeset
921 return ~NGX_FILE_ERROR;
2134
13652cba8633 fix building by bcc broken in r2130
Igor Sysoev <igor@sysoev.ru>
parents: 1980
diff changeset
922 }
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2234
diff changeset
923
2615
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
924
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2234
diff changeset
925 ngx_int_t
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2234
diff changeset
926 ngx_directio_off(ngx_fd_t fd)
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2234
diff changeset
927 {
3164
b1b1775698d5 uniform ngx_directio_on/off() interface with other file functions
Igor Sysoev <igor@sysoev.ru>
parents: 3158
diff changeset
928 return ~NGX_FILE_ERROR;
2248
1adec90a0e46 disable directio for unaligned reads in Linux
Igor Sysoev <igor@sysoev.ru>
parents: 2234
diff changeset
929 }
2615
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
930
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
931
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
932 size_t
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
933 ngx_fs_bsize(u_char *name)
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
934 {
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
935 u_char root[4];
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
936 u_long sc, bs, nfree, ncl;
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
937
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
938 if (name[2] == ':') {
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
939 ngx_cpystrn(root, name, 4);
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
940 name = root;
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
941 }
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
942
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
943 if (GetDiskFreeSpace((const char *) name, &sc, &bs, &nfree, &ncl) == 0) {
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
944 return 512;
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
945 }
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
946
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
947 return sc * bs;
ceef364208c8 ngx_fs_bsize()
Igor Sysoev <igor@sysoev.ru>
parents: 2462
diff changeset
948 }
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
949
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
950
7670
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
951 off_t
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
952 ngx_fs_available(u_char *name)
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
953 {
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
954 ULARGE_INTEGER navail;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
955
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
956 if (GetDiskFreeSpaceEx((const char *) name, &navail, NULL, NULL) == 0) {
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
957 return NGX_MAX_OFF_T_VALUE;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
958 }
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
959
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
960 return (off_t) navail.QuadPart;
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
961 }
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
962
ccb5ff87ab3e Cache: introduced min_free cache clearing.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7433
diff changeset
963
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
964 static ngx_int_t
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
965 ngx_win32_check_filename(u_short *u, size_t len, ngx_uint_t dirname)
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
966 {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
967 u_long n;
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
968 u_short *lu, *p, *slash, ch;
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
969 ngx_err_t err;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
970 enum {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
971 sw_start = 0,
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
972 sw_normal,
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
973 sw_after_slash,
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
974 sw_after_colon,
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
975 sw_after_dot
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
976 } state;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
977
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
978 /* check for NTFS streams (":"), trailing dots and spaces */
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
979
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
980 lu = NULL;
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
981 slash = NULL;
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
982 state = sw_start;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
983
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
984 #if (NGX_SUPPRESS_WARN)
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
985 ch = 0;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
986 #endif
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
987
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
988 for (p = u; *p; p++) {
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
989 ch = *p;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
990
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
991 switch (state) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
992
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
993 case sw_start:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
994
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
995 /*
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
996 * skip till first "/" to allow paths starting with drive and
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
997 * relative path, like "c:html/"
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
998 */
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
999
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1000 if (ch == '/' || ch == '\\') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1001 state = sw_after_slash;
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1002 slash = p;
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1003 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1004
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1005 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1006
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1007 case sw_normal:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1008
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1009 if (ch == ':') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1010 state = sw_after_colon;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1011 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1012 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1013
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1014 if (ch == '.' || ch == ' ') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1015 state = sw_after_dot;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1016 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1017 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1018
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1019 if (ch == '/' || ch == '\\') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1020 state = sw_after_slash;
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1021 slash = p;
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1022 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1023 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1024
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1025 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1026
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1027 case sw_after_slash:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1028
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1029 if (ch == '/' || ch == '\\') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1030 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1031 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1032
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1033 if (ch == '.') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1034 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1035 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1036
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1037 if (ch == ':') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1038 state = sw_after_colon;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1039 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1040 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1041
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1042 state = sw_normal;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1043 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1044
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1045 case sw_after_colon:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1046
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1047 if (ch == '/' || ch == '\\') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1048 state = sw_after_slash;
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1049 slash = p;
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1050 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1051 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1052
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1053 goto invalid;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1054
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1055 case sw_after_dot:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1056
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1057 if (ch == '/' || ch == '\\') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1058 goto invalid;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1059 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1060
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1061 if (ch == ':') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1062 goto invalid;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1063 }
4703
Maxim Dounin <mdounin@mdounin.ru>
parents: 4673
diff changeset
1064
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1065 if (ch == '.' || ch == ' ') {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1066 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1067 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1068
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1069 state = sw_normal;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1070 break;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1071 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1072 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1073
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1074 if (state == sw_after_dot) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1075 goto invalid;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1076 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1077
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1078 if (dirname && slash) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1079 ch = *slash;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1080 *slash = '\0';
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1081 len = slash - u + 1;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1082 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1083
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1084 /* check if long name match */
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1085
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1086 lu = malloc(len * 2);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1087 if (lu == NULL) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1088 return NGX_ERROR;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1089 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1090
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1091 n = GetLongPathNameW(u, lu, len);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1092
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1093 if (n == 0) {
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1094
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1095 if (dirname && slash && ngx_errno == NGX_ENOENT) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1096 ngx_set_errno(NGX_ENOPATH);
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1097 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1098
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1099 goto failed;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1100 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1101
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1102 if (n != len - 1 || _wcsicmp(u, lu) != 0) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1103 goto invalid;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1104 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1105
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1106 if (dirname && slash) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1107 *slash = ch;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1108 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1109
5437
dea321e5c021 Win32: plugged memory leak.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4703
diff changeset
1110 ngx_free(lu);
dea321e5c021 Win32: plugged memory leak.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4703
diff changeset
1111
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1112 return NGX_OK;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1113
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1114 invalid:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1115
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1116 ngx_set_errno(NGX_ENOENT);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1117
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1118 failed:
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1119
8133
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1120 if (dirname && slash) {
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1121 *slash = ch;
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1122 }
e0f385521c79 Win32: non-ASCII directory names support in ngx_create_dir().
Maxim Dounin <mdounin@mdounin.ru>
parents: 8132
diff changeset
1123
4673
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1124 if (lu) {
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1125 err = ngx_errno;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1126 ngx_free(lu);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1127 ngx_set_errno(err);
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1128 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1129
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1130 return NGX_ERROR;
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1131 }
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1132
dc6c658942a8 Win32: disallowed access to various non-canonical name variants.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4564
diff changeset
1133
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1134 static u_short *
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1135 ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len, size_t reserved)
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1136 {
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1137 u_char *p;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1138 u_short *u, *last;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1139 uint32_t n;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1140
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1141 p = utf8;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1142 u = utf16;
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1143 last = utf16 + *len;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1144
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1145 while (u < last) {
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1146
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1147 if (*p < 0x80) {
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1148 *u++ = (u_short) *p;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1149
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1150 if (*p == 0) {
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1151 *len = u - utf16;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1152 return utf16;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1153 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1154
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1155 p++;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1156
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1157 continue;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1158 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1159
5501
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1160 if (u + 1 == last) {
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1161 *len = u - utf16;
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1162 break;
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1163 }
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1164
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1165 n = ngx_utf8_decode(&p, 4);
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1166
5501
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1167 if (n > 0x10ffff) {
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1168 ngx_set_errno(NGX_EILSEQ);
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1169 return NULL;
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1170 }
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1171
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1172 if (n > 0xffff) {
5501
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1173 n -= 0x10000;
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1174 *u++ = (u_short) (0xd800 + (n >> 10));
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1175 *u++ = (u_short) (0xdc00 + (n & 0x03ff));
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1176 continue;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1177 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1178
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1179 *u++ = (u_short) n;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1180 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1181
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1182 /* the given buffer is not enough, allocate a new one */
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1183
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1184 u = malloc(((p - utf8) + ngx_strlen(p) + 1 + reserved) * sizeof(u_short));
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1185 if (u == NULL) {
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1186 return NULL;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1187 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1188
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1189 ngx_memcpy(u, utf16, *len * 2);
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1190
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1191 utf16 = u;
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1192 u += *len;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1193
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1194 for ( ;; ) {
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1195
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1196 if (*p < 0x80) {
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1197 *u++ = (u_short) *p;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1198
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1199 if (*p == 0) {
3417
15017418fd84 disable Win32 short file names
Igor Sysoev <igor@sysoev.ru>
parents: 3382
diff changeset
1200 *len = u - utf16;
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1201 return utf16;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1202 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1203
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1204 p++;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1205
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1206 continue;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1207 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1208
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1209 n = ngx_utf8_decode(&p, 4);
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1210
5501
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1211 if (n > 0x10ffff) {
5785
fbdab7f38fd6 Style: use ngx_free() instead of free().
Tatsuhiko Kubo <cubicdaiya@gmail.com>
parents: 5749
diff changeset
1212 ngx_free(utf16);
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1213 ngx_set_errno(NGX_EILSEQ);
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1214 return NULL;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1215 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1216
5501
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1217 if (n > 0xffff) {
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1218 n -= 0x10000;
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1219 *u++ = (u_short) (0xd800 + (n >> 10));
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1220 *u++ = (u_short) (0xdc00 + (n & 0x03ff));
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1221 continue;
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1222 }
1cd23ca84a9b Win32: support for UTF-16 surrogate pairs (ticket #457).
Maxim Dounin <mdounin@mdounin.ru>
parents: 5437
diff changeset
1223
2628
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1224 *u++ = (u_short) n;
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1225 }
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1226
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1227 /* unreachable */
64a10d6b97bd win32 ngx_open_file() supports utf8 names and NGX_FILE_APPEND
Igor Sysoev <igor@sysoev.ru>
parents: 2615
diff changeset
1228 }
8130
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1229
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1230
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1231 static u_char *
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1232 ngx_utf16_to_utf8(u_char *utf8, u_short *utf16, size_t *len, size_t *allocated)
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1233 {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1234 u_char *p, *last;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1235 u_short *u, *j;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1236 uint32_t n;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1237
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1238 u = utf16;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1239 p = utf8;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1240 last = utf8 + *len;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1241
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1242 while (p < last) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1243
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1244 if (*u < 0x80) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1245 *p++ = (u_char) *u;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1246
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1247 if (*u == 0) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1248 *len = p - utf8;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1249 return utf8;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1250 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1251
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1252 u++;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1253
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1254 continue;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1255 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1256
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1257 if (p >= last - 4) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1258 *len = p - utf8;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1259 break;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1260 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1261
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1262 n = ngx_utf16_decode(&u, 2);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1263
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1264 if (n > 0x10ffff) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1265 ngx_set_errno(NGX_EILSEQ);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1266 return NULL;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1267 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1268
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1269 if (n >= 0x10000) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1270 *p++ = (u_char) (0xf0 + (n >> 18));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1271 *p++ = (u_char) (0x80 + ((n >> 12) & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1272 *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1273 *p++ = (u_char) (0x80 + (n & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1274 continue;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1275 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1276
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1277 if (n >= 0x0800) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1278 *p++ = (u_char) (0xe0 + (n >> 12));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1279 *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1280 *p++ = (u_char) (0x80 + (n & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1281 continue;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1282 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1283
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1284 *p++ = (u_char) (0xc0 + (n >> 6));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1285 *p++ = (u_char) (0x80 + (n & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1286 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1287
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1288 /* the given buffer is not enough, allocate a new one */
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1289
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1290 for (j = u; *j; j++) { /* void */ }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1291
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1292 p = malloc((j - utf16) * 4 + 1);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1293 if (p == NULL) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1294 return NULL;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1295 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1296
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1297 if (allocated) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1298 *allocated = (j - utf16) * 4 + 1;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1299 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1300
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1301 ngx_memcpy(p, utf8, *len);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1302
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1303 utf8 = p;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1304 p += *len;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1305
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1306 for ( ;; ) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1307
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1308 if (*u < 0x80) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1309 *p++ = (u_char) *u;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1310
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1311 if (*u == 0) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1312 *len = p - utf8;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1313 return utf8;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1314 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1315
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1316 u++;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1317
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1318 continue;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1319 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1320
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1321 n = ngx_utf16_decode(&u, 2);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1322
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1323 if (n > 0x10ffff) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1324 ngx_free(utf8);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1325 ngx_set_errno(NGX_EILSEQ);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1326 return NULL;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1327 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1328
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1329 if (n >= 0x10000) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1330 *p++ = (u_char) (0xf0 + (n >> 18));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1331 *p++ = (u_char) (0x80 + ((n >> 12) & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1332 *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1333 *p++ = (u_char) (0x80 + (n & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1334 continue;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1335 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1336
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1337 if (n >= 0x0800) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1338 *p++ = (u_char) (0xe0 + (n >> 12));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1339 *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1340 *p++ = (u_char) (0x80 + (n & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1341 continue;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1342 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1343
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1344 *p++ = (u_char) (0xc0 + (n >> 6));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1345 *p++ = (u_char) (0x80 + (n & 0x3f));
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1346 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1347
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1348 /* unreachable */
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1349 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1350
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1351
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1352 /*
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1353 * ngx_utf16_decode() decodes one or two UTF-16 code units
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1354 * the return values:
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1355 * 0x80 - 0x10ffff valid character
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1356 * 0x110000 - 0xfffffffd invalid sequence
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1357 * 0xfffffffe incomplete sequence
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1358 * 0xffffffff error
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1359 */
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1360
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1361 uint32_t
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1362 ngx_utf16_decode(u_short **u, size_t n)
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1363 {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1364 uint32_t k, m;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1365
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1366 k = **u;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1367
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1368 if (k < 0xd800 || k > 0xdfff) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1369 (*u)++;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1370 return k;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1371 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1372
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1373 if (k > 0xdbff) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1374 (*u)++;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1375 return 0xffffffff;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1376 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1377
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1378 if (n < 2) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1379 return 0xfffffffe;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1380 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1381
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1382 (*u)++;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1383
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1384 m = *(*u)++;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1385
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1386 if (m < 0xdc00 || m > 0xdfff) {
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1387 return 0xffffffff;
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1388
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1389 }
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1390
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1391 return 0x10000 + ((k - 0xd800) << 10) + (m - 0xdc00);
b0a06c50c1b4 Win32: non-ASCII names support in autoindex (ticket #458).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7670
diff changeset
1392 }