This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Net::Telnet needs line of code added for fhopen to work withcygwin-perl and IO::Pty module in MSWin


Brian.Kelly@empireblue.com wrote:
> First I'd like to say THANKS!!!!

Brian, you're most welcome.

>      Recently, the IO:Pty module was successfully ported to
> work with cygwin-perl. Now it is truly possible to use your
> fhopen method (per Lincoln Stein's chapter on your Telnet
> module) to do Expect-like control of interactive programs using
> your Telnet module on MSWin OS's.

I haven't seen Lincoln's book.  Is that chapter available online?

>      There's just one sligggghhht  problem ...........
> 
>      It seems that on a MSWin OS there is no way to truly escape the infamous
> CR\LF.
> 
>      In your "print" subroutine, you "attempt" to do this with the following
> line of code:

The TELNET protocol specifies CR LF as an end-of-line.  The
Net::Telnet::print() code you mention converts the OS native EOL
to the TELNET EOL.

If you're using Net::Telnet with a pseudo terminal then yes you
do want the EOL to be just CR.

Probably the best way to do this is just:

    $telnet->output_record_separator("\r");

Modifying Net::Telnet to convert CR LF to just CR is definitely
not the right way to do this.

Here's some code that changes a password on SunOS 5.8.  Give it a
try on cygwin.

#!/usr/bin/perl

my $oldpw = "";
my $newpw = "";

use Net::Telnet;
$pwd = new Net::Telnet (Timeout => 2,
                        Errmode => "return",
                        Dump_log => "/tmp/dump.log");

## Start passwd program.
&spawn($pwd, "passwd")
    or die $pwd->errmsg;

## Send existing passwd.
$pwd->waitfor('/password: ?$/i')
    or die "no old password prompt: ", $pwd->lastline;
$pwd->print($oldpw);

## Send new passwd.
$pwd->waitfor('/new password: ?$/i')
    or die "bad old password: ", $pwd->lastline;
$pwd->print($newpw);

## Send new passwd verification.
$pwd->waitfor('/new password: ?$/i')
    or die "bad new password: ", $pwd->lastline;
$pwd->print($newpw);

## Display success or failure.
$pwd->waitfor('/changed/')
    or die "bad new password: ", $pwd->lastline;
print $pwd->lastline;

$pwd->close;
exit;


sub spawn {
    my($spawn) = shift @_;
    my($pty,
       $tty,
       $tty_fd);

    use IO::Pty ();
    use POSIX ();

    $pty = new IO::Pty
        or die $!;

    unless ($pid = fork) {  # child process
        die "problem spawning program: $!\n" unless defined $pid;

        use POSIX ();
        POSIX::setsid
            or die "setsid failed: $!";

        $tty = $pty->slave;
        $tty_fd = $tty->fileno;
 
        open STDIN, "<&$tty_fd" or die $!;
        open STDOUT, ">&$tty_fd" or die $!;
        open STDERR, ">&STDOUT" or die $!;
        close $pty;
        close $tty;

        exec @_ == 1 ? $_[0] : @_
            or die "problem executing $_[0]: $!\n";
    }

    $spawn->fhopen($pty)
        or return;
    $spawn->telnetmode(0);
    $spawn->binmode(1);
    $spawn->output_record_separator("\r");
    $spawn->cmd_remove_mode(1);

    1;
} # end sub spawn

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]