App-BCSSH

 view release on metacpan or  search on metacpan

lib/App/BCSSH/Handler/scp.pm  view on Meta::CPAN

package App::BCSSH::Handler::scp;
use Moo;
my $have_pty;
BEGIN { eval {require IO::Pty::Easy; $have_pty = 1} }

with 'App::BCSSH::Handler';

has destination => (
    is => 'ro',
    default => sub {
        -d && return $_
            for ("$ENV{HOME}/Desktop", "$ENV{HOME}/desktop", $ENV{HOME});
    },
);
has scp => (
    is => 'ro',
    default => sub { 'scp' },
);

sub handle {
    my ($self, $send, $args) = @_;
    my $files = $args->{files};
    for my $file (@$files) {
        $file = $self->host.':'.$file;
    }
    my $socket = $send->();
    fork and return;
    my @scp = ref $self->scp ? @{ $self->scp } : $self->scp;
    my @command = (@scp, '-r', '--', @$files, $self->destination);
    if ($have_pty) {
        my $pty = IO::Pty::Easy->new;
        $pty->spawn(@command);

        while ($pty->is_active) {
            my $output = $pty->read;
            last if defined($output) && $output eq '';
            $socket->syswrite($output);
        }
        $pty->close;
    }
    else {
        system @command;
    }
    $socket->shutdown(2);
    exit;
}

1;



( run in 1.023 second using v1.01-cache-2.11-cpan-d7f47b0818f )