Annotation of win32/apache13/src/include/buff.h, revision 1.1.1.1
1.1 parser 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, void (*error) (BUFF *, int, void *),
160: void *data);
161:
162: /* I/O */
163: API_EXPORT(int) ap_bread(BUFF *fb, void *buf, int nbyte);
164: API_EXPORT(int) ap_bgets(char *s, int n, BUFF *fb);
165: API_EXPORT(int) ap_blookc(char *buff, BUFF *fb);
166: API_EXPORT(int) ap_bskiplf(BUFF *fb);
167: API_EXPORT(int) ap_bwrite(BUFF *fb, const void *buf, int nbyte);
168: API_EXPORT(int) ap_bflush(BUFF *fb);
169: API_EXPORT(int) ap_bputs(const char *x, BUFF *fb);
170: API_EXPORT(int) ap_bvputs(BUFF *fb,...);
171: API_EXPORT_NONSTD(int) ap_bprintf(BUFF *fb, const char *fmt,...)
172: __attribute__((format(printf,2,3)));
173: API_EXPORT(int) ap_vbprintf(BUFF *fb, const char *fmt, va_list vlist);
174:
175: /* Internal routines */
176: API_EXPORT(int) ap_bflsbuf(int c, BUFF *fb);
177: API_EXPORT(int) ap_bfilbuf(BUFF *fb);
178:
179: #ifndef CHARSET_EBCDIC
180:
181: #define ap_bgetc(fb) ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
182: ((fb)->incnt--, *((fb)->inptr++)) )
183:
184: #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
185: (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
186: ((fb)->outbase[(fb)->outcnt++] = (c), 0))
187:
188: #else /*CHARSET_EBCDIC*/
189:
190: #define ap_bgetc(fb) ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
191: ((fb)->incnt--, (fb->flags & B_ASCII2EBCDIC)\
192: ?os_toebcdic[(unsigned char)*((fb)->inptr++)]:*((fb)->inptr++)) )
193:
194: #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
195: (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
196: ((fb)->outbase[(fb)->outcnt++] = (fb->flags & B_EBCDIC2ASCII)\
197: ?os_toascii[(unsigned char)c]:(c), 0))
198:
199: #endif /*CHARSET_EBCDIC*/
200: struct child_info {
201: #ifdef WIN32
202: /*
203: * These handles are used by ap_call_exec to call
204: * create process with pipe handles.
205: */
206: HANDLE hPipeInputRead;
207: HANDLE hPipeOutputWrite;
208: HANDLE hPipeErrorWrite;
209: #else
210: /*
211: * We need to put a dummy member in here to avoid compilation
212: * errors under certain Unix compilers, like SGI's and HPUX's,
213: * which fail to compile a zero-sized struct. Of course
214: * it would be much nicer if there was actually a use for this
215: * structure under Unix. Aah the joys of x-platform code.
216: */
217: int dummy;
218: #endif
219: };
220: API_EXPORT(int) ap_bspawn_child(pool *, int (*)(void *, child_info *), void *,
221: enum kill_conditions, BUFF **pipe_in, BUFF **pipe_out,
222: BUFF **pipe_err);
223:
224: /* enable non-blocking operations */
225: API_EXPORT(int) ap_bnonblock(BUFF *fb, int direction);
226: /* and get an fd to select() on */
227: API_EXPORT(int) ap_bfileno(BUFF *fb, int direction);
228:
229: /* bflush() if a read now would block, but don't actually read anything */
230: API_EXPORT(void) ap_bhalfduplex(BUFF *fb);
231:
232: #ifdef __cplusplus
233: }
234: #endif
235:
236: #endif /* !APACHE_BUFF_H */
E-mail: