$conn->{eproc} = $callback;
}
+sub set_on_eof
+{
+ my $conn = shift;
+ my $callback = shift;
+ $conn->{sock}->on_eof($callback);
+ $conn->{sock}->on_error($callback);
+}
+
sub set_rproc
{
my $conn = shift;
# Create a connection end-point object
my $conn = $pkg;
- $conn = $pkg->new($rproc);
+ unless (ref $pkg) {
+ $conn = $pkg->new($rproc);
+ }
$conn->{peerhost} = $to_host;
$conn->{peerport} = $to_port;
$conn->{sort} = 'Outgoing';
connect => [$to_host, $to_port],
-# on_connect => sub {my $h = shift; $conn->{peerhost} = $h->handle->peername;},
+ on_connect => sub {my $h = shift; $conn->{peerhost} = shift;},
on_eof => sub {$conn->disconnect},
}
}
- if (defined($sock)) {
+ if (ref $sock && $sock->isa('AnyEvent::Handle') && exists $sock->{fh}) {
+ shutdown($sock->{fh}, 2);
$sock->destroy;
+ } else {
+ my $s;
+ $s = "already destroyed" unless exists $sock->{fh};
+ $s ||= ref $sock || $sock || "undefined";
+ dbg("Msg::disconnect trying to disconnect a $s socket") if isdbg('chan');
}
unless ($main::is_win) {
while (@$rq) {
my $data = shift @$rq;
my $lth = length $data;
+ my $call = $conn->{call} || 'none';
if (isdbg('raw')) {
- my $call = $conn->{call} || 'none';
if (isdbg('raw')) {
dbgdump('raw', "$call send $lth: ", $lth);
}
}
- $sock->push_write($data);
- $total_out = $lth;
+ if (defined $sock && !$sock->destroyed) {
+ $sock->push_write($data);
+ $total_out = $lth;
+ } else {
+ dbg("_send_stuff $call ending data ignored: $data");
+ }
}
}
sub close_on_empty
{
my $conn = shift;
- $conn->{sock}->push_shutdown;
+ $conn->{sock}->on_drain(sub {$conn->disconnect;});
}
#-----------------------------------------------------------------
dbg("Msg::set_event_handler called from ${pkg}::${fn} line $line doing $s");
}
+sub echo
+{
+ my $conn = shift;
+ return defined $_[0] ? $conn->{echo} = $_[0] : $_[0];
+}
+
sub DESTROY
{
my $conn = shift;