perl-unicode

Re: IO::Socket::INET and utf-8

2003-07-01 05:30:10
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;
     }
<Prev in Thread] Current Thread [Next in Thread>