home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 April / PCWorld_2002-04_cd.bin / Komunik / apache / apache_1.3.23-win32-x86-no_src.msi / Data.Cab / F164891_buff.h < prev    next >
C/C++ Source or Header  |  2002-01-21  |  9KB  |  250 lines

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