On Fri, Jul 18, 2003 at 01:18:12PM -0500, Cameron B. Prince wrote:
> Hi Barrie,
> 
> I dug out an old note from you and started trying IPC::Run. Here's what I
> have so far:
> 
> sub MP3Check {
>    my ($self,$params) = @_;
>    use IPC::Run qw( run timeout );
> 
>    my @command = (
>       $self->{MP3Check},
>       qq! -v "$params->{file}"!
>   );
> 
>    run [EMAIL PROTECTED], \undef, \my $output, timeout( 5 ) or die "mp3_check: $?";
>    my @outlines = split /\n/, $output;
> 
>    my %values;
>    for ( @outlines ) {
>       $values{$1} = $2 if /^([A-Z_]+)\s+(.*)$/;
>    }
>    return \%values;
> }
> 
> 
> Something is wrong with the command line...

I'd do a

   use BFD; [EMAIL PROTECTED];

to see what it's Really Doing.  I think, however, that you'd see
something like:

    [
        '/home/rw/bin/mp3_check',
        ' -v "/media/New/Music/Albums/sting.mp3"',
    ],

which is probably not what you want.  The program name is ok, but you're
attempting to pass two parameters and some shell-oriented quotation
marks through a non-shell spawning operation so mp3_check is receiving a
single parameter string it can't parse.  The upside is that you're not
causing the overhead of spawning a shell or the parse errors that will
occur if some sneaky feller puts a shell metacharacter in an mp3
filename :).

I think you want @command to look like:

    (
        '/home/rw/bin/mp3_check',
        '-v',
        '/media/New/Music/Albums/sting.mp3',
    ),

and so you'd build @command like so:

    my @command = (
       $self->{MP3Check},
       '-v',
       $params->{file},
   );

> Also, with IPC::Open3, I am killing the process in the alarm and setting a
> variable to indicate check failed:
> 
> $SIG{ALRM} = sub {
>     my $kill = "kill -9 $pid";
>     system($kill);
>     $values{'CHECK_PROBLEM'} = 1;
>     return;
> };
> 
> 
> How would something similar be done with IPC::Run?

User Perl's exception handling mechanism, roughly like so:

    eval {
        run [EMAIL PROTECTED], \undef, \$out, timeout( 5 )
            or die "$self->{MP3Check} returned ", $? >> 8, "\n";
        1;
    } or do {
        ## check $@ here for either your die() call or for
        ## IPC::Run::run()'s timeout exception.
    };

- Barrie

Reply via email to