]> granicus.if.org Git - apache/blob - server/util_ebcdic.c
mod_session_cookie: Add a session implementation capable of storing
[apache] / server / util_ebcdic.c
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 apr_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
70 void 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
79 void 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
88 int 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 */