summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-03-04 23:24:44 -0600
committerJesse Luehrs <doy@tozt.net>2012-03-04 23:24:44 -0600
commit08f0aa75ce9e9f04c4d5e925f366f1d07099d40c (patch)
treeb72252a74a70edff316fe793d6f2803f744d7d4b
parent35ac3605fdc040ab87fffb344a524fad7e6afad1 (diff)
downloadapp-termcast-08f0aa75ce9e9f04c4d5e925f366f1d07099d40c.tar.gz
app-termcast-08f0aa75ce9e9f04c4d5e925f366f1d07099d40c.zip
use IO::Select instead of Select::Retry
-rw-r--r--lib/App/Termcast.pm75
1 files changed, 49 insertions, 26 deletions
diff --git a/lib/App/Termcast.pm b/lib/App/Termcast.pm
index 22f8d2f..75613aa 100644
--- a/lib/App/Termcast.pm
+++ b/lib/App/Termcast.pm
@@ -4,10 +4,10 @@ use Moose;
with 'MooseX::Getopt::Dashes';
+use IO::Select;
use IO::Socket::INET;
use JSON;
use Scalar::Util 'weaken';
-use Select::Retry;
use Term::Filter;
use Term::ReadKey;
use Try::Tiny;
@@ -190,19 +190,30 @@ sub _build_socket {
# ensure the server accepted our connection info
{
- my ($rout, $eout) = retry_select($socket);
+ my $select = IO::Select->new($socket);
+ my ($r, undef, $e) = IO::Select->select(
+ $select, undef, $select,
+ );
- if (vec($eout, fileno($socket), 1)) {
- Carp::croak("Invalid password");
- }
- elsif (vec($rout, fileno($socket), 1)) {
- my $buf;
- $socket->recv($buf, 4096);
- if (!defined $buf || length $buf == 0) {
+ for my $fh (@$e) {
+ if ($fh == $socket) {
+ ReadMode 0 if $self->_has_term && $self->_term->_raw_mode;
Carp::croak("Invalid password");
}
- elsif ($buf ne ('hello, ' . $self->user . "\n")) {
- Carp::carp("Unknown login response from server: $buf");
+ }
+ for my $fh (@$r) {
+ if ($fh == $socket) {
+ my $buf;
+ $socket->recv($buf, 4096);
+ if (!defined $buf || length $buf == 0) {
+ ReadMode 0 if $self->_has_term && $self->_term->_raw_mode;
+ Carp::croak("Invalid password");
+ }
+ elsif ($buf ne ('hello, ' . $self->user . "\n")) {
+ ReadMode 0 if $self->_has_term && $self->_term->_raw_mode;
+ Carp::carp("Unknown login response from server: $buf");
+ ReadMode 5 if $self->_has_term && $self->_term->_raw_mode;
+ }
}
}
}
@@ -250,14 +261,14 @@ has _term => (
$self->_needs_termsize_update(1);
},
read_error => sub {
- my ($term, $eout) = @_;
- if (vec($eout, fileno($self->socket), 1)) {
+ my ($term, $fh) = @_;
+ if ($fh == $self->socket) {
$self->_new_socket;
}
},
read => sub {
- my ($term, $rout) = @_;
- if (vec($rout, fileno($self->socket), 1)) {
+ my ($term, $fh) = @_;
+ if ($fh == $self->socket) {
my $got = $term->_read_from_handle(
$self->socket, "socket"
);
@@ -270,7 +281,7 @@ has _term => (
}
},
munge_output => sub {
- my ($event, $buf) = @_;
+ my ($term, $buf) = @_;
$self->write_to_termcast($buf);
$buf;
},
@@ -291,23 +302,35 @@ sub write_to_termcast {
my ($buf) = @_;
my $socket = $self->socket;
+ my $select = IO::Select->new($socket);
- my ($wout, $eout) = retry_select(
- { mode => 'w', timeout => $self->timeout },
- $socket,
+ my (undef, $w, $e) = IO::Select->select(
+ undef, $select, $select, $self->timeout,
);
- if (!vec($wout, fileno($socket), 1) || vec($eout, fileno($socket), 1)) {
- $self->clear_socket;
- return $self->write_to_termcast(@_);
+ my $err;
+
+ for my $fh (@$e) {
+ if ($fh == $socket) {
+ $err = 1;
+ }
}
- if ($self->_needs_termsize_update) {
- $buf = $self->termsize_message . $buf;
- $self->_needs_termsize_update(0);
+ if (!$err) {
+ for my $fh (@$w) {
+ if ($fh == $socket) {
+ if ($self->_needs_termsize_update) {
+ $buf = $self->termsize_message . $buf;
+ $self->_needs_termsize_update(0);
+ }
+
+ return $self->socket->syswrite($buf);
+ }
+ }
}
- $self->socket->syswrite($buf);
+ $self->clear_socket;
+ return $self->write_to_termcast(@_);
}
=method run @ARGV