Re: run an interactive command using POE::Wheel?

Andreas Altergott <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Organization MIRA Consulting GmbH
Message-ID <[email protected]>
Hi,

woosley. xu. wrote:
> Apparently I failed to get the password but get the last "\n" in the first
> input to password.  But if I got rid of "\n", the whole script just blocked.
> How can I deal with such a situation?

I didn't find the error, but I've written your application a little bit
different.  This is working for me.  Maybe it helps you to find
something.  Please let me (us on the mailing list ;-) ) know if you do.
 Sorry if I'm not of much help.  I really didn't see the mistake.
Probably it has something to do with the StdioFilter that is missing in
your code.

I'm new to POE, so I don't have any answer for you second question.

#!/usr/bin/perl
#-----------------------------------------------------------------------
# main.pl

use strict;
use warnings;

use POE qw(Wheel::Run Filter::Line);

sub _start {
    my ($kernel, $heap) = @_[KERNEL, HEAP];

    $heap->{'child'} = POE::Wheel::Run->new(
        'CloseEvent'   => 'child_close',
        'Program'      => ['perl', 'child.pl'],
        'StderrEvent'  => 'child_stderr',
        'StdoutEvent'  => 'child_stdout',
        'StdioFilter'  => POE::Filter::Line->new(),
        'StderrFilter' => POE::Filter::Line->new()
    );

    $kernel->sig_child($heap->{'child'}->PID, 'sig_chld');
    $heap->{'child'}->put("user\npw\n");
}

sub child_close {
    my ($kernel, $heap) = @_[KERNEL, HEAP];

    delete($heap->{'child'});
}

sub child_stderr {
    my $stderr = $_[ARG0];

    print("$stderr\n");
}

sub child_stdout {
    my $stdout = $_[ARG0];

    print("$stdout\n");
}

sub sig_chld {
}

POE::Session->create(
    inline_states => {
        '_start'       => \&_start,
        'child_close'  => \&child_close,
        'child_stderr' => \&child_stderr,
        'child_stdout' => \&child_stdout,
        'sig_chld'     => \&sig_chld
    }
);

POE::Kernel->run();
exit(0);

# EOF
#-----------------------------------------------------------------------

#!/usr/bin/perl
#-----------------------------------------------------------------------
# child.pl

use strict;
use warnings;

my ($user, $pw);

print("User:\n");
$user = <STDIN>;

print("Password:\n");
$pw = <STDIN>;

chomp($user);
chomp($pw);

print("Entered: $user/$pw\n");

# EOF
#-----------------------------------------------------------------------


Regards,
Andreas
signature.asc (application/pgp-signature, 260 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkq7s5cACgkQImDrLy4cAN+6JwCfRNJt2DlF9LzH0L2HezqfQGuL
eSIAn2VCj6nZ3GYBSOvrcMOHzRVMzbK0
=7Dmp
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.