blob: 9574c8661e778570fbda5ce71be441ea4b08b1cf [file] [log] [blame]
#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; /*avoid warning*/
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