X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FFCGI.XL;h=4e8e5521d9282a5afb05e378faa78cb36f66359c;hb=2f33e704f2effdafa83cb87af462e850277a88f1;hp=2eb7a4dfea1c6d0b4061613fc08e1692f85b6b16;hpb=7fa2de73132fde0e3a2db9694c34c10aa8bc0892;p=catagits%2Ffcgi2.git diff --git a/perl/FCGI.XL b/perl/FCGI.XL index 2eb7a4d..4e8e552 100644 --- a/perl/FCGI.XL +++ b/perl/FCGI.XL @@ -12,7 +12,7 @@ unless ($] >= 5.005) { print OUT while ; close OUT; __END__ -/* $Id: FCGI.XL,v 1.6 2001/09/20 12:00:24 skimo Exp $ */ +/* $Id: FCGI.XL,v 1.10 2003/06/22 00:24:11 robs Exp $ */ #include "EXTERN.h" #include "perl.h" @@ -34,6 +34,10 @@ __END__ #define dTHX #endif +#ifndef INT2PTR +#define INT2PTR(a,b) ((a) (b)) +#endif + #ifdef USE_SFIO typedef struct { @@ -137,9 +141,15 @@ FCGI_UndoBinding(FCGP_Request* request) sfdcdelfcgi(sfdisc(IoOFP(request->io[1]), SF_POPDISC)); sfdcdelfcgi(sfdisc(IoOFP(request->io[2]), SF_POPDISC)); #else +# ifdef USE_PERLIO + sv_unmagic((SV *)GvIOp(request->gv[0]), 'q'); + sv_unmagic((SV *)GvIOp(request->gv[1]), 'q'); + sv_unmagic((SV *)GvIOp(request->gv[2]), 'q'); +# else sv_unmagic((SV *)request->gv[0], 'q'); sv_unmagic((SV *)request->gv[1], 'q'); sv_unmagic((SV *)request->gv[2], 'q'); +# endif #endif request->bound = FALSE; } @@ -154,9 +164,25 @@ FCGI_Bind(FCGP_Request* request) sfdisc(IoOFP(request->io[1]), sfdcnewfcgi(request->requestPtr->out)); sfdisc(IoOFP(request->io[2]), sfdcnewfcgi(request->requestPtr->err)); #else +# ifdef USE_PERLIO + /* For tied filehandles, we apply tiedscalar magic to the IO + slot of the GP rather than the GV itself. */ + + if (!GvIOp(request->gv[1])) + GvIOp(request->gv[1]) = newIO(); + if (!GvIOp(request->gv[2])) + GvIOp(request->gv[2]) = newIO(); + if (!GvIOp(request->gv[0])) + GvIOp(request->gv[0]) = newIO(); + + sv_magic((SV *)GvIOp(request->gv[1]), request->svout, 'q', Nullch, 0); + sv_magic((SV *)GvIOp(request->gv[2]), request->sverr, 'q', Nullch, 0); + sv_magic((SV *)GvIOp(request->gv[0]), request->svin, 'q', Nullch, 0); +# else sv_magic((SV *)request->gv[1], request->svout, 'q', Nullch, 0); sv_magic((SV *)request->gv[2], request->sverr, 'q', Nullch, 0); sv_magic((SV *)request->gv[0], request->svin, 'q', Nullch, 0); +# endif #endif request->bound = TRUE; } @@ -461,8 +487,10 @@ Detach(request) PROTOTYPE: $ CODE: - if (request->accepted && request->bound) - FCGI_UndoBinding(request); + if (request->accepted && request->bound) { + FCGI_UndoBinding(request); + FCGX_Detach(request->requestPtr); + } void Attach(request) @@ -471,8 +499,10 @@ Attach(request) PROTOTYPE: $ CODE: - if (request->accepted && !request->bound) - FCGI_Bind(request); + if (request->accepted && !request->bound) { + FCGI_Bind(request); + FCGX_Attach(request->requestPtr); + } void LastCall(request) @@ -508,16 +538,30 @@ PRINT(stream, ...) FCGI::Stream stream; PREINIT: - int n; + int n, sum = 0, ret = 0; + STRLEN len; + register char *str; CODE: - for (n = 1; n < items; ++n) { - STRLEN len; - register char *tmps = (char *)SvPV(ST(n),len); - FCGX_PutStr(tmps, len, stream); - } - if (SvTRUEx(perl_get_sv("|", FALSE))) + for (n = 1; n < items; ++n) { +#ifdef DO_UTF8 + if (DO_UTF8(ST(n)) && !sv_utf8_downgrade(ST(n), 1)) + croak("Wide character in FCGI::Stream::PRINT"); +#endif + str = (char *)SvPV(ST(n),len); + if ((ret = FCGX_PutStr(str, len, stream)) < 0) + break; + + sum += ret; + } + + if (sum == 0 && ret < 0) + XSRETURN_UNDEF; + + + if (SvTRUEx(perl_get_sv("|", FALSE))) FCGX_FFlush(stream); + XSRETURN_YES; int WRITE(stream, bufsv, len, ...) @@ -533,6 +577,10 @@ WRITE(stream, bufsv, len, ...) CODE: offset = (items == 4) ? (int)SvIV(ST(3)) : 0; +#ifdef DO_UTF8 + if (DO_UTF8(bufsv) && !sv_utf8_downgrade(bufsv, 1)) + croak("Wide character in FCGI::Stream::WRITE"); +#endif buf = SvPV(bufsv, blen); if (offset < 0) offset += blen; if (len > blen - offset) @@ -542,7 +590,7 @@ WRITE(stream, bufsv, len, ...) ST(0) = &PL_sv_undef; else { ST(0) = sv_newmortal(); - sv_setpvf(ST(0), "%c", n); + sv_setiv(ST(0), n); } int @@ -557,6 +605,10 @@ READ(stream, bufsv, len, ...) CODE: offset = (items == 4) ? (int)SvIV(ST(3)) : 0; +#ifdef DO_UTF8 + if (DO_UTF8(bufsv) && !sv_utf8_downgrade(bufsv, 1)) + croak("Wide character in FCGI::Stream::READ"); +#endif if (! SvOK(bufsv)) sv_setpvn(bufsv, "", 0); buf = SvGROW(bufsv, len+offset+1);