Skip Menu |

This queue is for tickets about the Net-SSH2 CPAN distribution.

Report information
The Basics
Id: 17467
Status: rejected
Priority: 0/
Queue: Net-SSH2

People
Owner: Nobody in particular
Requestors: awa [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: Important
Broken in: (no value)
Fixed in: (no value)



Subject: Ability to read extended stream
I wanted to use Channel.pm READLINE function to read the output from stdout and then from stderr. Currently the Channel.pm provided READLINE functionality only for stdout. I have attached the Channel.pm containing changes to READLINE and GETC function. I am new atcontributing to the open sourcve world. So please let me know if I need to provide the patch in any other way. Kind Regards Vandana
Subject: Channel.pm
package Net::SSH2::Channel; use 5.008; use strict; use warnings; use Carp; use Data::Dumper; # methods sub shell { $_[0]->process('shell') } sub exec { $_[0]->process(exec => $_[1]) } sub subsystem { $_[0]->process(subsystem => $_[1]) } sub error { shift->session->error(@_) } # tie interface sub PRINT { my $self = shift; my $sep = defined($,) ? $, : ''; $self->write(join $sep, @_) } sub PRINTF { my $self = shift; $self->write(sprintf @_) } sub WRITE { my ($self, $buf, $len, $offset) = @_; $self->write(substr($buf, $offset, $len)) } sub READLINE { my ($self,$ext) = @_; return if $self->eof; if (wantarray) { my @lines; my $line; push @lines, $line while defined($line = $self->READLINE($ext)); return @lines; } my ($line, $eol, $c) = ('', $/); $line .= $c while $line !~ /\Q$eol\E$/ and defined($c = $self->GETC($ext)); length($line) ? $line : undef } sub GETC { my ($self,$ext) = @_; my $buf; my @poll; if (defined $ext) { @poll = ({ handle => $self, events => 'ext' }); return unless $self->session->poll(250, \@poll) and $poll[0]->{revents}->{ext}; $self->read($buf, 1,$ext) ? $buf : undef; } else { @poll = ({ handle => $self, events => 'in' }); return unless $self->session->poll(250, \@poll) and $poll[0]->{revents}->{in}; $self->read($buf, 1) ? $buf : undef } } sub READ { my ($self, $rbuf, $len, $offset) = @_; my ($tmp, $count); return unless defined($count = $self->read($tmp, $len)); substr($$rbuf, $offset) = $tmp; $count } sub CLOSE { &close } sub BINMODE { } sub EOF { &eof } 1; __END__ =head1 NAME Net::SSH2::Channel - SSH 2 channel object =head1 DESCRIPTION A channel object is created by the L<Net::SSH2> C<channel> method. As well as being an object, it is also a tied filehandle. The L<Net::SSH2> C<poll> method can be used to check for read/write availability and other conditions. =head2 setenv ( key, value ... ) Sets remote environment variables. Note that most implementations do not allow environment variables to be freely set. Pass in a list of keys and values with the values to set. Returns the number of successful sets. =head2 blocking ( flag ) Enable or disable blocking. =head2 eof Returns true if the remote server sent an EOF. =head2 send_eof Send an EOF to the remote. After an EOF has been sent, no more data may be sent; the connection should be closed. =head2 close Close the channel (happens automatically on object destruction). =head2 wait_close Wait for a remote close event. Must have already seen remote EOF. =head2 exit_status Returns the channel's program exit status. =head2 pty ( terminal [, modes [, width [, height ]]] ) Request a terminal on a channel. If provided, C<width> and C<height> are the width and height in characters (defaults to 80x24); if negative their absolute values specify width and height in pixels. =head2 process ( request, message ) Start a process on the channel. See also L<shell>, L<exec>, L<subsystem>. =head2 shell Start a shell on the remote host; calls L<process>("shell"). =head2 exec ( command ) Execute the command on the remote host; calls L<process>("exec", command). Note that only one of these requests can succeed per channel (cp. L<perlfunc/exec>); if you want to run a series of commands, consider using L<shell> instead. =head2 subsystem ( name ) Run subsystem on the remote host; calls L<process>("subsystem", command). =head2 ext_data ( mode ) Set extended data handling mode: =over 4 =item normal (default) Keep data in separate channels; stderr is read separately. =item ignore Ignore all extended data. =item merge Merge into the regular channel. =back =head2 read ( buffer, size [, ext ] ) Attempts to read size bytes into the buffer. Returns number of bytes read, undef on failure. If ext is present and set, reads from the extended data channel (stderr). =head2 write ( buffer [, ext ] ) Attempts to write the buffer to the channel. Returns number of bytes written, undef on failure. If ext is present and set, writes to the extended data channel (stderr). =head2 flush ( [ ext ] ) Flushes the channel; if ext is present and set, flushes extended data channel. Returns number of bytes flushed, undef on error. =head1 SEE ALSO L<Net::SSH2>. =head1 AUTHOR David B. Robins, E<lt>dbrobins@cpan.orgE<gt> =head1 COPYRIGHT AND LICENSE Copyright (C) 2005 by David B. Robins; all rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.0 or, at your option, any later version of Perl 5 you may have available. =cut
Please provide changes as a unified diff.