Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / afsweb / apache_includes / 1.3.6 / buff.h
1 /* ====================================================================
2 * Copyright (c) 1996-1999 The Apache Group. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * 3. All advertising materials mentioning features or use of this
17 * software must display the following acknowledgment:
18 * "This product includes software developed by the Apache Group
19 * for use in the Apache HTTP server project (http://www.apache.org/)."
20 *
21 * 4. The names "Apache Server" and "Apache Group" must not be used to
22 * endorse or promote products derived from this software without
23 * prior written permission. For written permission, please contact
24 * apache@apache.org.
25 *
26 * 5. Products derived from this software may not be called "Apache"
27 * nor may "Apache" appear in their names without prior written
28 * permission of the Apache Group.
29 *
30 * 6. Redistributions of any form whatsoever must retain the following
31 * acknowledgment:
32 * "This product includes software developed by the Apache Group
33 * for use in the Apache HTTP server project (http://www.apache.org/)."
34 *
35 * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
36 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46 * OF THE POSSIBILITY OF SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Group and was originally based
51 * on public domain software written at the National Center for
52 * Supercomputing Applications, University of Illinois, Urbana-Champaign.
53 * For more information on the Apache Group and the Apache HTTP server
54 * project, please see <http://www.apache.org/>.
55 *
56 */
57
58 #ifndef APACHE_BUFF_H
59 #define APACHE_BUFF_H
60
61 #ifdef __cplusplus
62 extern "C" {
63 #endif
64
65 #ifdef B_SFIO
66 #include "sfio.h"
67 #endif
68
69 #include <stdarg.h>
70
71 /* Reading is buffered */
72 #define B_RD (1)
73 /* Writing is buffered */
74 #define B_WR (2)
75 #define B_RDWR (3)
76 /* At end of file, or closed stream; no further input allowed */
77 #define B_EOF (4)
78 /* No further output possible */
79 #define B_EOUT (8)
80 /* A read error has occurred */
81 #define B_RDERR (16)
82 /* A write error has occurred */
83 #define B_WRERR (32)
84 #ifdef B_ERROR /* in SVR4: sometimes defined in /usr/include/sys/buf.h */
85 #undef B_ERROR
86 #endif
87 #define B_ERROR (48)
88 /* Use chunked writing */
89 #define B_CHUNK (64)
90 /* bflush() if a read would block */
91 #define B_SAFEREAD (128)
92 /* buffer is a socket */
93 #define B_SOCKET (256)
94 #ifdef CHARSET_EBCDIC
95 #define B_ASCII2EBCDIC 0x40000000 /* Enable conversion for this buffer */
96 #define B_EBCDIC2ASCII 0x80000000 /* Enable conversion for this buffer */
97 #endif /*CHARSET_EBCDIC */
98
99 typedef struct buff_struct BUFF;
100
101 struct buff_struct {
102 int flags; /* flags */
103 unsigned char *inptr; /* pointer to next location to read */
104 int incnt; /* number of bytes left to read from input buffer;
105 * always 0 if had a read error */
106 int outchunk; /* location of chunk header when chunking */
107 int outcnt; /* number of byte put in output buffer */
108 unsigned char *inbase;
109 unsigned char *outbase;
110 int bufsiz;
111 void (*error) (BUFF * fb, int op, void *data);
112 void *error_data;
113 long int bytes_sent; /* number of bytes actually written */
114
115 ap_pool *pool;
116
117 /* could also put pointers to the basic I/O routines here */
118 int fd; /* the file descriptor */
119 int fd_in; /* input file descriptor, if different */
120 #ifdef WIN32
121 HANDLE hFH; /* Windows filehandle */
122 #endif
123
124 /* transport handle, for RPC binding handle or some such */
125 void *t_handle;
126
127 #ifdef B_SFIO
128 Sfio_t *sf_in;
129 Sfio_t *sf_out;
130 #endif
131 };
132
133 #ifdef B_SFIO
134 typedef struct {
135 Sfdisc_t disc;
136 BUFF *buff;
137 } apache_sfio;
138
139 extern Sfdisc_t *bsfio_new(pool * p, BUFF * b);
140 #endif
141
142 /* Options to bset/getopt */
143 #define BO_BYTECT (1)
144
145 /* Stream creation and modification */
146 API_EXPORT(BUFF *) ap_bcreate(pool * p, int flags);
147 API_EXPORT(void) ap_bpushfd(BUFF * fb, int fd_in, int fd_out);
148 #ifdef WIN32
149 API_EXPORT(void) ap_bpushh(BUFF * fb, HANDLE hFH);
150 #endif
151 API_EXPORT(int) ap_bsetopt(BUFF * fb, int optname, const void *optval);
152 API_EXPORT(int) ap_bgetopt(BUFF * fb, int optname, void *optval);
153 API_EXPORT(int) ap_bsetflag(BUFF * fb, int flag, int value);
154 API_EXPORT(int) ap_bclose(BUFF * fb);
155
156 #define ap_bgetflag(fb, flag) ((fb)->flags & (flag))
157
158 /* Error handling */
159 API_EXPORT(void) ap_bonerror(BUFF * fb,
160 void (*error) (BUFF *, int, void *),
161 void *data);
162
163 /* I/O */
164 API_EXPORT(int) ap_bread(BUFF * fb, void *buf, int nbyte);
165 API_EXPORT(int) ap_bgets(char *s, int n, BUFF * fb);
166 API_EXPORT(int) ap_blookc(char *buff, BUFF * fb);
167 API_EXPORT(int) ap_bskiplf(BUFF * fb);
168 API_EXPORT(int) ap_bwrite(BUFF * fb, const void *buf, int nbyte);
169 API_EXPORT(int) ap_bflush(BUFF * fb);
170 API_EXPORT(int) ap_bputs(const char *x, BUFF * fb);
171 API_EXPORT(int) ap_bvputs(BUFF * fb, ...);
172 API_EXPORT_NONSTD(int) ap_bprintf(BUFF * fb, const char *fmt, ...)
173 __attribute__ ((format(printf, 2, 3)));
174 API_EXPORT(int) ap_vbprintf(BUFF * fb, const char *fmt, va_list vlist);
175
176 /* Internal routines */
177 API_EXPORT(int) ap_bflsbuf(int c, BUFF * fb);
178 API_EXPORT(int) ap_bfilbuf(BUFF * fb);
179
180 #ifndef CHARSET_EBCDIC
181
182 #define ap_bgetc(fb) ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
183 ((fb)->incnt--, *((fb)->inptr++)) )
184
185 #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
186 (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
187 ((fb)->outbase[(fb)->outcnt++] = (c), 0))
188
189 #else /*CHARSET_EBCDIC */
190
191 #define ap_bgetc(fb) ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
192 ((fb)->incnt--, (fb->flags & B_ASCII2EBCDIC)\
193 ?os_toebcdic[(unsigned char)*((fb)->inptr++)]:*((fb)->inptr++)) )
194
195 #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
196 (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
197 ((fb)->outbase[(fb)->outcnt++] = (fb->flags & B_EBCDIC2ASCII)\
198 ?os_toascii[(unsigned char)c]:(c), 0))
199
200 #endif /*CHARSET_EBCDIC */
201 struct child_info {
202 #ifdef WIN32
203 /*
204 * These handles are used by ap_call_exec to call
205 * create process with pipe handles.
206 */
207 HANDLE hPipeInputRead;
208 HANDLE hPipeOutputWrite;
209 HANDLE hPipeErrorWrite;
210 #else
211 /*
212 * We need to put a dummy member in here to avoid compilation
213 * errors under certain Unix compilers, like SGI's and HPUX's,
214 * which fail to compile a zero-sized struct. Of course
215 * it would be much nicer if there was actually a use for this
216 * structure under Unix. Aah the joys of x-platform code.
217 */
218 int dummy;
219 #endif
220 };
221 API_EXPORT(int) ap_bspawn_child(pool *, int (*)(void *, child_info *),
222 void *, enum kill_conditions,
223 BUFF ** pipe_in, BUFF ** pipe_out,
224 BUFF ** pipe_err);
225
226 /* enable non-blocking operations */
227 API_EXPORT(int) ap_bnonblock(BUFF * fb, int direction);
228 /* and get an fd to select() on */
229 API_EXPORT(int) ap_bfileno(BUFF * fb, int direction);
230
231 /* bflush() if a read now would block, but don't actually read anything */
232 API_EXPORT(void) ap_bhalfduplex(BUFF * fb);
233
234 #ifdef __cplusplus
235 }
236 #endif
237 #endif /* !APACHE_BUFF_H */