]> granicus.if.org Git - apache/commitdiff
get mod_proxy to build on EBCDIC machines
authorJeff Trawick <trawick@apache.org>
Thu, 25 Apr 2002 22:12:51 +0000 (22:12 +0000)
committerJeff Trawick <trawick@apache.org>
Thu, 25 Apr 2002 22:12:51 +0000 (22:12 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@94808 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/proxy_ftp.c
modules/proxy/proxy_util.c

index 3e599e05713a4680a5f7406b4abb3c8df85a40ce..193722b0b264b77944a324b947ad991c3dca463f 100644 (file)
@@ -147,6 +147,9 @@ static int ftp_check_globbingchars(const char *path)
 static int ftp_check_string(const char *x)
 {
     int i, ch = 0;
+#if APR_CHARSET_EBCDIC
+    char buf[1];
+#endif
 
     for (i = 0; x[i] != '\0'; i++) {
         ch = x[i];
@@ -157,7 +160,11 @@ static int ftp_check_string(const char *x)
 #if !APR_CHARSET_EBCDIC
         if (ch == '\015' || ch == '\012' || (ch & 0x80))
 #else                           /* APR_CHARSET_EBCDIC */
-        if (ch == '\r' || ch == '\n' || (os_toascii[ch] & 0x80))
+        if (ch == '\r' || ch == '\n')
+            return 0;
+        buf[0] = ch;
+        ap_xlate_proto_to_ascii(buf);
+        if (buf[0] & 0x80)
 #endif                          /* APR_CHARSET_EBCDIC */
             return 0;
     }
index ff6b9bdfa2a441118e9a8090769b71a4ba3b1071..da07414cab3cc2ae3968ed00ae9a3bd2cd018783 100644 (file)
@@ -93,7 +93,27 @@ PROXY_DECLARE(int) ap_proxy_hex2c(const char *x)
        i += ch - ('a' - 10);
     return i;
 #else /*APR_CHARSET_EBCDIC*/
-    return (1 == sscanf(x, "%2x", &i)) ? os_toebcdic[i&0xFF] : 0;
+    /* we assume that the hex value refers to an ASCII character
+     * so convert to EBCDIC so that it makes sense locally;
+     *
+     * example:
+     *
+     * client specifies %20 in URL to refer to a space char;
+     * at this point we're called with EBCDIC "20"; after turning
+     * EBCDIC "20" into binary 0x20, we then need to assume that 0x20
+     * represents an ASCII char and convert 0x20 to EBCDIC, yielding
+     * 0x40
+     */
+    char buf[1];
+
+    if (1 == sscanf(x, "%2x", &i)) {
+        buf[0] = i & 0xFF;
+        ap_xlate_proto_from_ascii(buf, 1);
+        return buf[0];
+    }
+    else {
+        return 0;
+    }
 #endif /*APR_CHARSET_EBCDIC*/
 }
 
@@ -116,10 +136,16 @@ PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x)
        x[2] = '0' + i;
 #else /*APR_CHARSET_EBCDIC*/
     static const char ntoa[] = { "0123456789ABCDEF" };
+    char buf[1];
+
     ch &= 0xFF;
+
+    buf[0] = ch;
+    ap_xlate_proto_to_ascii(buf, 1);
+
     x[0] = '%';
-    x[1] = ntoa[(os_toascii[ch]>>4)&0x0F];
-    x[2] = ntoa[os_toascii[ch]&0x0F];
+    x[1] = ntoa[(buf[0] >> 4) & 0x0F];
+    x[2] = ntoa[buf[0] & 0x0F];
     x[3] = '\0';
 #endif /*APR_CHARSET_EBCDIC*/
 }