IO *io = sv_2io( sv ); PerlIO *perlio = IoIFP( io ); if( perlio != NULL ) { PerlIO_read( perlio, ... ); } else { const MAGIC *mg = SvTIED_mg( (SV *) io, 'q' ); if( mg != NULL ) { sv = SvTIED_obj( (SV *) io, mg ); // call the READ method with sv as object... } else { Perl_croak( aTHX_ "invalid IO handle" ); } }