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