#include "mod_perl.h"
#include "mod_perl_xs.h"
#if MODULE_MAGIC_NUMBER >= MMN_132
#define HAVE_LOG_RERROR 1
#else
#define HAVE_LOG_RERROR 0
#endif
static
void
perl_cv_alias(
char
*to,
char
*from)
{
GV *gp = gv_fetchpv(to, TRUE, SVt_PVCV);
GvCV(gp) = perl_get_cv(from, TRUE);
}
static
void
ApacheLog(
int
level, SV *sv, SV *msg)
{
dTHR;
char
*file = NULL;
int
line = 0;
char
*str;
SV *svstr = Nullsv;
int
lmask = level & APLOG_LEVELMASK;
server_rec *s;
request_rec *r = NULL;
if
(sv_isa(sv,
"Apache::Log::Request"
) && SvROK(sv)) {
r = (request_rec *) SvIV((SV*)SvRV(sv));
s = r->server;
}
else
if
(sv_isa(sv,
"Apache::Log::Server"
) && SvROK(sv)) {
s = (server_rec *) SvIV((SV*)SvRV(sv));
}
else
{
croak(
"Argument is not an Apache or Apache::Server object"
);
}
if
((lmask == APLOG_DEBUG) && (s->loglevel >= APLOG_DEBUG)) {
SV *caller;
bool
old_T = tainting; tainting = FALSE;
caller = perl_eval_pv(
"[ (caller)[1,2] ]"
, TRUE);
tainting = old_T;
file = SvPV(*av_fetch((AV *)SvRV(caller), 0, FALSE),na);
line = (
int
)SvIV(*av_fetch((AV *)SvRV(caller), 1, FALSE));
}
if
((s->loglevel >= lmask) &&
SvROK(msg) && (SvTYPE(SvRV(msg)) == SVt_PVCV)) {
dSP;
ENTER;SAVETMPS;
PUSHMARK(sp);
(
void
)perl_call_sv(msg, G_SCALAR);
SPAGAIN;
svstr = POPs;
++SvREFCNT(svstr);
PUTBACK;
FREETMPS;LEAVE;
str = SvPV(svstr,na);
}
else
str = SvPV(msg,na);
if
(r && HAVE_LOG_RERROR) {
#if HAVE_LOG_RERROR > 0
ap_log_rerror(file, line, APLOG_NOERRNO|level, r,
"%s"
, str);
#endif
}
else
{
ap_log_error(file, line, APLOG_NOERRNO|level, s,
"%s"
, str);
}
SvREFCNT_dec(msg);
if
(svstr) SvREFCNT_dec(svstr);
}
#define join_stack_msg \
SV *msgstr; \
if
(items > 2) { \
msgstr = newSV(0); \
do_join(msgstr, &sv_no, MARK+1, SP); \
} \
else
{ \
msgstr = ST(1); \
++SvREFCNT(msgstr); \
}
#define MP_AP_LOG(l,s) \
{ \
join_stack_msg; \
ApacheLog(l, s, msgstr); \
}
#define Apache_log_emerg(s) \
MP_AP_LOG(APLOG_EMERG, s)
#define Apache_log_alert(s) \
MP_AP_LOG(APLOG_ALERT, s)
#define Apache_log_crit(s) \
MP_AP_LOG(APLOG_CRIT, s)
#define Apache_log_error(s) \
MP_AP_LOG(APLOG_ERR, s)
#define Apache_log_warn(s) \
MP_AP_LOG(APLOG_WARNING, s)
#define Apache_log_notice(s) \
MP_AP_LOG(APLOG_NOTICE, s)
#define Apache_log_info(s) \
MP_AP_LOG(APLOG_INFO, s)
#define Apache_log_debug(s) \
MP_AP_LOG(APLOG_DEBUG, s)
MODULE = Apache::Log PACKAGE = Apache
PROTOTYPES: DISABLE
BOOT:
perl_cv_alias(
"Apache::log"
,
"Apache::Log::log"
);
perl_cv_alias(
"Apache::Server::log"
,
"Apache::Log::log"
);
perl_cv_alias(
"emergency"
,
"emerg"
);
perl_cv_alias(
"critical"
,
"crit"
);
av_push(perl_get_av(
"Apache::Log::Request::ISA"
,TRUE),
newSVpv(
"Apache::Log"
,11));
av_push(perl_get_av(
"Apache::Log::Server::ISA"
,TRUE),
newSVpv(
"Apache::Log"
,11));
items = items;
MODULE = Apache::Log PACKAGE = Apache::Log PREFIX=Apache_log_
void
Apache_log_log(sv)
SV *sv
PREINIT:
void
*retval;
char
*pclass =
"Apache::Log::Request"
;
CODE:
if
(!SvROK(sv))
croak(
"Argument is not a reference"
);
if
(sv_derived_from(sv,
"Apache"
)) {
retval = (
void
*)sv2request_rec(sv,
"Apache"
, cv);
}
else
if
(sv_derived_from(sv,
"Apache::Server"
)) {
pclass =
"Apache::Log::Server"
;
retval = (
void
*) SvIV((SV*)SvRV(sv));
}
else
{
croak(
"Argument is not an Apache or Apache::Server object"
);
}
ST(0) = sv_newmortal();
sv_setref_pv(ST(0), pclass, (
void
*)retval);
void
Apache_log_emerg(s, ...)
SV *s
void
Apache_log_alert(s, ...)
SV *s
void
Apache_log_crit(s, ...)
SV *s
void
Apache_log_error(s, ...)
SV *s
void
Apache_log_warn(s, ...)
SV *s
void
Apache_log_notice(s, ...)
SV *s
void
Apache_log_info(s, ...)
SV *s
void
Apache_log_debug(s, ...)
SV *s
MODULE = Apache::Log PACKAGE = Apache::Server
PROTOTYPES: DISABLE
BOOT:
#ifdef newCONSTSUB
{
HV *stash = gv_stashpv(
"Apache::Log"
, TRUE);
newCONSTSUB(stash,
"EMERG"
, newSViv(APLOG_EMERG));
newCONSTSUB(stash,
"ALERT"
, newSViv(APLOG_ALERT));
newCONSTSUB(stash,
"CRIT"
, newSViv(APLOG_CRIT));
newCONSTSUB(stash,
"ERR"
, newSViv(APLOG_ERR));
newCONSTSUB(stash,
"WARNING"
, newSViv(APLOG_WARNING));
newCONSTSUB(stash,
"NOTICE"
, newSViv(APLOG_NOTICE));
newCONSTSUB(stash,
"INFO"
, newSViv(APLOG_INFO));
newCONSTSUB(stash,
"DEBUG"
, newSViv(APLOG_DEBUG));
}
#endif
int
loglevel(server, ...)
Apache::Server server
CODE:
get_set_IV(server->loglevel);
OUTPUT:
RETVAL