]> git.pld-linux.org Git - packages/apache.git/blame - apache-mod_ssl-eapi.patch
- Requires: psmisc >= 20.1 (because of /bin/killall used in logrotate script)
[packages/apache.git] / apache-mod_ssl-eapi.patch
CommitLineData
bac1ef07 1## _____ _ ____ ___
2## | ____| / \ | _ \_ _|
3## | _| / _ \ | |_) | |
4## | |__ / ___ \| __/| |
5## |____/_/ \_\_| |___| Extended API for Apache
6## ____________________________________________________________________________
7##
8## Annotated patch file: eapi.patch
9## Copyright (c) 1998-2001 Ralf S. Engelschall, All Rights Reserved.
10## Created on: 29-Jan-2001
11##
12## This file assembles changes to existing Apache source files
13## between the original Apache and the patched variant. It can be
14## automatically applied to a vanilla Apache source tree with the
15## 'patch' tool to upgrade those files. Each patch snippet is
16## annotated with a short description.
17##
18## This file contains all patches to the Apache source
19## tree which add the Extended API (EAPI) support.
20##
21
22+---------------------------------------------------------------------------
23| Add the EAPI and EAPI_MM configuration entries which triggers the EAPI
24| patches and configured the shared memory support via the MM library.
25+---------------------------------------------------------------------------
26Index: src/Configuration.tmpl
27--- src/Configuration.tmpl 1999/08/17 11:21:38 1.1.1.5
28+++ src/Configuration.tmpl 2000/10/09 12:15:02 1.21
29@@ -68,6 +105,24 @@
30 #TARGET=
31
32 ################################################################
33+# Extended API (EAPI) support:
34+#
35+# EAPI:
36+# The EAPI rule enables more module hooks, a generic low-level hook
37+# mechanism, a generic context mechanism and shared memory based pools.
38+#
39+# EAPI_MM:
40+# Set the EAPI_MM variable to either the directory of a MM Shared Memory
41+# Library source tree or the installation tree of MM. Alternatively you can
42+# also use the value 'SYSTEM' which then indicates that MM is installed
43+# under various system locations. When the MM library files cannot be found
44+# the EAPI still can be built, but without shared memory pool support, of
45+# course.
46+
47+Rule EAPI=no
48+#EAPI_MM=SYSTEM
49+
50+################################################################
51 # Dynamic Shared Object (DSO) support
52 #
53 # There is experimental support for compiling the Apache core and
54
55+---------------------------------------------------------------------------
56| Patch in implementation of the EAPI rule.
57+---------------------------------------------------------------------------
58Index: src/Configure
59--- src/Configure 2001/01/29 19:36:36 1.1.1.13
60+++ src/Configure 2001/01/29 19:38:39 1.15
61@@ -1808,6 +1808,72 @@
62 fi
63
64 ####################################################################
65+## Extended API (EAPI) support:
66+##
67+if [ "x$RULE_EAPI" = "x" ]; then
68+ RULE_EAPI=`./helpers/CutRule EAPI $file`
69+fi
70+if [ "x$RULE_EAPI" = "xyes" ]; then
71+ echo " + enabling Extended API (EAPI)"
72+ CFLAGS="$CFLAGS -DEAPI"
73+ # some vendor compilers are too restrictive
74+ # for our ap_hook and ap_ctx sources.
75+ case "$OS:$CC" in
76+ *IRIX-32*:*/cc|*IRIX-32*:cc )
77+ CFLAGS="$CFLAGS -woff 1048,1110,1164"
78+ ;;
79+ esac
80+ # MM Shared Memory Library support for EAPI
81+ if [ "x$EAPI_MM" = "x" ]; then
82+ EAPI_MM=`egrep '^EAPI_MM=' $file | tail -1 | awk -F= '{print $2}'`
83+ fi
84+ if [ "x$EAPI_MM" != "x" ]; then
85+ case $EAPI_MM in
86+ SYSTEM|/* ) ;;
87+ * ) for p in . .. ../..; do
88+ if [ -d "$p/$EAPI_MM" ]; then
89+ EAPI_MM="`echo $p/$EAPI_MM | sed -e 's;/\./;/;g'`"
90+ break
91+ fi
92+ done
93+ ;;
94+ esac
95+ if [ "x$EAPI_MM" = "xSYSTEM" ]; then
96+ echo " using MM library for EAPI: (system-wide)"
97+ CFLAGS="$CFLAGS -DEAPI_MM"
98+ __INCLUDES="`mm-config --cflags`"
99+ if [ "x$__INCLUDES" != "x-I/usr/include" ]; then
100+ INCLUDES="$INCLUDES $__INCLUDES"
101+ fi
102+ LDFLAGS="$LDFLAGS `mm-config --ldflags`"
103+ LIBS="$LIBS `mm-config --libs`"
104+ else
105+ if [ -f "$EAPI_MM/.libs/libmm.a" -a -f "$EAPI_MM/mm.h" ]; then
106+ echo " using MM library: $EAPI_MM (source-tree only)"
107+ case $EAPI_MM in
108+ /* ) ;;
109+ * ) EAPI_MM="\$(SRCDIR)/$EAPI_MM" ;;
110+ esac
111+ CFLAGS="$CFLAGS -DEAPI_MM"
112+ INCLUDES="$INCLUDES -I$EAPI_MM"
113+ LDFLAGS="$LDFLAGS -L$EAPI_MM/.libs"
114+ LIBS="$LIBS -lmm"
115+ elif [ -f "$EAPI_MM/bin/mm-config" ]; then
116+ echo " using MM library: $EAPI_MM (installed)"
117+ CFLAGS="$CFLAGS -DEAPI_MM"
118+ INCLUDES="$INCLUDES `$EAPI_MM/bin/mm-config --cflags`"
119+ LDFLAGS="$LDFLAGS `$EAPI_MM/bin/mm-config --ldflags`"
120+ LIBS="$LIBS `$EAPI_MM/bin/mm-config --libs`"
121+ else
122+ echo "Configure:Error: Cannot find MM library under $EAPI_MM" 1>&2
123+ exit 1
124+ fi
125+ fi
126+ fi
127+fi
128+
129+
130+####################################################################
131 ## Add in the Expat library if needed/wanted.
132 ##
133 if [ -d ./lib/expat-lite/ ]; then
134
135+---------------------------------------------------------------------------
136| Add the build support for the ap_hook.c and ap_ctx.c sources (Unix)
137+---------------------------------------------------------------------------
138Index: src/ap/Makefile.tmpl
139--- src/ap/Makefile.tmpl 2000/10/12 08:17:28 1.1.1.6
140+++ src/ap/Makefile.tmpl 2000/10/12 08:31:47 1.6
141@@ -6,7 +6,8 @@
142 LIB=libap.a
143
144 OBJS=ap_cpystrn.o ap_execve.o ap_fnmatch.o ap_getpass.o ap_md5c.o ap_signal.o \
145- ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o ap_base64.o
146+ ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o ap_base64.o \
147+ ap_hook.o ap_ctx.o ap_mm.o
148
149 .c.o:
150 $(CC) -c $(INCLUDES) $(CFLAGS) $<
151
152+---------------------------------------------------------------------------
153| Add the build support for the ap_hook.c and ap_ctx.c sources (Win32)
154+---------------------------------------------------------------------------
155Index: src/ap/ap.mak
156--- src/ap/ap.mak 2001/01/23 11:35:02 1.1.1.7
157+++ src/ap/ap.mak 2001/01/23 11:48:05 1.7
158@@ -52,6 +52,9 @@
159 -@erase "$(INTDIR)\ap_cpystrn.obj"
160 -@erase "$(INTDIR)\ap_fnmatch.obj"
161 -@erase "$(INTDIR)\ap_md5c.obj"
162+ -@erase "$(INTDIR)\ap_hook.obj"
163+ -@erase "$(INTDIR)\ap_ctx.obj"
164+ -@erase "$(INTDIR)\ap_mm.obj"
165 -@erase "$(INTDIR)\ap_sha1.obj"
166 -@erase "$(INTDIR)\ap_signal.obj"
167 -@erase "$(INTDIR)\ap_slack.obj"
168@@ -78,6 +81,9 @@
169 "$(INTDIR)\ap_cpystrn.obj" \
170 "$(INTDIR)\ap_fnmatch.obj" \
171 "$(INTDIR)\ap_md5c.obj" \
172+ "$(INTDIR)\ap_hook.obj" \
173+ "$(INTDIR)\ap_ctx.obj" \
174+ "$(INTDIR)\ap_mm.obj" \
175 "$(INTDIR)\ap_sha1.obj" \
176 "$(INTDIR)\ap_signal.obj" \
177 "$(INTDIR)\ap_slack.obj" \
178@@ -114,6 +120,9 @@
179 -@erase "$(INTDIR)\ap_cpystrn.obj"
180 -@erase "$(INTDIR)\ap_fnmatch.obj"
181 -@erase "$(INTDIR)\ap_md5c.obj"
182+ -@erase "$(INTDIR)\ap_hook.obj"
183+ -@erase "$(INTDIR)\ap_ctx.obj"
184+ -@erase "$(INTDIR)\ap_mm.obj"
185 -@erase "$(INTDIR)\ap_sha1.obj"
186 -@erase "$(INTDIR)\ap_signal.obj"
187 -@erase "$(INTDIR)\ap_slack.obj"
188@@ -140,6 +149,9 @@
189 "$(INTDIR)\ap_cpystrn.obj" \
190 "$(INTDIR)\ap_fnmatch.obj" \
191 "$(INTDIR)\ap_md5c.obj" \
192+ "$(INTDIR)\ap_hook.obj" \
193+ "$(INTDIR)\ap_ctx.obj" \
194+ "$(INTDIR)\ap_mm.obj" \
195 "$(INTDIR)\ap_sha1.obj" \
196 "$(INTDIR)\ap_signal.obj" \
197 "$(INTDIR)\ap_slack.obj" \
198
199+---------------------------------------------------------------------------
200| Replace the MODULE_MAGIC_COOKIE to allow us to distinguish between
201| EAPI-aware modules and standard modules.
202+---------------------------------------------------------------------------
203Index: src/include/ap_mmn.h
204--- src/include/ap_mmn.h 2001/01/23 11:35:07 1.1.1.8
205+++ src/include/ap_mmn.h 2001/01/23 11:48:05 1.8
206@@ -233,7 +233,23 @@
207 * 19990320.10 - add ap_is_rdirectory() and ap_stripprefix()
208 */
209
210+/*
211+ * Under Extended API situations we replace the magic cookie "AP13" with
212+ * "EAPI" to let us distinguish between the EAPI module structure (which
213+ * contain additional pointers at the end) and standard module structures
214+ * (which lack at least NULL's for the pointers at the end). This is
215+ * important because standard ("AP13") modules would dump core when we
216+ * dispatch over the additional hooks because NULL's are missing at the end of
217+ * the module structure. See also the code in mod_so for details on loading
218+ * (we accept both "AP13" and "EAPI").
219+ */
220+#ifdef EAPI
221+#define MODULE_MAGIC_COOKIE_AP13 0x41503133UL /* "AP13" */
222+#define MODULE_MAGIC_COOKIE_EAPI 0x45415049UL /* "EAPI" */
223+#define MODULE_MAGIC_COOKIE MODULE_MAGIC_COOKIE_EAPI
224+#else
225 #define MODULE_MAGIC_COOKIE 0x41503133UL /* "AP13" */
226+#endif
227
228 #ifndef MODULE_MAGIC_NUMBER_MAJOR
229 #define MODULE_MAGIC_NUMBER_MAJOR 19990320
230
231+---------------------------------------------------------------------------
232| Add the additional prototypes and defines for the
233| shared memory pools.
234+---------------------------------------------------------------------------
235Index: src/include/ap_alloc.h
236--- src/include/ap_alloc.h 2001/01/23 11:35:07 1.1.1.2
237+++ src/include/ap_alloc.h 2001/01/23 11:48:05 1.3
238@@ -95,6 +95,15 @@
239 pool * ap_init_alloc(void); /* Set up everything */
240 void ap_cleanup_alloc(void);
241 API_EXPORT(pool *) ap_make_sub_pool(pool *); /* All pools are subpools of permanent_pool */
242+#if defined(EAPI)
243+typedef enum { AP_POOL_RD, AP_POOL_RW } ap_pool_lock_mode;
244+int ap_shared_pool_possible(void);
245+void ap_init_alloc_shared(int);
246+void ap_kill_alloc_shared(void);
247+API_EXPORT(pool *) ap_make_shared_sub_pool(pool *);
248+API_EXPORT(int) ap_acquire_pool(pool *, ap_pool_lock_mode);
249+API_EXPORT(int) ap_release_pool(pool *);
250+#endif
251 API_EXPORT(void) ap_destroy_pool(pool *);
252
253 /* pools have nested lifetimes -- sub_pools are destroyed when the
254
255+---------------------------------------------------------------------------
256| Add the additional context variable `ctx' for BUFF structures.
257+---------------------------------------------------------------------------
258Index: src/include/buff.h
259--- src/include/buff.h 2001/01/23 11:35:07 1.1.1.4
260+++ src/include/buff.h 2001/01/23 11:48:05 1.8
261@@ -125,6 +125,10 @@
262 /* transport handle, for RPC binding handle or some such */
263 void *t_handle;
264
265+#ifdef EAPI
266+ ap_ctx *ctx;
267+#endif /* EAPI */
268+
269 #ifdef B_SFIO
270 Sfio_t *sf_in;
271 Sfio_t *sf_out;
272@@ -176,6 +180,10 @@
273 /* Internal routines */
274 API_EXPORT(int) ap_bflsbuf(int c, BUFF *fb);
275 API_EXPORT(int) ap_bfilbuf(BUFF *fb);
276+
277+#ifdef EAPI
278+#define ap_bpeekc(fb) ( ((fb)->incnt == 0) ? EOF : *((fb)->inptr) )
279+#endif
280
281 #ifndef CHARSET_EBCDIC
282
283
284+---------------------------------------------------------------------------
285| Add the four additional Apache API module hooks.
286+---------------------------------------------------------------------------
287Index: src/include/http_config.h
288--- src/include/http_config.h 2001/01/23 11:35:07 1.1.1.8
289+++ src/include/http_config.h 2001/01/23 11:48:05 1.10
290@@ -276,6 +276,65 @@
291 void (*child_exit) (server_rec *, pool *);
292 #endif
293 int (*post_read_request) (request_rec *);
294+
295+#ifdef EAPI
296+ /*
297+ * ANSI C guarantees us that we can at least _extend_ the module structure
298+ * with additional hooks without the need to change all existing modules.
299+ * Because: ``If there are fewer initializers in the list than members of
300+ * the structure, the trailing members are initialized with 0.'' (The C
301+ * Programming Language, 2nd Ed., A8.7 Initialization). So we just
302+ * have to put our additional hooks here:
303+ *
304+ * add_module:
305+ * Called from within ap_add_module() right after the module structure
306+ * was linked into the Apache internal module list. It is mainly
307+ * intended to be used to define configuration defines (<IfDefine>)
308+ * which have to be available directly after a LoadModule/AddModule.
309+ * Actually this is the earliest possible hook a module can use.
310+ *
311+ * remove_module:
312+ * Called from within ap_remove_module() right before the module
313+ * structure is kicked out from the Apache internal module list.
314+ * Actually this is last possible hook a module can use and exists for
315+ * consistency with the add_module hook.
316+ *
317+ * rewrite_command:
318+ * Called right after a configuration directive line was read and
319+ * before it is processed. It is mainly intended to be used for
320+ * rewriting directives in order to provide backward compatibility to
321+ * old directive variants.
322+ *
323+ * new_connection:
324+ * Called from within the internal new_connection() function, right
325+ * after the conn_rec structure for the new established connection was
326+ * created and before Apache starts processing the request with
327+ * ap_read_request(). It is mainly intended to be used to setup/run
328+ * connection dependent things like sending start headers for
329+ * on-the-fly compression, etc.
330+ *
331+ * close_connection:
332+ * Called from within the Apache dispatching loop just before any
333+ * ap_bclose() is performed on the socket connection, but a long time
334+ * before any pool cleanups are done for the connection (which can be
335+ * too late for some applications). It is mainly intended to be used
336+ * to close/finalize connection dependent things like sending end
337+ * headers for on-the-fly compression, etc.
338+ */
339+#ifdef ULTRIX_BRAIN_DEATH
340+ void (*add_module) ();
341+ void (*remove_module) ();
342+ char *(*rewrite_command) ();
343+ void (*new_connection) ();
344+ void (*close_connection) ();
345+#else
346+ void (*add_module) (struct module_struct *);
347+ void (*remove_module) (struct module_struct *);
348+ char *(*rewrite_command) (cmd_parms *, void *config, const char *);
349+ void (*new_connection) (conn_rec *);
350+ void (*close_connection) (conn_rec *);
351+#endif
352+#endif /* EAPI */
353 } module;
354
355 /* Initializer for the first few module slots, which are only
356
357+---------------------------------------------------------------------------
358| Add the additional variable `ap_global_ctx' for holding
359| global module context.
360+---------------------------------------------------------------------------
361Index: src/include/http_conf_globals.h
362--- src/include/http_conf_globals.h 2001/01/23 11:35:07 1.1.1.8
363+++ src/include/http_conf_globals.h 2001/01/23 11:48:05 1.9
364@@ -92,6 +92,9 @@
365 extern int ap_listenbacklog;
366 extern int ap_dump_settings;
367 extern API_VAR_EXPORT int ap_extended_status;
368+#ifdef EAPI
369+extern API_VAR_EXPORT ap_ctx *ap_global_ctx;
370+#endif /* EAPI */
371
372 extern API_VAR_EXPORT char *ap_pid_fname;
373 extern API_VAR_EXPORT char *ap_scoreboard_fname;
374
375+---------------------------------------------------------------------------
376| Export the ap_set_callback_and_alarm() function because this
377| first is a useful thing and second we need it because all
378| other API/timeout functions deal with a request_rec while
379| some modules need a generic timeout mechanism.
380+---------------------------------------------------------------------------
381Index: src/include/http_main.h
382--- src/include/http_main.h 2001/01/23 11:35:07 1.1.1.5
383+++ src/include/http_main.h 2001/01/23 11:48:05 1.5
384@@ -125,7 +125,11 @@
385 API_EXPORT(void) ap_sync_scoreboard_image(void);
386 int ap_update_child_status(int child_num, int status, request_rec *r);
387 void ap_time_process_request(int child_num, int status);
388+#ifdef EAPI
389+API_EXPORT(unsigned int) ap_set_callback_and_alarm(void (*fn) (int), int x);
390+#else
391 unsigned int ap_set_callback_and_alarm(void (*fn) (int), int x);
392+#endif
393 API_EXPORT(int) ap_check_alarm(void);
394
395 void setup_signal_names(char *prefix);
396
397+---------------------------------------------------------------------------
398| First add support for the HTTPS protocol scheme via hooks,
399| second add the additional context variable `ctx' for the
400| conn_rec, server_rec and request_rec structures. And third
401| add a prototype for the additional ap_add_config_define()
402| function.
403+---------------------------------------------------------------------------
404Index: src/include/httpd.h
405--- src/include/httpd.h 2001/01/29 19:36:42 1.1.1.13
406+++ src/include/httpd.h 2001/01/29 19:38:39 1.22
407@@ -70,7 +70,19 @@
408 /* Headers in which EVERYONE has an interest... */
409
410 #include "ap_config.h"
411+#ifdef EAPI
412+#include "ap_mm.h"
413+#endif
414 #include "ap_alloc.h"
415+/*
416+ * Include the Extended API headers.
417+ * Don't move the position. It has to be after ap_alloc.h because it uses the
418+ * pool stuff but before buff.h because the buffer stuff uses the EAPI, too.
419+ */
420+#ifdef EAPI
421+#include "ap_hook.h"
422+#include "ap_ctx.h"
423+#endif /* EAPI */
424 #include "buff.h"
425 #include "ap.h"
426
427@@ -141,8 +153,13 @@
428 #define DEFAULT_HTTP_PORT 80
429 #define DEFAULT_HTTPS_PORT 443
430 #define ap_is_default_port(port,r) ((port) == ap_default_port(r))
431+#ifdef EAPI
432+#define ap_http_method(r) (ap_ctx_get((r)->ctx, "ap::http::method") != NULL ? ((char *)ap_ctx_get((r)->ctx, "ap::http::method")) : "http")
433+#define ap_default_port(r) (ap_ctx_get((r)->ctx, "ap::default::port") != NULL ? atoi((char *)ap_ctx_get((r)->ctx, "ap::default::port")) : DEFAULT_HTTP_PORT)
434+#else /* EAPI */
435 #define ap_http_method(r) "http"
436 #define ap_default_port(r) DEFAULT_HTTP_PORT
437+#endif /* EAPI */
438
439 /* --------- Default user name and group name running standalone ---------- */
440 /* --- These may be specified as numbers by placing a # before a number --- */
441@@ -354,6 +371,19 @@
442 #define SCOREBOARD_MAINTENANCE_INTERVAL 1000000
443 #endif
444
445+/*
446+ * Unix only:
447+ * Path to Shared Memory Files
448+ */
449+#ifdef EAPI
450+#ifndef EAPI_MM_CORE_PATH
451+#define EAPI_MM_CORE_PATH "logs/mm"
452+#endif
453+#ifndef EAPI_MM_CORE_MAXSIZE
454+#define EAPI_MM_CORE_MAXSIZE 1024*1024*1 /* max. 1MB */
455+#endif
456+#endif
457+
458 /* Number of requests to try to handle in a single process. If <= 0,
459 * the children don't die off. That's the default here, since I'm still
460 * interested in finding and stanching leaks.
461@@ -446,6 +476,9 @@
462 API_EXPORT(const char *) ap_get_server_version(void);
463 API_EXPORT(void) ap_add_version_component(const char *component);
464 API_EXPORT(const char *) ap_get_server_built(void);
465+#ifdef EAPI
466+API_EXPORT(void) ap_add_config_define(const char *define);
467+#endif /* EAPI */
468
469 /* Numeric release version identifier: MMNNFFRBB: major minor fix final beta
470 * Always increases along the same track as the source branch.
471@@ -838,6 +871,10 @@
472 * record to improve 64bit alignment the next time we need to break
473 * binary compatibility for some other reason.
474 */
475+
476+#ifdef EAPI
477+ ap_ctx *ctx;
478+#endif /* EAPI */
479 };
480
481
482@@ -886,6 +923,9 @@
483 char *local_host; /* used for ap_get_server_name when
484 * UseCanonicalName is set to DNS
485 * (ignores setting of HostnameLookups) */
486+#ifdef EAPI
487+ ap_ctx *ctx;
488+#endif /* EAPI */
489 };
490
491 /* Per-vhost config... */
492@@ -958,6 +998,10 @@
493 int limit_req_line; /* limit on size of the HTTP request line */
494 int limit_req_fieldsize; /* limit on size of any request header field */
495 int limit_req_fields; /* limit on number of request header fields */
496+
497+#ifdef EAPI
498+ ap_ctx *ctx;
499+#endif /* EAPI */
500 };
501
502 /* These are more like real hosts than virtual hosts */
503
504+---------------------------------------------------------------------------
505| Patch the shared memory pool support into the Apache pool facility.
506+---------------------------------------------------------------------------
507Index: src/main/alloc.c
508--- src/main/alloc.c 2001/01/23 11:35:08 1.1.1.10
509+++ src/main/alloc.c 2001/01/23 11:48:05 1.17
510@@ -64,6 +64,10 @@
511 */
512
513 #include "httpd.h"
514+#ifdef EAPI
515+#include "http_config.h"
516+#include "http_conf_globals.h"
517+#endif
518 #include "multithread.h"
519 #include "http_log.h"
520
521@@ -138,6 +142,10 @@
522 #define BLOCK_MINALLOC 0
523 #endif
524
525+#if defined(EAPI) && defined(EAPI_MM)
526+static AP_MM *mm = NULL;
527+#endif
528+
529 /*****************************************************************
530 *
531 * Managing free storage blocks...
532@@ -166,6 +174,9 @@
533 char *endp;
534 union block_hdr *next;
535 char *first_avail;
536+#if defined(EAPI) && defined(EAPI_MM)
537+ int is_shm;
538+#endif
539 #ifdef POOL_DEBUG
540 union block_hdr *global_next;
541 struct pool *owning_pool;
542@@ -216,7 +227,11 @@
543 /* Get a completely new block from the system pool. Note that we rely on
544 malloc() to provide aligned memory. */
545
546+#if defined(EAPI) && defined(EAPI_MM)
547+static union block_hdr *malloc_block(int size, int is_shm)
548+#else
549 static union block_hdr *malloc_block(int size)
550+#endif
551 {
552 union block_hdr *blok;
553
554@@ -230,12 +245,20 @@
555 ++num_malloc_calls;
556 num_malloc_bytes += size + sizeof(union block_hdr);
557 #endif
558+#if defined(EAPI) && defined(EAPI_MM)
559+ if (is_shm)
560+ blok = (union block_hdr *)ap_mm_malloc(mm, size + sizeof(union block_hdr));
561+ else
562+#endif
563 blok = (union block_hdr *) malloc(size + sizeof(union block_hdr));
564 if (blok == NULL) {
565 fprintf(stderr, "Ouch! malloc failed in malloc_block()\n");
566 exit(1);
567 }
568 debug_fill(blok, size + sizeof(union block_hdr));
569+#if defined(EAPI) && defined(EAPI_MM)
570+ blok->h.is_shm = is_shm;
571+#endif
572 blok->h.next = NULL;
573 blok->h.first_avail = (char *) (blok + 1);
574 blok->h.endp = size + blok->h.first_avail;
575@@ -296,6 +319,10 @@
576 if (blok == NULL)
577 return; /* Sanity check --- freeing empty pool? */
578
579+#if defined(EAPI) && defined(EAPI_MM)
580+ if (blok->h.is_shm)
581+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
582+#endif
583 (void) ap_acquire_mutex(alloc_mutex);
584 old_free_list = block_freelist;
585 block_freelist = blok;
586@@ -342,7 +369,11 @@
587 #endif
588
589 (void) ap_release_mutex(alloc_mutex);
590+#if defined(EAPI) && defined(EAPI_MM)
591+ if (blok->h.is_shm)
592+ (void)ap_mm_unlock(mm);
593 #endif
594+#endif
595 }
596
597
598@@ -350,7 +381,11 @@
599 * if necessary. Must be called with alarms blocked.
600 */
601
602+#if defined(EAPI) && defined(EAPI_MM)
603+static union block_hdr *new_block(int min_size, int is_shm)
604+#else
605 static union block_hdr *new_block(int min_size)
606+#endif
607 {
608 union block_hdr **lastptr = &block_freelist;
609 union block_hdr *blok = block_freelist;
610@@ -360,7 +395,12 @@
611 */
612
613 while (blok != NULL) {
614+#if defined(EAPI) && defined(EAPI_MM)
615+ if (blok->h.is_shm == is_shm &&
616+ min_size + BLOCK_MINFREE <= blok->h.endp - blok->h.first_avail) {
617+#else
618 if (min_size + BLOCK_MINFREE <= blok->h.endp - blok->h.first_avail) {
619+#endif
620 *lastptr = blok->h.next;
621 blok->h.next = NULL;
622 debug_verify_filled(blok->h.first_avail, blok->h.endp,
623@@ -376,7 +416,11 @@
624 /* Nope. */
625
626 min_size += BLOCK_MINFREE;
627+#if defined(EAPI) && defined(EAPI_MM)
628+ blok = malloc_block((min_size > BLOCK_MINALLOC) ? min_size : BLOCK_MINALLOC, is_shm);
629+#else
630 blok = malloc_block((min_size > BLOCK_MINALLOC) ? min_size : BLOCK_MINALLOC);
631+#endif
632 return blok;
633 }
634
635@@ -426,6 +470,9 @@
636 #ifdef POOL_DEBUG
637 struct pool *joined;
638 #endif
639+#if defined(EAPI) && defined(EAPI_MM)
640+ int is_shm;
641+#endif
642 };
643
644 static pool *permanent_pool;
645@@ -440,16 +487,28 @@
646 #define POOL_HDR_CLICKS (1 + ((sizeof(struct pool) - 1) / CLICK_SZ))
647 #define POOL_HDR_BYTES (POOL_HDR_CLICKS * CLICK_SZ)
648
649+#if defined(EAPI) && defined(EAPI_MM)
650+static struct pool *make_sub_pool_internal(struct pool *p, int is_shm)
651+#else
652 API_EXPORT(struct pool *) ap_make_sub_pool(struct pool *p)
653+#endif
654 {
655 union block_hdr *blok;
656 pool *new_pool;
657
658 ap_block_alarms();
659
660+#if defined(EAPI) && defined(EAPI_MM)
661+ if (is_shm)
662+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
663+#endif
664 (void) ap_acquire_mutex(alloc_mutex);
665
666+#if defined(EAPI) && defined(EAPI_MM)
667+ blok = new_block(POOL_HDR_BYTES, is_shm);
668+#else
669 blok = new_block(POOL_HDR_BYTES);
670+#endif
671 new_pool = (pool *) blok->h.first_avail;
672 blok->h.first_avail += POOL_HDR_BYTES;
673 #ifdef POOL_DEBUG
674@@ -468,12 +527,38 @@
675 p->sub_pools = new_pool;
676 }
677
678+#if defined(EAPI) && defined(EAPI_MM)
679+ new_pool->is_shm = is_shm;
680+#endif
681+
682 (void) ap_release_mutex(alloc_mutex);
683+#if defined(EAPI) && defined(EAPI_MM)
684+ if (is_shm)
685+ (void)ap_mm_unlock(mm);
686+#endif
687 ap_unblock_alarms();
688
689 return new_pool;
690 }
691
692+#if defined(EAPI)
693+#if defined(EAPI_MM)
694+API_EXPORT(struct pool *) ap_make_sub_pool(struct pool *p)
695+{
696+ return make_sub_pool_internal(p, 0);
697+}
698+API_EXPORT(struct pool *) ap_make_shared_sub_pool(struct pool *p)
699+{
700+ return make_sub_pool_internal(p, 1);
701+}
702+#else
703+API_EXPORT(struct pool *) ap_make_shared_sub_pool(struct pool *p)
704+{
705+ return NULL;
706+}
707+#endif
708+#endif
709+
710 #ifdef POOL_DEBUG
711 static void stack_var_init(char *s)
712 {
713@@ -488,6 +573,13 @@
714 }
715 #endif
716
717+#if defined(EAPI)
718+int ap_shared_pool_possible(void)
719+{
720+ return ap_mm_useable();
721+}
722+#endif
723+
724 #ifdef ALLOC_STATS
725 static void dump_stats(void)
726 {
727@@ -520,6 +612,58 @@
728 return permanent_pool;
729 }
730
731+#if defined(EAPI)
732+void ap_init_alloc_shared(int early)
733+{
734+#if defined(EAPI_MM)
735+ int mm_size;
736+ char *mm_path;
737+ char *err1, *err2;
738+
739+ if (early) {
740+ /* process very early on startup */
741+ mm_size = ap_mm_maxsize();
742+ if (mm_size > EAPI_MM_CORE_MAXSIZE)
743+ mm_size = EAPI_MM_CORE_MAXSIZE;
744+ mm_path = ap_server_root_relative(permanent_pool,
745+ ap_psprintf(permanent_pool, "%s.%ld",
746+ EAPI_MM_CORE_PATH, (long)getpid()));
747+ if ((mm = ap_mm_create(mm_size, mm_path)) == NULL) {
748+ fprintf(stderr, "Ouch! ap_mm_create(%d, \"%s\") failed\n", mm_size, mm_path);
749+ err1 = ap_mm_error();
750+ if (err1 == NULL)
751+ err1 = "-unknown-";
752+ err2 = strerror(errno);
753+ if (err2 == NULL)
754+ err2 = "-unknown-";
755+ fprintf(stderr, "Error: MM: %s: OS: %s\n", err1, err2);
756+ exit(1);
757+ }
758+ }
759+ else {
760+ /* process a lot later on startup */
761+#ifdef WIN32
762+ ap_mm_permission(mm, (_S_IREAD|_S_IWRITE), ap_user_id, -1);
763+#else
764+ ap_mm_permission(mm, (S_IRUSR|S_IWUSR), ap_user_id, -1);
765+#endif
766+ }
767+#endif /* EAPI_MM */
768+ return;
769+}
770+
771+void ap_kill_alloc_shared(void)
772+{
773+#if defined(EAPI_MM)
774+ if (mm != NULL) {
775+ ap_mm_destroy(mm);
776+ mm = NULL;
777+ }
778+#endif /* EAPI_MM */
779+ return;
780+}
781+#endif /* EAPI */
782+
783 void ap_cleanup_alloc(void)
784 {
785 ap_destroy_mutex(alloc_mutex);
786@@ -530,10 +674,18 @@
787 {
788 ap_block_alarms();
789
790+#if defined(EAPI) && defined(EAPI_MM)
791+ if (a->is_shm)
792+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
793+#endif
794 (void) ap_acquire_mutex(alloc_mutex);
795 while (a->sub_pools)
796 ap_destroy_pool(a->sub_pools);
797 (void) ap_release_mutex(alloc_mutex);
798+#if defined(EAPI) && defined(EAPI_MM)
799+ if (a->is_shm)
800+ (void)ap_mm_unlock(mm);
801+#endif
802 /* Don't hold the mutex during cleanups. */
803 run_cleanups(a->cleanups);
804 a->cleanups = NULL;
805@@ -567,6 +719,10 @@
806 ap_block_alarms();
807 ap_clear_pool(a);
808
809+#if defined(EAPI) && defined(EAPI_MM)
810+ if (a->is_shm)
811+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
812+#endif
813 (void) ap_acquire_mutex(alloc_mutex);
814 if (a->parent) {
815 if (a->parent->sub_pools == a)
816@@ -577,6 +733,10 @@
817 a->sub_next->sub_prev = a->sub_prev;
818 }
819 (void) ap_release_mutex(alloc_mutex);
820+#if defined(EAPI) && defined(EAPI_MM)
821+ if (a->is_shm)
822+ (void)ap_mm_unlock(mm);
823+#endif
824
825 free_blocks(a->first);
826 ap_unblock_alarms();
827@@ -591,6 +751,30 @@
828 return bytes_in_block_list(block_freelist);
829 }
830
831+#if defined(EAPI)
832+API_EXPORT(int) ap_acquire_pool(pool *p, ap_pool_lock_mode mode)
833+{
834+#if defined(EAPI_MM)
835+ if (!p->is_shm)
836+ return 1;
837+ return ap_mm_lock(mm, mode == AP_POOL_RD ? AP_MM_LOCK_RD : AP_MM_LOCK_RW);
838+#else
839+ return 1;
840+#endif
841+}
842+
843+API_EXPORT(int) ap_release_pool(pool *p)
844+{
845+#if defined(EAPI_MM)
846+ if (!p->is_shm)
847+ return 1;
848+ return ap_mm_unlock(mm);
849+#else
850+ return 1;
851+#endif
852+}
853+#endif /* EAPI */
854+
855 /*****************************************************************
856 * POOL_DEBUG support
857 */
858@@ -756,16 +940,31 @@
859
860 ap_block_alarms();
861
862+#if defined(EAPI) && defined(EAPI_MM)
863+ if (a->is_shm)
864+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
865+#endif
866 (void) ap_acquire_mutex(alloc_mutex);
867
868+#if defined(EAPI) && defined(EAPI_MM)
869+ blok = new_block(size, a->is_shm);
870+#else
871 blok = new_block(size);
872+#endif
873 a->last->h.next = blok;
874 a->last = blok;
875 #ifdef POOL_DEBUG
876 blok->h.owning_pool = a;
877 #endif
878+#if defined(EAPI) && defined(EAPI_MM)
879+ blok->h.is_shm = a->is_shm;
880+#endif
881
882 (void) ap_release_mutex(alloc_mutex);
883+#if defined(EAPI) && defined(EAPI_MM)
884+ if (a->is_shm)
885+ (void)ap_mm_unlock(mm);
886+#endif
887
888 ap_unblock_alarms();
889
890@@ -877,6 +1076,11 @@
891 char *ptr;
892
893 size = (char *)ps->vbuff.curpos - ps->base;
894+#if defined(EAPI) && defined(EAPI_MM)
895+ if (ps->block->h.is_shm)
896+ ptr = ap_mm_realloc(ps->base, 2*size);
897+ else
898+#endif
899 ptr = realloc(ps->base, 2*size);
900 if (ptr == NULL) {
901 fputs("Ouch! Out of memory!\n", stderr);
902@@ -897,9 +1101,21 @@
903 cur_len = strp - blok->h.first_avail;
904
905 /* must try another blok */
906+#if defined(EAPI) && defined(EAPI_MM)
907+ if (blok->h.is_shm)
908+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
909+#endif
910 (void) ap_acquire_mutex(alloc_mutex);
911+#if defined(EAPI) && defined(EAPI_MM)
912+ nblok = new_block(2 * cur_len, blok->h.is_shm);
913+#else
914 nblok = new_block(2 * cur_len);
915+#endif
916 (void) ap_release_mutex(alloc_mutex);
917+#if defined(EAPI) && defined(EAPI_MM)
918+ if (blok->h.is_shm)
919+ (void)ap_mm_unlock(mm);
920+#endif
921 memcpy(nblok->h.first_avail, blok->h.first_avail, cur_len);
922 ps->vbuff.curpos = nblok->h.first_avail + cur_len;
923 /* save a byte for the NUL terminator */
924@@ -908,10 +1124,18 @@
925 /* did we allocate the current blok? if so free it up */
926 if (ps->got_a_new_block) {
927 debug_fill(blok->h.first_avail, blok->h.endp - blok->h.first_avail);
928+#if defined(EAPI) && defined(EAPI_MM)
929+ if (blok->h.is_shm)
930+ (void)ap_mm_lock(mm, AP_MM_LOCK_RW);
931+#endif
932 (void) ap_acquire_mutex(alloc_mutex);
933 blok->h.next = block_freelist;
934 block_freelist = blok;
935 (void) ap_release_mutex(alloc_mutex);
936+#if defined(EAPI) && defined(EAPI_MM)
937+ if (blok->h.is_shm)
938+ (void)ap_mm_unlock(mm);
939+#endif
940 }
941 ps->blok = nblok;
942 ps->got_a_new_block = 1;
943@@ -930,6 +1154,11 @@
944 void *ptr;
945
946 ap_block_alarms();
947+#if defined(EAPI) && defined(EAPI_MM)
948+ if (p->is_shm)
949+ ps.base = ap_mm_malloc(mm, 512);
950+ else
951+#endif
952 ps.base = malloc(512);
953 if (ps.base == NULL) {
954 fputs("Ouch! Out of memory!\n", stderr);
955@@ -942,6 +1171,11 @@
956 *ps.vbuff.curpos++ = '\0';
957 ptr = ps.base;
958 /* shrink */
959+#if defined(EAPI) && defined(EAPI_MM)
960+ if (p->is_shm)
961+ ptr = ap_mm_realloc(ptr, (char *)ps.vbuff.curpos - (char *)ptr);
962+ else
963+#endif
964 ptr = realloc(ptr, (char *)ps.vbuff.curpos - (char *)ptr);
965 if (ptr == NULL) {
966 fputs("Ouch! Out of memory!\n", stderr);
967
968+---------------------------------------------------------------------------
969| Patch the low-level buffer routines to additionally allow
970| modules to intercept the I/O processing via hooks.
971+---------------------------------------------------------------------------
972Index: src/main/buff.c
973--- src/main/buff.c 2001/01/23 11:35:08 1.1.1.10
974+++ src/main/buff.c 2001/01/23 11:48:05 1.18
975@@ -127,7 +127,11 @@
976 select() sometimes returns 1 even though the write will block. We must work around this.
977 */
978
979+#ifdef EAPI
980+API_EXPORT(int) sendwithtimeout(int sock, const char *buf, int len, int flags)
981+#else /* EAPI */
982 int sendwithtimeout(int sock, const char *buf, int len, int flags)
983+#endif /* EAPI */
984 {
985 int iostate = 1;
986 fd_set fdset;
987@@ -195,8 +199,11 @@
988 return (rv);
989 }
990
991-
992+#ifdef EAPI
993+API_EXPORT(int) recvwithtimeout(int sock, char *buf, int len, int flags)
994+#else /* EAPI */
995 int recvwithtimeout(int sock, char *buf, int len, int flags)
996+#endif /* EAPI */
997 {
998 int iostate = 1;
999 fd_set fdset;
1000@@ -274,6 +281,9 @@
1001 }
1002 else
1003 #endif
1004+#ifdef EAPI
1005+ if (!ap_hook_call("ap::buff::read", &rv, fb, buf, nbyte))
1006+#endif /* EAPI */
1007 rv = read(fb->fd_in, buf, nbyte);
1008
1009 return rv;
1010@@ -285,6 +295,9 @@
1011
1012 #if defined (WIN32) || defined(NETWARE)
1013 if (fb->flags & B_SOCKET) {
1014+#ifdef EAPI
1015+ if (!ap_hook_call("ap::buff::recvwithtimeout", &rv, fb, buf, nbyte))
1016+#endif /* EAPI */
1017 rv = recvwithtimeout(fb->fd_in, buf, nbyte, 0);
1018 if (rv == SOCKET_ERROR)
1019 errno = WSAGetLastError();
1020@@ -332,6 +345,9 @@
1021 }
1022 else
1023 #endif
1024+#ifdef EAPI
1025+ if (!ap_hook_call("ap::buff::write", &rv, fb, buf, nbyte))
1026+#endif /* EAPI */
1027 #if defined (B_SFIO)
1028 rv = sfwrite(fb->sf_out, buf, nbyte);
1029 #else
1030@@ -358,6 +374,9 @@
1031
1032 #if defined(WIN32) || defined(NETWARE)
1033 if (fb->flags & B_SOCKET) {
1034+#ifdef EAPI
1035+ if (!ap_hook_call("ap::buff::sendwithtimeout", &rv, fb, buf, nbyte))
1036+#endif /* EAPI */
1037 rv = sendwithtimeout(fb->fd, buf, nbyte, 0);
1038 if (rv == SOCKET_ERROR)
1039 errno = WSAGetLastError();
1040@@ -438,6 +457,10 @@
1041 (size_t) SF_UNBOUND, 1, SF_WRITE);
1042 #endif
1043
1044+#ifdef EAPI
1045+ fb->ctx = ap_ctx_new(p);
1046+#endif /* EAPI */
1047+
1048 return fb;
1049 }
1050
1051@@ -1084,6 +1107,9 @@
1052 i = 0;
1053 while (i < nvec) {
1054 do
1055+#ifdef EAPI
1056+ if (!ap_hook_call("ap::buff::writev", &rv, fb, &vec[i], nvec -i))
1057+#endif /* EAPI */
1058 rv = writev(fb->fd, &vec[i], nvec - i);
1059 while (rv == -1 && (errno == EINTR || errno == EAGAIN)
1060 && !(fb->flags & B_EOUT));
1061
1062+---------------------------------------------------------------------------
1063| Add the implementation of the additional `add_module' and
1064| `rewrite_command' module hooks. Additionally the `ctx'
1065| variables are initialized.
1066+---------------------------------------------------------------------------
1067Index: src/main/http_config.c
1068--- src/main/http_config.c 2001/01/29 19:36:42 1.1.1.11
1069+++ src/main/http_config.c 2001/01/29 19:38:39 1.14
1070@@ -599,6 +599,20 @@
1071 m->name = tmp;
1072 }
1073 #endif /*_OSD_POSIX*/
1074+
1075+#ifdef EAPI
1076+ /*
1077+ * Invoke the `add_module' hook inside the now existing set
1078+ * of modules to let them all now that this module was added.
1079+ */
1080+ {
1081+ module *m2;
1082+ for (m2 = top_module; m2 != NULL; m2 = m2->next)
1083+ if (m2->magic == MODULE_MAGIC_COOKIE_EAPI)
1084+ if (m2->add_module != NULL)
1085+ (*m2->add_module)(m);
1086+ }
1087+#endif /* EAPI */
1088 }
1089
1090 /*
1091@@ -613,6 +627,21 @@
1092 {
1093 module *modp;
1094
1095+#ifdef EAPI
1096+ /*
1097+ * Invoke the `remove_module' hook inside the now existing
1098+ * set of modules to let them all now that this module is
1099+ * beeing removed.
1100+ */
1101+ {
1102+ module *m2;
1103+ for (m2 = top_module; m2 != NULL; m2 = m2->next)
1104+ if (m2->magic == MODULE_MAGIC_COOKIE_EAPI)
1105+ if (m2->remove_module != NULL)
1106+ (*m2->remove_module)(m);
1107+ }
1108+#endif /* EAPI */
1109+
1110 modp = top_module;
1111 if (modp == m) {
1112 /* We are the top module, special case */
1113@@ -1006,6 +1035,27 @@
1114 const command_rec *cmd;
1115 module *mod = top_module;
1116
1117+#ifdef EAPI
1118+ /*
1119+ * Invoke the `rewrite_command' of modules to allow
1120+ * they to rewrite the directive line before we
1121+ * process it.
1122+ */
1123+ {
1124+ module *m;
1125+ char *cp;
1126+ for (m = top_module; m != NULL; m = m->next) {
1127+ if (m->magic == MODULE_MAGIC_COOKIE_EAPI) {
1128+ if (m->rewrite_command != NULL) {
1129+ cp = (m->rewrite_command)(parms, config, l);
1130+ if (cp != NULL)
1131+ l = cp;
1132+ }
1133+ }
1134+ }
1135+ }
1136+#endif /* EAPI */
1137+
1138 if ((l[0] == '#') || (!l[0]))
1139 return NULL;
1140
1141@@ -1440,6 +1490,10 @@
1142 s->limit_req_fieldsize = main_server->limit_req_fieldsize;
1143 s->limit_req_fields = main_server->limit_req_fields;
1144
1145+#ifdef EAPI
1146+ s->ctx = ap_ctx_new(p);
1147+#endif /* EAPI */
1148+
1149 *ps = s;
1150
1151 return ap_parse_vhost_addrs(p, hostname, s);
1152@@ -1550,6 +1604,10 @@
1153
1154 s->module_config = create_server_config(p, s);
1155 s->lookup_defaults = create_default_per_dir_config(p);
1156+
1157+#ifdef EAPI
1158+ s->ctx = ap_ctx_new(p);
1159+#endif /* EAPI */
1160
1161 return s;
1162 }
1163
1164+---------------------------------------------------------------------------
1165| Add the ap_global_ctx variable and the new
1166| ap_add_config_define() function. Additionally the
1167| implementation of the additional `new_connection' module hook
1168| is added plus the initialization of one more `ctx' variable.
1169+---------------------------------------------------------------------------
1170Index: src/main/http_main.c
1171--- src/main/http_main.c 2001/01/29 19:36:43 1.1.1.12
1172+++ src/main/http_main.c 2001/01/29 19:38:39 1.33
1173@@ -260,6 +260,9 @@
1174 int ap_listenbacklog;
1175 int ap_dump_settings = 0;
1176 API_VAR_EXPORT int ap_extended_status = 0;
1177+#ifdef EAPI
1178+API_VAR_EXPORT ap_ctx *ap_global_ctx;
1179+#endif /* EAPI */
1180
1181 /*
1182 * The max child slot ever assigned, preserved across restarts. Necessary
1183@@ -442,6 +445,30 @@
1184 }
1185 }
1186
1187+#ifdef EAPI
1188+API_EXPORT(void) ap_add_config_define(const char *define)
1189+{
1190+ char **var;
1191+ var = (char **)ap_push_array(ap_server_config_defines);
1192+ *var = ap_pstrdup(pcommands, define);
1193+ return;
1194+}
1195+
1196+/*
1197+ * Invoke the `close_connection' hook of modules to let them do
1198+ * some connection dependent actions before we close it.
1199+ */
1200+static void ap_call_close_connection_hook(conn_rec *c)
1201+{
1202+ module *m;
1203+ for (m = top_module; m != NULL; m = m->next)
1204+ if (m->magic == MODULE_MAGIC_COOKIE_EAPI)
1205+ if (m->close_connection != NULL)
1206+ (*m->close_connection)(c);
1207+ return;
1208+}
1209+#endif /* EAPI */
1210+
1211 #ifndef NETWARE
1212 static APACHE_TLS int volatile exit_after_unblock = 0;
1213 #endif
1214@@ -1206,6 +1233,10 @@
1215 ap_log_transaction(log_req);
1216 }
1217
1218+#ifdef EAPI
1219+ ap_call_close_connection_hook(save_req->connection);
1220+#endif /* EAPI */
1221+
1222 ap_bsetflag(save_req->connection->client, B_EOUT, 1);
1223 ap_bclose(save_req->connection->client);
1224
1225@@ -1214,6 +1245,9 @@
1226 ap_longjmp(jmpbuffer, 1);
1227 }
1228 else { /* abort the connection */
1229+#ifdef EAPI
1230+ ap_call_close_connection_hook(current_conn);
1231+#endif /* EAPI */
1232 ap_bsetflag(current_conn->client, B_EOUT, 1);
1233 ap_bclose(current_conn->client);
1234 current_conn->aborted = 1;
1235@@ -1279,7 +1313,11 @@
1236 }
1237 #endif
1238
1239+#ifdef EAPI
1240+API_EXPORT(unsigned int) ap_set_callback_and_alarm(void (*fn) (int), int x)
1241+#else
1242 unsigned int ap_set_callback_and_alarm(void (*fn) (int), int x)
1243+#endif
1244 {
1245 unsigned int old;
1246
1247@@ -1515,10 +1553,16 @@
1248 /* Send any leftover data to the client, but never try to again */
1249
1250 if (ap_bflush(r->connection->client) == -1) {
1251+#ifdef EAPI
1252+ ap_call_close_connection_hook(r->connection);
1253+#endif /* EAPI */
1254 ap_kill_timeout(r);
1255 ap_bclose(r->connection->client);
1256 return;
1257 }
1258+#ifdef EAPI
1259+ ap_call_close_connection_hook(r->connection);
1260+#endif /* EAPI */
1261 ap_bsetflag(r->connection->client, B_EOUT, 1);
1262
1263 /* Close our half of the connection --- send the client a FIN */
1264@@ -2229,6 +2273,9 @@
1265 /* Clear the pool - including any registered cleanups */
1266 ap_destroy_pool(pglobal);
1267 #endif
1268+#ifdef EAPI
1269+ ap_kill_alloc_shared();
1270+#endif
1271 exit(code);
1272 }
1273
1274@@ -3223,6 +3270,24 @@
1275 conn->remote_addr = *remaddr;
1276 conn->remote_ip = ap_pstrdup(conn->pool,
1277 inet_ntoa(conn->remote_addr.sin_addr));
1278+#ifdef EAPI
1279+ conn->ctx = ap_ctx_new(conn->pool);
1280+#endif /* EAPI */
1281+
1282+#ifdef EAPI
1283+ /*
1284+ * Invoke the `new_connection' hook of modules to let them do
1285+ * some connection dependent actions before we go on with
1286+ * processing the request on this connection.
1287+ */
1288+ {
1289+ module *m;
1290+ for (m = top_module; m != NULL; m = m->next)
1291+ if (m->magic == MODULE_MAGIC_COOKIE_EAPI)
1292+ if (m->new_connection != NULL)
1293+ (*m->new_connection)(conn);
1294+ }
1295+#endif /* EAPI */
1296
1297 return conn;
1298 }
1299@@ -3545,6 +3610,11 @@
1300 else {
1301 ap_note_cleanups_for_socket(p, fd);
1302 }
1303+ if (fd >= 0) {
1304+ FD_SET(fd, &listenfds);
1305+ if (fd > listenmaxfd)
1306+ listenmaxfd = fd;
1307+ }
1308 FD_SET(fd, &listenfds);
1309 if (fd > listenmaxfd)
1310 listenmaxfd = fd;
1311@@ -3644,6 +3714,15 @@
1312 printf("Server's Module Magic Number: %u:%u\n",
1313 MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
1314 printf("Server compiled with....\n");
1315+#ifdef EAPI
1316+ printf(" -D EAPI\n");
1317+#endif
1318+#ifdef EAPI_MM
1319+ printf(" -D EAPI_MM\n");
1320+#ifdef EAPI_MM_CORE_PATH
1321+ printf(" -D EAPI_MM_CORE_PATH=\"" EAPI_MM_CORE_PATH "\"\n");
1322+#endif
1323+#endif
1324 #ifdef BIG_SECURITY_HOLE
1325 printf(" -D BIG_SECURITY_HOLE\n");
1326 #endif
1327@@ -3797,6 +3876,22 @@
1328 ap_server_pre_read_config = ap_make_array(pcommands, 1, sizeof(char *));
1329 ap_server_post_read_config = ap_make_array(pcommands, 1, sizeof(char *));
1330 ap_server_config_defines = ap_make_array(pcommands, 1, sizeof(char *));
1331+
1332+#ifdef EAPI
1333+ ap_hook_init();
1334+ ap_hook_configure("ap::buff::read",
1335+ AP_HOOK_SIG4(int,ptr,ptr,int), AP_HOOK_TOPMOST);
1336+ ap_hook_configure("ap::buff::write",
1337+ AP_HOOK_SIG4(int,ptr,ptr,int), AP_HOOK_TOPMOST);
1338+ ap_hook_configure("ap::buff::writev",
1339+ AP_HOOK_SIG4(int,ptr,ptr,int), AP_HOOK_TOPMOST);
1340+ ap_hook_configure("ap::buff::sendwithtimeout",
1341+ AP_HOOK_SIG4(int,ptr,ptr,int), AP_HOOK_TOPMOST);
1342+ ap_hook_configure("ap::buff::recvwithtimeout",
1343+ AP_HOOK_SIG4(int,ptr,ptr,int), AP_HOOK_TOPMOST);
1344+
1345+ ap_global_ctx = ap_ctx_new(NULL);
1346+#endif /* EAPI */
1347 }
1348
1349 #ifndef MULTITHREAD
1350@@ -4216,6 +4311,9 @@
1351
1352 ap_sync_scoreboard_image();
1353 if (ap_scoreboard_image->global.running_generation != ap_my_generation) {
1354+#ifdef EAPI
1355+ ap_call_close_connection_hook(current_conn);
1356+#endif /* EAPI */
1357 ap_bclose(conn_io);
1358 clean_child_exit(0);
1359 }
1360@@ -4244,6 +4342,9 @@
1361 */
1362
1363 #ifdef NO_LINGCLOSE
1364+#ifdef EAPI
1365+ ap_call_close_connection_hook(current_conn);
1366+#endif /* EAPI */
1367 ap_bclose(conn_io); /* just close it */
1368 #else
1369 if (r && r->connection
1370@@ -4254,6 +4355,9 @@
1371 lingering_close(r);
1372 }
1373 else {
1374+#ifdef EAPI
1375+ ap_call_close_connection_hook(current_conn);
1376+#endif /* EAPI */
1377 ap_bsetflag(conn_io, B_EOUT, 1);
1378 ap_bclose(conn_io);
1379 }
1380@@ -4978,16 +5082,31 @@
1381 usage(argv[0]);
1382 }
1383 }
1384+#ifdef EAPI
1385+ ap_init_alloc_shared(TRUE);
1386+#endif
1387
1388 ap_suexec_enabled = init_suexec();
1389 server_conf = ap_read_config(pconf, ptrans, ap_server_confname);
1390
1391+#ifdef EAPI
1392+ ap_init_alloc_shared(FALSE);
1393+#endif
1394+
1395 if (ap_configtestonly) {
1396 fprintf(stderr, "Syntax OK\n");
1397+#ifdef EAPI
1398+ clean_parent_exit(0);
1399+#else
1400 exit(0);
1401+#endif
1402 }
1403 if (ap_dump_settings) {
1404+#ifdef EAPI
1405+ clean_parent_exit(0);
1406+#else
1407 exit(0);
1408+#endif
1409 }
1410
1411 child_timeouts = !ap_standalone || one_process;
1412@@ -5121,6 +5240,10 @@
1413 ap_destroy_pool(r->pool);
1414 }
1415
1416+#ifdef EAPI
1417+ ap_call_close_connection_hook(conn);
1418+#endif /* EAPI */
1419+
1420 ap_bclose(cio);
1421 }
1422 exit(0);
1423@@ -5467,6 +5590,9 @@
1424 ap_kill_cleanups_for_socket(ptrans, csd);
1425
1426 #ifdef NO_LINGCLOSE
1427+#ifdef EAPI
1428+ ap_call_close_connection_hook(current_conn);
1429+#endif /* EAPI */
1430 ap_bclose(conn_io); /* just close it */
1431 #else
1432 if (r && r->connection
1433@@ -5477,6 +5603,9 @@
1434 lingering_close(r);
1435 }
1436 else {
1437+#ifdef EAPI
1438+ ap_call_close_connection_hook(current_conn);
1439+#endif /* EAPI */
1440 ap_bsetflag(conn_io, B_EOUT, 1);
1441 ap_bclose(conn_io);
1442 }
1443@@ -6979,6 +7108,9 @@
1444 sizeof(ap_server_root));
1445 }
1446 }
1447+#ifdef EAPI
1448+ ap_init_alloc_shared(TRUE);
1449+#endif
1450
1451 ap_cpystrn(ap_server_confname,
1452 ap_server_root_relative(pcommands, ap_server_confname),
1453@@ -7020,6 +7152,9 @@
1454 }
1455 #else /* ndef WIN32 */
1456 server_conf = ap_read_config(pconf, ptrans, ap_server_confname);
1457+#endif
1458+#ifdef EAPI
1459+ ap_init_alloc_shared(FALSE);
1460 #endif
1461
1462 if (ap_configtestonly) {
1463
1464+---------------------------------------------------------------------------
1465| Just add the initialization of the `ctx' variable for
1466| conn_rec structures.
1467+---------------------------------------------------------------------------
1468Index: src/main/http_request.c
1469--- src/main/http_request.c 2001/01/23 11:35:09 1.1.1.10
1470+++ src/main/http_request.c 2001/01/23 11:48:07 1.9
1471@@ -1387,6 +1387,9 @@
1472 new->no_local_copy = r->no_local_copy;
1473 new->read_length = r->read_length; /* We can only read it once */
1474 new->vlist_validator = r->vlist_validator;
1475+#ifdef EAPI
1476+ new->ctx = r->ctx;
1477+#endif /* EAPI */
1478
1479 ap_table_setn(new->subprocess_env, "REDIRECT_STATUS",
1480 ap_psprintf(r->pool, "%d", r->status));
1481
1482+---------------------------------------------------------------------------
1483| Just add the initialization of the `ctx' variable for
1484| request_rec structures.
1485+---------------------------------------------------------------------------
1486Index: src/main/http_protocol.c
1487--- src/main/http_protocol.c 2001/01/23 11:35:09 1.1.1.11
1488+++ src/main/http_protocol.c 2001/01/23 11:48:06 1.11
1489@@ -1105,6 +1105,10 @@
1490 r->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */
1491 r->the_request = NULL;
1492
1493+#ifdef EAPI
1494+ r->ctx = ap_ctx_new(r->pool);
1495+#endif /* EAPI */
1496+
1497 #ifdef CHARSET_EBCDIC
1498 ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1);
1499 #endif
1500@@ -1252,6 +1256,11 @@
1501 rnew->read_body = REQUEST_NO_BODY;
1502
1503 rnew->main = (request_rec *) r;
1504+
1505+#ifdef EAPI
1506+ rnew->ctx = r->ctx;
1507+#endif /* EAPI */
1508+
1509 }
1510
1511 void ap_finalize_sub_req_protocol(request_rec *sub)
1512
1513+---------------------------------------------------------------------------
1514| Add support for loading both EAPI and AP13 modules.
1515+---------------------------------------------------------------------------
1516Index: src/modules/standard/mod_so.c
1517--- src/modules/standard/mod_so.c 2001/01/23 11:35:13 1.1.1.6
1518+++ src/modules/standard/mod_so.c 2001/01/23 11:48:08 1.7
1519@@ -263,11 +263,24 @@
1520 * Make sure the found module structure is really a module structure
1521 *
1522 */
1523+#ifdef EAPI
1524+ if ( modp->magic != MODULE_MAGIC_COOKIE_AP13
1525+ && modp->magic != MODULE_MAGIC_COOKIE_EAPI) {
1526+#else
1527 if (modp->magic != MODULE_MAGIC_COOKIE) {
1528+#endif
1529 return ap_pstrcat(cmd->pool, "API module structure `", modname,
1530 "' in file ", szModuleFile, " is garbled -"
1531 " perhaps this is not an Apache module DSO?", NULL);
1532 }
1533+#ifdef EAPI
1534+ if (modp->magic == MODULE_MAGIC_COOKIE_AP13) {
1535+ ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, NULL,
1536+ "Loaded DSO %s uses plain Apache 1.3 API, "
1537+ "this module might crash under EAPI! "
1538+ "(please recompile it with -DEAPI)", filename);
1539+ }
1540+#endif
1541
1542 /*
1543 * Add this module to the Apache core structures
1544
1545+---------------------------------------------------------------------------
1546| Add additional logging functions to the CustomLog directive
1547| which can be used by other modules to create additional
1548| logfile tags. Actually we add two types of hooks: One hook
1549| for intercepting the new and generic %x (eXtension) tag and
1550| one hook for creating new %x tags at all.
1551+---------------------------------------------------------------------------
1552Index: src/modules/standard/mod_log_config.c
1553--- src/modules/standard/mod_log_config.c 2001/01/23 11:35:12 1.1.1.11
1554+++ src/modules/standard/mod_log_config.c 2001/01/23 11:48:08 1.24
1555@@ -262,6 +262,9 @@
1556 typedef const char *(*item_key_func) (request_rec *, char *);
1557
1558 typedef struct {
1559+#ifdef EAPI
1560+ char ch;
1561+#endif
1562 item_key_func func;
1563 char *arg;
1564 int condition_sense;
1565@@ -573,15 +576,36 @@
1566 }
1567 };
1568
1569+#ifdef EAPI
1570+static struct log_item_list *find_log_func(pool *p, char k)
1571+#else /* EAPI */
1572 static struct log_item_list *find_log_func(char k)
1573+#endif /* EAPI */
1574 {
1575 int i;
1576+#ifdef EAPI
1577+ struct log_item_list *lil;
1578+#endif /* EAPI */
1579
1580 for (i = 0; log_item_keys[i].ch; ++i)
1581 if (k == log_item_keys[i].ch) {
1582 return &log_item_keys[i];
1583 }
1584
1585+#ifdef EAPI
1586+ if (ap_hook_status(ap_psprintf(p, "ap::mod_log_config::log_%c", k))
1587+ != AP_HOOK_STATE_NOTEXISTANT) {
1588+ lil = (struct log_item_list *)
1589+ ap_pcalloc(p, sizeof(struct log_item_list));
1590+ if (lil == NULL)
1591+ return NULL;
1592+ lil->ch = k;
1593+ lil->func = NULL;
1594+ lil->want_orig_default = 0;
1595+ return lil;
1596+ }
1597+#endif /* EAPI */
1598+
1599 return NULL;
1600 }
1601
1602@@ -707,7 +731,11 @@
1603 break;
1604
1605 default:
1606+#ifdef EAPI
1607+ l = find_log_func(p, *s++);
1608+#else /* EAPI */
1609 l = find_log_func(*s++);
1610+#endif /* EAPI */
1611 if (!l) {
1612 char dummy[2];
1613
1614@@ -716,6 +744,9 @@
1615 return ap_pstrcat(p, "Unrecognized LogFormat directive %",
1616 dummy, NULL);
1617 }
1618+#ifdef EAPI
1619+ it->ch = s[-1];
1620+#endif
1621 it->func = l->func;
1622 if (it->want_orig == -1) {
1623 it->want_orig = l->want_orig_default;
1624@@ -777,6 +808,15 @@
1625
1626 /* We do. Do it... */
1627
1628+#ifdef EAPI
1629+ if (item->func == NULL) {
1630+ cp = NULL;
1631+ ap_hook_use(ap_psprintf(r->pool, "ap::mod_log_config::log_%c", item->ch),
1632+ AP_HOOK_SIG3(ptr,ptr,ptr), AP_HOOK_DECLINE(NULL),
1633+ &cp, r, item->arg);
1634+ }
1635+ else
1636+#endif
1637 cp = (*item->func) (item->want_orig ? orig : r, item->arg);
1638 return cp ? cp : "-";
1639 }
1640
1641+---------------------------------------------------------------------------
1642| Allow RewriteCond and RewriteRule directives to lookup
1643| variables from other modules.
1644+---------------------------------------------------------------------------
1645Index: src/modules/standard/mod_rewrite.c
1646--- src/modules/standard/mod_rewrite.c 2001/01/23 11:35:13 1.1.1.9
1647+++ src/modules/standard/mod_rewrite.c 2001/01/23 11:48:08 1.7
1648@@ -3637,6 +3637,15 @@
1649 }
1650 #endif /* ndef WIN32 && NETWARE*/
1651
1652+#ifdef EAPI
1653+ else {
1654+ ap_hook_use("ap::mod_rewrite::lookup_variable",
1655+ AP_HOOK_SIG3(ptr,ptr,ptr),
1656+ AP_HOOK_DECLINE(NULL),
1657+ &result, r, var);
1658+ }
1659+#endif
1660+
1661 if (result == NULL) {
1662 return ap_pstrdup(r->pool, "");
1663 }
1664
1665+---------------------------------------------------------------------------
1666| Add an EAPI hook to allow other modules to add content to
1667| the status HTML page.
1668+---------------------------------------------------------------------------
1669Index: src/modules/standard/mod_status.c
1670--- src/modules/standard/mod_status.c 2001/01/23 11:35:14 1.1.1.11
1671+++ src/modules/standard/mod_status.c 2001/01/23 11:48:08 1.8
1672@@ -711,6 +748,12 @@
1673 </table>\n", r);
1674 #endif
1675 }
1676+
1677+#ifdef EAPI
1678+ ap_hook_use("ap::mod_status::display",
1679+ AP_HOOK_SIG4(void,ptr,int,int), AP_HOOK_ALL,
1680+ r, no_table_report, short_report);
1681+#endif
1682
1683 } else {
1684
1685
1686+---------------------------------------------------------------------------
1687| Add hooks to the scheme processing to allow other modules to
1688| recognize more schemes by intercepting this processing.
1689+---------------------------------------------------------------------------
1690Index: src/modules/proxy/mod_proxy.c
1691--- src/modules/proxy/mod_proxy.c 2001/01/23 11:35:10 1.1.1.8
1692+++ src/modules/proxy/mod_proxy.c 2001/01/23 11:48:07 1.15
1693@@ -215,6 +215,9 @@
1694 static int proxy_fixup(request_rec *r)
1695 {
1696 char *url, *p;
1697+#ifdef EAPI
1698+ int rc;
1699+#endif /* EAPI */
1700
1701 if (r->proxyreq == NOT_PROXY || strncmp(r->filename, "proxy:", 6) != 0)
1702 return DECLINED;
1703@@ -222,6 +225,14 @@
1704 url = &r->filename[6];
1705
1706 /* canonicalise each specific scheme */
1707+#ifdef EAPI
1708+ if (ap_hook_use("ap::mod_proxy::canon",
1709+ AP_HOOK_SIG3(int,ptr,ptr),
1710+ AP_HOOK_DECLINE(DECLINED),
1711+ &rc, r, url) && rc != DECLINED)
1712+ return rc;
1713+ else
1714+#endif /* EAPI */
1715 if (strncasecmp(url, "http:", 5) == 0)
1716 return ap_proxy_http_canon(r, url + 5, "http", DEFAULT_HTTP_PORT);
1717 else if (strncasecmp(url, "ftp:", 4) == 0)
1718@@ -237,9 +248,44 @@
1719 static void proxy_init(server_rec *r, pool *p)
1720 {
1721 ap_proxy_garbage_init(r, p);
1722+#ifdef EAPI
1723+ ap_hook_use("ap::mod_proxy::init",
1724+ AP_HOOK_SIG3(void,ptr,ptr), AP_HOOK_ALL, r, p);
1725+#endif
1726 }
1727-
1728
1729+#ifdef EAPI
1730+static void proxy_addmod(module *m)
1731+{
1732+ /* export: ap_proxy_http_canon() as `ap::mod_proxy::http::canon' */
1733+ ap_hook_configure("ap::mod_proxy::http::canon",
1734+ AP_HOOK_SIG5(int,ptr,ptr,ptr,int), AP_HOOK_TOPMOST);
1735+ ap_hook_register("ap::mod_proxy::http::canon",
1736+ ap_proxy_http_canon, AP_HOOK_NOCTX);
1737+
1738+ /* export: ap_proxy_http_handler() as `ap::mod_proxy::http::handler' */
1739+ ap_hook_configure("ap::mod_proxy::http::handler",
1740+ AP_HOOK_SIG6(int,ptr,ptr,ptr,ptr,int), AP_HOOK_TOPMOST);
1741+ ap_hook_register("ap::mod_proxy::http::handler",
1742+ ap_proxy_http_handler, AP_HOOK_NOCTX);
1743+
1744+ /* export: ap_proxyerror() as `ap::mod_proxy::error' */
1745+ ap_hook_configure("ap::mod_proxy::error",
1746+ AP_HOOK_SIG3(int,ptr,ptr), AP_HOOK_TOPMOST);
1747+ ap_hook_register("ap::mod_proxy::error",
1748+ ap_proxyerror, AP_HOOK_NOCTX);
1749+ return;
1750+}
1751+
1752+static void proxy_remmod(module *m)
1753+{
1754+ /* remove the hook references */
1755+ ap_hook_unregister("ap::mod_proxy::http::canon", ap_proxy_http_canon);
1756+ ap_hook_unregister("ap::mod_proxy::http::handler", ap_proxy_http_handler);
1757+ ap_hook_unregister("ap::mod_proxy::error", ap_proxyerror);
1758+ return;
1759+}
1760+#endif /* EAPI */
1761
1762 /* Send a redirection if the request contains a hostname which is not */
1763 /* fully qualified, i.e. doesn't have a domain name appended. Some proxy */
1764@@ -369,6 +415,14 @@
1765 /* CONNECT is a special method that bypasses the normal
1766 * proxy code.
1767 */
1768+#ifdef EAPI
1769+ if (!ap_hook_use("ap::mod_proxy::handler",
1770+ AP_HOOK_SIG7(int,ptr,ptr,ptr,ptr,int,ptr),
1771+ AP_HOOK_DECLINE(DECLINED),
1772+ &rc, r, cr, url,
1773+ ents[i].hostname, ents[i].port,
1774+ ents[i].protocol) || rc == DECLINED) {
1775+#endif /* EAPI */
1776 if (r->method_number == M_CONNECT)
1777 rc = ap_proxy_connect_handler(r, cr, url, ents[i].hostname,
1778 ents[i].port);
1779@@ -378,6 +432,9 @@
1780 ents[i].port);
1781 else
1782 rc = DECLINED;
1783+#ifdef EAPI
1784+ }
1785+#endif /* EAPI */
1786
1787 /* an error or success */
1788 if (rc != DECLINED && rc != HTTP_BAD_GATEWAY)
1789@@ -391,6 +448,14 @@
1790 * give up??
1791 */
1792 /* handle the scheme */
1793+#ifdef EAPI
1794+ if (ap_hook_use("ap::mod_proxy::handler",
1795+ AP_HOOK_SIG7(int,ptr,ptr,ptr,ptr,int,ptr),
1796+ AP_HOOK_DECLINE(DECLINED),
1797+ &rc, r, cr, url,
1798+ NULL, 0, scheme) && rc != DECLINED)
1799+ return rc;
1800+#endif /* EAPI */
1801 if (r->method_number == M_CONNECT)
1802 return ap_proxy_connect_handler(r, cr, url, NULL, 0);
1803 if (strcasecmp(scheme, "http") == 0)
1804@@ -955,6 +1020,12 @@
1805 NULL, /* child_init */
1806 NULL, /* child_exit */
1807 proxy_detect /* post read-request */
1808+#ifdef EAPI
1809+ ,proxy_addmod, /* EAPI: add_module */
1810+ proxy_remmod, /* EAPI: remove_module */
1811+ NULL, /* EAPI: rewrite_command */
1812+ NULL /* EAPI: new_connection */
1813+#endif
1814 };
1815
1816
1817
1818+---------------------------------------------------------------------------
1819| Add hooks to the HTTP processing to allow other modules
1820| to enhance it by intercepting this processing.
1821+---------------------------------------------------------------------------
1822Index: src/modules/proxy/proxy_http.c
1823--- src/modules/proxy/proxy_http.c 2001/01/23 11:35:10 1.1.1.9
1824+++ src/modules/proxy/proxy_http.c 2001/01/23 11:48:07 1.17
1825@@ -190,6 +190,9 @@
1826 const char *urlptr = NULL;
1827 const char *datestr;
1828 struct tbl_do_args tdo;
1829+#ifdef EAPI
1830+ char *peer;
1831+#endif
1832
1833 void *sconf = r->server->module_config;
1834 proxy_server_conf *conf =
1835@@ -208,6 +211,12 @@
1836 return HTTP_BAD_REQUEST;
1837 urlptr += 3;
1838 destport = DEFAULT_HTTP_PORT;
1839+#ifdef EAPI
1840+ ap_hook_use("ap::mod_proxy::http::handler::set_destport",
1841+ AP_HOOK_SIG2(int,ptr),
1842+ AP_HOOK_TOPMOST,
1843+ &destport, r);
1844+#endif /* EAPI */
1845 strp = strchr(urlptr, '/');
1846 if (strp == NULL) {
1847 desthost = ap_pstrdup(p, urlptr);
1848@@ -244,12 +253,18 @@
1849 err = ap_proxy_host2addr(proxyhost, &server_hp);
1850 if (err != NULL)
1851 return DECLINED; /* try another */
1852+#ifdef EAPI
1853+ peer = ap_psprintf(p, "%s:%u", proxyhost, proxyport);
1854+#endif
1855 }
1856 else {
1857 server.sin_port = htons(destport);
1858 err = ap_proxy_host2addr(desthost, &server_hp);
1859 if (err != NULL)
1860 return ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR, err);
1861+#ifdef EAPI
1862+ peer = ap_psprintf(p, "%s:%u", desthost, destport);
1863+#endif
1864 }
1865
1866 sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
1867@@ -306,13 +321,41 @@
1868 f = ap_bcreate(p, B_RDWR | B_SOCKET);
1869 ap_bpushfd(f, sock, sock);
1870
1871+#ifdef EAPI
1872+ {
1873+ char *errmsg = NULL;
1874+ ap_hook_use("ap::mod_proxy::http::handler::new_connection",
1875+ AP_HOOK_SIG4(ptr,ptr,ptr,ptr),
1876+ AP_HOOK_DECLINE(NULL),
1877+ &errmsg, r, f, peer);
1878+ if (errmsg != NULL)
1879+ return ap_proxyerror(r, HTTP_BAD_GATEWAY, errmsg);
1880+ }
1881+#endif /* EAPI */
1882+
1883 ap_hard_timeout("proxy send", r);
1884 ap_bvputs(f, r->method, " ", proxyhost ? url : urlptr, " HTTP/1.0" CRLF,
1885 NULL);
1886+#ifdef EAPI
1887+ {
1888+ int rc = DECLINED;
1889+ ap_hook_use("ap::mod_proxy::http::handler::write_host_header",
1890+ AP_HOOK_SIG6(int,ptr,ptr,ptr,int,ptr),
1891+ AP_HOOK_DECLINE(DECLINED),
1892+ &rc, r, f, desthost, destport, destportstr);
1893+ if (rc == DECLINED) {
1894+ if (destportstr != NULL && destport != DEFAULT_HTTP_PORT)
1895+ ap_bvputs(f, "Host: ", desthost, ":", destportstr, CRLF, NULL);
1896+ else
1897+ ap_bvputs(f, "Host: ", desthost, CRLF, NULL);
1898+ }
1899+ }
1900+#else /* EAPI */
1901 if (destportstr != NULL && destport != DEFAULT_HTTP_PORT)
1902 ap_bvputs(f, "Host: ", desthost, ":", destportstr, CRLF, NULL);
1903 else
1904 ap_bvputs(f, "Host: ", desthost, CRLF, NULL);
1905+#endif /* EAPI */
1906
1907 if (conf->viaopt == via_block) {
1908 /* Block all outgoing Via: headers */
1909
1910+---------------------------------------------------------------------------
1911| Add EAPI hooks in module structure for APXS generated samples.
1912+---------------------------------------------------------------------------
1913Index: src/support/apxs.pl
1914--- src/support/apxs.pl 2001/01/23 11:35:14 1.1.1.9
1915+++ src/support/apxs.pl 2001/01/23 11:48:09 1.9
1916@@ -654,5 +654,11 @@
1917 NULL, /* child_init */
1918 NULL, /* child_exit */
1919 NULL /* [#0] post read-request */
1920+#ifdef EAPI
1921+ ,NULL, /* EAPI: add_module */
1922+ NULL, /* EAPI: remove_module */
1923+ NULL, /* EAPI: rewrite_command */
1924+ NULL /* EAPI: new_connection */
1925+#endif
1926 };
1927
1928
1929+---------------------------------------------------------------------------
1930| Add the EAPI functions, so the stuff can be built under AIX
1931| and similar braindead platforms as DSO.
1932+---------------------------------------------------------------------------
1933Index: src/support/httpd.exp
1934--- src/support/httpd.exp 2000/10/12 08:17:39 1.1.1.8
1935+++ src/support/httpd.exp 2000/10/12 08:31:48 1.10
1936@@ -421,3 +421,59 @@
1937 XML_SetUnparsedEntityDeclHandler
1938 XML_SetUserData
1939 XML_UseParserAsHandlerArg
1940+ap_add_config_define
1941+ap_make_shared_sub_pool
1942+ap_global_ctx
1943+ap_ctx_new
1944+ap_ctx_get
1945+ap_ctx_set
1946+ap_hook_init
1947+ap_hook_kill
1948+ap_hook_configure
1949+ap_hook_register_I
1950+ap_hook_unregister_I
1951+ap_hook_status
1952+ap_hook_use
1953+ap_hook_call
1954+ap_mm_useable
1955+ap_MM_create
1956+ap_MM_permission
1957+ap_MM_destroy
1958+ap_MM_lock
1959+ap_MM_unlock
1960+ap_MM_malloc
1961+ap_MM_realloc
1962+ap_MM_free
1963+ap_MM_calloc
1964+ap_MM_strdup
1965+ap_MM_sizeof
1966+ap_MM_maxsize
1967+ap_MM_available
1968+ap_MM_error
1969+ap_mm_create
1970+ap_mm_permission
1971+ap_mm_destroy
1972+ap_mm_lock
1973+ap_mm_unlock
1974+ap_mm_malloc
1975+ap_mm_realloc
1976+ap_mm_free
1977+ap_mm_calloc
1978+ap_mm_strdup
1979+ap_mm_sizeof
1980+ap_mm_maxsize
1981+ap_mm_available
1982+ap_mm_error
1983+ap_mm_display_info
1984+ap_mm_core_create
1985+ap_mm_core_permission
1986+ap_mm_core_delete
1987+ap_mm_core_size
1988+ap_mm_core_lock
1989+ap_mm_core_unlock
1990+ap_mm_core_maxsegsize
1991+ap_mm_core_align2page
1992+ap_mm_core_align2word
1993+ap_mm_lib_error_set
1994+ap_mm_lib_error_get
1995+ap_mm_lib_version
1996
1997+---------------------------------------------------------------------------
1998| Add the EAPI functions, so the stuff can be built under
1999| Windows 95 and similar braindead platforms as DDL.
2000+---------------------------------------------------------------------------
2001Index: src/ApacheCore.def
2002--- src/ApacheCore.def 2001/01/23 11:35:01 1.1.1.7
2003+++ src/ApacheCore.def 2001/01/23 12:38:37 1.10
2004@@ -389,3 +389,70 @@
2005 ap_stripprefix @380
2006 ap_os_dso_load @381
2007 ap_os_dso_error @382
2008+
2009+ ; EAPI extended symbols
2010+ ; note; no ID's, so these all bind by name rather than ordinal since
2011+ ; their ordinals would change with symbol changes in the distribution
2012+ ap_add_config_define
2013+ ap_global_ctx DATA
2014+ ap_ctx_new
2015+ ap_ctx_get
2016+ ap_ctx_overlay
2017+ ap_ctx_set
2018+ ap_hook_init
2019+ ap_hook_kill
2020+ ap_hook_configure
2021+ ap_hook_register_I
2022+ ap_hook_unregister_I
2023+ ap_hook_status
2024+ ap_hook_use
2025+ ap_hook_call
2026+ ap_set_callback_and_alarm
2027+ recvwithtimeout
2028+ sendwithtimeout
2029+ ap_aquire_pool
2030+ ap_make_shared_pool
2031+ ap_make_shared_sub_pool
2032+ ap_release_pool
2033+ ap_mm_useable
2034+ ap_MM_create
2035+ ap_MM_permission
2036+ ap_MM_destroy
2037+ ap_MM_lock
2038+ ap_MM_unlock
2039+ ap_MM_malloc
2040+ ap_MM_realloc
2041+ ap_MM_free
2042+ ap_MM_calloc
2043+ ap_MM_strdup
2044+ ap_MM_sizeof
2045+ ap_MM_maxsize
2046+ ap_MM_available
2047+ ap_MM_error
2048+ ap_mm_create
2049+ ap_mm_permission
2050+ ap_mm_destroy
2051+ ap_mm_lock
2052+ ap_mm_unlock
2053+ ap_mm_malloc
2054+ ap_mm_realloc
2055+ ap_mm_free
2056+ ap_mm_calloc
2057+ ap_mm_strdup
2058+ ap_mm_sizeof
2059+ ap_mm_maxsize
2060+ ap_mm_available
2061+ ap_mm_error
2062+ ap_mm_display_info
2063+ ap_mm_core_create
2064+ ap_mm_core_permission
2065+ ap_mm_core_delete
2066+ ap_mm_core_size
2067+ ap_mm_core_lock
2068+ ap_mm_core_unlock
2069+ ap_mm_core_align2page
2070+ ap_mm_core_align2word
2071+ ap_mm_lib_error_set
2072+ ap_mm_lib_error_get
2073+ ap_mm_lib_version
2074+
This page took 0.313405 seconds and 4 git commands to generate.