dougm 01/05/02 23:21:00 Modified: xs/maps apache_functions.map modperl_functions.map Added: t/response/TestAPI aplog.pm xs/Apache/Log Apache__Log.h Log: add Apache::Log api and tests Revision Changes Path 1.1 modperl-2.0/t/response/TestAPI/aplog.pm Index: aplog.pm =================================================================== package TestAPI::aplog; use strict; use warnings FATAL => 'all'; use Apache::Log (); use Apache::Test; my @LogLevels = qw(emerg alert crit error warn notice info debug); my $package = __PACKAGE__; sub handler { my $r = shift; plan $r, tests => (@LogLevels * 2) + 3; my $rlog = $r->log; ok $rlog->isa('Apache::Log::Request'); my $slog = $r->server->log; ok $slog->isa('Apache::Log::Server'); $rlog->info($package, " test in progress"); for my $method (@LogLevels) { #wrap in sub {}, else Test.pm tries to run the return value of ->can ok sub { $rlog->can($method) }; ok sub { $slog->can($method) }; } $slog->info(sub { ok 1; "$package test done" }); Apache::OK; } 1; 1.1 modperl-2.0/xs/Apache/Log/Apache__Log.h Index: Apache__Log.h =================================================================== static void mpxs_Apache__Log_BOOT(pTHXo) { av_push(get_av("Apache::Log::Request::ISA",TRUE), newSVpv("Apache::Log",11)); av_push(get_av("Apache::Log::Server::ISA",TRUE), newSVpv("Apache::Log",11)); } #define croak_inval_obj() \ Perl_croak(aTHX_ "Argument is not an Apache::RequestRec " \ "or Apache::Server object") static void mpxs_ap_log_error(pTHX_ int level, SV *sv, SV *msg) { char *file = NULL; int line = 0; char *str; SV *svstr = Nullsv; STRLEN n_a; int lmask = level & APLOG_LEVELMASK; server_rec *s; request_rec *r = NULL; if (SvROK(sv) && sv_isa(sv, "Apache::Log::Request")) { r = (request_rec *)SvObjIV(sv); s = r->server; } else if (SvROK(sv) && sv_isa(sv, "Apache::Log::Server")) { s = (server_rec *)SvObjIV(sv); } else { croak_inval_obj(); } if ((lmask == APLOG_DEBUG) && (s->loglevel >= APLOG_DEBUG)) { COP *cop = cxstack[1].blk_oldcop; file = CopFILE(cop); /* (caller)[1] */ line = CopLINE(cop); /* (caller)[2] */ } if ((s->loglevel >= lmask) && SvROK(msg) && (SvTYPE(SvRV(msg)) == SVt_PVCV)) { dSP; ENTER;SAVETMPS; PUSHMARK(sp); (void)call_sv(msg, G_SCALAR); SPAGAIN; svstr = POPs; (void)SvREFCNT_inc(svstr); PUTBACK; FREETMPS;LEAVE; str = SvPV(svstr,n_a); } else { str = SvPV(msg,n_a); } if (r) { ap_log_rerror(file, line, APLOG_NOERRNO|level, 0, r, "%s", str); } else { ap_log_error(file, line, APLOG_NOERRNO|level, 0, s, "%s", str); } if (svstr) { SvREFCNT_dec(svstr); } } #define MP_LOG_REQUEST 1 #define MP_LOG_SERVER 2 static SV *mpxs_Apache__Log_log(pTHX_ SV *sv, int logtype) { SV *svretval; void *retval; char *pclass; if (!SvROK(sv)) { Perl_croak(aTHX_ "Argument is not a reference"); } switch (logtype) { case MP_LOG_REQUEST: pclass = "Apache::Log::Request"; retval = (void *)modperl_sv2request_rec(aTHX_ sv); break; case MP_LOG_SERVER: pclass = "Apache::Log::Server"; retval = (void *)SvObjIV(sv); break; default: croak_inval_obj(); }; svretval = newSV(0); sv_setref_pv(svretval, pclass, (void*)retval); return svretval; } #define mpxs_Apache__RequestRec_log(sv) \ mpxs_Apache__Log_log(aTHX_ sv, MP_LOG_REQUEST) #define mpxs_Apache__Server_log(sv) \ mpxs_Apache__Log_log(aTHX_ sv, MP_LOG_SERVER) static XS(MPXS_Apache__Log_dispatch) { dXSARGS; SV *msgsv; int level; char *name = GvNAME(CvGV(cv)); if (items < 2) { Perl_croak(aTHX_ "usage: %s::%s(obj, ...)", mpxs_cv_name()); } if (items > 2) { msgsv = newSV(0); do_join(msgsv, &PL_sv_no, MARK+1, SP); } else { msgsv = ST(1); (void)SvREFCNT_inc(msgsv); } switch (*name) { case 'e': if (*(name + 1) == 'r') { level = APLOG_ERR; break; } level = APLOG_EMERG; break; case 'w': level = APLOG_WARNING; break; case 'n': level = APLOG_NOTICE; break; case 'i': level = APLOG_INFO; break; case 'd': level = APLOG_DEBUG; break; case 'a': level = APLOG_ALERT; break; case 'c': level = APLOG_CRIT; break; default: level = APLOG_ERR; /* should never get here */ break; }; mpxs_ap_log_error(aTHX_ level, ST(0), msgsv); SvREFCNT_dec(msgsv); XSRETURN_EMPTY; } 1.17 +4 -4 modperl-2.0/xs/maps/apache_functions.map Index: apache_functions.map =================================================================== RCS file: /home/cvs/modperl-2.0/xs/maps/apache_functions.map,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- apache_functions.map 2001/04/29 17:53:42 1.16 +++ apache_functions.map 2001/05/03 06:20:59 1.17 @@ -147,12 +147,12 @@ >ap_update_vhost_given_ip ap_new_connection -!MODULE=Apache::Log PACKAGE=guess - ap_log_assert +MODULE=Apache::Log PACKAGE=guess +?ap_log_assert ap_log_error - ap_log_perror +-ap_log_perror ap_log_pid - ap_log_rerror +~ap_log_rerror >ap_open_stderr_log >ap_open_logs 1.10 +18 -0 modperl-2.0/xs/maps/modperl_functions.map Index: modperl_functions.map =================================================================== RCS file: /home/cvs/modperl-2.0/xs/maps/modperl_functions.map,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- modperl_functions.map 2001/04/30 04:39:29 1.9 +++ modperl_functions.map 2001/05/03 06:20:59 1.10 @@ -31,3 +31,21 @@ SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=Nullsv int:DEFINE_PRINT | | ... + +MODULE=Apache::Log PACKAGE=Apache::Log BOOT=1 + +DEFINE_error | MPXS_Apache__Log_dispatch | ... +DEFINE_emerg | MPXS_Apache__Log_dispatch | ... +DEFINE_alert | MPXS_Apache__Log_dispatch | ... +DEFINE_warn | MPXS_Apache__Log_dispatch | ... +DEFINE_notice | MPXS_Apache__Log_dispatch | ... +DEFINE_info | MPXS_Apache__Log_dispatch | ... +DEFINE_debug | MPXS_Apache__Log_dispatch | ... +DEFINE_crit | MPXS_Apache__Log_dispatch | ... + +PACKAGE=Apache::RequestRec +SV *:DEFINE_log | | SV *:obj + +PACKAGE=Apache::Server +SV *:DEFINE_log | | SV *:obj +