Added many Apache 1.3 files

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@22 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2006-09-30 15:10:01 +00:00
parent cad97dd1d7
commit ea7458a135
10 changed files with 2117 additions and 174 deletions

149
httpd/httpd_1_3/ap.inc Normal file
View File

@ -0,0 +1,149 @@
{ 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.
}
{
* The ap_vsnprintf/ap_snprintf functions are based on, and used with the
* permission of, the SIO stdio-replacement strx_* functions by Panos
* Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
}
{API_EXPORT(char *) ap_cpystrn(char *, const char *, size_t);
int ap_slack(int, int);
int ap_execle(const char *, const char *, ...);
int ap_execve(const char *, char * const argv[], char * const envp[]);
API_EXPORT(int) ap_getpass(const char *prompt, char *pwbuf, size_t bufsiz);}
{$ifndef ap_strtol}
//API_EXPORT(long) ap_strtol(const char *nptr, char **endptr, int base);
{$endif}
{ small utility macros to make things easier to read }
{.$ifdef WIN32
#define ap_killpg(x, y)
#else
#ifdef NO_KILLPG
#define ap_killpg(x, y) (kill (-(x), (y)))
#else
#define ap_killpg(x, y) (killpg ((x), (y)))
#endif
#endif} { WIN32 }
{ ap_vformatter() is a generic printf-style formatting routine
* with some extensions. The extensions are:
*
* %pA takes a struct in_addr *, and prints it as a.b.c.d
* %pI takes a struct sockaddr_in * and prints it as a.b.c.d:port
* %pp takes a void * and outputs it in hex
*
* The %p hacks are to force gcc's printf warning code to skip
* over a pointer argument without complaining. This does
* mean that the ANSI-style %p (output a void * in hex format) won't
* work as expected at all, but that seems to be a fair trade-off
* for the increased robustness of having printf-warnings work.
*
* Additionally, ap_vformatter allows for arbitrary output methods
* using the ap_vformatter_buff and flush_func.
*
* The ap_vformatter_buff has two elements curpos and endpos.
* curpos is where ap_vformatter will write the next byte of output.
* It proceeds writing output to curpos, and updating curpos, until
* either the end of output is reached, or curpos == endpos (i.e. the
* buffer is full).
*
* If the end of output is reached, ap_vformatter returns the
* number of bytes written.
*
* When the buffer is full, the flush_func is called. The flush_func
* can return -1 to indicate that no further output should be attempted,
* and ap_vformatter will return immediately with -1. Otherwise
* the flush_func should flush the buffer in whatever manner is
* appropriate, re-initialize curpos and endpos, and return 0.
*
* Note that flush_func is only invoked as a result of attempting to
* write another byte at curpos when curpos >= endpos. So for
* example, it's possible when the output exactly matches the buffer
* space available that curpos == endpos will be true when
* ap_vformatter returns.
*
* ap_vformatter does not call out to any other code, it is entirely
* self-contained. This allows the callers to do things which are
* otherwise "unsafe". For example, ap_psprintf uses the "scratch"
* space at the unallocated end of a block, and doesn't actually
* complete the allocation until ap_vformatter returns. ap_psprintf
* would be completely broken if ap_vformatter were to call anything
* that used a pool. Similarly http_bprintf() uses the "scratch"
* space at the end of its output buffer, and doesn't actually note
* that the space is in use until it either has to flush the buffer
* or until ap_vformatter returns.
}
type
ap_vformatter_buff = record
curpos: PChar;
endpos: PChar;
end;
//API_EXPORT(int) ap_vformatter(int (*flush_func)(ap_vformatter_buff *),
// ap_vformatter_buff *, const char *fmt, va_list ap);
{ These are snprintf implementations based on ap_vformatter().
*
* Note that various standards and implementations disagree on the return
* value of snprintf, and side-effects due to %n in the formatting string.
* ap_snprintf behaves as follows:
*
* Process the format string until the entire string is exhausted, or
* the buffer fills. If the buffer fills then stop processing immediately
* (so no further %n arguments are processed), and return the buffer
* length. In all cases the buffer is NUL terminated. The return value
* is the number of characters placed in the buffer, excluding the
* terminating NUL. All this implies that, at most, (len-1) characters
* will be copied over; if the return value is >= len, then truncation
* occured.
*
* In no event does ap_snprintf return a negative number.
}
//API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...)
// __attribute__((format(printf,3,4)));
//API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format,
// va_list ap);
{ Simple BASE64 encode/decode functions.
*
* As we might encode binary strings, hence we require the length of
* the incoming plain source. And return the length of what we decoded.
*
* The decoding function takes any non valid char (i.e. whitespace, \0
* or anything non A-Z,0-9 etc as terminal.
*
* plain strings/binary sequences are not assumed '\0' terminated. Encoded
* strings are neither. But propably should.
*
}
{API_EXPORT(int) ap_base64encode_len(int len);
API_EXPORT(int) ap_base64encode(char * coded_dst, const char *plain_src,int len_plain_src);
API_EXPORT(int) ap_base64encode_binary(char * coded_dst, const unsigned char *plain_src,int len_plain_src);
API_EXPORT(int) ap_base64decode_len(const char * coded_src);
API_EXPORT(int) ap_base64decode(char * plain_dst, const char *coded_src);
API_EXPORT(int) ap_base64decode_binary(unsigned char * plain_dst, const char *coded_src);}
{ Password validation, as used in AuthType Basic which is able to cope
* (based on the prefix) with the SHA1, Apache's internal MD5 and (depending
* on your platform either plain or crypt(3) passwords.
}
//API_EXPORT(char *) ap_validate_password(const char *passwd, const char *hash);

View File

@ -0,0 +1,370 @@
{ 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.
}
{
* Resource allocation routines...
*
* designed so that we don't have to keep track of EVERYTHING so that
* it can be explicitly freed later (a fundamentally unsound strategy ---
* particularly in the presence of die()).
*
* Instead, we maintain pools, and allocate items (both memory and I/O
* handlers) from the pools --- currently there are two, one for per
* transaction info, and one for config info. When a transaction is over,
* we can delete everything in the per-transaction pool without fear, and
* without thinking too hard about it either.
*
* rst
}
{ Arenas for configuration info and transaction info
* --- actual layout of the pool structure is private to
* alloc.c.
}
{ Need declaration of DIR on Win32 }
{$ifdef WIN32}
//#include "readdir.h"
{$endif}
type
pool = record end;
Ppool = ^pool;
ap_pool = pool;
Pap_pool = ^ap_pool;
//API_EXPORT(pool *) ap_init_alloc(void); { Set up everything }
//void ap_cleanup_alloc(void);
//API_EXPORT(pool *) ap_make_sub_pool(pool *); { All pools are subpools of permanent_pool }
//API_EXPORT(void) ap_destroy_pool(pool *);
{ pools have nested lifetimes -- sub_pools are destroyed when the
* parent pool is cleared. We allow certain liberties with operations
* on things such as tables (and on other structures in a more general
* sense) where we allow the caller to insert values into a table which
* were not allocated from the table's pool. The table's data will
* remain valid as long as all the pools from which its values are
* allocated remain valid.
*
* For example, if B is a sub pool of A, and you build a table T in
* pool B, then it's safe to insert data allocated in A or B into T
* (because B lives at most as long as A does, and T is destroyed when
* B is cleared/destroyed). On the other hand, if S is a table in
* pool A, it is safe to insert data allocated in A into S, but it
* is *not safe* to insert data allocated from B into S... because
* B can be cleared/destroyed before A is (which would leave dangling
* pointers in T's data structures).
*
* In general we say that it is safe to insert data into a table T
* if the data is allocated in any ancestor of T's pool. This is the
* basis on which the POOL_DEBUG code works -- it tests these ancestor
* relationships for all data inserted into tables. POOL_DEBUG also
* provides tools (ap_find_pool, and ap_pool_is_ancestor) for other
* folks to implement similar restrictions for their own data
* structures.
*
* However, sometimes this ancestor requirement is inconvenient --
* sometimes we're forced to create a sub pool (such as through
* ap_sub_req_lookup_uri), and the sub pool is guaranteed to have
* the same lifetime as the parent pool. This is a guarantee implemented
* by the *caller*, not by the pool code. That is, the caller guarantees
* they won't destroy the sub pool individually prior to destroying the
* parent pool.
*
* In this case the caller must call ap_pool_join() to indicate this
* guarantee to the POOL_DEBUG code. There are a few examples spread
* through the standard modules.
}
{$ifndef POOL_DEBUG}
//#define ap_pool_join(a,b)
{$else}
//API_EXPORT(void) ap_pool_join(pool *p, pool *sub);
//API_EXPORT(pool *) ap_find_pool(const void *ts);
//API_EXPORT(int) ap_pool_is_ancestor(pool *a, pool *b);
{$endif}
{ Clearing out EVERYTHING in an pool... destroys any sub-pools }
procedure ap_clear_pool(param1: Ppool); cdecl; external LibHTTPD;
{ Preparing for exec() --- close files, etc., but *don't* flush I/O
* buffers, *don't* wait for subprocesses, and *don't* free any memory.
}
//API_EXPORT(void) ap_cleanup_for_exec(void);
{ routines to allocate memory from an pool... }
//API_EXPORT(void *) ap_palloc(struct pool *, int nbytes);
//API_EXPORT(void *) ap_pcalloc(struct pool *, int nbytes);
//API_EXPORT(char *) ap_pstrdup(struct pool *, const char *s);
{ make a nul terminated copy of the n characters starting with s }
//API_EXPORT(char *) ap_pstrndup(struct pool *, const char *s, int n);
//API_EXPORT_NONSTD(char *) ap_pstrcat(struct pool *,...); { all '...' must be char* }
//API_EXPORT_NONSTD(char *) ap_psprintf(struct pool *, const char *fmt, ...)
// __attribute__((format(printf,2,3)));
//API_EXPORT(char *) ap_pvsprintf(struct pool *, const char *fmt, va_list);
{ array and alist management... keeping lists of things.
* Common enough to want common support code ...
}
type
Parray_header = ^array_header;
array_header = record
pool: Pap_pool;
elt_size: cint;
nelts: cint;
nalloc: cint;
elts: PChar;
end;
//API_EXPORT(array_header *) ap_make_array(pool *p, int nelts, int elt_size);
//API_EXPORT(void *) ap_push_array(array_header *);
//API_EXPORT(void) ap_array_cat(array_header *dst, const array_header *src);
//API_EXPORT(array_header *) ap_append_arrays(pool *, const array_header *,
// const array_header *);
{ ap_array_pstrcat generates a new string from the pool containing
* the concatenated sequence of substrings referenced as elements within
* the array. The string will be empty if all substrings are empty or null,
* or if there are no elements in the array.
* If sep is non-NUL, it will be inserted between elements as a separator.
}
//API_EXPORT(char *) ap_array_pstrcat(pool *p, const array_header *arr,
// const char sep);
{ copy_array copies the *entire* array. copy_array_hdr just copies
* the header, and arranges for the elements to be copied if (and only
* if) the code subsequently does a push or arraycat.
}
//API_EXPORT(array_header *) ap_copy_array(pool *p, const array_header *src);
//API_EXPORT(array_header *) ap_copy_array_hdr(pool *p, const array_header *src);
{ Tables. Implemented alist style, for now, though we try to keep
* it so that imposing a hash table structure on top in the future
* wouldn't be *too* hard...
*
* Note that key comparisons for these are case-insensitive, largely
* because that's what's appropriate and convenient everywhere they're
* currently being used...
}
type
table = record end;
Ptable = ^table;
table_entry = record
key: PChar; { maybe NULL in future;
* check when iterating thru table_elts
}
val: PChar;
end;
table_entry_t = table_entry;
{API_EXPORT(table *) ap_make_table(pool *p, int nelts);
API_EXPORT(table *) ap_copy_table(pool *p, const table *);
API_EXPORT(void) ap_clear_table(table *);
API_EXPORT(const char *) ap_table_get(const table *, const char *);
API_EXPORT(void) ap_table_set(table *, const char *name, const char *val);
API_EXPORT(void) ap_table_setn(table *, const char *name, const char *val);
API_EXPORT(void) ap_table_merge(table *, const char *name, const char *more_val);
API_EXPORT(void) ap_table_mergen(table *, const char *name, const char *more_val);
API_EXPORT(void) ap_table_unset(table *, const char *key);
API_EXPORT(void) ap_table_add(table *, const char *name, const char *val);
API_EXPORT(void) ap_table_addn(table *, const char *name, const char *val);
API_EXPORT_NONSTD(void) ap_table_do(int ( *comp) (void *, const char *, const char *),
void *rec, const table *t,...);
API_EXPORT(table * ) ap_overlay_tables(pool *p, const table *overlay, const table *base);
}
{ Conceptually, ap_overlap_tables does this:
array_header *barr = ap_table_elts(b);
table_entry *belt = (table_entry *)barr->elts;
int i;
for (i = 0; i < barr->nelts; ++i) begin
if (flags & AP_OVERLAP_TABLES_MERGE) begin
ap_table_mergen(a, belt[i].key, belt[i].val);
end
else begin
ap_table_setn(a, belt[i].key, belt[i].val);
end;
end;
Except that it is more efficient (less space and cpu-time) especially
when b has many elements.
Notice the assumptions on the keys and values in b -- they must be
in an ancestor of a's pool. In practice b and a are usually from
the same pool.
}
const
AP_OVERLAP_TABLES_SET = (0);
AP_OVERLAP_TABLES_MERGE = (1);
//API_EXPORT(void) ap_overlap_tables(table *a, const table *b, unsigned flags);
{ XXX: these know about the definition of struct table in alloc.c. That
* definition is not here because it is supposed to be private, and by not
* placing it here we are able to get compile-time diagnostics from modules
* written which assume that a table is the same as an array_header. -djg
}
//#define ap_table_elts(t) ((array_header *)(t))
//#define ap_is_empty_table(t) (((t) == NULL)||(((array_header *)(t))->nelts == 0))
{ routines to remember allocation of other sorts of things...
* generic interface first. Note that we want to have two separate
* cleanup functions in the general case, one for exec() preparation,
* to keep CGI scripts and the like from inheriting access to things
* they shouldn't be able to touch, and one for actually cleaning up,
* when the actual server process wants to get rid of the thing,
* whatever it is.
*
* kill_cleanup disarms a cleanup, presumably because the resource in
* question has been closed, freed, or whatever, and it's scarce
* enough to want to reclaim (e.g., descriptors). It arranges for the
* resource not to be cleaned up a second time (it might have been
* reallocated). run_cleanup does the same, but runs it first.
*
* Cleanups are identified for purposes of finding & running them off by the
* plain_cleanup and data, which should presumably be unique.
*
* NB any code which invokes register_cleanup or kill_cleanup directly
* is a critical section which should be guarded by block_alarms() and
* unblock_alarms() below...
*
* ap_register_cleanup_ex provided to allow for an optional "cleanup"
* to be run at call-time for things like setting CLOSEXEC flags
* on fd's or whatever else may make sense.
}
//API_EXPORT(void) ap_register_cleanup(pool *p, void *data,
// void (*plain_cleanup) (void *),
// void (*child_cleanup) (void *));
//API_EXPORT(void) ap_register_cleanup_ex(pool *p, void *data,
// void (*plain_cleanup) (void *),
// void (*child_cleanup) (void *),
// int (*magic_cleanup) (void *));
//API_EXPORT(void) ap_kill_cleanup(pool *p, void *data, void (*plain_cleanup) (void *));
//API_EXPORT(void) ap_run_cleanup(pool *p, void *data, void (*cleanup) (void *));
{ A "do-nothing" cleanup, for register_cleanup; it's faster to do
* things this way than to test for NULL. }
//API_EXPORT_NONSTD(void) ap_null_cleanup(void *data);
{ The time between when a resource is actually allocated, and when it
* its cleanup is registered is a critical section, during which the
* resource could leak if we got interrupted or timed out. So, anything
* which registers cleanups should bracket resource allocation and the
* cleanup registry with these. (This is done internally by run_cleanup).
*
* NB they are actually implemented in http_main.c, since they are bound
* up with timeout handling in general...
}
//API_EXPORT(void) ap_block_alarms(void);
//API_EXPORT(void) ap_unblock_alarms(void);
{ Common cases which want utility support..
* the note_cleanups_for_foo routines are for
}
{API_EXPORT(FILE *) ap_pfopen(struct pool *, const char *name, const char *fmode);
API_EXPORT(FILE *) ap_pfdopen(struct pool *, int fd, const char *fmode);
API_EXPORT(int) ap_popenf(struct pool *, const char *name, int flg, int mode);
API_EXPORT(int) ap_popenf_ex(struct pool *, const char *name, int flg,
int mode, int domagic);
API_EXPORT(void) ap_note_cleanups_for_file(pool *, FILE *);
API_EXPORT(void) ap_note_cleanups_for_file_ex(pool *, FILE *, int);
API_EXPORT(void) ap_note_cleanups_for_fd(pool *, int);
API_EXPORT(void) ap_note_cleanups_for_fd_ex(pool *, int, int);}
{$ifdef WIN32}
//API_EXPORT(void) ap_note_cleanups_for_h(pool *, HANDLE);
{$endif}
{API_EXPORT(void) ap_kill_cleanups_for_fd(pool *p, int fd);
API_EXPORT(void) ap_note_cleanups_for_socket(pool *, int);
API_EXPORT(void) ap_note_cleanups_for_socket_ex(pool *, int, int);
API_EXPORT(void) ap_kill_cleanups_for_socket(pool *p, int sock);
API_EXPORT(int) ap_psocket(pool *p, int, int, int);
API_EXPORT(int) ap_psocket_ex(pool *p, int, int, int, int);
API_EXPORT(int) ap_pclosesocket(pool *a, int sock);
API_EXPORT(regex_t *) ap_pregcomp(pool *p, const char *pattern, int cflags);
API_EXPORT(void) ap_pregfree(pool *p, regex_t * reg);}
{ routines to note closes... file descriptors are constrained enough
* on some systems that we want to support this.
}
{API_EXPORT(int) ap_pfclose(struct pool *, FILE *);
API_EXPORT(int) ap_pclosef(struct pool *, int fd);
#ifdef WIN32
API_EXPORT(int) ap_pcloseh(struct pool *, HANDLE hDevice);
#endif}
{ routines to deal with directories }
//API_EXPORT(DIR *) ap_popendir(pool *p, const char *name);
//API_EXPORT(void) ap_pclosedir(pool *p, DIR * d);
{ ... even child processes (which we may want to wait for,
* or to kill outright, on unexpected termination).
*
* ap_spawn_child is a utility routine which handles an awful lot of
* the rigamarole associated with spawning a child --- it arranges
* for pipes to the child's stdin and stdout, if desired (if not,
* set the associated args to NULL). It takes as args a function
* to call in the child, and an argument to be passed to the function.
}
type
kill_conditions = (
kill_never, { process is never sent any signals }
kill_always, { process is sent SIGKILL on pool cleanup }
kill_after_timeout, { SIGTERM, wait 3 seconds, SIGKILL }
just_wait, { wait forever for the process to complete }
kill_only_once { send SIGTERM and then wait }
);
//typedef struct child_info child_info;
//API_EXPORT(void) ap_note_subprocess(pool *a, pid_t pid,
// enum kill_conditions how);
///API_EXPORT(int) ap_spawn_child(pool *, int (*)(void *, child_info *),
// void *, enum kill_conditions,
// FILE **pipe_in, FILE **pipe_out,
// FILE **pipe_err);
//int ap_close_fd_on_exec(int fd);
{ magic numbers --- min free bytes to consider a free pool block useable,
* and the min amount to allocate if we have to go to malloc() }
const
BLOCK_MINFREE = 4096;
BLOCK_MINALLOC = 8192;
{ Finally, some accounting }
//API_EXPORT(long) ap_bytes_in_pool(pool *p);
//API_EXPORT(long) ap_bytes_in_free_blocks(void);

237
httpd/httpd_1_3/ap_mmn.inc Normal file
View File

@ -0,0 +1,237 @@
{ 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.
}
{
* MODULE_MAGIC_NUMBER_MAJOR
* Major API changes that could cause compatibility problems for older modules
* such as structure size changes. No binary compatibility is possible across
* a change in the major version.
*
* MODULE_MAGIC_NUMBER_MINOR
* Minor API changes that do not cause binary compatibility problems.
* Should be reset to 0 when upgrading MODULE_MAGIC_NUMBER_MAJOR.
*
* See the MODULE_MAGIC_AT_LEAST macro below for an example.
}
{
* 19950525 - original value
* 19960512 (1.1b2) - updated, 1.1, version.
* 19960526 (1.1b3) - get_token(), table_unset(), pstrndup()
* functions added
* 19960725 (1.2-dev) - HTTP/1.1 compliance
* (new version of read_client_block)
* 19960806 (1.2-dev) - scan_script_header_err() added
* 19961007 (1.2-dev) - replace read_client_block() with get_client_block()
* 19961125 (1.2b1) - change setup_client_block() to Roy's version
* 19961211 (1.2b3) - rwrite() added
* 19970103 (1.2b5-dev) - header parse API
* 19970427 (1.2b9-dev) - port references made unsigned
* 19970526 (1.2) - correct vhost walk for multiple requests on a single
* connect
* 19970623 (1.3-dev) - NT changes
* 19970628 (1.3-dev) - ap_slack (fd fixes) added
* 19970717 (1.3-dev) - child_init API hook added
* 19970719 (1.3-dev) - discard_request_body() added (to clear the decks
* as needed)
* 19970728 (1.3a2-dev) - child_exit API hook added
* 19970818 (1.3a2-dev) - post read-request phase added
* 19970825 (1.3a2-dev) - r->mtime cell added
* 19970831 (1.3a2-dev) - error logging changed to use aplog_error()
* 19970902 (1.3a2-dev) - MD5 routines and structures renamed to ap_*
* 19970912 (1.3b1-dev) - set_last_modified split into set_last_modified,
* set_etag and meets_conditions
* register_other_child API
* piped_log API
* short_score split into parent and child pieces
* os_is_absolute_path
* 19971026 (1.3b3-dev) - custom config hooks in place
* 19980126 (1.3b4-dev) - ap_cpystrn(), table_addn(), table_setn(),
* table_mergen()
* 19980201 (1.3b4-dev) - construct_url()
* prototype server_rec * -> request_rec *
* add get_server_name() and get_server_port()
* 19980207 (1.3b4-dev) - add dynamic_load_handle to module structure as part
* of the STANDARD_MODULE_STUFF header
* 19980304 (1.3b6-dev) - abstraction of SERVER_BUILT and SERVER_VERSION
* 19980305 (1.3b6-dev) - ap_config.h added for use by external modules
* 19980312 (1.3b6-dev) - parse_uri_components() and its ilk
* remove r->hostlen, add r->unparsed_uri
* set_string_slot_lower()
* clarification: non-RAW_ARGS cmd handlers do not
* need to pstrdup() their arguments
* clarification: request_rec members content_type,
* handler, content_encoding, content_language,
* content_languages MUST all be lowercase strings,
* and MAY NOT be modified in place -- modifications
* require pstrdup().
* 19980317 (1.3b6-dev) - CORE_EXPORTs for win32 and <Perl>
* API export basic_http_header, send_header_field,
* set_keepalive, srm_command_loop, check_cmd_context,
* tm2sec
* spacetoplus(), plustospace(), client_to_stdout()
* removed
* 19980324 (1.3b6-dev) - API_EXPORT(index_of_response)
* 19980413 (1.3b6-dev) - The BIG SYMBOL RENAMING: general ap_ prefix
* (see src/include/compat.h for more details)
* ap_vformatter() API, see src/include/ap.h
* 19980507 (1.3b7-dev) - addition of ap_add_version_component() and
* discontinuation of -DSERVER_SUBVERSION support
* 19980519 (1.3b7-dev) - add child_info * to spawn function (as passed to
* ap_spawn_child_err_buff) and to ap_call_exec to make
* children work correctly on Win32.
* 19980527 (1.3b8-dev) - renamed some more functions to ap_ prefix which were
* missed at the big renaming (they are defines):
* is_default_port, default_port and http_method.
* A new communication method for modules was added:
* they can create customized error messages under the
* "error-notes" key in the request_rec->notes table.
* This string will be printed in place of the canned
* error responses, and will be propagated to
* ErrorDocuments or cgi scripts in the
* (REDIRECT_)ERROR_NOTES variable.
* 19980627 (1.3.1-dev) - More renaming that we forgot/bypassed. In particular:
* table_elts --> ap_table_elts
* is_table_empty --> ap_is_table_empty
* 19980708 (1.3.1-dev) - ap_isalnum(), ap_isalpha(), ... "8-bit safe" ctype
* macros and apctype.h added
* 19980713 (1.3.1-dev) - renaming of C header files:
* 1. conf.h -> ap_config.h
* 2. conf_auto.h -> ap_config_auto.h - now merged
* 3. ap_config.h -> ap_config_auto.h - now merged
* 4. compat.h -> ap_compat.h
* 5. apctype.h -> ap_ctype.h
* 19980806 (1.3.2-dev) - add ap_log_rerror()
* - add ap_scan_script_header_err_core()
* - add ap_uuencode()
* - add ap_custom_response()
* 19980811 (1.3.2-dev) - added limit_req_line, limit_req_fieldsize, and
* limit_req_fields to server_rec.
* added limit_req_body to core_dir_config and
* ap_get_limit_req_body() to get its value.
* 19980812 (1.3.2-dev) - split off MODULE_MAGIC_NUMBER
* 19980812.2 - add ap_overlap_tables()
* 19980816 (1.3.2-dev) - change proxy to use tables for headers, change
* struct cache_req to typedef cache_req.
* Delete ap_proxy_get_header(), ap_proxy_add_header(),
* ap_proxy_del_header(). Change interface of
* ap_proxy_send_fb() and ap_proxy_cache_error().
* Add ap_proxy_send_hdr_line() and ap_proxy_bputs2().
* 19980825 (1.3.2-dev) - renamed is_HTTP_xxx() macros to ap_is_HTTP_xxx()
* 19980825.1 - mod_proxy only (minor change): modified interface of
* ap_proxy_read_headers() and rdcache() to use a
* request_rec* instead of pool*
* (for implementing better error reporting).
* 19980906 (1.3.2-dev) - added ap_md5_binary()
* 19980917 (1.3.2-dev) - bs2000: changed os_set_authfile() to os_set_account()
* 19981108 (1.3.4-dev) - added ap_method_number_of()
* - changed value of M_INVALID and added WebDAV methods
* 19981108.1 - ap_exists_config_define() is now public (minor bump)
* 19981204 - scoreboard changes -- added generation, changed
* exit_generation to running_generation. Somewhere
* earlier vhostrec was added, but it's only safe to use
* as of this rev. See scoreboard.h for documentation.
* 19981211 - DSO changes -- added ap_single_module_configure()
* -- added ap_single_module_init()
* 19981229 - mod_negotiation overhaul -- added ap_make_etag()
* and added vlist_validator to request_rec.
* 19990101 - renamed macro escape_uri() to ap_escape_uri()
* - added MODULE_MAGIC_COOKIE to identify module structs
* 19990103 (1.3.4-dev) - added ap_array_pstrcat()
* 19990105 (1.3.4-dev) - added ap_os_is_filename_valid()
* 19990106 (1.3.4-dev) - Move MODULE_MAGIC_COOKIE to the end of the
* STANDARD_MODULE_STUFF macro so the version
* numbers and file name remain at invariant offsets
* 19990108 (1.3.4-dev) - status_drops_connection -> ap_status_drops_connection
* scan_script_header -> ap_scan_script_header_err
* - reordered entries in request_rec that were waiting
* for a non-binary-compatible release.
* (1.3.5-dev)
* 19990108.1 - add ap_MD5Encode() for MD5 password handling.
* 19990108.2 - add ap_validate_password() and change ap_MD5Encode()
* to use a stronger algorithm.
* 19990108.4 - add ap_size_list_item(), ap_get_list_item(), and
* ap_find_list_item()
* 19990108.5 - added ap_sub_req_method_uri() and added const to the
* definition of method in request_rec.
* 19990108.6 - SIGPIPE is now ignored by the core server.
* 19990108.7 - ap_isxdigit added
* 19990320 - METHODS and M_INVALID symbol values modified
* 19990320.1 - add ap_vrprintf()
* 19990320.2 - add cmd_parms.context, ap_set_config_vectors,
* export ap_add_file_conf
* 19990320.3 - add ap_regexec() and ap_regerror()
* 19990320.4 - add ap_field_noparam()
* 19990320.5 - add local_ip/host to conn_rec for mass-vhost
* 19990320.6 - add ap_SHA1Final(), ap_SHA1Init(),
* ap_SHA1Update_binary(), ap_SHA1Update(),
* ap_base64encode(), ap_base64encode_binary(),
* ap_base64encode_len(), ap_base64decode(),
* ap_base64decode_binary(), ap_base64decode_len(),
* ap_pbase64decode(), ap_pbase64encode()
* 19990320.7 - add ap_strcasestr()
* 19990320.8 - add request_rec.case_preserved_filename
* 19990320.9 - renamed alloc.h to ap_alloc.h
* 19990320.10 - add ap_is_rdirectory() and ap_stripprefix()
* 19990320.11 - Add a couple of fields, callback_data and
* filter_callback to the end of buff.h
* 19990320.11 - Add some fields to the end of the core_dir_config
* structure
* 19990320.12 - add ap_getline(), ap_get_chunk_size()
* 19990320.13 - add ap_strtol()
* 19990320.14 - add ap_register_cleanup_ex(),
* ap_note_cleanups_for_fd_ex(),
* ap_note_cleanups_for_socket_ex(),
* ap_note_cleanups_for_file_ex(),
* ap_popenf_ex() and ap_psocket_ex().
* 19990320.15 - ap_is_recursion_limit_exceeded()
* 19990320.16 - ap_escape_errorlog_item()
* 19990320.17 - ap_auth_nonce() and ap_auth_nonce added
* in core_dir_config.
* 19990320.18 - trace_enable member added to core server_config
}
const
MODULE_MAGIC_COOKIE = $41503133; { "AP13" }
MODULE_MAGIC_NUMBER_MAJOR = 19990320;
MODULE_MAGIC_NUMBER_MINOR = 18; { 0...n }
{ Useful for testing for features. }
{#define AP_MODULE_MAGIC_AT_LEAST(major,minor) \
((major) < MODULE_MAGIC_NUMBER_MAJOR \
|| ((major) == MODULE_MAGIC_NUMBER_MAJOR \
&& (minor) <= MODULE_MAGIC_NUMBER_MINOR))}
{
* For example, suppose you wish to use the ap_overlap_tables
* function. You can do this:
*
* #if AP_MODULE_MAGIC_AT_LEAST(19980812,2)
* ... use ap_overlap_tables()
* #else
* ... alternative code which doesn't use ap_overlap_tables()
* #endif
*
}
{ deprecated. present for backwards compatibility }
MODULE_MAGIC_NUMBER = MODULE_MAGIC_NUMBER_MAJOR;
//#define MODULE_MAGIC_AT_LEAST old_broken_macro_we_hope_you_are_not_using

205
httpd/httpd_1_3/buff.inc Normal file
View File

@ -0,0 +1,205 @@
{ 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>
{ 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;
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 WIN32}
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 }
{API_EXPORT(BUFF *) ap_bcreate(pool *p, int flags);
API_EXPORT(void) ap_bpushfd(BUFF *fb, int fd_in, int fd_out);
#ifdef WIN32
API_EXPORT(void) ap_bpushh(BUFF *fb, HANDLE hFH);
#endif
API_EXPORT(int) ap_bsetopt(BUFF *fb, int optname, const void *optval);
API_EXPORT(int) ap_bgetopt(BUFF *fb, int optname, void *optval);
API_EXPORT(int) ap_bsetflag(BUFF *fb, int flag, int value);
API_EXPORT(int) ap_bclose(BUFF *fb);}
//#define ap_bgetflag(fb, flag) ((fb)->flags & (flag))
{ Error handling }
//API_EXPORT(void) ap_bonerror(BUFF *fb, void (*error) (BUFF *, int, void *),
// void *data);
{ I/O }
{API_EXPORT(int) ap_bread(BUFF *fb, void *buf, int nbyte);
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 WIN32}
{
* 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;
//API_EXPORT(int) ap_bspawn_child(pool *, int (*)(void *, child_info *), void *,
// enum kill_conditions, BUFF **pipe_in, BUFF **pipe_out,
// BUFF **pipe_err);
{ enable non-blocking operations }
//API_EXPORT(int) ap_bnonblock(BUFF *fb, int direction);
{ and get an fd to select() on }
//API_EXPORT(int) ap_bfileno(BUFF *fb, int direction);
{ bflush() if a read now would block, but don't actually read anything }
//API_EXPORT(void) ap_bhalfduplex(BUFF *fb);
{$if defined(WIN32) 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}

View File

@ -0,0 +1,97 @@
{ DON'T EVEN THINK ABOUT EDITING THIS, go see regex/Makefile,
* search for mkh }
{ ========= begin header generated by ./mkh ========= }
{ === regex2.h === }
{#ifndef API_EXPORT
#ifdef WIN32
#define API_EXPORT(type) __declspec(dllexport) type __stdcall
#else
#define API_EXPORT(type) type
#endif
#endif}
{#if defined(MAC_OS) || defined(MAC_OS_X_SERVER) || (defined(DARWIN) && defined(__DYNAMIC__))
#define ap_private_extern __private_extern__
#else
#define ap_private_extern
#endif}
type
regoff_t = Integer;
// off_t = regoff_t;
Pregex_t = ^regex_t;
Pre_guts = Pointer;
regex_t = record
re_magic: cint;
re_nsub: size_t; { number of parenthesized subexpressions }
re_endp: PChar; { end pointer for REG_PEND }
re_g: Pre_guts; { none of your business :-) }
end;
regmatch_t = record
rm_so: regoff_t; { start of match }
rm_eo: regoff_t; { end of match }
end;
{ === regcomp.c === }
//API_EXPORT(int) regcomp(regex_t *, const char *, int);
const
REG_BASIC = 0000;
REG_EXTENDED = 0001;
REG_ICASE = 0002;
REG_NOSUB = 0004;
REG_NEWLINE = 0010;
REG_NOSPEC = 0020;
REG_PEND = 0040;
REG_DUMP = 0200;
{ === regerror.c === }
REG_NOMATCH = 1;
REG_BADPAT = 2;
REG_ECOLLATE = 3;
REG_ECTYPE = 4;
REG_EESCAPE = 5;
REG_ESUBREG = 6;
REG_EBRACK = 7;
REG_EPAREN = 8;
REG_EBRACE = 9;
REG_BADBR =10;
REG_ERANGE =11;
REG_ESPACE =12;
REG_BADRPT =13;
REG_EMPTY =14;
REG_ASSERT =15;
REG_INVARG =16;
REG_ATOI =255; { convert name to number (!) }
REG_ITOA =0400; { convert number to name (!) }
//API_EXPORT(size_t) regerror(int, const regex_t *, char *, size_t);
{ === regexec.c === }
//API_EXPORT(int) regexec(const regex_t *, const char *, size_t, regmatch_t [], int);
const
REG_NOTBOL = 00001;
REG_NOTEOL = 00002;
REG_STARTEND = 00004;
REG_TRACE = 00400; { tracing of execution }
REG_LARGE = 01000; { force large representation }
REG_BACKR = 02000; { force use of backref code }
{ === regfree.c === }
//API_EXPORT(void) regfree(regex_t *);
{ ========= end header generated by ./mkh ========= }

View File

@ -0,0 +1,388 @@
{ 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.
}
{
* The central data structures around here...
}
{ Command dispatch structures... }
{ Note that for all of these except RAW_ARGS, the config routine is
* passed a freshly allocated string which can be modified or stored
* or whatever... it's only necessary to do pstrdup() stuff with
* RAW_ARGS.
}
type
cmd_how = (
RAW_ARGS, { cmd_func parses command line itself }
TAKE1, { one argument only }
TAKE2, { two arguments only }
ITERATE, { one argument, occuring multiple times
* (e.g., IndexIgnore)
}
ITERATE2, { two arguments, 2nd occurs multiple times
* (e.g., AddIcon)
}
FLAG, { One of 'On' or 'Off' }
NO_ARGS, { No args at all, e.g. </Directory> }
TAKE12, { one or two arguments }
TAKE3, { three arguments only }
TAKE23, { two or three arguments }
TAKE123, { one, two or three arguments }
TAKE13 { one or three arguments }
);
func_t = function (): PChar;
command_struct = record
name: PChar; { Name of this command }
func: func_t; { Function invoked }
cmd_data: Pointer; { Extra data, for functions which
* implement multiple commands...
}
req_override: cint; { What overrides need to be allowed to
* enable this command.
}
args_how: cmd_how; { What the command expects as arguments }
errmsg: PChar; { 'usage' message, in case of syntax errors }
end;
command_rec = command_struct;
Pcommand_rec = ^command_rec;
{ The allowed locations for a configuration directive are the union of
* those indicated by each set bit in the req_override mask.
*
* (req_override & RSRC_CONF) => *.conf outside <Directory> or <Location>
* (req_override & ACCESS_CONF) => *.conf inside <Directory> or <Location>
* (req_override & OR_AUTHCFG) => *.conf inside <Directory> or <Location>
* and .htaccess when AllowOverride AuthConfig
* (req_override & OR_LIMIT) => *.conf inside <Directory> or <Location>
* and .htaccess when AllowOverride Limit
* (req_override & OR_OPTIONS) => *.conf anywhere
* and .htaccess when AllowOverride Options
* (req_override & OR_FILEINFO) => *.conf anywhere
* and .htaccess when AllowOverride FileInfo
* (req_override & OR_INDEXES) => *.conf anywhere
* and .htaccess when AllowOverride Indexes
}
const
OR_NONE = 0;
OR_LIMIT = 1;
OR_OPTIONS = 2;
OR_FILEINFO = 4;
OR_AUTHCFG = 8;
OR_INDEXES = 16;
OR_UNSET = 32;
ACCESS_CONF = 64;
RSRC_CONF = 128;
OR_ALL = (OR_LIMIT or OR_OPTIONS or OR_FILEINFO or OR_AUTHCFG or OR_INDEXES);
{ This can be returned by a function if they don't wish to handle
* a command. Make it something not likely someone will actually use
* as an error code.
}
DECLINE_CMD = '\a\b';
{
* This structure is passed to a command which is being invoked,
* to carry a large variety of miscellaneous data which is all of
* use to *somebody*...
}
type
cmd_parms = record
info: Pointer; { Argument to command from cmd_table }
override: cint; { Which allow-override bits are set }
limited: cint; { Which methods are <Limit>ed }
config_file: Pconfigfile_t; { Config file structure from pcfg_openfile() }
pool: Pap_pool; { Pool to allocate new storage in }
temp_pool: Ppool; { Pool for scratch memory; persists during
* configuration, but wiped before the first
* request is served...
}
server: Pserver_rec; { Server_rec being configured for }
path: PChar; { If configuring for a directory,
* pathname of that directory.
* NOPE! That's what it meant previous to the
* existance of <Files>, <Location> and regex
* matching. Now the only usefulness that can
* be derived from this field is whether a command
* is being called in a server context (path == NULL)
* or being called in a dir context (path != NULL).
}
cmd: Pcommand_rec; { configuration command }
end_token: PChar; { end token required to end a nested section }
context: Pointer; { per_dir_config vector passed
* to handle_command }
end;
{ This structure records the existence of handlers in a module... }
handler_t = function (param1: Prequest_rec): Integer; cdecl;
Phandler_rec = ^handler_rec;
handler_rec = record
content_type: PChar; { MUST be all lower case }
handler: handler_t;
end;
{
* Module structures. Just about everything is dispatched through
* these, directly or indirectly (through the command and handler
* tables).
}
Pmodule_struct = ^module_struct;
{$ifdef ULTRIX_BRAIN_DEATH}
init_t = procedure (); cdecl;
create_dir_config_t = function (): Pointer; cdecl;
merge_dir_config_t = function (): Pointer; cdecl;
create_server_config_t = function (): Pointer; cdecl;
merge_server_config_t = function (): Pointer; cdecl;
{$else}
init_t = procedure (param1: Pserver_rec; param2: Ppool); cdecl;
create_dir_config_t = function (p: Ppool; dir: PChar): Pointer; cdecl;
merge_dir_config_t = function (p: PPool; base_conf, new_conf: Pointer): Pointer; cdecl;
create_server_config_t = function (p: Ppool; s: Pserver_rec): Pointer; cdecl;
merge_server_config_t = function (p: Ppool; base_conf, new_conf: Pointer): Pointer; cdecl;
{$endif}
hook_t = function (param1: Prequest_rec): cint; cdecl;
child_init_t = procedure (param1: Pserver_rec; param2: Ppool); cdecl;
child_exit_t = procedure (param1: Pserver_rec; param2: Ppool); cdecl;
module_struct = record
version: cint; { API version, *not* module version;
* check that module is compatible with this
* version of the server.
}
minor_version: cint; { API minor version. Provides API feature
* milestones. Not checked during module init
}
module_index: cint; { Index to this modules structures in
* config vectors.
}
name: PChar;
dynamic_load_handle: Pointer;
next: Pmodule_struct;
magic: culong; { Magic Cookie to identify a module structure;
* It's mainly important for the DSO facility
* (see also mod_so).
}
{ init() occurs after config parsing, but before any children are
* forked.
* Modules should not rely on the order in which create_server_config
* and create_dir_config are called.
}
init: init_t;
create_dir_config: create_dir_config_t;
merge_dir_config: merge_dir_config_t;
create_server_config: create_server_config_t;
merge_server_config: merge_server_config_t;
cmds: Pcommand_rec;
handlers: Phandler_rec;
{ Hooks for getting into the middle of server ops...
* translate_handler --- translate URI to filename
* access_checker --- check access by host address, etc. All of these
* run; if all decline, that's still OK.
* check_user_id --- get and validate user id from the HTTP request
* auth_checker --- see if the user (from check_user_id) is OK *here*.
* If all of *these* decline, the request is rejected
* (as a SERVER_ERROR, since the module which was
* supposed to handle this was configured wrong).
* type_checker --- Determine MIME type of the requested entity;
* sets content_type, _encoding and _language fields.
* logger --- log a transaction.
* post_read_request --- run right after read_request or internal_redirect,
* and not run during any subrequests.
}
translate_handler: hook_t;
ap_check_user_id: hook_t;
auth_checker: hook_t;
access_checker: hook_t;
type_checker: hook_t;
fixer_upper: hook_t;
logger: hook_t;
header_parser: hook_t;
{ Regardless of the model the server uses for managing "units of
* execution", i.e. multi-process, multi-threaded, hybrids of those,
* there is the concept of a "heavy weight process". That is, a
* process with its own memory space, file spaces, etc. This method,
* child_init, is called once for each heavy-weight process before
* any requests are served. Note that no provision is made yet for
* initialization per light-weight process (i.e. thread). The
* parameters passed here are the same as those passed to the global
* init method above.
}
{$ifdef ULTRIX_BRAIN_DEATH}
void ( *child_init) ();
void ( *child_exit) ();
{$else}
child_init: child_init_t;
child_exit: child_exit_t;
{$endif}
post_read_request: hook_t;
end;
module = module_struct;
Pmodule = ^module;
{ Initializer for the first few module slots, which are only
* really set up once we start running. Note that the first two slots
* provide a version check; this should allow us to deal with changes to
* the API. The major number should reflect changes to the API handler table
* itself or removal of functionality. The minor number should reflect
* additions of functionality to the existing API. (the server can detect
* an old-format module, and either handle it back-compatibly, or at least
* signal an error). See src/include/ap_mmn.h for MMN version history.
}
procedure STANDARD_MODULE_STUFF(var mod_: module);
{ Generic accessors for other modules to get at their own module-specific
* data
}
{API_EXPORT(void *) ap_get_module_config(void *conf_vector, module *m);
API_EXPORT(void) ap_set_module_config(void *conf_vector, module *m, void *val);
#define ap_get_module_config(v,m) \
(((void **)(v))[(m)->module_index])
#define ap_set_module_config(v,m,val) \
((((void **)(v))[(m)->module_index]) = (val))}
{ Generic command handling function... }
{API_EXPORT_NONSTD(const char *) ap_set_string_slot(cmd_parms *, char *, char *);
API_EXPORT_NONSTD(const char *) ap_set_string_slot_lower(cmd_parms *, char *, char *);
API_EXPORT_NONSTD(const char *) ap_set_flag_slot(cmd_parms *, char *, int);
API_EXPORT_NONSTD(const char *) ap_set_file_slot(cmd_parms *, char *, char *);}
{ For modules which need to read config files, open logs, etc. ...
* this returns the fname argument if it begins with '/'; otherwise
* it relativizes it wrt server_root.
}
//API_EXPORT(char *) ap_server_root_relative(pool *p, char *fname);
{ Finally, the hook for dynamically loading modules in... }
{API_EXPORT(void) ap_add_module(module *m);
API_EXPORT(void) ap_remove_module(module *m);
API_EXPORT(void) ap_add_loaded_module(module *mod);
API_EXPORT(void) ap_remove_loaded_module(module *mod);
API_EXPORT(int) ap_add_named_module(const char *name);
API_EXPORT(void) ap_clear_module_list(void);
API_EXPORT(const char *) ap_find_module_name(module *m);
API_EXPORT(module *) ap_find_linked_module(const char *name);}
{ for implementing subconfigs and customized config files }
{API_EXPORT(const char *) ap_srm_command_loop(cmd_parms *parms, void *config);
#ifdef CORE_PRIVATE
extern API_VAR_EXPORT module *top_module;
extern module *ap_prelinked_modules[];
extern module *ap_preloaded_modules[];
extern API_VAR_EXPORT module **ap_loaded_modules;}
{ For mod_so.c... }
//API_EXPORT(void) ap_single_module_configure(pool *p, server_rec *s, module *m);
{ For http_main.c... }
{API_EXPORT(server_rec *) ap_read_config(pool *conf_pool, pool *temp_pool, char *config_name);
API_EXPORT(void) ap_init_modules(pool *p, server_rec *s);
API_EXPORT(void) ap_child_init_modules(pool *p, server_rec *s);
API_EXPORT(void) ap_child_exit_modules(pool *p, server_rec *s);
API_EXPORT(void) ap_setup_prelinked_modules(void);
API_EXPORT(void) ap_show_directives(void);
API_EXPORT(void) ap_show_modules(void);
void ap_cleanup_method_ptrs(void);}
{ For http_request.c... }
{CORE_EXPORT(void *) ap_create_request_config(pool *p);
CORE_EXPORT(void *) ap_create_per_dir_config(pool *p);
CORE_EXPORT(void *) ap_merge_per_dir_configs(pool *p, void *base, void *new);}
{ For http_core.c... (<Directory> command and virtual hosts) }
{CORE_EXPORT(int) ap_parse_htaccess(void **result, request_rec *r, int override,
const char *path, const char *access_name);
CORE_EXPORT(const char *) ap_init_virtual_host(pool *p, const char *hostname,
server_rec *main_server, server_rec **);
CORE_EXPORT(void) ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp);
}
{ ap_check_cmd_context() definitions: }
//API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden);
{ ap_check_cmd_context(): Forbidden in: }
const
NOT_IN_VIRTUALHOST = $01; { <Virtualhost> }
NOT_IN_LIMIT = $02; { <Limit> }
NOT_IN_DIRECTORY = $04; { <Directory> }
NOT_IN_LOCATION = $08; { <Location> }
NOT_IN_FILES = $10; { <Files> }
NOT_IN_DIR_LOC_FILE = (NOT_IN_DIRECTORY or NOT_IN_LOCATION or NOT_IN_FILES); { <Directory>/<Location>/<Files>}
GLOBAL_ONLY = (NOT_IN_VIRTUALHOST or NOT_IN_LIMIT or NOT_IN_DIR_LOC_FILE);
{ Module-method dispatchers, also for http_request.c }
//API_EXPORT(int) ap_translate_name(request_rec *);
//API_EXPORT(int) ap_check_access(request_rec *); { check access on non-auth basis }
//API_EXPORT(int) ap_check_user_id(request_rec *); { obtain valid username from client auth }
//API_EXPORT(int) ap_check_auth(request_rec *); { check (validated) user is authorized here }
//API_EXPORT(int) ap_find_types(request_rec *); { identify MIME type }
//API_EXPORT(int) ap_run_fixups(request_rec *); { poke around for other metainfo, etc.... }
//API_EXPORT(int) ap_invoke_handler(request_rec *);
//API_EXPORT(int) ap_log_transaction(request_rec *r);
//API_EXPORT(int) ap_header_parse(request_rec *);
//API_EXPORT(int) ap_run_post_read_request(request_rec *);
{ for mod_perl }
//CORE_EXPORT(const command_rec *) ap_find_command(const char *name, const command_rec *cmds);
//CORE_EXPORT(const command_rec *) ap_find_command_in_modules(const char *cmd_name, module **mod);
//CORE_EXPORT(void *) ap_set_config_vectors(cmd_parms *parms, void *config, module *mod);
//CORE_EXPORT(const char *) ap_handle_command(cmd_parms *parms, void *config, const char *l);
//#endif

View File

@ -0,0 +1,387 @@
{ 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.
}
{****************************************************************
*
* The most basic server code is encapsulated in a single module
* known as the core, which is just *barely* functional enough to
* serve documents, though not terribly well.
*
* Largely for NCSA back-compatibility reasons, the core needs to
* make pieces of its config structures available to other modules.
* The accessors are declared here, along with the interpretation
* of one of them (allow_options).
}
const
OPT_NONE = 0;
OPT_INDEXES = 1;
OPT_INCLUDES = 2;
OPT_SYM_LINKS = 4;
OPT_EXECCGI = 8;
OPT_UNSET = 16;
OPT_INCNOEXEC = 32;
OPT_SYM_OWNER = 64;
OPT_MULTI = 128;
OPT_ALL = (OPT_INDEXES or OPT_INCLUDES or OPT_SYM_LINKS or OPT_EXECCGI);
{ options for get_remote_host() }
{ REMOTE_HOST returns the hostname, or NULL if the hostname
* lookup fails. It will force a DNS lookup according to the
* HostnameLookups setting.
}
REMOTE_HOST = (0);
{ REMOTE_NAME returns the hostname, or the dotted quad if the
* hostname lookup fails. It will force a DNS lookup according
* to the HostnameLookups setting.
}
REMOTE_NAME = (1);
{ REMOTE_NOLOOKUP is like REMOTE_NAME except that a DNS lookup is
* never forced.
}
REMOTE_NOLOOKUP = (2);
{ REMOTE_DOUBLE_REV will always force a DNS lookup, and also force
* a double reverse lookup, regardless of the HostnameLookups
* setting. The result is the (double reverse checked) hostname,
* or NULL if any of the lookups fail.
}
REMOTE_DOUBLE_REV = (3);
SATISFY_ALL = 0;
SATISFY_ANY = 1;
SATISFY_NOSPEC = 2;
{ default maximum of internal redirects }
AP_DEFAULT_MAX_INTERNAL_REDIRECTS = 20;
{ default maximum subrequest nesting level }
AP_DEFAULT_MAX_SUBREQ_DEPTH = 20;
//API_EXPORT(int) ap_allow_options (request_rec *);
//API_EXPORT(int) ap_allow_overrides (request_rec *);
//API_EXPORT(const char *) ap_default_type (request_rec *);
//API_EXPORT(const char *) ap_document_root (request_rec *); { Don't use this! If your request went
// * through a Userdir, or something like
// * that, it'll screw you. But it's
// * back-compatible...
// }
//API_EXPORT(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type);
//API_EXPORT(const char *) ap_get_remote_logname(request_rec *r);
{ Used for constructing self-referencing URLs, and things like SERVER_PORT,
* and SERVER_NAME.
}
{API_EXPORT(char *) ap_construct_url(pool *p, const char *uri, request_rec *r);
API_EXPORT(const char *) ap_get_server_name(request_rec *r);
API_EXPORT(unsigned) ap_get_server_port(const request_rec *r);
API_EXPORT(unsigned long) ap_get_limit_req_body(const request_rec *r);
API_EXPORT(void) ap_custom_response(request_rec *r, int status, char *string);
API_EXPORT(int) ap_exists_config_define(char *name);
}
{ Check if the current request is beyond the configured max. number of redirects or subrequests
* @param r The current request
* @return true (is exceeded) or false
}
//API_EXPORT(int) ap_is_recursion_limit_exceeded(const request_rec *r);
{ Authentication stuff. This is one of the places where compatibility
* with the old config files *really* hurts; they don't discriminate at
* all between different authentication schemes, meaning that we need
* to maintain common state for all of them in the core, and make it
* available to the other modules through interfaces.
}
type
require_line = record
method_mask: cint;
requirement: PChar;
end;
{API_EXPORT(const char *) ap_auth_type (request_rec *);
API_EXPORT(const char *) ap_auth_name (request_rec *);
API_EXPORT(const char *) ap_auth_nonce (request_rec *);
API_EXPORT(int) ap_satisfies (request_rec *r);
API_EXPORT(const array_header *) ap_requires (request_rec *); }
{$ifdef WIN32}
{
* CGI Script stuff for Win32...
}
typedef enum { eFileTypeUNKNOWN, eFileTypeBIN, eFileTypeEXE16, eFileTypeEXE32,
eFileTypeSCRIPT, eCommandShell16, eCommandShell32 } file_type_e;
typedef enum { INTERPRETER_SOURCE_UNSET, INTERPRETER_SOURCE_REGISTRY,
INTERPRETER_SOURCE_SHEBANG } interpreter_source_e;
API_EXPORT(file_type_e) ap_get_win32_interpreter(const request_rec *, char **);
{$endif}
{.$ifdef CORE_PRIVATE}
{
* Core is also unlike other modules in being implemented in more than
* one file... so, data structures are declared here, even though most of
* the code that cares really is in http_core.c. Also, another accessor.
}
//API_EXPORT(char *) ap_response_code_string (request_rec *r, int error_index);
//extern API_VAR_EXPORT module core_module;
{ Per-directory configuration }
type
allow_options_t = Char;
overrides_t = Char
;
{
* Bits of info that go into making an ETag for a file
* document. Why a long? Because char historically
* proved too short for Options, and int can be different
* sizes on different platforms.
}
etag_components_t = culong;
const
ETAG_UNSET = 0;
ETAG_NONE = (1 shl 0);
ETAG_MTIME = (1 shl 1);
ETAG_INODE = (1 shl 2);
ETAG_SIZE = (1 shl 3);
ETAG_BACKWARD = (ETAG_MTIME or ETAG_INODE or ETAG_SIZE);
ETAG_ALL = (ETAG_MTIME or ETAG_INODE or ETAG_SIZE);
{ Things moved up }
HOSTNAME_LOOKUP_OFF = 0;
HOSTNAME_LOOKUP_ON = 1;
HOSTNAME_LOOKUP_DOUBLE= 2;
HOSTNAME_LOOKUP_UNSET = 3;
USE_CANONICAL_NAME_OFF = (0);
USE_CANONICAL_NAME_ON = (1);
USE_CANONICAL_NAME_DNS = (2);
USE_CANONICAL_NAME_UNSET= (3);
ADD_DEFAULT_CHARSET_OFF = (0);
ADD_DEFAULT_CHARSET_ON = (1);
ADD_DEFAULT_CHARSET_UNSET = (2);
type
ap_flag_e = (
AP_FLAG_UNSET = 0,
AP_FLAG_ON = 1,
AP_FLAG_OFF = 2
);
server_signature_t = ( srv_sig_unset, srv_sig_off, srv_sig_on,
srv_sig_withmail);
core_dir_config = record
{ path of the directory/regex/etc. see also d_is_fnmatch below }
d: PChar;
{ the number of slashes in d }
d_components: cuint;
{ If (opts & OPT_UNSET) then no absolute assignment to options has
* been made.
* invariant: (opts_add & opts_remove) == 0
* Which said another way means that the last relative (options + or -)
* assignment made to each bit is recorded in exactly one of opts_add
* or opts_remove.
}
opts: allow_options_t;
opts_add: allow_options_t;
opts_remove: allow_options_t;
override: overrides_t;
{ MIME typing --- the core doesn't do anything at all with this,
* but it does know what to slap on a request for a document which
* goes untyped by other mechanisms before it slips out the door...
}
ap_default_type: PChar;
{ Authentication stuff. Groan... }
satisfy: cint;
ap_auth_type: PChar;
ap_auth_name: PChar;
ap_requires: Parray_header;
{ Custom response config. These can contain text or a URL to redirect to.
* if response_code_strings is NULL then there are none in the config,
* if it's not null then it's allocated to sizeof(char*)*RESPONSE_CODES.
* This lets us do quick merges in merge_core_dir_configs().
}
response_code_strings: PPChar; { from ErrorDocument, not from
* ap_custom_response()
}
{ Hostname resolution etc }
{ Moved Up }
// unsigned int hostname_lookups : 4;
// signed int do_rfc1413 : 2; { See if client is advertising a username? }
// signed int content_md5 : 2; { calculate Content-MD5? }
{ Moved Up }
// unsigned use_canonical_name : 2;
{ since is_fnmatch(conf->d) was being called so frequently in
* directory_walk() and its relatives, this field was created and
* is set to the result of that call.
}
// unsigned d_is_fnmatch : 1;
{ should we force a charset on any outgoing parameterless content-type?
* if so, which charset?
}
{ Moved up }
// unsigned add_default_charset : 2;
add_default_charset_name: PChar;
{ System Resource Control }
{$ifdef RLIMIT_CPU}
struct rlimit *limit_cpu;
{$endif}
{$if defined (RLIMIT_DATA) or defined (RLIMIT_VMEM) or defined(RLIMIT_AS)}
struct rlimit *limit_mem;
{$endif}
{$ifdef RLIMIT_NPROC}
struct rlimit *limit_nproc;
{$endif}
limit_req_body: culong; { limit on bytes in request msg body }
{ logging options }
server_signature: server_signature_t;
loglevel: cint;
{ Access control }
sec: Parray_header;
r: Pregex_t;
{$ifdef WIN32}
{ Where to find interpreter to run scripts }
interpreter_source_e script_interpreter_source;
{$endif}
{$ifdef CHARSET_EBCDIC}
{ Configurable EBCDIC Conversion stuff }
{ Direction specific conversion: }
#define dir_Out 0 { 0utput (returned contents in a GET or POST) }
#define dir_In 1 { 1nput (uploaded contents in a PUT / POST) }
{ Conversion Enabled/Disabled: }
#define conv_Unset '?' { Conversion unconfigured }
#define conv_Off '0' { BINARY or ASCII file (no conversion) }
#define conv_On '1' { TEXT file (EBCDIC->ASCII for dir_Out; ASCII->EBCDIC for dir_In) }
{ The configuration args {On|Off}[={In|Out|InOut}] are currently stored
* as character strings ("0" = conv_Off, "1" = conv_On)
}
ebcdicconversion_by_ext_in: Ptable;
ebcdicconversion_by_ext_out: Ptable;
ebcdicconversion_by_type_in: Ptable;
ebcdicconversion_by_type_out: Ptable;
#define LEGACY_KLUDGE 1 { After a couple of versions this legacy kludge should be set to 0 }
#ifndef ASCIITEXT_MAGIC_TYPE_PREFIX
#define ASCIITEXT_MAGIC_TYPE_PREFIX "text/x-ascii-" { Text files whose content-type starts with this are passed thru unconverted }
#endif
int x_ascii_magic_kludge; { whether to handle the text/x-ascii- kludge }
#if ADD_EBCDICCONVERT_DEBUG_HEADER
int ebcdicconversion_debug_header; { whether to add an X-EBCDIC-Debug-{In,Out} header to the response }
#endif
{$endif} { CHARSET_EBCDIC }
{
* What attributes/data should be included in ETag generation?
}
etag_bits: etag_components_t;
etag_add: etag_components_t;
etag_remove: etag_components_t;
{
* Do we allow ISINDEX CGI scripts to pass their query argument as
* direct command line parameters or argv elements?
}
cgi_command_args: ap_flag_e;
{ Digest auth. }
ap_auth_nonce: PChar;
end;
{ Per-server core configuration }
type
core_server_config = record
{$ifdef GPROF}
gprof_dir: PChar;
{$endif}
{ Name translations --- we want the core to be able to do *something*
* so it's at least a minimally functional web server on its own (and
* can be tested that way). But let's keep it to the bare minimum:
}
ap_document_root: PChar;
{ Access control }
access_name: PChar;
sec: Parray_header;
sec_url: Parray_header;
{ recursion backstopper }
recursion_limit_set: cint; { boolean }
redirect_limit: cint; { maximum number of internal redirects }
subreq_limit: cint; { maximum nesting level of subrequests }
{ TRACE control }
trace_enable: cint; { see AP_TRACE_ below }
end;
{ trace_enable options }
const
AP_TRACE_UNSET =-1;
AP_TRACE_DISABLE = 0;
AP_TRACE_ENABLE = 1;
AP_TRACE_EXTENDED = 2;
{ for http_config.c }
//CORE_EXPORT(void) ap_core_reorder_directories(pool *, server_rec *);
{ for mod_perl }
//CORE_EXPORT(void) ap_add_per_dir_conf (server_rec *s, void *dir_config);
//CORE_EXPORT(void) ap_add_per_url_conf (server_rec *s, void *url_config);
//CORE_EXPORT(void) ap_add_file_conf(core_dir_config *conf, void *url_config);
//CORE_EXPORT_NONSTD(const char *) ap_limit_section (cmd_parms *cmd, void *dummy, const char *arg);
{.$endif}

View File

@ -0,0 +1,42 @@
{ 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.
}
{ called before any config is read }
//API_EXPORT(void) ap_init_vhost_config(pool *p);
{ called after the config has been read }
//API_EXPORT(void) ap_fini_vhost_config(pool *p, server_rec *main_server);
{ handle addresses in <VirtualHost> statement }
//API_EXPORT(const char *) ap_parse_vhost_addrs(pool *p, const char *hostname, server_rec *s);
{ handle NameVirtualHost directive }
//API_EXPORT_NONSTD(const char *) ap_set_name_virtual_host (cmd_parms *cmd, void *dummy, char *arg);
{ given an ip address only, give our best guess as to what vhost it is }
//API_EXPORT(void) ap_update_vhost_given_ip(conn_rec *conn);
{ The above is never enough, and this is always called after the headers
* have been read. It may change r->server.
}
//API_EXPORT(void) ap_update_vhost_from_headers(request_rec *r);
{ return 1 if the host:port matches any of the aliases of r->server
* return 0 otherwise
}
//API_EXPORT(int) ap_matches_request_vhost(request_rec *r, const char *host,
// unsigned port);

View File

@ -0,0 +1,84 @@
{ 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.
}
{
* util_uri.h: External Interface of util_uri.c
}
type
schemes_t = record
name: PChar;
default_port: cushort;
end;
const
DEFAULT_FTP_DATA_PORT = 20;
DEFAULT_FTP_PORT = 21;
DEFAULT_GOPHER_PORT = 70;
DEFAULT_NNTP_PORT = 119;
DEFAULT_WAIS_PORT = 210;
DEFAULT_SNEWS_PORT = 563;
DEFAULT_PROSPERO_PORT = 1525; { WARNING: conflict w/Oracle }
DEFAULT_URI_SCHEME = 'http';
{ Flags passed to unparse_uri_components(): }
UNP_OMITSITEPART = (1 shl 0); { suppress "scheme://user@site:port" }
UNP_OMITUSER = (1 shl 1); { Just omit user }
UNP_OMITPASSWORD = (1 shl 2); { Just omit password }
UNP_OMITUSERINFO = (UNP_OMITUSER or UNP_OMITPASSWORD); { omit "user:password@" part }
UNP_REVEALPASSWORD = (1 shl 3); { Show plain text password (default: show XXXXXXXX) }
UNP_OMITPATHINFO = (1 shl 4); { Show "scheme://user@site:port" only }
UNP_OMITQUERY = (1 shl 5); { Omit the "?queryarg" from the path }
type
hostent = record end;
Phostent = ^hostent;
uri_components = record
scheme: PChar; { scheme ("http"/"ftp"/...) }
hostinfo: PChar; { combined [user[:password]@]host[:port] }
user: PChar; { user name, as in http://user:passwd@host:port/ }
password: PChar; { password, as in http://user:passwd@host:port/ }
hostname: PChar; { hostname from URI (or from Host: header) }
port_str: PChar; { port string (integer representation is in "port") }
path: PChar; { the request path (or "/" if only scheme://host was given) }
query: PChar; { Everything after a '?' in the path, if present }
fragment: PChar; { Trailing "#fragment" string, if present }
hostent: Phostent;
port: cushort; { The port number, numeric, valid only if port_str != NULL }
// unsigned is_initialized:1;
// unsigned dns_looked_up:1;
// unsigned dns_resolved:1;
end;
{ util_uri.c }
{API_EXPORT(unsigned short) ap_default_port_for_scheme(const char *scheme_str);
API_EXPORT(unsigned short) ap_default_port_for_request(const request_rec *r);
API_EXPORT(struct hostent *) ap_pduphostent(pool *p, const struct hostent *hp);
API_EXPORT(struct hostent *) ap_pgethostbyname(pool *p, const char *hostname);
API_EXPORT(char *) ap_unparse_uri_components(pool *p, const uri_components *uptr,
unsigned flags);
API_EXPORT(int) ap_parse_uri_components(pool *p, const char *uri, uri_components *uptr);
API_EXPORT(int) ap_parse_hostinfo_components(pool *p, const char *hostinfo, uri_components *uptr);}
{ called by the core in main() }
//extern void ap_util_uri_init(void);

View File

@ -1,36 +1,16 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<PathDelim Value="\"/>
<PathDelim Value="/"/>
<Version Value="5"/>
<General>
<MainUnit Value="0"/>
<IconPath Value="./"/>
<TargetFileExt Value=".exe"/>
<ActiveEditorIndexAtStart Value="0"/>
<ActiveEditorIndexAtStart Value="3"/>
</General>
<VersionInfo>
<UseVersionInfo Value="False"/>
<AutoIncrementBuild Value="False"/>
<CurrentVersionNr Value="0"/>
<CurrentMajorRevNr Value="0"/>
<CurrentMinorRevNr Value="0"/>
<CurrentBuildNr Value="0"/>
<ProjectVersion Value="1,0,0,0"/>
<Language Value="0409"/>
<CharSet Value="04E4"/>
<Comments Value=""/>
<CompanyName Value=""/>
<FileDescription Value=""/>
<InternalName Value=""/>
<LegalCopyright Value=""/>
<LegalTrademarks Value=""/>
<OriginalFilename Value=""/>
<ProductName Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<DestinationDirectory Value="$(TestDir)\publishedproject\"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
@ -38,10 +18,10 @@
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<Units Count="105">
<Units Count="110">
<Unit0>
<Filename Value="mod_hello.lpr"/>
<IsPartOfProject Value="True"/>
@ -49,7 +29,7 @@
<CursorPos X="1" Y="19"/>
<TopLine Value="1"/>
<EditorIndex Value="0"/>
<UsageCount Value="55"/>
<UsageCount Value="58"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
@ -60,693 +40,697 @@
<UsageCount Value="8"/>
</Unit1>
<Unit2>
<Filename Value="httpd_2_0\httpd.inc"/>
<Filename Value="httpd_2_0/httpd.inc"/>
<CursorPos X="21" Y="840"/>
<TopLine Value="825"/>
<UsageCount Value="8"/>
</Unit2>
<Unit3>
<Filename Value="httpd_2_0\apr\apr_buckets.inc"/>
<Filename Value="httpd_2_0/apr/apr_buckets.inc"/>
<CursorPos X="14" Y="9"/>
<TopLine Value="1"/>
<UsageCount Value="8"/>
</Unit3>
<Unit4>
<Filename Value="httpd_2_0\http_log.inc"/>
<Filename Value="httpd_2_0/http_log.inc"/>
<CursorPos X="1" Y="2"/>
<TopLine Value="1"/>
<UsageCount Value="12"/>
</Unit4>
<Unit5>
<Filename Value="httpd_2_0\aprutil\apr_md5.inc"/>
<Filename Value="httpd_2_0/aprutil/apr_md5.inc"/>
<CursorPos X="28" Y="128"/>
<TopLine Value="123"/>
<UsageCount Value="8"/>
</Unit5>
<Unit6>
<Filename Value="httpd_2_0\http_config.inc"/>
<Filename Value="httpd_2_0/http_config.inc"/>
<CursorPos X="11" Y="160"/>
<TopLine Value="138"/>
<UsageCount Value="8"/>
</Unit6>
<Unit7>
<Filename Value="httpd_2_0\ap_mmn.inc"/>
<Filename Value="httpd_2_0/ap_mmn.inc"/>
<CursorPos X="13" Y="76"/>
<TopLine Value="75"/>
<UsageCount Value="8"/>
</Unit7>
<Unit8>
<Filename Value="httpd_2_0\httpd.pas"/>
<Filename Value="httpd_2_0/httpd.pas"/>
<UnitName Value="httpd"/>
<CursorPos X="12" Y="31"/>
<TopLine Value="22"/>
<UsageCount Value="54"/>
</Unit8>
<Unit9>
<Filename Value="httpd_2_0\apr\apr_network_io.inc"/>
<Filename Value="httpd_2_0/apr/apr_network_io.inc"/>
<CursorPos X="17" Y="197"/>
<TopLine Value="178"/>
<UsageCount Value="8"/>
</Unit9>
<Unit10>
<Filename Value="httpd_2_0\apr\apr.pas"/>
<Filename Value="httpd_2_0/apr/apr.pas"/>
<UnitName Value="apr"/>
<CursorPos X="8" Y="177"/>
<TopLine Value="170"/>
<UsageCount Value="10"/>
</Unit10>
<Unit11>
<Filename Value="..\httpd-2.0.58\srclib\apr\include\apr_network_io.h"/>
<Filename Value="../httpd-2.0.58/srclib/apr/include/apr_network_io.h"/>
<CursorPos X="16" Y="212"/>
<TopLine Value="18"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit11>
<Unit12>
<Filename Value="..\httpd-2.0.58\modules\arch\netware\mod_nw_ssl.c"/>
<Filename Value="../httpd-2.0.58/modules/arch/netware/mod_nw_ssl.c"/>
<CursorPos X="39" Y="79"/>
<TopLine Value="79"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit12>
<Unit13>
<Filename Value="httpd_1_3\httpd.pas"/>
<Filename Value="httpd_1_3/httpd.pas"/>
<UnitName Value="httpd"/>
<CursorPos X="21" Y="169"/>
<TopLine Value="146"/>
<UsageCount Value="14"/>
</Unit13>
<Unit14>
<Filename Value="httpd_1_3\ap_config.inc"/>
<Filename Value="httpd_1_3/ap_config.inc"/>
<CursorPos X="1" Y="22"/>
<TopLine Value="114"/>
<UsageCount Value="13"/>
</Unit14>
<Unit15>
<Filename Value="httpd_1_3\ap_alloc.inc"/>
<Filename Value="httpd_1_3/ap_alloc.inc"/>
<CursorPos X="4" Y="126"/>
<TopLine Value="110"/>
<UsageCount Value="10"/>
</Unit15>
<Unit16>
<Filename Value="httpd_1_3\http_config.inc"/>
<Filename Value="httpd_1_3/http_config.inc"/>
<CursorPos X="1" Y="146"/>
<TopLine Value="128"/>
<UsageCount Value="12"/>
</Unit16>
<Unit17>
<Filename Value="httpd_2_0\ap_provider.inc"/>
<Filename Value="httpd_2_0/ap_provider.inc"/>
<CursorPos X="34" Y="20"/>
<TopLine Value="18"/>
<UsageCount Value="8"/>
</Unit17>
<Unit18>
<Filename Value="httpd_1_3\buff.inc"/>
<Filename Value="httpd_1_3/buff.inc"/>
<CursorPos X="1" Y="185"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit18>
<Unit19>
<Filename Value="httpd_1_3\ap.inc"/>
<Filename Value="httpd_1_3/ap.inc"/>
<CursorPos X="3" Y="35"/>
<TopLine Value="20"/>
<UsageCount Value="9"/>
</Unit19>
<Unit20>
<Filename Value="httpd_1_3\httpd.inc"/>
<Filename Value="httpd_1_3/httpd.inc"/>
<CursorPos X="14" Y="22"/>
<TopLine Value="1163"/>
<UsageCount Value="12"/>
</Unit20>
<Unit21>
<Filename Value="..\..\apache_1.3.37\src\include\httpd.h"/>
<Filename Value="../../apache_1.3.37/src/include/httpd.h"/>
<CursorPos X="9" Y="215"/>
<TopLine Value="197"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit21>
<Unit22>
<Filename Value="..\..\apache_1.3.37\src\support\suexec.h"/>
<Filename Value="../../apache_1.3.37/src/support/suexec.h"/>
<CursorPos X="44" Y="54"/>
<TopLine Value="36"/>
<UsageCount Value="9"/>
<SyntaxHighlighter Value="C++"/>
</Unit22>
<Unit23>
<Filename Value="..\..\apache_1.3.37\src\modules\proxy\mod_proxy.h"/>
<Filename Value="../../apache_1.3.37/src/modules/proxy/mod_proxy.h"/>
<CursorPos X="8" Y="296"/>
<TopLine Value="276"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit23>
<Unit24>
<Filename Value="..\..\apache_1.3.37\src\include\ap_alloc.h"/>
<Filename Value="../../apache_1.3.37/src/include/ap_alloc.h"/>
<CursorPos X="7" Y="180"/>
<TopLine Value="155"/>
<UsageCount Value="9"/>
<SyntaxHighlighter Value="C++"/>
</Unit24>
<Unit25>
<Filename Value="..\..\apache_1.3.37\src\include\ap_config.h"/>
<Filename Value="../../apache_1.3.37/src/include/ap_config.h"/>
<CursorPos X="22" Y="22"/>
<TopLine Value="7"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit25>
<Unit26>
<Filename Value="httpd_1_3\util_uri.inc"/>
<Filename Value="httpd_1_3/util_uri.inc"/>
<CursorPos X="4" Y="49"/>
<TopLine Value="38"/>
<UsageCount Value="9"/>
</Unit26>
<Unit27>
<Filename Value="..\..\apache_1.3.37\src\include\util_uri.h"/>
<Filename Value="../../apache_1.3.37/src/include/util_uri.h"/>
<CursorPos X="12" Y="53"/>
<TopLine Value="45"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit27>
<Unit28>
<Filename Value="..\..\apache_1.3.37\src\include\http_config.h"/>
<Filename Value="../../apache_1.3.37/src/include/http_config.h"/>
<CursorPos X="27" Y="174"/>
<TopLine Value="126"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit28>
<Unit29>
<Filename Value="httpd_1_3\http_core.inc"/>
<Filename Value="httpd_1_3/http_core.inc"/>
<CursorPos X="1" Y="387"/>
<TopLine Value="352"/>
<UsageCount Value="12"/>
</Unit29>
<Unit30>
<Filename Value="httpd_1_3\http_request.inc"/>
<Filename Value="httpd_1_3/http_request.inc"/>
<CursorPos X="78" Y="57"/>
<TopLine Value="29"/>
<UsageCount Value="9"/>
</Unit30>
<Unit31>
<Filename Value="httpd_2_0\pcreposix.inc"/>
<Filename Value="httpd_2_0/pcreposix.inc"/>
<CursorPos X="1" Y="74"/>
<TopLine Value="34"/>
<UsageCount Value="8"/>
</Unit31>
<Unit32>
<Filename Value="httpd_1_3\hsregex.inc"/>
<Filename Value="httpd_1_3/hsregex.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit32>
<Unit33>
<Filename Value="..\..\apache_1.3.37\src\regex\regex2.h"/>
<Filename Value="../../apache_1.3.37/src/regex/regex2.h"/>
<CursorPos X="8" Y="115"/>
<TopLine Value="82"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit33>
<Unit34>
<Filename Value="httpd_1_3\http_log.inc"/>
<Filename Value="httpd_1_3/http_log.inc"/>
<CursorPos X="11" Y="67"/>
<TopLine Value="52"/>
<UsageCount Value="8"/>
</Unit34>
<Unit35>
<Filename Value="httpd_1_3\http_main.inc"/>
<Filename Value="httpd_1_3/http_main.inc"/>
<CursorPos X="27" Y="123"/>
<TopLine Value="18"/>
<UsageCount Value="11"/>
</Unit35>
<Unit36>
<Filename Value="httpd_1_3\http_protocol.inc"/>
<Filename Value="httpd_1_3/http_protocol.inc"/>
<CursorPos X="77" Y="108"/>
<TopLine Value="85"/>
<UsageCount Value="8"/>
</Unit36>
<Unit37>
<Filename Value="httpd_1_3\http_vhost.inc"/>
<Filename Value="httpd_1_3/http_vhost.inc"/>
<CursorPos X="1" Y="33"/>
<TopLine Value="10"/>
<UsageCount Value="8"/>
</Unit37>
<Unit38>
<Filename Value="..\..\apache_1.3.37\src\modules\example\mod_example.c"/>
<Filename Value="../../apache_1.3.37/src/modules/example/mod_example.c"/>
<CursorPos X="7" Y="1011"/>
<TopLine Value="1004"/>
<UsageCount Value="11"/>
<SyntaxHighlighter Value="C++"/>
</Unit38>
<Unit39>
<Filename Value="httpd_1_3\ap_mmn.inc"/>
<Filename Value="httpd_1_3/ap_mmn.inc"/>
<CursorPos X="34" Y="208"/>
<TopLine Value="192"/>
<UsageCount Value="9"/>
</Unit39>
<Unit40>
<Filename Value="httpd_2_0\ap_config.inc"/>
<Filename Value="httpd_2_0/ap_config.inc"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="1"/>
<UsageCount Value="8"/>
</Unit40>
<Unit41>
<Filename Value="usr\share\fpcsrc\rtl\linux\ptypes.inc"/>
<Filename Value="usr/share/fpcsrc/rtl/linux/ptypes.inc"/>
<CursorPos X="5" Y="68"/>
<TopLine Value="52"/>
<UsageCount Value="8"/>
</Unit41>
<Unit42>
<Filename Value="httpd_2_2\http_main.inc"/>
<Filename Value="httpd_2_2/http_main.inc"/>
<CursorPos X="1" Y="16"/>
<TopLine Value="1"/>
<UsageCount Value="13"/>
</Unit42>
<Unit43>
<Filename Value="httpd_2_2\httpd.inc"/>
<Filename Value="httpd_2_2/httpd.inc"/>
<CursorPos X="1" Y="326"/>
<TopLine Value="316"/>
<UsageCount Value="13"/>
</Unit43>
<Unit44>
<Filename Value="httpd_2_2\httpd.pas"/>
<Filename Value="httpd_2_2/httpd.pas"/>
<UnitName Value="httpd"/>
<CursorPos X="11" Y="46"/>
<TopLine Value="42"/>
<UsageCount Value="20"/>
</Unit44>
<Unit45>
<Filename Value="httpd_2_2\http_log.inc"/>
<Filename Value="httpd_2_2/http_log.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit45>
<Unit46>
<Filename Value="httpd_2_2\http_protocol.inc"/>
<Filename Value="httpd_2_2/http_protocol.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="13"/>
</Unit46>
<Unit47>
<Filename Value="httpd_2_2\http_vhost.inc"/>
<Filename Value="httpd_2_2/http_vhost.inc"/>
<CursorPos X="30" Y="52"/>
<TopLine Value="1"/>
<UsageCount Value="13"/>
</Unit47>
<Unit48>
<Filename Value="httpd_2_2\apr\apr_network_io.inc"/>
<Filename Value="httpd_2_2/apr/apr_network_io.inc"/>
<CursorPos X="26" Y="817"/>
<TopLine Value="814"/>
<UsageCount Value="14"/>
</Unit48>
<Unit49>
<Filename Value="httpd_2_2\apr\apr.pas"/>
<Filename Value="httpd_2_2/apr/apr.pas"/>
<UnitName Value="apr"/>
<CursorPos X="25" Y="171"/>
<TopLine Value="169"/>
<UsageCount Value="14"/>
</Unit49>
<Unit50>
<Filename Value="..\..\httpd-2.2.3\srclib\apr\include\apr_ring.h"/>
<Filename Value="../../httpd-2.2.3/srclib/apr/include/apr_ring.h"/>
<CursorPos X="9" Y="70"/>
<TopLine Value="52"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit50>
<Unit51>
<Filename Value="..\..\httpd-2.2.3\srclib\apr\include\apr_mmap.h"/>
<Filename Value="../../httpd-2.2.3/srclib/apr/include/apr_mmap.h"/>
<CursorPos X="5" Y="85"/>
<TopLine Value="67"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit51>
<Unit52>
<Filename Value="httpd_2_2\apr\apr_poll.inc"/>
<Filename Value="httpd_2_2/apr/apr_poll.inc"/>
<CursorPos X="19" Y="5"/>
<TopLine Value="1"/>
<UsageCount Value="17"/>
</Unit52>
<Unit53>
<Filename Value="..\..\httpd-2.0.58\include\http_config.h"/>
<Filename Value="../../httpd-2.0.58/include/http_config.h"/>
<CursorPos X="1" Y="75"/>
<TopLine Value="57"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit53>
<Unit54>
<Filename Value="..\..\httpd-2.0.58\include\http_core.h"/>
<Filename Value="../../httpd-2.0.58/include/http_core.h"/>
<CursorPos X="10" Y="585"/>
<TopLine Value="570"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit54>
<Unit55>
<Filename Value="httpd_2_0\http_core.inc"/>
<Filename Value="httpd_2_0/http_core.inc"/>
<CursorPos X="16" Y="650"/>
<TopLine Value="634"/>
<UsageCount Value="8"/>
</Unit55>
<Unit56>
<Filename Value="httpd_2_0\apr\apr_dso.inc"/>
<Filename Value="httpd_2_0/apr/apr_dso.inc"/>
<CursorPos X="1" Y="81"/>
<TopLine Value="60"/>
<UsageCount Value="12"/>
</Unit56>
<Unit57>
<Filename Value="..\..\..\lazarus16\fpcsrc\rtl\win32\winsock.pp"/>
<Filename Value="../../../lazarus16/fpcsrc/rtl/win32/winsock.pp"/>
<UnitName Value="winsock"/>
<CursorPos X="14" Y="220"/>
<TopLine Value="210"/>
<UsageCount Value="8"/>
</Unit57>
<Unit58>
<Filename Value="..\..\..\lazarus16\fpcsrc\rtl\win32\wininc\struct.inc"/>
<Filename Value="../../../lazarus16/fpcsrc/rtl/win32/wininc/struct.inc"/>
<CursorPos X="14" Y="6"/>
<TopLine Value="1"/>
<UsageCount Value="8"/>
</Unit58>
<Unit59>
<Filename Value="httpd_2_0\util_cfgtree.inc"/>
<Filename Value="httpd_2_0/util_cfgtree.inc"/>
<CursorPos X="13" Y="24"/>
<TopLine Value="9"/>
<UsageCount Value="12"/>
</Unit59>
<Unit60>
<Filename Value="httpd_2_0\util_filter.inc"/>
<Filename Value="httpd_2_0/util_filter.inc"/>
<CursorPos X="11" Y="95"/>
<TopLine Value="80"/>
<UsageCount Value="8"/>
</Unit60>
<Unit61>
<Filename Value="httpd_2_2\ap_regex.inc"/>
<Filename Value="httpd_2_2/ap_regex.inc"/>
<CursorPos X="4" Y="86"/>
<TopLine Value="50"/>
<UsageCount Value="12"/>
</Unit61>
<Unit62>
<Filename Value="..\..\httpd-2.2.3\include\httpd.h"/>
<Filename Value="../../httpd-2.2.3/include/httpd.h"/>
<CursorPos X="13" Y="59"/>
<TopLine Value="41"/>
<UsageCount Value="8"/>
<SyntaxHighlighter Value="C++"/>
</Unit62>
<Unit63>
<Filename Value="httpd_2_2\pcreposix.inc"/>
<Filename Value="httpd_2_2/pcreposix.inc"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="53"/>
<UsageCount Value="8"/>
</Unit63>
<Unit64>
<Filename Value="httpd_2_2\http_core.inc"/>
<Filename Value="httpd_2_2/http_core.inc"/>
<CursorPos X="31" Y="10"/>
<TopLine Value="3"/>
<UsageCount Value="14"/>
</Unit64>
<Unit65>
<Filename Value="httpd_2_2\ap_config.inc"/>
<Filename Value="httpd_2_2/ap_config.inc"/>
<CursorPos X="1" Y="16"/>
<TopLine Value="1"/>
<UsageCount Value="10"/>
</Unit65>
<Unit66>
<Filename Value="httpd_2_2\util_md5.inc"/>
<Filename Value="httpd_2_2/util_md5.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit66>
<Unit67>
<Filename Value="httpd_2_2\ap_mmn.inc"/>
<Filename Value="httpd_2_2/ap_mmn.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit67>
<Unit68>
<Filename Value="httpd_2_2\http_request.inc"/>
<Filename Value="httpd_2_2/http_request.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit68>
<Unit69>
<Filename Value="httpd_2_2\util_script.inc"/>
<Filename Value="httpd_2_2/util_script.inc"/>
<CursorPos X="2" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit69>
<Unit70>
<Filename Value="httpd_2_2\ap_mpm.inc"/>
<Filename Value="httpd_2_2/ap_mpm.inc"/>
<CursorPos X="1" Y="144"/>
<TopLine Value="130"/>
<UsageCount Value="9"/>
</Unit70>
<Unit71>
<Filename Value="httpd_2_2\util_filter.inc"/>
<Filename Value="httpd_2_2/util_filter.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit71>
<Unit72>
<Filename Value="httpd_2_2\util_time.inc"/>
<Filename Value="httpd_2_2/util_time.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit72>
<Unit73>
<Filename Value="httpd_2_2\ap_provider.inc"/>
<Filename Value="httpd_2_2/ap_provider.inc"/>
<CursorPos X="8" Y="6"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit73>
<Unit74>
<Filename Value="httpd_2_2\ap_release.inc"/>
<Filename Value="httpd_2_2/ap_release.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit74>
<Unit75>
<Filename Value="httpd_2_2\util_cfgtree.inc"/>
<Filename Value="httpd_2_2/util_cfgtree.inc"/>
<CursorPos X="40" Y="9"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit75>
<Unit76>
<Filename Value="httpd_2_2\http_connection.inc"/>
<Filename Value="httpd_2_2/http_connection.inc"/>
<CursorPos X="1" Y="15"/>
<TopLine Value="1"/>
<UsageCount Value="9"/>
</Unit76>
<Unit77>
<Filename Value="httpd_2_2\http_config.inc"/>
<Filename Value="httpd_2_2/http_config.inc"/>
<CursorPos X="3" Y="168"/>
<TopLine Value="152"/>
<UsageCount Value="14"/>
</Unit77>
<Unit78>
<Filename Value="httpd_2_2\apr\apr_allocator.inc"/>
<Filename Value="httpd_2_2/apr/apr_allocator.inc"/>
<CursorPos X="22" Y="135"/>
<TopLine Value="130"/>
<UsageCount Value="16"/>
</Unit78>
<Unit79>
<Filename Value="httpd_2_2\apr\apr_hash.inc"/>
<Filename Value="httpd_2_2/apr/apr_hash.inc"/>
<CursorPos X="17" Y="56"/>
<TopLine Value="55"/>
<UsageCount Value="13"/>
</Unit79>
<Unit80>
<Filename Value="httpd_2_2\apr\apr_time.inc"/>
<Filename Value="httpd_2_2/apr/apr_time.inc"/>
<CursorPos X="17" Y="229"/>
<TopLine Value="212"/>
<UsageCount Value="13"/>
</Unit80>
<Unit81>
<Filename Value="httpd_2_2\apr\apr_file_io.inc"/>
<Filename Value="httpd_2_2/apr/apr_file_io.inc"/>
<CursorPos X="28" Y="567"/>
<TopLine Value="564"/>
<UsageCount Value="15"/>
</Unit81>
<Unit82>
<Filename Value="httpd_2_2\apr\apr_pools.inc"/>
<Filename Value="httpd_2_2/apr/apr_pools.inc"/>
<CursorPos X="8" Y="123"/>
<TopLine Value="121"/>
<UsageCount Value="15"/>
</Unit82>
<Unit83>
<Filename Value="httpd_2_2\apr\apr_tables.inc"/>
<Filename Value="httpd_2_2/apr/apr_tables.inc"/>
<CursorPos X="19" Y="437"/>
<TopLine Value="415"/>
<UsageCount Value="12"/>
</Unit83>
<Unit84>
<Filename Value="httpd_2_2\apr\apr_general.inc"/>
<Filename Value="httpd_2_2/apr/apr_general.inc"/>
<CursorPos X="1" Y="210"/>
<TopLine Value="187"/>
<UsageCount Value="12"/>
</Unit84>
<Unit85>
<Filename Value="httpd_2_2\apr\apr_portable.inc"/>
<Filename Value="httpd_2_2/apr/apr_portable.inc"/>
<CursorPos X="18" Y="227"/>
<TopLine Value="258"/>
<UsageCount Value="12"/>
</Unit85>
<Unit86>
<Filename Value="httpd_2_2\apr\apr_thread_proc.inc"/>
<Filename Value="httpd_2_2/apr/apr_thread_proc.inc"/>
<CursorPos X="1" Y="802"/>
<TopLine Value="788"/>
<UsageCount Value="12"/>
</Unit86>
<Unit87>
<Filename Value="httpd_2_2\apr\apr_lib.inc"/>
<Filename Value="httpd_2_2/apr/apr_lib.inc"/>
<CursorPos X="1" Y="177"/>
<TopLine Value="154"/>
<UsageCount Value="12"/>
</Unit87>
<Unit88>
<Filename Value="httpd_2_2\apr\apr_errno.inc"/>
<Filename Value="httpd_2_2/apr/apr_errno.inc"/>
<CursorPos X="1" Y="1205"/>
<TopLine Value="1173"/>
<UsageCount Value="12"/>
</Unit88>
<Unit89>
<Filename Value="httpd_2_2\apr\apr_signal.inc"/>
<Filename Value="httpd_2_2/apr/apr_signal.inc"/>
<CursorPos X="1" Y="93"/>
<TopLine Value="71"/>
<UsageCount Value="12"/>
</Unit89>
<Unit90>
<Filename Value="httpd_2_2\apr\apr_user.inc"/>
<Filename Value="httpd_2_2/apr/apr_user.inc"/>
<CursorPos X="1" Y="156"/>
<TopLine Value="129"/>
<UsageCount Value="12"/>
</Unit90>
<Unit91>
<Filename Value="httpd_2_2\apr\apr_file_info.inc"/>
<Filename Value="httpd_2_2/apr/apr_file_info.inc"/>
<CursorPos X="1" Y="2"/>
<TopLine Value="1"/>
<UsageCount Value="12"/>
</Unit91>
<Unit92>
<Filename Value="httpd_2_2\apr\apr_version.inc"/>
<Filename Value="httpd_2_2/apr/apr_version.inc"/>
<CursorPos X="8" Y="112"/>
<TopLine Value="109"/>
<UsageCount Value="14"/>
</Unit92>
<Unit93>
<Filename Value="httpd_2_2\apr\apr_strings.inc"/>
<Filename Value="httpd_2_2/apr/apr_strings.inc"/>
<CursorPos X="1" Y="339"/>
<TopLine Value="312"/>
<UsageCount Value="10"/>
</Unit93>
<Unit94>
<Filename Value="httpd_2_2\aprutil\apr_md5.inc"/>
<Filename Value="httpd_2_2/aprutil/apr_md5.inc"/>
<CursorPos X="1" Y="157"/>
<TopLine Value="126"/>
<UsageCount Value="10"/>
</Unit94>
<Unit95>
<Filename Value="httpd_2_2\aprutil\apr_uri.inc"/>
<Filename Value="httpd_2_2/aprutil/apr_uri.inc"/>
<CursorPos X="1" Y="122"/>
<TopLine Value="107"/>
<UsageCount Value="10"/>
</Unit95>
<Unit96>
<Filename Value="httpd_2_2\aprutil\apr_xlate.inc"/>
<Filename Value="httpd_2_2/aprutil/apr_xlate.inc"/>
<CursorPos X="1" Y="112"/>
<TopLine Value="80"/>
<UsageCount Value="10"/>
</Unit96>
<Unit97>
<Filename Value="httpd_2_2\aprutil\apr_xml.inc"/>
<Filename Value="httpd_2_2/aprutil/apr_xml.inc"/>
<CursorPos X="24" Y="338"/>
<TopLine Value="335"/>
<UsageCount Value="12"/>
</Unit97>
<Unit98>
<Filename Value="httpd_2_2\apriconv\apriconv.pas"/>
<Filename Value="httpd_2_2/apriconv/apriconv.pas"/>
<UnitName Value="apriconv"/>
<CursorPos X="28" Y="30"/>
<TopLine Value="27"/>
<UsageCount Value="12"/>
</Unit98>
<Unit99>
<Filename Value="httpd_2_2\apriconv\apr_iconv.inc"/>
<Filename Value="httpd_2_2/apriconv/apr_iconv.inc"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="1"/>
<UsageCount Value="10"/>
</Unit99>
<Unit100>
<Filename Value="httpd_2_2\apriconv\api_version.inc"/>
<Filename Value="httpd_2_2/apriconv/api_version.inc"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="67"/>
<UsageCount Value="10"/>
</Unit100>
<Unit101>
<Filename Value="httpd_2_2\apr\apr_buckets.inc"/>
<Filename Value="httpd_2_2/apr/apr_buckets.inc"/>
<CursorPos X="18" Y="9"/>
<TopLine Value="1"/>
<UsageCount Value="12"/>
</Unit101>
<Unit102>
<Filename Value="httpd_2_2\apr/apr_hash.inc"/>
<CursorPos X="27" Y="49"/>
<TopLine Value="46"/>
<UsageCount Value="10"/>
</Unit102>
<Unit103>
<Filename Value="httpd_2_0\apr\apr_file_io.inc"/>
<Filename Value="httpd_2_0/apr/apr_file_io.inc"/>
<CursorPos X="14" Y="528"/>
<TopLine Value="525"/>
<UsageCount Value="10"/>
</Unit102>
<Unit103>
<Filename Value="httpd_2_0/apr/apr_poll.inc"/>
<CursorPos X="4" Y="251"/>
<TopLine Value="224"/>
<EditorIndex Value="1"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit103>
<Unit104>
<Filename Value="httpd_2_0\apr\apr_poll.inc"/>
<CursorPos X="1" Y="229"/>
<TopLine Value="229"/>
<EditorIndex Value="1"/>
<Filename Value="../../../Componentes/epiktimer-0.4/epiktimer.pas"/>
<UnitName Value="EpikTimer"/>
<CursorPos X="21" Y="458"/>
<TopLine Value="432"/>
<UsageCount Value="10"/>
</Unit104>
<Unit105>
<Filename Value="/usr/share/fpcsrc/rtl/unix/oldlinux.pp"/>
<UnitName Value="oldlinux"/>
<CursorPos X="13" Y="1"/>
<TopLine Value="1"/>
<UsageCount Value="10"/>
</Unit105>
<Unit106>
<Filename Value="/usr/share/fpcsrc/rtl/unix/linuxold.inc"/>
<CursorPos X="16" Y="2969"/>
<TopLine Value="2954"/>
<UsageCount Value="10"/>
</Unit106>
<Unit107>
<Filename Value="/usr/share/fpcsrc/rtl/unix/bunxh.inc"/>
<CursorPos X="1" Y="82"/>
<TopLine Value="71"/>
<UsageCount Value="10"/>
</Unit107>
<Unit108>
<Filename Value="../../../Componentes/epiktimer-1.0/epiktimer.pas"/>
<UnitName Value="EpikTimer"/>
<CursorPos X="1" Y="75"/>
<TopLine Value="446"/>
<EditorIndex Value="2"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit108>
<Unit109>
<Filename Value="../../../lazarus/ide/lazarus.pp"/>
<UnitName Value="Lazarus"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="1"/>
<EditorIndex Value="3"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit104>
</Unit109>
</Units>
<JumpHistory Count="8" HistoryIndex="7">
<Position1>
<Filename Value="mod_hello.lpr"/>
<Caret Line="121" Column="1" TopLine="112"/>
</Position1>
<Position2>
<Filename Value="mod_hello.lpr"/>
<Caret Line="24" Column="1" TopLine="1"/>
</Position2>
<Position3>
<Filename Value="mod_hello.lpr"/>
<Caret Line="116" Column="1" TopLine="96"/>
</Position3>
<Position4>
<Filename Value="mod_hello.lpr"/>
<Caret Line="53" Column="18" TopLine="34"/>
</Position4>
<Position5>
<Filename Value="mod_hello.lpr"/>
<Caret Line="20" Column="14" TopLine="20"/>
</Position5>
<Position6>
<Filename Value="mod_hello.lpr"/>
<Caret Line="17" Column="1" TopLine="5"/>
</Position6>
<Position7>
<Filename Value="mod_hello.lpr"/>
<Caret Line="20" Column="19" TopLine="2"/>
</Position7>
<Position8>
<Filename Value="httpd_2_0\apr\apr_poll.inc"/>
<Caret Line="234" Column="3" TopLine="229"/>
</Position8>
</JumpHistory>
<JumpHistory Count="0" HistoryIndex="-1"/>
</ProjectOptions>
<CompilerOptions>
<Version Value="5"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="mod_hello.so"/>
</Target>
<SearchPaths>
<OtherUnitFiles Value="httpd_2_2\;httpd_2_2\apr\;httpd_2_2\aprutil\"/>
<SrcPath Value="httpd_2_2\;httpd_2_2\apr\;httpd_2_2\aprutil\"/>
<OtherUnitFiles Value="httpd_2_2/;httpd_2_2/apr/;httpd_2_2/aprutil/"/>
<SrcPath Value="httpd_2_2/;httpd_2_2/apr/;httpd_2_2/aprutil/"/>
</SearchPaths>
<CodeGeneration>
<Generate Value="Faster"/>