123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- { Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- }
- {$ifdef B_SFIO}
- #include "sfio.h"
- {$endif}
- //#include <stdarg.h>
- const
- { Reading is buffered }
- B_RD = (1);
- { Writing is buffered }
- B_WR = (2);
- B_RDWR = (3);
- { At end of file, or closed stream; no further input allowed }
- B_EOF = (4);
- { No further output possible }
- B_EOUT = (8);
- { A read error has occurred }
- B_RDERR =(16);
- { A write error has occurred }
- B_WRERR =(32);
- //#ifdef B_ERROR { in SVR4: sometimes defined in /usr/include/sys/buf.h }
- //#undef B_ERROR
- //#endif
- B_ERROR =(48);
- { Use chunked writing }
- B_CHUNK =(64);
- { bflush() if a read would block }
- B_SAFEREAD =(128);
- { buffer is a socket }
- B_SOCKET =(256);
- {$ifdef CHARSET_EBCDIC}
- B_ASCII2EBCDIC = $40000000; { Enable conversion for this buffer }
- B_EBCDIC2ASCII = $80000000; { Enable conversion for this buffer }
- {$endif} {CHARSET_EBCDIC}
- type
- Pbuff_struct = ^buff_struct;
- PBUFF = Pbuff_struct;
- PPBUFF = ^PBUFF;
- error_t = procedure (fb: PBUFF; op: cint; data: Pointer);
-
- filter_callback_t = procedure (param1: PBUFF; const param2: Pointer; param3: cint);
- buff_struct = record
- flags: cint; { flags }
- inptr: PChar; { pointer to next location to read }
- incnt: cint; { number of bytes left to read from input buffer;
- * always 0 if had a read error }
- outchunk: cint; { location of chunk header when chunking }
- outcnt: cint; { number of byte put in output buffer }
- inbase: PChar;
- outbase: PChar;
- bufsiz: cint;
- error: error_t;
- error_data: PChar;
- bytes_sent: clong; { number of bytes actually written }
- pool: Pap_pool;
- { could also put pointers to the basic I/O routines here }
- fd: cint; { the file descriptor }
- fd_in: cint; { input file descriptor, if different }
- {$ifdef WINDOWS}
- hFH: HANDLE; { Windows filehandle }
- {$endif}
- { transport handle, for RPC binding handle or some such }
- t_handle: PChar;
- {$ifdef B_SFIO}
- sf_in: PSfio_t;
- sf_out: PSfio_t;
- {$endif}
- callback_data: Pointer;
- filter_callback: filter_callback_t;
-
- end;
- {$ifdef B_SFIO}
- apache_sfio = record
- disc: Sfdisc_t;
- buff: PBUFF;
- end;
- extern Sfdisc_t *bsfio_new(pool *p, BUFF *b);
- {$endif}
- { Options to bset/getopt }
- const
- BO_BYTECT = (1);
- { Stream creation and modification }
- function ap_bcreate(p: PPool; flags: cint): PBUFF;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- procedure ap_bpushfd(fb: PBUFF; fd_in, fd_out: cint);
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- {$ifdef WINDOWS}
- procedure ap_bpushh(fb: PBUFF; hFH: HANDLE);
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- {$endif}
- function ap_bsetopt(fb: PBUFF; optname: cint; const optval: Pointer): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- function ap_bgetopt(fb: PBUFF; optname: cint; optval: Pointer): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- function ap_bsetflag(fb: PBUFF; flag, value: cint): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- function ap_bclose(fb: PBUFF): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- //#define ap_bgetflag(fb, flag) ((fb)->flags & (flag))
- { Error handling }
- procedure ap_bonerror(fb: PBUFF; error: error_t; data: Pointer);
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- { I/O }
- function ap_bread(fb: PBUFF; buf: Pointer; nbyte: cint): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- {API_EXPORT(int) ap_bgets(char *s, int n, BUFF *fb);
- API_EXPORT(int) ap_blookc(char *buff, BUFF *fb);
- API_EXPORT(int) ap_bskiplf(BUFF *fb);
- API_EXPORT(int) ap_bwrite(BUFF *fb, const void *buf, int nbyte);
- API_EXPORT(int) ap_bflush(BUFF *fb);
- API_EXPORT(int) ap_bputs(const char *x, BUFF *fb);
- API_EXPORT_NONSTD(int) ap_bvputs(BUFF *fb,...);
- API_EXPORT_NONSTD(int) ap_bprintf(BUFF *fb, const char *fmt,...)
- __attribute__((format(printf,2,3)));
- API_EXPORT(int) ap_vbprintf(BUFF *fb, const char *fmt, va_list vlist);
- }
- { Internal routines }
- {API_EXPORT(int) ap_bflsbuf(int c, BUFF *fb);
- API_EXPORT(int) ap_bfilbuf(BUFF *fb);
- #ifndef CHARSET_EBCDIC
- #define ap_bgetc(fb) ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
- ((fb)->incnt--, *((fb)->inptr++)) )
- #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
- (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
- ((fb)->outbase[(fb)->outcnt++] = (c), 0))
- #else} {CHARSET_EBCDIC}
- {
- #define ap_bgetc(fb) ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
- ((fb)->incnt--, (fb->flags & B_ASCII2EBCDIC)\
- ?os_toebcdic[(unsigned char)*((fb)->inptr++)]:*((fb)->inptr++)) )
- #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
- (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
- ((fb)->outbase[(fb)->outcnt++] = (fb->flags & B_EBCDIC2ASCII)\
- ?os_toascii[(unsigned char)c]:(c), 0))
- #endif} {CHARSET_EBCDIC}
- type
- child_info = record
- {$ifdef WINDOWS}
- {
- * These handles are used by ap_call_exec to call
- * create process with pipe handles.
- }
- hPipeInputRead: HANDLE;
- hPipeOutputWrite: HANDLE;
- hPipeErrorWrite: HANDLE;
- {$else}
- {
- * We need to put a dummy member in here to avoid compilation
- * errors under certain Unix compilers, like SGI's and HPUX's,
- * which fail to compile a zero-sized struct. Of course
- * it would be much nicer if there was actually a use for this
- * structure under Unix. Aah the joys of x-platform code.
- }
- dummy: cint;
- {$endif}
- end;
-
- Pchild_info = ^child_info;
-
- func_t = function (param1: Pointer; param2: Pchild_info): cint;
- function ap_bspawn_child(p: PPool;
- func: func_t; data: Pointer; kill_how: kill_conditions; pipe_in, pipe_out, pipe_err: PPBUFF): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- { enable non-blocking operations }
- function ap_bnonblock(fb: PBUFF; direction: cint): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- { and get an fd to select() on }
- function ap_bfileno(fb: PBUFF; direction: cint): cint;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- { bflush() if a read now would block, but don't actually read anything }
- procedure ap_bhalfduplex(fb: PBUFF);
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} external LibHTTPD;
- {$if defined(WINDOWS) or defined(NETWARE) or defined(CYGWIN_WINSOCK)}
- { ap_recvwithtimeout/ap_sendwithtimeout socket primitives for WinSock }
- //API_EXPORT(int) ap_sendwithtimeout(int sock, const char *buf, int len, int flags);
- //API_EXPORT(int) ap_recvwithtimeout(int sock, char *buf, int len, int flags);
- {$endif}
|