Skip to content

Commit b7936f9

Browse files
committed
nginx: add more patch for utf8 file operations
Fix #1
1 parent 8bd3890 commit b7936f9

3 files changed

+332
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
From 34f9aca0bdd33867ee55b736d78006460310a9ed Mon Sep 17 00:00:00 2001
2+
From: myfreeer <[email protected]>
3+
Date: Tue, 5 Nov 2019 19:54:45 +0800
4+
Subject: [PATCH 1/3] ngx_files: implement ngx_open_tempfile in utf8 encoding
5+
6+
---
7+
src/os/win32/ngx_files.c | 35 ++++++++++++++++++++++++++++++++++-
8+
src/os/win32/ngx_files.h | 11 ++---------
9+
2 files changed, 36 insertions(+), 10 deletions(-)
10+
11+
diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c
12+
index fc69e6d..0ed27bb 100644
13+
--- a/src/os/win32/ngx_files.c
14+
+++ b/src/os/win32/ngx_files.c
15+
@@ -15,6 +15,39 @@ static ngx_int_t ngx_win32_check_filename(u_char *name, u_short *u,
16+
size_t len);
17+
static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len);
18+
19+
+ngx_fd_t
20+
+ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)
21+
+{
22+
+
23+
+ size_t len;
24+
+ u_short *u;
25+
+ ngx_fd_t fd;
26+
+ ngx_err_t err;
27+
+ u_short utf16[NGX_UTF16_BUFLEN];
28+
+
29+
+ len = NGX_UTF16_BUFLEN;
30+
+ u = ngx_utf8_to_utf16(utf16, name, &len);
31+
+
32+
+ if (u == NULL) {
33+
+ return INVALID_HANDLE_VALUE;
34+
+ }
35+
+
36+
+ fd = CreateFileW(u, GENERIC_READ|GENERIC_WRITE,
37+
+ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
38+
+ NULL,
39+
+ CREATE_NEW,
40+
+ persistent ? 0 :
41+
+ FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,
42+
+ NULL);
43+
+
44+
+ if (u != utf16) {
45+
+ err = ngx_errno;
46+
+ ngx_free(u);
47+
+ ngx_set_errno(err);
48+
+ }
49+
+
50+
+ return fd;
51+
+}
52+
53+
/* FILE_FLAG_BACKUP_SEMANTICS allows to obtain a handle to a directory */
54+
55+
@@ -494,7 +527,7 @@ ngx_create_file_mapping(ngx_file_mapping_t *fm)
56+
goto failed;
57+
}
58+
59+
- fm->handle = CreateFileMapping(fm->fd, NULL, PAGE_READWRITE,
60+
+ fm->handle = CreateFileMappingW(fm->fd, NULL, PAGE_READWRITE,
61+
(u_long) ((off_t) fm->size >> 32),
62+
(u_long) ((off_t) fm->size & 0xffffffff),
63+
NULL);
64+
diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h
65+
index 441a9a1..6a6aa25 100644
66+
--- a/src/os/win32/ngx_files.h
67+
+++ b/src/os/win32/ngx_files.h
68+
@@ -88,15 +88,8 @@ ngx_fd_t ngx_open_file(u_char *name, u_long mode, u_long create, u_long access);
69+
#define NGX_FILE_OWNER_ACCESS 0
70+
71+
72+
-#define ngx_open_tempfile(name, persistent, access) \
73+
- CreateFile((const char *) name, \
74+
- GENERIC_READ|GENERIC_WRITE, \
75+
- FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, \
76+
- NULL, \
77+
- CREATE_NEW, \
78+
- persistent ? 0: \
79+
- FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE, \
80+
- NULL);
81+
+ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent,
82+
+ ngx_uint_t access);
83+
84+
#define ngx_open_tempfile_n "CreateFile()"
85+
86+
--
87+
2.23.0
88+
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
From 95e5e4c05f8e3d2f643fa65011c5b3527746af0b Mon Sep 17 00:00:00 2001
2+
From: myfreeer <[email protected]>
3+
Date: Tue, 5 Nov 2019 20:42:09 +0800
4+
Subject: [PATCH 2/3] ngx_files: implement ngx_open_glob and ngx_read_glob in
5+
utf8 encoding
6+
7+
include would work in non-ascii path on win32
8+
---
9+
src/os/win32/ngx_files.c | 46 +++++++++++++++++++++++++++++-----------
10+
src/os/win32/ngx_files.h | 2 +-
11+
2 files changed, 35 insertions(+), 13 deletions(-)
12+
13+
diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c
14+
index 0ed27bb..fb413f2 100644
15+
--- a/src/os/win32/ngx_files.c
16+
+++ b/src/os/win32/ngx_files.c
17+
@@ -680,11 +680,20 @@ ngx_close_dir(ngx_dir_t *dir)
18+
ngx_int_t
19+
ngx_open_glob(ngx_glob_t *gl)
20+
{
21+
+ ngx_int_t rc;
22+
u_char *p;
23+
size_t len;
24+
ngx_err_t err;
25+
+ u_short *u;
26+
+ u_short utf16[NGX_UTF16_BUFLEN];
27+
+
28+
+ len = NGX_UTF16_BUFLEN;
29+
+ u = ngx_utf8_to_utf16(utf16, gl->pattern, &len);
30+
+ if (u == NULL) {
31+
+ return NGX_ERROR;
32+
+ }
33+
34+
- gl->dir = FindFirstFile((const char *) gl->pattern, &gl->finddata);
35+
+ gl->dir = FindFirstFileW((LPCWSTR) u, &gl->finddata);
36+
37+
if (gl->dir == INVALID_HANDLE_VALUE) {
38+
39+
@@ -694,10 +703,12 @@ ngx_open_glob(ngx_glob_t *gl)
40+
&& gl->test)
41+
{
42+
gl->no_match = 1;
43+
- return NGX_OK;
44+
+ rc = NGX_OK;
45+
+ goto failed;
46+
}
47+
48+
- return NGX_ERROR;
49+
+ rc = NGX_ERROR;
50+
+ goto failed;
51+
}
52+
53+
for (p = gl->pattern; *p; p++) {
54+
@@ -706,21 +717,30 @@ ngx_open_glob(ngx_glob_t *gl)
55+
}
56+
}
57+
58+
- len = ngx_strlen(gl->finddata.cFileName);
59+
+ len = WideCharToMultiByte(CP_UTF8, 0, gl->finddata.cFileName, -1, NULL, 0, NULL, NULL);
60+
gl->name.len = gl->last + len;
61+
62+
gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);
63+
if (gl->name.data == NULL) {
64+
- return NGX_ERROR;
65+
+ rc = NGX_ERROR;
66+
+ goto failed;
67+
}
68+
69+
ngx_memcpy(gl->name.data, gl->pattern, gl->last);
70+
- ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,
71+
- len + 1);
72+
+ WideCharToMultiByte(CP_UTF8, 0, gl->finddata.cFileName, -1,
73+
+ (char *) gl->name.data + gl->last, len, NULL, NULL);
74+
+ gl->name.data[gl->name.len] = '\0';
75+
76+
gl->ready = 1;
77+
+ rc = NGX_OK;
78+
79+
- return NGX_OK;
80+
+failed:
81+
+ if (u != utf16) {
82+
+ err = ngx_errno;
83+
+ ngx_free(u);
84+
+ ngx_set_errno(err);
85+
+ }
86+
+ return rc;
87+
}
88+
89+
90+
@@ -744,9 +764,9 @@ ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)
91+
ngx_free(gl->name.data);
92+
gl->name.data = NULL;
93+
94+
- if (FindNextFile(gl->dir, &gl->finddata) != 0) {
95+
+ if (FindNextFileW(gl->dir, &gl->finddata) != 0) {
96+
97+
- len = ngx_strlen(gl->finddata.cFileName);
98+
+ len = WideCharToMultiByte(CP_UTF8, 0, gl->finddata.cFileName, -1, NULL, 0, NULL, NULL);
99+
gl->name.len = gl->last + len;
100+
101+
gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);
102+
@@ -755,8 +775,10 @@ ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)
103+
}
104+
105+
ngx_memcpy(gl->name.data, gl->pattern, gl->last);
106+
- ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,
107+
- len + 1);
108+
+
109+
+ WideCharToMultiByte(CP_UTF8, 0, gl->finddata.cFileName, -1,
110+
+ (char *) gl->name.data + gl->last, len, NULL, NULL);
111+
+ gl->name.data[gl->name.len] = '\0';
112+
113+
*name = gl->name;
114+
115+
diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h
116+
index 6a6aa25..01e64a0 100644
117+
--- a/src/os/win32/ngx_files.h
118+
+++ b/src/os/win32/ngx_files.h
119+
@@ -42,7 +42,7 @@ typedef struct {
120+
121+
typedef struct {
122+
HANDLE dir;
123+
- WIN32_FIND_DATA finddata;
124+
+ WIN32_FIND_DATAW finddata;
125+
126+
unsigned ready:1;
127+
unsigned test:1;
128+
--
129+
2.23.0
130+
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
From d692adb4a34324839176d31009b98f26a67e2234 Mon Sep 17 00:00:00 2001
2+
From: myfreeer <[email protected]>
3+
Date: Tue, 5 Nov 2019 21:19:07 +0800
4+
Subject: [PATCH 3/3] ngx_files: implement ngx_win32_rename_file in utf8
5+
encoding
6+
7+
---
8+
src/os/win32/ngx_files.c | 55 +++++++++++++++++++++++++++++++++-------
9+
1 file changed, 46 insertions(+), 9 deletions(-)
10+
11+
diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c
12+
index fb413f2..87b3210 100644
13+
--- a/src/os/win32/ngx_files.c
14+
+++ b/src/os/win32/ngx_files.c
15+
@@ -238,18 +238,41 @@ ngx_write_console(ngx_fd_t fd, void *buf, size_t size)
16+
ngx_err_t
17+
ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
18+
{
19+
- u_char *name;
20+
+ u_short *name;
21+
ngx_err_t err;
22+
ngx_uint_t collision;
23+
ngx_atomic_uint_t num;
24+
+ size_t to_len;
25+
+ u_short to_utf16[NGX_UTF16_BUFLEN];
26+
+ u_short *to_u;
27+
+ size_t from_len;
28+
+ u_short from_utf16[NGX_UTF16_BUFLEN];
29+
+ u_short *from_u;
30+
+ size_t buffer_size;
31+
+
32+
+ to_len = NGX_UTF16_BUFLEN;
33+
+ to_u = ngx_utf8_to_utf16(to_utf16, to->data, &to_len);
34+
+
35+
+ if (to_u == NULL) {
36+
+ return NGX_ENOMEM;
37+
+ }
38+
39+
- name = ngx_alloc(to->len + 1 + NGX_ATOMIC_T_LEN + 1 + sizeof("DELETE"),
40+
- log);
41+
+ from_len = NGX_UTF16_BUFLEN;
42+
+ from_u = ngx_utf8_to_utf16(from_utf16, from->data, &from_len);
43+
+
44+
+ if (from_u == NULL) {
45+
+ err = NGX_ENOMEM;
46+
+ goto failed_to;
47+
+ }
48+
+
49+
+ buffer_size = to_len + 1 + (NGX_ATOMIC_T_LEN << 1) + 1 + sizeof(L"DELETE");
50+
+ name = ngx_alloc(buffer_size, log);
51+
if (name == NULL) {
52+
- return NGX_ENOMEM;
53+
+ err = NGX_ENOMEM;
54+
+ goto failed_from;
55+
}
56+
57+
- ngx_memcpy(name, to->data, to->len);
58+
+ ngx_memcpy(name, to_u, to_len);
59+
60+
collision = 0;
61+
62+
@@ -258,9 +281,9 @@ ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
63+
for ( ;; ) {
64+
num = ngx_next_temp_number(collision);
65+
66+
- ngx_sprintf(name + to->len, ".%0muA.DELETE%Z", num);
67+
+ swprintf(name + to_len, buffer_size - 1, L".%x.DELETE", num);
68+
69+
- if (MoveFile((const char *) to->data, (const char *) name) != 0) {
70+
+ if (MoveFileW((LPCWSTR) to_u, (LPCWSTR) name) != 0) {
71+
break;
72+
}
73+
74+
@@ -270,14 +293,14 @@ ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
75+
"MoveFile() \"%s\" to \"%s\" failed", to->data, name);
76+
}
77+
78+
- if (MoveFile((const char *) from->data, (const char *) to->data) == 0) {
79+
+ if (MoveFileW((LPCWSTR) from_u, (LPCWSTR) to_u) == 0) {
80+
err = ngx_errno;
81+
82+
} else {
83+
err = 0;
84+
}
85+
86+
- if (DeleteFile((const char *) name) == 0) {
87+
+ if (DeleteFileW((LPCWSTR) name) == 0) {
88+
ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
89+
"DeleteFile() \"%s\" failed", name);
90+
}
91+
@@ -286,6 +309,20 @@ ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
92+
93+
ngx_free(name);
94+
95+
+failed_from:
96+
+ if (from_u != from_utf16) {
97+
+ err = ngx_errno;
98+
+ ngx_free(from_u);
99+
+ ngx_set_errno(err);
100+
+ }
101+
+
102+
+failed_to:
103+
+ if (to_u != to_utf16) {
104+
+ err = ngx_errno;
105+
+ ngx_free(to_u);
106+
+ ngx_set_errno(err);
107+
+ }
108+
+
109+
return err;
110+
}
111+
112+
--
113+
2.23.0
114+

0 commit comments

Comments
 (0)