Nick Ing-Simmons <nick(_dot_)ing-simmons(_at_)elixent(_dot_)com> writes:
Martin J. Evans <martin(_at_)easysoft(_dot_)com> writes:
A socket is a file handle so :
binmode($sock,":utf8");
should work.
I'm obviously missing something rather fundamental here.
Not you - us.
How can we have got this far without someone discovering this?
binmmode() works on _input_ side of socket file handle:
if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
if (PerlIO_binmode(aTHX_ fp,IoTYPE(io),mode_from_discipline(discp),
(discp) ? SvPV_nolen(discp) : Nullch)) {
There does not seem to be any way at all of setting layers on
output side of a bi-directional socket :-(
Attached patch calls PerlIO_binmode() on IoOFP if it exists and
isn't same as IoIFP. It silences the warning on my quick-check
test.
--
Nick Ing-Simmons
http://www.ni-s.u-net.com/
--- pp_sys.c.ship Tue Jul 1 12:55:32 2003
+++ pp_sys.c Tue Jul 1 12:54:13 2003
@@ -742,6 +742,14 @@
PUTBACK;
if (PerlIO_binmode(aTHX_ fp,IoTYPE(io),mode_from_discipline(discp),
(discp) ? SvPV_nolen(discp) : Nullch)) {
+ if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
+ if (!PerlIO_binmode(aTHX_ IoOFP(io),IoTYPE(io),
+ mode_from_discipline(discp),
+ (discp) ? SvPV_nolen(discp) : Nullch)) {
+ SPAGAIN;
+ RETPUSHUNDEF;
+ }
+ }
SPAGAIN;
RETPUSHYES;
}