📄 ap_hook.c
字号:
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;}#endif /* EAPI *//*=cut#### Embedded Perl script for generating the dispatch section##require 5.003;use strict;# configurationmy $file = $0;my $begin = '----BEGIN GENERATED SECTION--------';my $end = '----END GENERATED SECTION----------';# special command: find used signaturesif ($ARGV[0] eq 'used') { my @S = `find .. -type f -name "*.c" -print`; my $s; my %T = (); foreach $s (@S) { $s =~ s|\n$||; open(FP, "<$s") || die; my $source = ''; $source .= $_ while (<FP>); close(FP); my %seen = (); sub printme { my ($src, $hook, $sig) = @_; return if ($seen{$hook} == 1); $seen{$hook} = 1; my ($rc, $args) = ($sig =~ m|^([^,]+)(.*)$|); $args =~ s|^,||; $src =~ s|^.+/||; my $sig = sprintf("%-6sfunc(%s)", $rc, $args); $T{$sig}++; } $source =~ s|\("([^"]+)",\s*AP_HOOK_SIG[0-9]\((.+?)\)|&printme($s, $1, $2), ''|sge; } my $t; foreach $t (sort(keys(%T))) { printf(" * %-40s [%dx]\n", $t, $T{$t}); } exit(0);}# read ourself and keep a backupopen(FP, "<$file") || die;my $source = '';$source .= $_ while (<FP>);close(FP);open(FP, ">$file.bak") || die;print FP $source;close(FP);# now parse the signature lines and update the codemy $o = '';my $next = 0;my $line;my %seen = ();foreach $line (split(/\n/, $source)) { next if (not $line =~ m|\*\s+\S+\s+func\(.*\)|); my ($sig, $rc, $param) = ($line =~ m|\*\s+((\S+)\s+func\((.*?)\))|); $sig =~ s|\s+| |g; next if ($seen{$sig} == 1); $seen{$sig} = 1; print "Generating code for `$sig'\n"; my @S = ($rc, split(/[\s,]+/, $param)); my @RS = @S; my $i; for ($i = 0; $i <= $#RS; $i++) { $RS[$i] = 'void *' if ($RS[$i] eq 'ptr'); $RS[$i] = 'void *' if ($RS[$i] eq 'ctx'); } $o .= "else " if ($next); $next++; $o .= sprintf("if (he->he_sig == AP_HOOK_SIG%d(%s)) {\n", $#S+1, join(', ',@S)); $o .= sprintf(" \/\* Call: %s \*\/\n", $sig); for ($i = 1; $i <= $#S; $i++) { $o .= sprintf(" %-6sv%d = va_arg(ap, va_type(%s));\n", $RS[$i], $i, $S[$i]); } $o .= " "; $o .= sprintf("*((%s *)v_rc) = ", $RS[0]) if ($S[0] ne 'void'); $o .= sprintf("((%s(*)(%s))(hf->hf_ptr))", $RS[0], join(', ', @RS[1..$#RS])); $o .= "("; for ($i = 1; $i <= $#S; $i++) { $o .= "hf->hf_ctx" if ($S[$i] eq 'ctx'); $o .= sprintf("v%d", $i) if ($S[$i] ne 'ctx'); $o .= ", " if ($i < $#S); } $o .= ");\n"; $o .= sprintf(" rc = (*((%s *)v_rc) != he->he_modeval.v_%s);\n", $RS[0], $S[0]) if ($S[0] ne 'void'); $o .= "}\n";}# insert the generated code at the target location$o =~ s|^| |mg;$source =~ s|(\/\* $begin.+?\n).*\n(.*?\/\* $end)|$1$o$2|s;# and update the source on diskprint "Updating file `$file'\n";open(FP, ">$file") || die;print FP $source;close(FP);=pod*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -