/* ==================================================================== * Copyright (c) 1998-2000 The Apache Group. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * 4. The names "Apache Server" and "Apache Group" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Group and was originally based * on public domain software written at the National Center for * Supercomputing Applications, University of Illinois, Urbana-Champaign. * For more information on the Apache Group and the Apache HTTP server * project, please see . * */ /* ** Implementation of a Generic Hook Interface for Apache ** Written by Ralf S. Engelschall ** ** See POD document at end of ap_hook.h for description. ** View it with the command ``pod2man ap_hook.h | nroff -man | more'' ** */ /* * Premature optimization is * the root of all evil. * -- D. E. Knuth */ #include "httpd.h" #include "http_log.h" #include "ap_config.h" #include "ap_hook.h" /* * the internal hook pool */ static ap_hook_entry **ap_hook_pool = NULL; /* * forward prototypes for internal functions */ static int ap_hook_call_func(va_list ap, ap_hook_entry *he, ap_hook_func *hf); static ap_hook_entry *ap_hook_create(char *hook); static ap_hook_entry *ap_hook_find(char *hook); static void ap_hook_destroy(ap_hook_entry *he); /* * Initialize the hook mechanism */ API_EXPORT(void) ap_hook_init(void) { int i; if (ap_hook_pool != NULL) return; ap_hook_pool = (ap_hook_entry **)malloc(sizeof(ap_hook_entry *) *(AP_HOOK_MAX_ENTRIES+1)); for (i = 0; i < AP_HOOK_MAX_ENTRIES; i++) ap_hook_pool[i] = NULL; return; } /* * Kill the hook mechanism */ API_EXPORT(void) ap_hook_kill(void) { int i; if (ap_hook_pool == NULL) return; for (i = 0; ap_hook_pool[i] != NULL; i++) ap_hook_destroy(ap_hook_pool[i]); free(ap_hook_pool); ap_hook_pool = NULL; return; } /* * Smart creation of a hook (when it exist this is the same as * ap_hook_find, when it doesn't exists it is created) */ static ap_hook_entry *ap_hook_create(char *hook) { int i; ap_hook_entry *he; for (i = 0; ap_hook_pool[i] != NULL; i++) if (strcmp(ap_hook_pool[i]->he_hook, hook) == 0) return ap_hook_pool[i]; if (i >= AP_HOOK_MAX_ENTRIES) return NULL; if ((he = (ap_hook_entry *)malloc(sizeof(ap_hook_entry))) == NULL) return NULL; ap_hook_pool[i] = he; he->he_hook = strdup(hook); he->he_sig = AP_HOOK_SIG_UNKNOWN; he->he_modeid = AP_HOOK_MODE_UNKNOWN; he->he_modeval.v_int = 0; he->he_func = (ap_hook_func **)malloc(sizeof(ap_hook_func *) *(AP_HOOK_MAX_FUNCS+1)); if (he->he_func == NULL) return FALSE; for (i = 0; i < AP_HOOK_MAX_FUNCS; i++) he->he_func[i] = NULL; return he; } /* * Find a particular hook */ static ap_hook_entry *ap_hook_find(char *hook) { int i; for (i = 0; ap_hook_pool[i] != NULL; i++) if (strcmp(ap_hook_pool[i]->he_hook, hook) == 0) return ap_hook_pool[i]; return NULL; } /* * Destroy a particular hook */ static void ap_hook_destroy(ap_hook_entry *he) { int i; if (he == NULL) return; free(he->he_hook); for (i = 0; he->he_func[i] != NULL; i++) free(he->he_func[i]); free(he->he_func); free(he); return; } /* * Configure a particular hook, * i.e. remember its signature and return value mode */ API_EXPORT(int) ap_hook_configure(char *hook, ap_hook_sig sig, ap_hook_mode modeid, ...) { ap_hook_entry *he; va_list ap; int rc; va_start(ap, modeid); if ((he = ap_hook_create(hook)) == NULL) rc = FALSE; else { he->he_sig = sig; he->he_modeid = modeid; if (modeid == AP_HOOK_MODE_DECLINE || modeid == AP_HOOK_MODE_DECLTMP) { if (AP_HOOK_SIG_HAS(sig, RC, char)) he->he_modeval.v_char = va_arg(ap, va_type(char)); else if (AP_HOOK_SIG_HAS(sig, RC, int)) he->he_modeval.v_int = va_arg(ap, va_type(int)); else if (AP_HOOK_SIG_HAS(sig, RC, long)) he->he_modeval.v_long = va_arg(ap, va_type(long)); else if (AP_HOOK_SIG_HAS(sig, RC, float)) he->he_modeval.v_float = va_arg(ap, va_type(float)); else if (AP_HOOK_SIG_HAS(sig, RC, double)) he->he_modeval.v_double = va_arg(ap, va_type(double)); else if (AP_HOOK_SIG_HAS(sig, RC, ptr)) he->he_modeval.v_ptr = va_arg(ap, va_type(ptr)); } rc = TRUE; } va_end(ap); return rc; } /* * Register a function to call for a hook */ API_EXPORT(int) ap_hook_register_I(char *hook, void *func, void *ctx) { int i, j; ap_hook_entry *he; ap_hook_func *hf; if ((he = ap_hook_create(hook)) == NULL) return FALSE; for (i = 0; he->he_func[i] != NULL; i++) if (he->he_func[i]->hf_ptr == func) return FALSE; if (i == AP_HOOK_MAX_FUNCS) return FALSE; if ((hf = (ap_hook_func *)malloc(sizeof(ap_hook_func))) == NULL) return FALSE; for (j = i; j >= 0; j--) he->he_func[j+1] = he->he_func[j]; he->he_func[0] = hf; hf->hf_ptr = func; hf->hf_ctx = ctx; return TRUE; } /* * Unregister a function to call for a hook */ API_EXPORT(int) ap_hook_unregister_I(char *hook, void *func) { int i, j; ap_hook_entry *he; if ((he = ap_hook_find(hook)) == NULL) return FALSE; for (i = 0; he->he_func[i] != NULL; i++) { if (he->he_func[i]->hf_ptr == func) { free(he->he_func[i]); for (j = i; he->he_func[j] != NULL; j++) he->he_func[j] = he->he_func[j+1]; return TRUE; } } return FALSE; } /* * Retrieve the status of a particular hook */ API_EXPORT(ap_hook_state) ap_hook_status(char *hook) { ap_hook_entry *he; if ((he = ap_hook_find(hook)) == NULL) return AP_HOOK_STATE_NOTEXISTANT; if ( he->he_func[0] != NULL && he->he_sig != AP_HOOK_SIG_UNKNOWN && he->he_modeid != AP_HOOK_MODE_UNKNOWN) return AP_HOOK_STATE_REGISTERED; if ( he->he_sig != AP_HOOK_SIG_UNKNOWN && he->he_modeid != AP_HOOK_MODE_UNKNOWN) return AP_HOOK_STATE_CONFIGURED; return AP_HOOK_STATE_ESTABLISHED; } /* * Use a hook, i.e. optional on-the-fly configure it before calling it */ API_EXPORT(int) ap_hook_use(char *hook, ap_hook_sig sig, ap_hook_mode modeid, ...) { int i; ap_hook_value modeval; ap_hook_entry *he; va_list ap; int rc; va_start(ap, modeid); if (modeid == AP_HOOK_MODE_DECLINE || modeid == AP_HOOK_MODE_DECLTMP) { if (AP_HOOK_SIG_HAS(sig, RC, char)) modeval.v_char = va_arg(ap, va_type(char)); else if (AP_HOOK_SIG_HAS(sig, RC, int)) modeval.v_int = va_arg(ap, va_type(int)); else if (AP_HOOK_SIG_HAS(sig, RC, long)) modeval.v_long = va_arg(ap, va_type(long)); else if (AP_HOOK_SIG_HAS(sig, RC, float)) modeval.v_float = va_arg(ap, va_type(float)); else if (AP_HOOK_SIG_HAS(sig, RC, double)) modeval.v_double = va_arg(ap, va_type(double)); else if (AP_HOOK_SIG_HAS(sig, RC, ptr)) modeval.v_ptr = va_arg(ap, va_type(ptr)); } if ((he = ap_hook_create(hook)) == NULL) return FALSE; if (he->he_sig == AP_HOOK_SIG_UNKNOWN) he->he_sig = sig; if (he->he_modeid == AP_HOOK_MODE_UNKNOWN) { he->he_modeid = modeid; he->he_modeval = modeval; } for (i = 0; he->he_func[i] != NULL; i++) if (ap_hook_call_func(ap, he, he->he_func[i])) break; if (i > 0 && he->he_modeid == AP_HOOK_MODE_ALL) rc = TRUE; else if (i == AP_HOOK_MAX_FUNCS || he->he_func[i] == NULL) rc = FALSE; else rc = TRUE; va_end(ap); return rc; } /* * Call a hook */ API_EXPORT(int) ap_hook_call(char *hook, ...) { int i; ap_hook_entry *he; va_list ap; int rc; va_start(ap, hook); if ((he = ap_hook_find(hook)) == NULL) { va_end(ap); return FALSE; } if ( he->he_sig == AP_HOOK_SIG_UNKNOWN || he->he_modeid == AP_HOOK_MODE_UNKNOWN) { va_end(ap); return FALSE; } for (i = 0; he->he_func[i] != NULL; i++) if (ap_hook_call_func(ap, he, he->he_func[i])) break; if (i > 0 && he->he_modeid == AP_HOOK_MODE_ALL) rc = TRUE; else if (i == AP_HOOK_MAX_FUNCS || he->he_func[i] == NULL) rc = FALSE; else rc = TRUE; va_end(ap); return rc; } static int ap_hook_call_func(va_list ap, ap_hook_entry *he, ap_hook_func *hf) { void *v_rc; ap_hook_value v_tmp; int rc; /* * Now we dispatch the various function calls. We support function * signatures with up to 9 types (1 return type, 8 argument types) where * each argument can have 7 different types (ctx, char, int, long, float, * double, ptr), so theoretically there are 9^7 (=4782969) combinations * possible. But because we don't need all of them, of course, we * implement only the following well chosen subset (duplicates are ok): * * 1. `The basic hook'. * * void func() * * 2. The standard set of signatures which form all combinations of * int&ptr based signatures for up to 3 arguments. We provide * them per default for module authors. * * int func() * ptr func() * int func(int) * int func(ptr) * ptr func(int) * ptr func(ptr) * int func(int,int) * int func(int,ptr) * int func(ptr,int) * int func(ptr,ptr) * ptr func(int,int) * ptr func(int,ptr) * ptr func(ptr,int) * ptr func(ptr,ptr) * int func(int,int,int) * int func(int,int,ptr) * int func(int,ptr,int) * int func(int,ptr,ptr) * int func(ptr,int,int) * int func(ptr,int,ptr) * int func(ptr,ptr,int) * int func(ptr,ptr,ptr) * ptr func(int,int,int) * ptr func(int,int,ptr) * ptr func(int,ptr,int) * ptr func(int,ptr,ptr) * ptr func(ptr,int,int) * ptr func(ptr,int,ptr) * ptr func(ptr,ptr,int) * ptr func(ptr,ptr,ptr) * * 3. Actually currently used hooks. * * int func(ptr) [2x] * int func(ptr,ptr) [2x] * int func(ptr,ptr,int) [5x] * int func(ptr,ptr,ptr,int) [1x] * int func(ptr,ptr,ptr,int,ptr) [1x] * int func(ptr,ptr,ptr,ptr,int) [1x] * int func(ptr,ptr,ptr,ptr,int,ptr) [1x] * ptr func(ptr,ptr) [3x] * ptr func(ptr,ptr,ptr,ptr,ptr) [1x] * void func(ptr) [2x] * void func(ptr,int,int) [1x] * void func(ptr,ptr) [5x] * void func(ptr,ptr,ptr) [3x] * void func(ptr,ptr,ptr,ptr) [2x] * * To simplify the programming task we generate the actual dispatch code * for these calls via the embedded Perl script at the end of this source * file. This script parses the above lines and generates the section * below. So, when you need more signature variants just add them to the * above list and run * * $ perl ap_hook.c * * This automatically updates the above code. */ rc = TRUE; v_rc = NULL; if (!AP_HOOK_SIG_HAS(he->he_sig, RC, void)) { if (he->he_modeid == AP_HOOK_MODE_DECLTMP) { /* the return variable is a temporary one */ if (AP_HOOK_SIG_HAS(he->he_sig, RC, char)) v_rc = &v_tmp.v_char; else if (AP_HOOK_SIG_HAS(he->he_sig, RC, int)) v_rc = &v_tmp.v_int; else if (AP_HOOK_SIG_HAS(he->he_sig, RC, long)) v_rc = &v_tmp.v_long; else if (AP_HOOK_SIG_HAS(he->he_sig, RC, float)) v_rc = &v_tmp.v_float; else if (AP_HOOK_SIG_HAS(he->he_sig, RC, double)) v_rc = &v_tmp.v_double; else if (AP_HOOK_SIG_HAS(he->he_sig, RC, ptr)) v_rc = &v_tmp.v_ptr; } else { /* the return variable is provided by caller */ v_rc = va_arg(ap, void *); } } /* ----BEGIN GENERATED SECTION-------- */ if (he->he_sig == AP_HOOK_SIG1(void)) { /* Call: void func() */ ((void(*)())(hf->hf_ptr))(); } else if (he->he_sig == AP_HOOK_SIG1(int)) { /* Call: int func() */ *((int *)v_rc) = ((int(*)())(hf->hf_ptr))(); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG1(ptr)) { /* Call: ptr func() */ *((void * *)v_rc) = ((void *(*)())(hf->hf_ptr))(); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG2(int, int)) { /* Call: int func(int) */ int v1 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(int))(hf->hf_ptr))(v1); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG2(int, ptr)) { /* Call: int func(ptr) */ void *v1 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(void *))(hf->hf_ptr))(v1); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG2(ptr, int)) { /* Call: ptr func(int) */ int v1 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(int))(hf->hf_ptr))(v1); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG2(ptr, ptr)) { /* Call: ptr func(ptr) */ void *v1 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(void *))(hf->hf_ptr))(v1); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG3(int, int, int)) { /* Call: int func(int,int) */ int v1 = va_arg(ap, va_type(int)); int v2 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(int, int))(hf->hf_ptr))(v1, v2); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG3(int, int, ptr)) { /* Call: int func(int,ptr) */ int v1 = va_arg(ap, va_type(int)); void *v2 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(int, void *))(hf->hf_ptr))(v1, v2); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG3(int, ptr, int)) { /* Call: int func(ptr,int) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(void *, int))(hf->hf_ptr))(v1, v2); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG3(int, ptr, ptr)) { /* Call: int func(ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(void *, void *))(hf->hf_ptr))(v1, v2); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG3(ptr, int, int)) { /* Call: ptr func(int,int) */ int v1 = va_arg(ap, va_type(int)); int v2 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(int, int))(hf->hf_ptr))(v1, v2); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG3(ptr, int, ptr)) { /* Call: ptr func(int,ptr) */ int v1 = va_arg(ap, va_type(int)); void *v2 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(int, void *))(hf->hf_ptr))(v1, v2); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG3(ptr, ptr, int)) { /* Call: ptr func(ptr,int) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(void *, int))(hf->hf_ptr))(v1, v2); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG3(ptr, ptr, ptr)) { /* Call: ptr func(ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(void *, void *))(hf->hf_ptr))(v1, v2); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(int, int, int, int)) { /* Call: int func(int,int,int) */ int v1 = va_arg(ap, va_type(int)); int v2 = va_arg(ap, va_type(int)); int v3 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(int, int, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, int, int, ptr)) { /* Call: int func(int,int,ptr) */ int v1 = va_arg(ap, va_type(int)); int v2 = va_arg(ap, va_type(int)); void *v3 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(int, int, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, int, ptr, int)) { /* Call: int func(int,ptr,int) */ int v1 = va_arg(ap, va_type(int)); void *v2 = va_arg(ap, va_type(ptr)); int v3 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(int, void *, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, int, ptr, ptr)) { /* Call: int func(int,ptr,ptr) */ int v1 = va_arg(ap, va_type(int)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(int, void *, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, ptr, int, int)) { /* Call: int func(ptr,int,int) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); int v3 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(void *, int, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, ptr, int, ptr)) { /* Call: int func(ptr,int,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); void *v3 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(void *, int, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, ptr, ptr, int)) { /* Call: int func(ptr,ptr,int) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); int v3 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(void *, void *, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(int, ptr, ptr, ptr)) { /* Call: int func(ptr,ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(void *, void *, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG4(ptr, int, int, int)) { /* Call: ptr func(int,int,int) */ int v1 = va_arg(ap, va_type(int)); int v2 = va_arg(ap, va_type(int)); int v3 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(int, int, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, int, int, ptr)) { /* Call: ptr func(int,int,ptr) */ int v1 = va_arg(ap, va_type(int)); int v2 = va_arg(ap, va_type(int)); void *v3 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(int, int, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, int, ptr, int)) { /* Call: ptr func(int,ptr,int) */ int v1 = va_arg(ap, va_type(int)); void *v2 = va_arg(ap, va_type(ptr)); int v3 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(int, void *, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, int, ptr, ptr)) { /* Call: ptr func(int,ptr,ptr) */ int v1 = va_arg(ap, va_type(int)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(int, void *, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, ptr, int, int)) { /* Call: ptr func(ptr,int,int) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); int v3 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(void *, int, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, ptr, int, ptr)) { /* Call: ptr func(ptr,int,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); void *v3 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(void *, int, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, ptr, ptr, int)) { /* Call: ptr func(ptr,ptr,int) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); int v3 = va_arg(ap, va_type(int)); *((void * *)v_rc) = ((void *(*)(void *, void *, int))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG4(ptr, ptr, ptr, ptr)) { /* Call: ptr func(ptr,ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(void *, void *, void *))(hf->hf_ptr))(v1, v2, v3); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG5(int, ptr, ptr, ptr, int)) { /* Call: int func(ptr,ptr,ptr,int) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); int v4 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(void *, void *, void *, int))(hf->hf_ptr))(v1, v2, v3, v4); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG6(int, ptr, ptr, ptr, int, ptr)) { /* Call: int func(ptr,ptr,ptr,int,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); int v4 = va_arg(ap, va_type(int)); void *v5 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(void *, void *, void *, int, void *))(hf->hf_ptr))(v1, v2, v3, v4, v5); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG6(int, ptr, ptr, ptr, ptr, int)) { /* Call: int func(ptr,ptr,ptr,ptr,int) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); void *v4 = va_arg(ap, va_type(ptr)); int v5 = va_arg(ap, va_type(int)); *((int *)v_rc) = ((int(*)(void *, void *, void *, void *, int))(hf->hf_ptr))(v1, v2, v3, v4, v5); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG7(int, ptr, ptr, ptr, ptr, int, ptr)) { /* Call: int func(ptr,ptr,ptr,ptr,int,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); void *v4 = va_arg(ap, va_type(ptr)); int v5 = va_arg(ap, va_type(int)); void *v6 = va_arg(ap, va_type(ptr)); *((int *)v_rc) = ((int(*)(void *, void *, void *, void *, int, void *))(hf->hf_ptr))(v1, v2, v3, v4, v5, v6); rc = (*((int *)v_rc) != he->he_modeval.v_int); } else if (he->he_sig == AP_HOOK_SIG6(ptr, ptr, ptr, ptr, ptr, ptr)) { /* Call: ptr func(ptr,ptr,ptr,ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); void *v4 = va_arg(ap, va_type(ptr)); void *v5 = va_arg(ap, va_type(ptr)); *((void * *)v_rc) = ((void *(*)(void *, void *, void *, void *, void *))(hf->hf_ptr))(v1, v2, v3, v4, v5); rc = (*((void * *)v_rc) != he->he_modeval.v_ptr); } else if (he->he_sig == AP_HOOK_SIG2(void, ptr)) { /* Call: void func(ptr) */ void *v1 = va_arg(ap, va_type(ptr)); ((void(*)(void *))(hf->hf_ptr))(v1); } else if (he->he_sig == AP_HOOK_SIG4(void, ptr, int, int)) { /* Call: void func(ptr,int,int) */ void *v1 = va_arg(ap, va_type(ptr)); int v2 = va_arg(ap, va_type(int)); int v3 = va_arg(ap, va_type(int)); ((void(*)(void *, int, int))(hf->hf_ptr))(v1, v2, v3); } else if (he->he_sig == AP_HOOK_SIG3(void, ptr, ptr)) { /* Call: void func(ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); ((void(*)(void *, void *))(hf->hf_ptr))(v1, v2); } else if (he->he_sig == AP_HOOK_SIG4(void, ptr, ptr, ptr)) { /* Call: void func(ptr,ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); ((void(*)(void *, void *, void *))(hf->hf_ptr))(v1, v2, v3); } else if (he->he_sig == AP_HOOK_SIG5(void, ptr, ptr, ptr, ptr)) { /* Call: void func(ptr,ptr,ptr,ptr) */ void *v1 = va_arg(ap, va_type(ptr)); void *v2 = va_arg(ap, va_type(ptr)); void *v3 = va_arg(ap, va_type(ptr)); void *v4 = va_arg(ap, va_type(ptr)); ((void(*)(void *, void *, void *, void *))(hf->hf_ptr))(v1, v2, v3, v4); } /* ----END GENERATED SECTION---------- */ else ap_log_assert("hook signature not implemented", __FILE__, __LINE__); if (he->he_modeid == AP_HOOK_MODE_ALL) rc = FALSE; else if (he->he_modeid == AP_HOOK_MODE_TOPMOST) rc = TRUE; return rc; }