1384Szelenkov@nginx.com 
2384Szelenkov@nginx.com /*
3384Szelenkov@nginx.com  * Copyright (C) Igor Sysoev
4384Szelenkov@nginx.com  * Copyright (C) NGINX, Inc.
5384Szelenkov@nginx.com  */
6384Szelenkov@nginx.com 
7384Szelenkov@nginx.com #include <nxt_main.h>
8384Szelenkov@nginx.com 
9384Szelenkov@nginx.com 
10384Szelenkov@nginx.com extern char  **environ;
11384Szelenkov@nginx.com 
12384Szelenkov@nginx.com static nxt_int_t nxt_utf8_file_name_test(nxt_thread_t *thr);
13384Szelenkov@nginx.com 
14384Szelenkov@nginx.com 
15384Szelenkov@nginx.com nxt_module_init_t  nxt_init_modules[1];
16384Szelenkov@nginx.com nxt_uint_t         nxt_init_modules_n;
17384Szelenkov@nginx.com 
18384Szelenkov@nginx.com 
19384Szelenkov@nginx.com int nxt_cdecl
20384Szelenkov@nginx.com main(int argc, char **argv)
21384Szelenkov@nginx.com {
22384Szelenkov@nginx.com     nxt_thread_t     *thr;
23384Szelenkov@nginx.com 
24384Szelenkov@nginx.com     if (nxt_lib_start("utf8_file_name_test", argv, &environ) != NXT_OK) {
25384Szelenkov@nginx.com         return 1;
26384Szelenkov@nginx.com     }
27384Szelenkov@nginx.com 
28384Szelenkov@nginx.com     nxt_main_log.level = NXT_LOG_INFO;
29384Szelenkov@nginx.com 
30384Szelenkov@nginx.com     thr = nxt_thread();
31384Szelenkov@nginx.com 
32384Szelenkov@nginx.com     if (nxt_utf8_file_name_test(thr) != NXT_OK) {
33384Szelenkov@nginx.com         return 1;
34384Szelenkov@nginx.com     }
35384Szelenkov@nginx.com 
36384Szelenkov@nginx.com     return 0;
37384Szelenkov@nginx.com }
38384Szelenkov@nginx.com 
39384Szelenkov@nginx.com 
40384Szelenkov@nginx.com static nxt_int_t
41384Szelenkov@nginx.com nxt_utf8_file_name_test(nxt_thread_t *thr)
42384Szelenkov@nginx.com {
43384Szelenkov@nginx.com     u_char               *p, test[4], buf[32];
44384Szelenkov@nginx.com     ssize_t              n;
45384Szelenkov@nginx.com     uint32_t             uc, lc;
46384Szelenkov@nginx.com     nxt_int_t            ret;
47384Szelenkov@nginx.com     nxt_task_t           task;
48384Szelenkov@nginx.com     nxt_file_t           uc_file, lc_file;
49384Szelenkov@nginx.com     const u_char         *pp;
50384Szelenkov@nginx.com     nxt_file_name_t      uc_name[10], lc_name[10];
51384Szelenkov@nginx.com     static const u_char  utf8[4] = "UTF8";
52384Szelenkov@nginx.com 
53384Szelenkov@nginx.com     nxt_thread_time_update(thr);
54384Szelenkov@nginx.com 
55384Szelenkov@nginx.com     uc_name[0] = 'u';
56384Szelenkov@nginx.com     uc_name[1] = 't';
57384Szelenkov@nginx.com     uc_name[2] = 'f';
58384Szelenkov@nginx.com     uc_name[3] = '8';
59384Szelenkov@nginx.com     uc_name[4] = '_';
60384Szelenkov@nginx.com 
61384Szelenkov@nginx.com     lc_name[0] = 'u';
62384Szelenkov@nginx.com     lc_name[1] = 't';
63384Szelenkov@nginx.com     lc_name[2] = 'f';
64384Szelenkov@nginx.com     lc_name[3] = '8';
65384Szelenkov@nginx.com     lc_name[4] = '_';
66384Szelenkov@nginx.com 
67384Szelenkov@nginx.com     nxt_memzero(&uc_file, sizeof(nxt_file_t));
68384Szelenkov@nginx.com 
69384Szelenkov@nginx.com     uc_file.name = uc_name;
70384Szelenkov@nginx.com     uc_file.log_level = NXT_LOG_ALERT;
71384Szelenkov@nginx.com 
72384Szelenkov@nginx.com     nxt_memzero(&lc_file, sizeof(nxt_file_t));
73384Szelenkov@nginx.com 
74384Szelenkov@nginx.com     lc_file.name = lc_name;
75384Szelenkov@nginx.com 
76384Szelenkov@nginx.com     task.thread = thr;
77384Szelenkov@nginx.com     task.log = thr->log;
78384Szelenkov@nginx.com 
79384Szelenkov@nginx.com     for (uc = 0x41; uc < 0x110000; uc++) {
80384Szelenkov@nginx.com 
81384Szelenkov@nginx.com         p = nxt_utf8_encode(&uc_name[5], uc);
82384Szelenkov@nginx.com 
83384Szelenkov@nginx.com         if (p == NULL) {
84384Szelenkov@nginx.com             nxt_log_alert(thr->log, "nxt_utf8_encode(%05uxD) failed", uc);
85384Szelenkov@nginx.com             return NXT_ERROR;
86384Szelenkov@nginx.com         }
87384Szelenkov@nginx.com 
88384Szelenkov@nginx.com         *p = '\0';
89384Szelenkov@nginx.com 
90384Szelenkov@nginx.com         pp = &uc_name[5];
91384Szelenkov@nginx.com         lc = nxt_utf8_lowcase(&pp, p);
92384Szelenkov@nginx.com 
93*611Svbart@nginx.com         if (lc == 0xFFFFFFFF) {
94384Szelenkov@nginx.com             nxt_log_alert(thr->log, "nxt_utf8_lowcase(%05uxD) failed: %05uxD",
95384Szelenkov@nginx.com                           uc, lc);
96384Szelenkov@nginx.com             return NXT_ERROR;
97384Szelenkov@nginx.com         }
98384Szelenkov@nginx.com 
99384Szelenkov@nginx.com         if (uc == lc) {
100384Szelenkov@nginx.com             continue;
101384Szelenkov@nginx.com         }
102384Szelenkov@nginx.com 
103384Szelenkov@nginx.com         p = nxt_utf8_encode(&lc_name[5], lc);
104384Szelenkov@nginx.com 
105384Szelenkov@nginx.com         if (p == NULL) {
106384Szelenkov@nginx.com             nxt_log_alert(thr->log, "nxt_utf8_encode(%05uxD) failed", lc);
107384Szelenkov@nginx.com             return NXT_ERROR;
108384Szelenkov@nginx.com         }
109384Szelenkov@nginx.com 
110384Szelenkov@nginx.com         *p = '\0';
111384Szelenkov@nginx.com 
112384Szelenkov@nginx.com         ret = nxt_file_open(&task, &uc_file, NXT_FILE_WRONLY, NXT_FILE_TRUNCATE,
113384Szelenkov@nginx.com                             NXT_FILE_DEFAULT_ACCESS);
114384Szelenkov@nginx.com         if (ret != NXT_OK) {
115384Szelenkov@nginx.com             return NXT_ERROR;
116384Szelenkov@nginx.com         }
117384Szelenkov@nginx.com 
118384Szelenkov@nginx.com         if (nxt_file_write(&uc_file, utf8, 4, 0) != 4) {
119384Szelenkov@nginx.com             return NXT_ERROR;
120384Szelenkov@nginx.com         }
121384Szelenkov@nginx.com 
122384Szelenkov@nginx.com         nxt_file_close(&task, &uc_file);
123384Szelenkov@nginx.com 
124384Szelenkov@nginx.com         ret = nxt_file_open(&task, &lc_file, NXT_FILE_RDONLY, NXT_FILE_OPEN,
125384Szelenkov@nginx.com                             NXT_FILE_DEFAULT_ACCESS);
126384Szelenkov@nginx.com 
127384Szelenkov@nginx.com         if (ret == NXT_OK) {
128384Szelenkov@nginx.com             n = nxt_file_read(&lc_file, test, 4, 0);
129384Szelenkov@nginx.com 
130384Szelenkov@nginx.com             nxt_file_close(&task, &lc_file);
131384Szelenkov@nginx.com 
132384Szelenkov@nginx.com             if (n != 4 || nxt_memcmp(utf8, test, 4) != 0) {
133384Szelenkov@nginx.com                 nxt_log_alert(thr->log, "nxt_file_read() mismatch");
134384Szelenkov@nginx.com 
135384Szelenkov@nginx.com                 nxt_file_delete(lc_file.name);
136384Szelenkov@nginx.com             }
137384Szelenkov@nginx.com 
138384Szelenkov@nginx.com             p = nxt_sprintf(buf, buf + 32, "%04uXD; C; %04uXD;%n", uc, lc);
139384Szelenkov@nginx.com 
140384Szelenkov@nginx.com             nxt_fd_write(nxt_stdout, buf, p - buf);
141384Szelenkov@nginx.com         }
142384Szelenkov@nginx.com 
143384Szelenkov@nginx.com         nxt_file_delete(uc_file.name);
144384Szelenkov@nginx.com     }
145384Szelenkov@nginx.com 
146384Szelenkov@nginx.com     nxt_log_error(NXT_LOG_NOTICE, thr->log, "utf8 file name test passed");
147384Szelenkov@nginx.com     return NXT_OK;
148384Szelenkov@nginx.com }
149