home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2004 December / PCpro_2004_12.ISO / files / webserver / tsw / TSW_3.4.0.exe / Apache2 / perl / SSH1.pm < prev    next >
Encoding:
Perl POD Document  |  2001-07-19  |  1.7 KB  |  75 lines

  1. package Net::SSH::Perl::Handle::SSH1;
  2. use strict;
  3.  
  4. use Net::SSH::Perl::Buffer;
  5. use Net::SSH::Perl::Constants qw(
  6.     SSH_SMSG_STDOUT_DATA
  7.     SSH_SMSG_EXITSTATUS
  8.     SSH_CMSG_STDIN_DATA
  9.     SSH_CMSG_EOF );
  10.  
  11. use constant CHUNK_SIZE => 32000;
  12.  
  13. use Tie::Handle;
  14. use base qw( Tie::Handle );
  15.  
  16. sub TIEHANDLE {
  17.     my $class = shift;
  18.     my($mode, $ssh) = @_;
  19.     my $read = $mode =~ /^[rR]/;
  20.     my $handle = bless { ssh => $ssh }, $class;
  21.     if ($read) {
  22.         my $incoming = $handle->{incoming} =
  23.             Net::SSH::Perl::Buffer->new( MP => 'SSH1' );
  24.         $ssh->register_handler(SSH_SMSG_STDOUT_DATA, sub {
  25.             my($ssh, $packet) = @_;
  26.             $incoming->append($packet->get_str);
  27.             $ssh->break_client_loop;
  28.         });
  29.         $ssh->register_handler(SSH_SMSG_EXITSTATUS,
  30.             sub { $handle->{exit} = $_[1]->get_int32 });
  31.     }
  32.     $handle;
  33. }
  34.  
  35. sub READ {
  36.     my $h = shift;
  37.     my $buf = $h->{incoming};
  38.     $_[0] = undef, return 0 unless $buf->length || !$h->EOF;
  39.     while (!$buf->length) {
  40.         $h->{ssh}->_start_interactive;
  41.         $_[0] = undef, return 0 unless $buf->length;
  42.     }
  43.     $_[0] = $buf->bytes;
  44.     $buf->empty;
  45.     length($_[0]);
  46. }
  47.  
  48. sub WRITE {
  49.     my $h = shift;
  50.     my($data) = @_;
  51.     my $len = length($data);
  52.     while ($data) {
  53.         my $chunk = substr($data, 0, CHUNK_SIZE, '');
  54.         my $packet = $h->{ssh}->packet_start(SSH_CMSG_STDIN_DATA);
  55.         $packet->put_str($chunk);
  56.         $packet->send;
  57.     }
  58.     $len;
  59. }
  60.  
  61. sub EOF { defined $_[0]->{exit} ? 1 : 0 }
  62.  
  63. sub CLOSE {
  64.     my $h = shift;
  65.     unless ($h->{incoming}) {
  66.         my $ssh = $h->{ssh};
  67.         my $packet = $ssh->packet_start(SSH_CMSG_EOF);
  68.         $packet->send;
  69.         $ssh->_start_interactive;
  70.     }
  71.     1;
  72. }
  73.  
  74. 1;
  75.