wrowe 00/10/24 19:46:43
Modified: src/modules/standard mod_autoindex.c src/lib/apr aprlib.dsp src/lib/apr/file_io/unix fileacc.c src/lib/apr/file_io/win32 dir.c filedup.c fileio.h filestat.c open.c src/lib/apr/include apr.h.in apr.hw Log: Ok here it is: Win32 utf-8 native unicode filename support. There are just too many folks to credit... so this goes out from the entire ApacheCon hacking team :-) Revision Changes Path 1.44 +3 -0 apache-2.0/src/modules/standard/mod_autoindex.c Index: mod_autoindex.c =================================================================== RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_autoindex.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- mod_autoindex.c 2000/10/16 06:05:04 1.43 +++ mod_autoindex.c 2000/10/25 02:46:40 1.44 @@ -1558,6 +1558,9 @@ } r->content_type = "text/html"; +#if APR_HAS_UNICODE_FS + r->content_type = "text/html;charset=utf-8"; +#endif ap_send_http_header(r); 1.43 +3 -10 apache-2.0/src/lib/apr/aprlib.dsp Index: aprlib.dsp =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/aprlib.dsp,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- aprlib.dsp 2000/10/17 17:47:47 1.42 +++ aprlib.dsp 2000/10/25 02:46:41 1.43 @@ -43,7 +43,7 @@ # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "dso/win32" /I "file_io/win32" /I "locks/win32" /I "misc/win32" /I "misc/unix" /I "network_io/win32" /I "threadproc/win32" /I "time/win32" /D "NDEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "include" /I "dso/win32" /I "file_io/win32" /I "locks/win32" /I "misc/win32" /I "misc/unix" /I "network_io/win32" /I "threadproc/win32" /I "time/win32" /I "i18n/unix" /D "NDEBUG" /D "APR_UNICODE" /D "APR_IMPLEMENT_UNICODE" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /FD /c # SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo @@ -68,8 +68,8 @@ RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 -# ADD BASE CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "include" /I "dso/win32" /I "file_io/win32" /I "locks/win32" /I "misc/win32" /I "misc/unix" /I "network_io/win32" /I "threadproc/win32" /I "time/win32" /D "_DEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /FD /c +# ADD BASE CPP /nologo /MTd /W3 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /ZI /c +# ADD CPP /nologo /MDd /W3 /GX /Od /I "include" /I "dso/win32" /I "file_io/win32" /I "locks/win32" /I "misc/win32" /I "misc/unix" /I "network_io/win32" /I "threadproc/win32" /I "time/win32" /I "i18n/unix" /D "_DEBUG" /D "APR_UNICODE" /D "APR_IMPLEMENT_UNICODE" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /FD /ZI /c # SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo @@ -341,13 +341,6 @@ # Begin Source File SOURCE=.\i18n\unix\utf8_ucs2.c - -!IF "$(CFG)" == "aprlib - Win32 Release" - -!ELSEIF "$(CFG)" == "aprlib - Win32 Debug" - -!ENDIF - # End Source File # Begin Source File 1.34 +16 -0 apache-2.0/src/lib/apr/file_io/unix/fileacc.c Index: fileacc.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/unix/fileacc.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- fileacc.c 2000/08/02 05:25:50 1.33 +++ fileacc.c 2000/10/25 02:46:41 1.34 @@ -68,11 +68,27 @@ #else #include "fileio.h" #endif +#if APR_HAS_UNICODE_FS +#include "i18n.h" +#endif + /* A file to put ALL of the accessor functions for apr_file_t types. */ apr_status_t apr_get_filename(char **fname, apr_file_t *thefile) { +#if APR_HAS_UNICODE_FS + apr_status_t rv; + int len = wcslen(thefile->fname) + 1; + int dremains = MAX_PATH; + *fname = apr_palloc(thefile->cntxt, len * 2); + if ((rv = conv_ucs2_to_utf8(thefile->fname, &len, + *fname, &dremains))) + return rv; + if (len) + return APR_ENAMETOOLONG; +#else *fname = apr_pstrdup(thefile->cntxt, thefile->fname); +#endif return APR_SUCCESS; } 1.29 +65 -30 apache-2.0/src/lib/apr/file_io/win32/dir.c Index: dir.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/dir.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- dir.c 2000/10/23 17:21:11 1.28 +++ dir.c 2000/10/25 02:46:41 1.29 @@ -57,6 +57,9 @@ #include "apr_file_io.h" #include "apr_strings.h" #include "apr_portable.h" +#if APR_HAS_UNICODE_FS +#include "i18n.h" +#endif #include "atime.h" #if APR_HAVE_ERRNO_H @@ -75,70 +78,90 @@ apr_status_t dir_cleanup(void *thedir) { apr_dir_t *dir = thedir; - if (!CloseHandle(dir->dirhand)) { + if (dir->dirhand != INVALID_HANDLE_VALUE && !FindClose(dir->dirhand)) { return apr_get_os_error(); } + dir->dirhand = INVALID_HANDLE_VALUE; return APR_SUCCESS; } apr_status_t apr_opendir(apr_dir_t **new, const char *dirname, apr_pool_t *cont) { + int len = strlen(dirname); +#if APR_HAS_UNICODE_FS + apr_status_t rv; + int lremains = len; + int dremains = (len + 3) * 2; (*new) = apr_pcalloc(cont, sizeof(apr_dir_t)); - (*new)->cntxt = cont; - (*new)->entry = NULL; - if (dirname[strlen(dirname)] == '/') { - (*new)->dirname = apr_pstrcat(cont, dirname, "*", NULL); - } - else { - (*new)->dirname = apr_pstrcat(cont, dirname, "/*", NULL); + (*new)->entry = apr_pcalloc(cont, sizeof(WIN32_FIND_DATAW)); + (*new)->dirname = apr_palloc(cont, dremains); + if ((rv = conv_utf8_to_ucs2(dirname, &lremains, + (*new)->dirname, &dremains))) + return rv; + if (lremains) + return APR_ENAMETOOLONG; + len = (len + 3) * 2 - dremains; +#else + (*new) = apr_pcalloc(cont, sizeof(apr_dir_t)); + (*new)->entry = apr_pcalloc(cont, sizeof(WIN32_FIND_DATA)); + (*new)->dirname = apr_palloc(cont, len + 3); + memcpy((*new)->dirname, dirname, len); +#endif + if (len && dirname[len - 1] != '/') { + (*new)->dirname[len++] = '/'; } + (*new)->dirname[len++] = '*'; + (*new)->dirname[len] = '\0'; + (*new)->cntxt = cont; (*new)->dirhand = INVALID_HANDLE_VALUE; apr_register_cleanup((*new)->cntxt, (void *)(*new), dir_cleanup, apr_null_cleanup); return APR_SUCCESS; } -apr_status_t apr_closedir(apr_dir_t *thedir) +apr_status_t apr_closedir(apr_dir_t *dir) { - if (!FindClose(thedir->dirhand)) { - return apr_get_os_error(); + if (dir->dirhand != INVALID_HANDLE_VALUE && !FindClose(dir->dirhand)) { + return apr_get_os_error(); } - apr_kill_cleanup(thedir->cntxt, thedir, dir_cleanup); + dir->dirhand = INVALID_HANDLE_VALUE; return APR_SUCCESS; } apr_status_t apr_readdir(apr_dir_t *thedir) { +#if APR_HAS_UNICODE_FS + if (thedir->dirhand == INVALID_HANDLE_VALUE) { + thedir->dirhand = FindFirstFileW(thedir->dirname, thedir->entry); + if (thedir->dirhand == INVALID_HANDLE_VALUE) { + return apr_get_os_error(); + } + } + else if (!FindNextFileW(thedir->dirhand, thedir->entry)) { + return apr_get_os_error(); + } +#else if (thedir->dirhand == INVALID_HANDLE_VALUE) { - thedir->entry = apr_pcalloc(thedir->cntxt, sizeof(WIN32_FIND_DATA)); thedir->dirhand = FindFirstFile(thedir->dirname, thedir->entry); if (thedir->dirhand == INVALID_HANDLE_VALUE) { return apr_get_os_error(); } - return APR_SUCCESS; } - if (!FindNextFile(thedir->dirhand, thedir->entry)) { + else if (!FindNextFile(thedir->dirhand, thedir->entry)) { return apr_get_os_error(); } +#endif return APR_SUCCESS; } -apr_status_t apr_rewinddir(apr_dir_t *thedir) +apr_status_t apr_rewinddir(apr_dir_t *dir) { - apr_status_t stat; - apr_pool_t *cont = thedir->cntxt; - char *temp = apr_pstrdup(cont, thedir->dirname); - temp[strlen(temp) - 2] = '\0'; /*remove the \* at the end */ - if (thedir->dirhand == INVALID_HANDLE_VALUE) { - return APR_SUCCESS; - } - if ((stat = apr_closedir(thedir)) == APR_SUCCESS) { - if ((stat = apr_opendir(&thedir, temp, cont)) == APR_SUCCESS) { - apr_readdir(thedir); - return APR_SUCCESS; - } - } - return stat; + dir_cleanup(dir); + if (!FindClose(dir->dirhand)) { + return apr_get_os_error(); + } + dir->dirhand = INVALID_HANDLE_VALUE; + return APR_SUCCESS; } apr_status_t apr_make_dir(const char *path, apr_fileperms_t perm, apr_pool_t *cont) @@ -196,7 +219,19 @@ apr_status_t apr_get_dir_filename(char **new, apr_dir_t *thedir) { +#if APR_HAS_UNICODE_FS + apr_status_t rv; + int len = wcslen(thedir->entry->cFileName) + 1; + int dremains = MAX_PATH; + (*new) = apr_palloc(thedir->cntxt, len * 2); + if ((rv = conv_ucs2_to_utf8(thedir->entry->cFileName, &len, + *new, &dremains))) + return rv; + if (len) + return APR_ENAMETOOLONG; +#else (*new) = apr_pstrdup(thedir->cntxt, thedir->entry->cFileName); +#endif return APR_SUCCESS; } 1.23 +13 -2 apache-2.0/src/lib/apr/file_io/win32/filedup.c Index: filedup.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/filedup.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- filedup.c 2000/10/23 17:21:11 1.22 +++ filedup.c 2000/10/25 02:46:42 1.23 @@ -57,19 +57,25 @@ #include "apr_general.h" #include "apr_strings.h" #include <string.h> +#if APR_HAS_UNICODE_FS +#include "i18n.h" +#include <wchar.h> +#endif apr_status_t apr_dupfile(apr_file_t **new_file, apr_file_t *old_file, apr_pool_t *p) { BOOLEAN isStdHandle = FALSE; HANDLE hCurrentProcess = GetCurrentProcess(); +#if APR_HAS_UNICODE_FS + int len = wcslen(old_file->fname) + 1; +#endif if ((*new_file) == NULL) { if (p == NULL) { p = old_file->cntxt; } - (*new_file) = (apr_file_t *) apr_pcalloc(p, - sizeof(apr_file_t)); + (*new_file) = (apr_file_t *) apr_pcalloc(p, sizeof(apr_file_t)); if ((*new_file) == NULL) { return APR_ENOMEM; } @@ -104,7 +110,12 @@ } (*new_file)->cntxt = old_file->cntxt; +#if APR_HAS_UNICODE_FS + (*new_file)->fname = apr_palloc(old_file->cntxt, len * 2); + wcscpy((*new_file)->fname, old_file->fname); +#else (*new_file)->fname = apr_pstrdup(old_file->cntxt, old_file->fname); +#endif /* (*new_file)->demonfname = apr_pstrdup(old_file->cntxt, old_file->demonfname); * (*new_file)->lowerdemonfname = apr_pstrdup(old_file->cntxt, old_file->lowerdemonfname); */ 1.33 +12 -1 apache-2.0/src/lib/apr/file_io/win32/fileio.h Index: fileio.h =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/fileio.h,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- fileio.h 2000/10/23 17:21:11 1.32 +++ fileio.h 2000/10/25 02:46:42 1.33 @@ -89,6 +89,8 @@ #define APR_FILE_BUFSIZE 4096 +typedef apr_int16_t apr_wchar_t; + typedef enum apr_canon_case_e { APR_CANON_CASE_GIVEN, APR_CANON_CASE_LOWER, @@ -138,7 +140,11 @@ apr_interval_time_t timeout; /* File specific info */ +#if APR_HAS_UNICODE_FS + apr_wchar_t *fname; +#else char *fname; +#endif apr_canon_t *canonname; DWORD dwFileAttributes; @@ -165,9 +171,14 @@ struct apr_dir_t { apr_pool_t *cntxt; - char *dirname; HANDLE dirhand; +#if APR_HAS_UNICODE_FS + apr_wchar_t *dirname; + WIN32_FIND_DATAW *entry; +#else + char *dirname; WIN32_FIND_DATA *entry; +#endif }; apr_status_t file_cleanup(void *); 1.30 +47 -9 apache-2.0/src/lib/apr/file_io/win32/filestat.c Index: filestat.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/filestat.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- filestat.c 2000/10/16 03:35:02 1.29 +++ filestat.c 2000/10/25 02:46:42 1.30 @@ -58,6 +58,9 @@ #include "apr_general.h" #include "apr_errno.h" #include "apr_time.h" +#if APR_HAS_UNICODE_FS +#include "i18n.h" +#endif #include <sys/stat.h> #include "atime.h" #include "misc.h" @@ -196,20 +199,53 @@ { /* WIN32_FILE_ATTRIBUTE_DATA is an exact subset of the first * entries of WIN32_FIND_DATA + * We need to catch the case where fname length == MAX_PATH since for + * some strange reason GetFileAttributesEx fails with PATH_NOT_FOUND. + * We would rather indicate length error than 'not found' + * since in many cases the apr user is testing for 'not found' + * and this is not such a case. */ +#if APR_HAS_UNICODE_FS + WIN32_FIND_DATAW FileInformation; + apr_wchar_t wname[MAX_PATH]; + int len = MAX_PATH; + int lremains = strlen(fname) + 1; + apr_oslevel_e os_level; + apr_status_t rv; + HANDLE hFind; + if ((rv = conv_utf8_to_ucs2(fname, &lremains, wname, &len))) + return rv; + if (lremains) + return APR_ENAMETOOLONG; + if (!apr_get_oslevel(cont, &os_level) && os_level >= APR_WIN_98) { + if (!GetFileAttributesExW(wname, GetFileExInfoStandard, + (WIN32_FILE_ATTRIBUTE_DATA*) &FileInformation)) { + return apr_get_os_error(); + } + } + else { + /* What a waste of cpu cycles... but what else can we do? + */ + if (strchr(fname, '*') || strchr(fname, '?')) + return APR_ENOENT; + hFind = FindFirstFileW(wname, &FileInformation); + if (hFind == INVALID_HANDLE_VALUE) { + return apr_get_os_error(); + } else { + FindClose(hFind); + } + } +#else + int len = strlen(fname); WIN32_FIND_DATA FileInformation; HANDLE hFind; apr_oslevel_e os_level; - - memset(finfo,'\0', sizeof(*finfo)); + (*new) = apr_pcalloc(cont, sizeof(apr_dir_t)); + (*new)->entry = apr_pcalloc(cont, sizeof(WIN32_FIND_DATA)); + (*new)->dirname = apr_palloc(cont, len + 3); + memcpy((*new)->dirname, dirname, len); - /* We need to catch the case where fname length == MAX_PATH since for - * some strange reason GetFileAttributesEx fails with PATH_NOT_FOUND. - * We would rather indicate length error than 'not found' - * since in many cases the apr user is testing for 'not found' - * and this is not such a case. - */ - if (strlen(fname) >= MAX_PATH) { + if (len >= MAX_PATH) { return APR_ENAMETOOLONG; } else if (!apr_get_oslevel(cont, &os_level) && os_level >= APR_WIN_98) { @@ -230,7 +266,9 @@ FindClose(hFind); } } +#endif + memset(finfo,'\0', sizeof(*finfo)); /* Filetype - Directory or file? * Short of opening the handle to the file, the 'FileType' appears * to be unknowable (in any trustworthy or consistent sense), that 1.52 +60 -6 apache-2.0/src/lib/apr/file_io/win32/open.c Index: open.c =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/open.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- open.c 2000/10/23 17:21:11 1.51 +++ open.c 2000/10/25 02:46:42 1.52 @@ -63,6 +63,9 @@ #include <string.h> #include <sys/stat.h> #include "misc.h" +#if APR_HAS_UNICODE_FS +#include "i18n.h" +#endif apr_status_t file_cleanup(void *thefile) { @@ -76,7 +79,7 @@ } apr_status_t apr_open(apr_file_t **new, const char *fname, - apr_int32_t flag, apr_fileperms_t perm, apr_pool_t *cont) + apr_int32_t flag, apr_fileperms_t perm, apr_pool_t *cont) { DWORD oflags = 0; DWORD createflags = 0; @@ -84,6 +87,10 @@ DWORD sharemode = FILE_SHARE_READ | FILE_SHARE_WRITE; apr_oslevel_e level; apr_status_t rv; +#if APR_HAS_UNICODE_FS + int lremains = strlen(fname) + 1; + int dremains = (lremains) * 2; +#endif (*new) = (apr_file_t *)apr_pcalloc(cont, sizeof(apr_file_t)); (*new)->cntxt = cont; @@ -108,8 +115,16 @@ if (rv) return rv; } - +#if APR_HAS_UNICODE_FS + (*new)->fname = apr_palloc(cont, dremains); + if ((rv = conv_utf8_to_ucs2(fname, &lremains, + (*new)->fname, &dremains))) + return rv; + if (lremains) + return APR_ENAMETOOLONG; +#else (*new)->fname = apr_pstrdup(cont, fname); +#endif if (apr_get_oslevel(cont, &level) == APR_SUCCESS && level >= APR_WIN_NT) { sharemode |= FILE_SHARE_DELETE; @@ -150,10 +165,14 @@ if (flag & APR_DELONCLOSE) { attributes |= FILE_FLAG_DELETE_ON_CLOSE; } - - (*new)->filehand = CreateFile(fname, oflags, sharemode, - NULL, createflags, attributes, 0); +#if APR_HAS_UNICODE_FS + (*new)->filehand = CreateFileW((*new)->fname, oflags, sharemode, + NULL, createflags, attributes, 0); +#else + (*new)->filehand = CreateFile((*new)->fname, oflags, sharemode, + NULL, createflags, attributes, 0); +#endif if ((*new)->filehand == INVALID_HANDLE_VALUE) { return apr_get_os_error(); } @@ -193,7 +212,20 @@ apr_status_t apr_remove_file(const char *path, apr_pool_t *cont) { +#if APR_HAS_UNICODE_FS + apr_wchar_t wpath[MAX_PATH]; + int lremains = strlen(path) + 1; + int dremains = MAX_PATH; + apr_status_t rv; + if ((rv = conv_utf8_to_ucs2(path, &lremains, + wpath, &dremains))) + return rv; + if (lremains) + return APR_ENAMETOOLONG; + if (DeleteFileW(wpath)) +#else if (DeleteFile(path)) +#endif return APR_SUCCESS; return apr_get_os_error(); } @@ -201,8 +233,30 @@ apr_status_t apr_rename_file(const char *from_path, const char *to_path, apr_pool_t *p) { +#if APR_HAS_UNICODE_FS + apr_wchar_t wfrompath[MAX_PATH]; + apr_wchar_t wtopath[MAX_PATH]; + int lremains = strlen(from_path) + 1; + int dremains = MAX_PATH; + apr_status_t rv; + if ((rv = conv_utf8_to_ucs2(from_path, &lremains, + wfrompath, &dremains))) + return rv; + if (lremains) + return APR_ENAMETOOLONG; + lremains = strlen(to_path) + 1; + dremains = MAX_PATH; + if ((rv = conv_utf8_to_ucs2(to_path, &lremains, + wtopath, &dremains))) + return rv; + if (lremains) + return APR_ENAMETOOLONG; + if (MoveFileExW(wfrompath, wtopath, MOVEFILE_REPLACE_EXISTING | + MOVEFILE_COPY_ALLOWED)) +#else if (MoveFileEx(from_path, to_path, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED)) +#endif return APR_SUCCESS; return apr_get_os_error(); } @@ -249,7 +303,7 @@ if ((*thefile)->filehand == INVALID_HANDLE_VALUE) return apr_get_os_error(); (*thefile)->cntxt = cont; - (*thefile)->fname = "STD_ERROR_HANDLE"; + (*thefile)->fname = "\0\0"; // What was this: "STD_ERROR_HANDLE"; (*thefile)->eof_hit = 0; return APR_SUCCESS; 1.47 +1 -0 apache-2.0/src/lib/apr/include/apr.h.in Index: apr.h.in =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr.h.in,v retrieving revision 1.46 retrieving revision 1.47 diff -u -r1.46 -r1.47 --- apr.h.in 2000/10/17 13:26:54 1.46 +++ apr.h.in 2000/10/25 02:46:43 1.47 @@ -93,6 +93,7 @@ #define APR_HAS_XLATE @iconv@ #define APR_HAS_OTHER_CHILD @oc@ #define APR_HAS_DSO @aprdso@ +#define APR_HAS_UNICODE_FS 0 /* This macro tells APR that it is safe to make a file masquerade as a * socket. This is necessary, because some platforms support poll'ing 1.32 +3 -1 apache-2.0/src/lib/apr/include/apr.hw Index: apr.hw =================================================================== RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr.hw,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- apr.hw 2000/10/17 13:26:54 1.31 +++ apr.hw 2000/10/25 02:46:43 1.32 @@ -147,12 +147,14 @@ /* APR Feature Macros */ #define APR_HAS_THREADS 1 -#define APR_HAS_SENDFILE 1 +#define APR_HAS_SENDFILE 1 #define APR_HAS_RANDOM 1 #define APR_HAS_DSO 1 #define APR_HAS_MMAP 0 #define APR_HAS_XLATE 0 + +#define APR_HAS_UNICODE_FS 1 /* Typedefs that APR needs. */