summaryrefslogtreecommitdiff
path: root/img/lib/IM/Ssh.pm
diff options
context:
space:
mode:
Diffstat (limited to 'img/lib/IM/Ssh.pm')
-rw-r--r--img/lib/IM/Ssh.pm121
1 files changed, 90 insertions, 31 deletions
diff --git a/img/lib/IM/Ssh.pm b/img/lib/IM/Ssh.pm
index bcac3f39..404a8f78 100644
--- a/img/lib/IM/Ssh.pm
+++ b/img/lib/IM/Ssh.pm
@@ -4,46 +4,47 @@
### Ssh.pm
###
### Author: Masatoshi Tsuchiya <tsuchiya@pine.kuee.kyoto-u.ac.jp>
+### Internet Message Group <img@mew.org>
### Created: Oct 05, 1999
-### Revised: Apr 14, 2000
+### Revised: Dec 7, 2002
###
-my $PM_VERSION = "IM::Ssh.pm version 20000414(IM141)";
+my $PM_VERSION = "IM::Ssh.pm version 20021207(IM142)";
package IM::Ssh;
require 5.003;
require Exporter;
-use IM::Config qw( connect_timeout command_timeout $SSH_PATH );
+use IM::Config qw(connect_timeout command_timeout $SSH_PATH);
use IM::Util;
use strict;
-use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $SSH $FH @PID );
-@ISA = qw( Exporter );
-@EXPORT = qw( ssh_proxy );
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $SSH $FH @PID);
+@ISA = qw(Exporter);
+@EXPORT = qw(ssh_proxy);
# Global Variables
$FH = "SSH00000";
@PID = ();
-sub ssh_proxy ($$$$) {
- my( $server, $remote, $local, $host ) = @_;
+sub ssh_proxy($$$$) {
+ my($server, $remote, $local, $host) = @_;
- unless( $host ){
- im_err( "Missing relay host.\n" );
+ unless ($host) {
+ im_err("Missing relay host.\n");
return 0;
}
- im_notice( "openning SSH-tunnel to $server/$remote\%$local via $host\n" )
+ im_notice("openning SSH-tunnel to $server/$remote\%$local via $host\n")
if &verbose;
- my( $pid, $read, $write );
+ my($pid, $read, $write);
FORK: {
no strict 'refs';
$read = $FH++;
$write = $FH++;
- pipe( $read, $write );
- if ( $pid = fork ) {
+ pipe($read, $write);
+ if ($pid = fork) {
close $write;
- my( $buf, $sig, $i );
- for( $i=0; $i<3; $i++ ){
+ my($buf, $sig, $i);
+ for ($i=0; $i<3; $i++) {
$sig = $SIG{ALRM};
$SIG{ALRM} = sub { die "SIGALRM is received\n"; };
eval {
@@ -52,34 +53,35 @@ sub ssh_proxy ($$$$) {
alarm 0;
};
$SIG{ALRM} = $sig;
- if ( $@ !~ /SIGALRM is received/ ) {
- push( @PID, $pid );
- if ( $buf =~ /ssh_proxy_connect/ ) {
+ if ($@ !~ /SIGALRM is received/) {
+ push(@PID, $pid);
+ if ($buf =~ /ssh_proxy_connect/) {
return $local;
- } elsif ( $buf =~ /Local: bind: Address already in use/ ) {
+ } elsif ($buf =~ /Local: bind: Address already in use/) {
$local++;
redo FORK;
- } elsif( $buf ){
+ } elsif ($buf) {
last;
}
}
}
$buf =~ s/\s+$//;
$buf =~ s/\n/\\n/g;
- im_warn( "Accident in Port Forwading: $buf\n" );
- } elsif ( $pid == 0 ) {
+ im_warn("Accident in Port Forwading: $buf\n");
+ } elsif ($pid == 0) {
close $read;
- open(STDOUT, ">&$write" );
- open(STDERR, ">&$write" );
+ open(STDOUT, ">&$write");
+ open(STDERR, ">&$write");
exec($SSH_PATH, '-n', '-x', '-o', 'BatchMode yes',
- "-L$local:$server:$remote", $host,
- sprintf( 'echo ssh_proxy_connect ; sleep %s', &command_timeout() ) );
+ "-L$local:$server:$remote", $host,
+ sprintf('echo ssh_proxy_connect ; sleep %s',
+ &command_timeout()));
exit 0; # Not reach.
- } elsif ( $! =~ /No more process/ ) {
+ } elsif ($! =~ /No more process/) {
sleep 5;
redo FORK;
} else {
- im_warn( "Can't fork $SSH_PATH.\n" );
+ im_warn("Can't fork $SSH_PATH.\n");
}
}
0;
@@ -87,12 +89,69 @@ sub ssh_proxy ($$$$) {
sub END {
- if ( @PID ) {
+ if (@PID) {
kill 15, @PID;
sleep 3;
kill 9, @PID;
}
}
-
1;
+
+__END__
+
+=head1 NAME
+
+IM::Ssh - SSH handler
+
+=head1 SYNOPSIS
+
+ use IM::Ssh;
+
+ if ($remote = ssh_proxy($server, $remote, $local, $host)) {
+ # connection succeeded
+ } else {
+ # connection failed
+ }
+
+=head1 DESCRIPTION
+
+The I<IM::Ssh> module handles SSH.
+
+This modules is provided by IM (Internet Message).
+
+=head1 COPYRIGHT
+
+IM (Internet Message) is copyrighted by IM developing team.
+You can redistribute it and/or modify it under the modified BSD
+license. See the copyright file for more details.
+
+=cut
+
+### Copyright (C) 1997, 1998, 1999 IM developing team
+### All rights reserved.
+###
+### Redistribution and use in source and binary forms, with or without
+### modification, are permitted provided that the following conditions
+### are met:
+###
+### 1. Redistributions of source code must retain the above copyright
+### notice, this list of conditions and the following disclaimer.
+### 2. Redistributions in binary form must reproduce the above copyright
+### notice, this list of conditions and the following disclaimer in the
+### documentation and/or other materials provided with the distribution.
+### 3. Neither the name of the team nor the names of its contributors
+### may be used to endorse or promote products derived from this software
+### without specific prior written permission.
+###
+### THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND
+### ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+### PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE
+### LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+### CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+### SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+### BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+### WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+### OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+### IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.