IPC-Run icon indicating copy to clipboard operation
IPC-Run copied to clipboard

Can't locate object method "FILENO" [rt.cpan.org #102824]

Open toddr opened this issue 8 years ago • 1 comments
trafficstars

Migrated from rt.cpan.org#102824 (status was 'open')

Requestors:

From [email protected] on 2015-03-17 13:56:24:

If STDERR is tied and does not implement a real filehandle, especially if FILENO is not implemented, then running IPC::Run with redirection fails. Here's a sample script which fails with the error message "Can't locate object method "FILENO" via package "MySTDERR" at /opt/perl-5.18.4/lib/site_perl/5.18.4/IPC/Run.pm line 1126.":

#!/usr/bin/perl

use strict;
use warnings;

use IPC::Run qw(run);

#{ no warnings 'redefine'; *IPC::Run::_debug_fd = sub { }; }

{
    package MySTDERR;
    use Symbol qw(geniosym);
    sub TIEHANDLE { return bless geniosym, __PACKAGE__ }
    sub PRINT { shift; print @_ }
}

tie *STDERR, 'MySTDERR' or die $!;

my $out;
run ["echo", "hello"], ">", \$out;
print "out is $out\n";

__END__

If IPC::Run's _debug_fd method is made into a no-op (see the commented out line), then operation is successful.

Probably the correct solution would be to check if the fileno() call is possible in _debug_fd() (using eval{} or ->can()), and just return undef otherwise.

From [email protected] on 2016-04-12 23:53:38:

perl recently (5.18?) made fileno get angry if a file handle wasn't open and fileno is called.

toddr avatar May 12 '17 13:05 toddr

@eserte IPC::Run seems to heavily use fileno. I don't have any suggestions other than: Don't do that?

Do you have any ideas?

toddr avatar Mar 26 '18 23:03 toddr