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