blob: 6b5cbf606e8aeb5b14597ef5ced18a7de1d930da [file] [log] [blame]
#include "mod_perl.h"
/*
* bleedperl change #11639 switch tied handle magic
* from living in the gv to the GvIOp(gv), so we have to deal
* with both to support 5.6.x
*/
#if ((PERL_REVISION == 5) && (PERL_VERSION >= 7))
# define TIEHANDLE_SV(handle) (SV*)GvIOp((SV*)handle)
#else
# define TIEHANDLE_SV(handle) (SV*)handle
#endif
#define dHANDLE(name) GV *handle = gv_fetchpv(name, TRUE, SVt_PVIO)
#define TIEHANDLE(handle,r) \
modperl_io_handle_tie(aTHX_ handle, "Apache::RequestRec", (void *)r)
#define TIED(handle) \
modperl_io_handle_tied(aTHX_ handle, "Apache::RequestRec")
MP_INLINE void modperl_io_handle_untie(pTHX_ GV *handle)
{
#ifdef MP_TRACE
if (mg_find(TIEHANDLE_SV(handle), 'q')) {
MP_TRACE_g(MP_FUNC, "untie *%s(0x%lx), REFCNT=%d\n",
GvNAME(handle), (unsigned long)handle,
SvREFCNT(TIEHANDLE_SV(handle)));
}
else {
return;
}
#endif
sv_unmagic(TIEHANDLE_SV(handle), 'q');
}
MP_INLINE void modperl_io_handle_tie(pTHX_ GV *handle,
char *classname, void *ptr)
{
SV *obj = modperl_ptr2obj(aTHX_ classname, ptr);
modperl_io_handle_untie(aTHX_ handle);
sv_magic(TIEHANDLE_SV(handle), obj, 'q', Nullch, 0);
SvREFCNT_dec(obj); /* since sv_magic did SvREFCNT_inc */
MP_TRACE_g(MP_FUNC, "tie *%s(0x%lx) => %s, REFCNT=%d\n",
GvNAME(handle), (unsigned long)handle, classname,
SvREFCNT(TIEHANDLE_SV(handle)));
}
MP_INLINE int modperl_io_handle_tied(pTHX_ GV *handle, char *classname)
{
MAGIC *mg;
SV *sv = TIEHANDLE_SV(handle);
if (SvMAGICAL(sv) && (mg = mg_find(sv, 'q'))) {
char *package = HvNAME(SvSTASH((SV*)SvRV(mg->mg_obj)));
if (!strEQ(package, classname)) {
MP_TRACE_g(MP_FUNC, "%s tied to %s\n", GvNAME(handle), package);
return TRUE;
}
}
return FALSE;
}
MP_INLINE GV *modperl_io_tie_stdout(pTHX_ request_rec *r)
{
#if defined(MP_IO_TIE_SFIO)
/* XXX */
#elif defined(MP_IO_TIE_PERLIO)
/* XXX */
#else
dHANDLE("STDOUT");
if (TIED(handle)) {
return handle;
}
IoFLUSH_off(PL_defoutgv); /* $|=0 */
TIEHANDLE(handle, r);
return handle;
#endif
}
MP_INLINE GV *modperl_io_tie_stdin(pTHX_ request_rec *r)
{
#if defined(MP_IO_TIE_SFIO)
/* XXX */
#elif defined(MP_IO_TIE_PERLIO)
/* XXX */
#else
dHANDLE("STDIN");
if (TIED(handle)) {
return handle;
}
TIEHANDLE(handle, r);
return handle;
#endif
}