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 27/* we know core's module_index is 0 */ 28#undef APLOG_MODULE_INDEX 29#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX 30 31apr_status_t ap_init_ebcdic(apr_pool_t *pool) 32{ 33 apr_status_t rv; 34 35 rv = apr_xlate_open(&ap_hdrs_to_ascii, "ISO-8859-1", APR_DEFAULT_CHARSET, pool); 36 if (rv) { 37 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(00040) 38 "apr_xlate_open() failed"); 39 return rv; 40 } 41 42 rv = apr_xlate_open(&ap_hdrs_from_ascii, APR_DEFAULT_CHARSET, "ISO-8859-1", pool); 43 if (rv) { 44 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(00041) 45 "apr_xlate_open() failed"); 46 return rv; 47 } 48 49 rv = apr_MD5InitEBCDIC(ap_hdrs_to_ascii); 50 if (rv) { 51 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(00042) 52 "apr_MD5InitEBCDIC() failed"); 53 return rv; 54 } 55 56 rv = apr_base64init_ebcdic(ap_hdrs_to_ascii, ap_hdrs_from_ascii); 57 if (rv) { 58 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(00043) 59 "apr_base64init_ebcdic() failed"); 60 return rv; 61 } 62 63 rv = apr_SHA1InitEBCDIC(ap_hdrs_to_ascii); 64 if (rv) { 65 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(00044) 66 "apr_SHA1InitEBCDIC() failed"); 67 return rv; 68 } 69 70 return APR_SUCCESS; 71} 72 73void ap_xlate_proto_to_ascii(char *buffer, apr_size_t len) 74{ 75 apr_size_t inbytes_left, outbytes_left; 76 77 inbytes_left = outbytes_left = len; 78 apr_xlate_conv_buffer(ap_hdrs_to_ascii, buffer, &inbytes_left, 79 buffer, &outbytes_left); 80} 81 82void ap_xlate_proto_from_ascii(char *buffer, apr_size_t len) 83{ 84 apr_size_t inbytes_left, outbytes_left; 85 86 inbytes_left = outbytes_left = len; 87 apr_xlate_conv_buffer(ap_hdrs_from_ascii, buffer, &inbytes_left, 88 buffer, &outbytes_left); 89} 90 91int ap_rvputs_proto_in_ascii(request_rec *r, ...) 92{ 93 va_list va; 94 const char *s; 95 char *ascii_s; 96 apr_size_t len; 97 apr_size_t written = 0; 98 99 va_start(va, r); 100 while (1) { 101 s = va_arg(va, const char *); 102 if (s == NULL) 103 break; 104 len = strlen(s); 105 ascii_s = apr_pstrmemdup(r->pool, s, len); 106 ap_xlate_proto_to_ascii(ascii_s, len); 107 if (ap_rputs(ascii_s, r) < 0) 108 return -1; 109 written += len; 110 } 111 va_end(va); 112 113 return written; 114} 115#endif /* APR_CHARSET_EBCDIC */ 116