]> granicus.if.org Git - apache/commitdiff
Some enhancements for OS/2 ap_canonical_filename:
authorBrian Havard <bjh@apache.org>
Sun, 6 Aug 2000 15:07:41 +0000 (15:07 +0000)
committerBrian Havard <bjh@apache.org>
Sun, 6 Aug 2000 15:07:41 +0000 (15:07 +0000)
- Log proper error message instead of error code on failure
- In case of error caused by an invalid file name, don't return an empty
  string as that tends to confuse things rather than make them better.
- Avoid using the very expensive ap_os_systemcase_canonical_filename()
  unless it's truely necessary.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86011 13f79535-47bb-0310-9956-ffa450edef68

os/os2/util_os2.c

index 3fbae4bf66773e84a2ca6e0472f287df0d7e7e46..180bf7c69e448b70f4d7fe78513d9876a3256abd 100644 (file)
@@ -86,12 +86,10 @@ API_EXPORT(char *)ap_os_case_canonical_filename(apr_pool_t *pPool, const char *s
     rc = DosQueryPathInfo(buf, FIL_QUERYFULLNAME, buf2, HUGE_STRING_LEN);
 
     if (rc) {
-        if ( rc != ERROR_INVALID_NAME ) {
-            ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, NULL, "OS/2 error %d for file %s", rc, szFile);
-            return apr_pstrdup(pPool, "");
-        } else {
-            return apr_pstrdup(pPool, szFile);
+        if (rc != ERROR_INVALID_NAME) {
+            ap_log_error(APLOG_MARK, APLOG_ERR, APR_OS2_STATUS(rc), NULL, "for file [%s]", szFile);
         }
+        apr_cpystrn(buf2, buf, sizeof(buf2));
     }
 
 /* Switch backslashes to forward */
@@ -151,7 +149,24 @@ char *ap_os_systemcase_canonical_filename(apr_pool_t *pPool, const char *szFile)
 
 char *ap_os_canonical_filename(apr_pool_t *pPool, const char *szFile)
 {
-    char *szCanonicalFile = ap_os_systemcase_canonical_filename(pPool, szFile);
+    char *szCanonicalFile;
+    const unsigned char *pos = szFile;
+
+    /* Find any 8 bit characters */
+    while (*pos && *pos < 128) {
+        pos++;
+    }
+
+    /* Only use the very expensive ap_os_systemcase_canonical_filename() if
+     * the file name contains non-english characters as they are the only type
+     * that can't be made canonical with a simple strlwr() 
+     */
+    if (*pos < 128) {
+        szCanonicalFile = ap_os_case_canonical_filename(pPool, szFile);
+    } else {
+        szCanonicalFile = ap_os_systemcase_canonical_filename(pPool, szFile);
+    }
+
     strlwr(szCanonicalFile);
     return szCanonicalFile;
 }