1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "ap_config.h" 18 19#if APR_CHARSET_EBCDIC 20 21#include "apr_strings.h" 22#include "httpd.h" 23#include "http_log.h" 24#include "http_core.h" 25#include "util_ebcdic.h" 26 27apr_status_t ap_init_ebcdic(apr_pool_t *pool) 28{ 29 apr_status_t rv; 30 char buf[80]; 31 32 rv = apr_xlate_open(&ap_hdrs_to_ascii, "ISO-8859-1", APR_DEFAULT_CHARSET, pool); 33 if (rv) { 34 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, 35 "apr_xlate_open() failed"); 36 return rv; 37 } 38 39 rv = apr_xlate_open(&ap_hdrs_from_ascii, APR_DEFAULT_CHARSET, "ISO-8859-1", pool); 40 if (rv) { 41 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, 42 "apr_xlate_open() failed"); 43 return rv; 44 } 45 46 rv = apr_MD5InitEBCDIC(ap_hdrs_to_ascii); 47 if (rv) { 48 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, 49 "apr_MD5InitEBCDIC() failed"); 50 return rv; 51 } 52 53 rv = apr_base64init_ebcdic(ap_hdrs_to_ascii, ap_hdrs_from_ascii); 54 if (rv) { 55 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, 56 "apr_base64init_ebcdic() failed"); 57 return rv; 58 } 59 60 rv = apr_SHA1InitEBCDIC(ap_hdrs_to_ascii); 61 if (rv) { 62 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, 63 "apr_SHA1InitEBCDIC() failed"); 64 return rv; 65 } 66 67 return APR_SUCCESS; 68} 69 70void ap_xlate_proto_to_ascii(char *buffer, apr_size_t len) 71{ 72 apr_size_t inbytes_left, outbytes_left; 73 74 inbytes_left = outbytes_left = len; 75 apr_xlate_conv_buffer(ap_hdrs_to_ascii, buffer, &inbytes_left, 76 buffer, &outbytes_left); 77} 78 79void ap_xlate_proto_from_ascii(char *buffer, apr_size_t len) 80{ 81 apr_size_t inbytes_left, outbytes_left; 82 83 inbytes_left = outbytes_left = len; 84 apr_xlate_conv_buffer(ap_hdrs_from_ascii, buffer, &inbytes_left, 85 buffer, &outbytes_left); 86} 87 88int ap_rvputs_proto_in_ascii(request_rec *r, ...) 89{ 90 va_list va; 91 const char *s; 92 char *ascii_s; 93 apr_size_t len; 94 apr_size_t written = 0; 95 96 va_start(va, r); 97 while (1) { 98 s = va_arg(va, const char *); 99 if (s == NULL) 100 break; 101 len = strlen(s); 102 ascii_s = apr_pstrndup(r->pool, s, len); 103 ap_xlate_proto_to_ascii(ascii_s, len); 104 if (ap_rputs(ascii_s, r) < 0) 105 return -1; 106 written += len; 107 } 108 va_end(va); 109 110 return written; 111} 112#endif /* APR_CHARSET_EBCDIC */ 113