projects
/
spider.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
add CTY-2105 prefixes
[spider.git]
/
perl
/
Msg.pm
diff --git
a/perl/Msg.pm
b/perl/Msg.pm
index 45c0ab7c48b68f6bdd2f80d2a8fbd3c027ef0f57..f2bb29768169b02b953887dcc6395a42d7b7175d 100644
(file)
--- a/
perl/Msg.pm
+++ b/
perl/Msg.pm
@@
-5,25
+5,20
@@
#
# I have modified it to suit my devious purposes (Dirk Koopman G1TLH)
#
#
# I have modified it to suit my devious purposes (Dirk Koopman G1TLH)
#
-#
$Id$
+#
#
package Msg;
use strict;
#
package Msg;
use strict;
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
+use DXUtil;
use IO::Select;
use IO::Select;
-use IO::Socket;
use DXDebug;
use Timer;
use DXDebug;
use Timer;
-use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported $cnum);
+use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported $cnum
$total_in $total_out $io_socket
);
%rd_callbacks = ();
%wt_callbacks = ();
%rd_callbacks = ();
%wt_callbacks = ();
@@
-31,6
+26,7
@@
use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $e
$rd_handles = IO::Select->new();
$wt_handles = IO::Select->new();
$er_handles = IO::Select->new();
$rd_handles = IO::Select->new();
$wt_handles = IO::Select->new();
$er_handles = IO::Select->new();
+$total_in = $total_out = 0;
$now = time;
$now = time;
@@
-40,12
+36,25
@@
BEGIN {
local $^W;
require POSIX; POSIX->import(qw(O_NONBLOCK F_SETFL F_GETFL))
};
local $^W;
require POSIX; POSIX->import(qw(O_NONBLOCK F_SETFL F_GETFL))
};
+
+ eval {
+ local $^W;
+ require IO::Socket::INET6;
+ };
+
+ if ($@) {
+ dbg($@);
+ require IO::Socket;
+ $io_socket = 'IO::Socket::INET';
+ } else {
+ $io_socket = 'IO::Socket::INET6';
+ }
+ $io_socket->import;
+
if ($@ || $main::is_win) {
if ($@ || $main::is_win) {
-# print STDERR "POSIX Blocking *** NOT *** supported $@\n";
- $blocking_supported = 0;
+ $blocking_supported = $io_socket->can('blocking') ? 2 : 0;
} else {
} else {
- $blocking_supported = 1;
-# print STDERR "POSIX Blocking enabled\n";
+ $blocking_supported = $io_socket->can('blocking') ? 2 : 1;
}
}
@@
-71,12
+80,12
@@
BEGIN {
# defines EINPROGRESS as 10035. We provide it here because some
# Win32 users report POSIX::EINPROGRESS is not vendor-supported.
if ($^O eq 'MSWin32') {
# defines EINPROGRESS as 10035. We provide it here because some
# Win32 users report POSIX::EINPROGRESS is not vendor-supported.
if ($^O eq 'MSWin32') {
- eval '*EINPROGRESS = sub { 10036 };';
- eval '*EWOULDBLOCK = *EAGAIN = sub { 10035 };';
- eval '*F_GETFL = sub { 0 };';
- eval '*F_SETFL = sub { 0 };';
- eval '
*IPPROTO_TCP = sub
{ 6 };';
- eval '
*TCP_NODELAY = sub
{ 1 };';
+ eval '*EINPROGRESS = sub { 10036 };'
unless defined *EINPROGRESS
;
+ eval '*EWOULDBLOCK = *EAGAIN = sub { 10035 };'
unless defined *EWOULDBLOCK
;
+ eval '*F_GETFL = sub { 0 };'
unless defined *F_GETFL
;
+ eval '*F_SETFL = sub { 0 };'
unless defined *F_SETFL
;
+ eval '
sub IPPROTO_TCP
{ 6 };';
+ eval '
sub TCP_NODELAY
{ 1 };';
$blocking_supported = 0; # it appears that this DOESN'T work :-(
}
}
$blocking_supported = 0; # it appears that this DOESN'T work :-(
}
}
@@
-138,12
+147,8
@@
sub blocking
return unless $blocking_supported;
# Make the handle stop blocking, the Windows way.
return unless $blocking_supported;
# Make the handle stop blocking, the Windows way.
- if ($main::is_win) {
- # 126 is FIONBIO (some docs say 0x7F << 16)
- ioctl( $_[0],
- 0x80000000 | (4 << 16) | (ord('f') << 8) | 126,
- "$_[1]"
- );
+ if ($blocking_supported) {
+ $_[0]->blocking($_[1]);
} else {
my $flags = fcntl ($_[0], F_GETFL, 0);
if ($_[1]) {
} else {
my $flags = fcntl ($_[0], F_GETFL, 0);
if ($_[1]) {
@@
-188,6
+193,21
@@
sub pid_gone
}
}
}
}
+sub ax25
+{
+ my $conn = shift;
+ return $conn->{csort} eq 'ax25';
+}
+
+sub peerhost
+{
+ my $conn = shift;
+ $conn->{peerhost} ||= 'ax25' if $conn->ax25;
+ $conn->{peerhost} ||= $conn->{sock}->peerhost if $conn->{sock} && $conn->{sock}->isa('IO::Socket::INET');
+ $conn->{peerhost} ||= 'UNKNOWN';
+ return $conn->{peerhost};
+}
+
#-----------------------------------------------------------------
# Send side routines
sub connect {
#-----------------------------------------------------------------
# Send side routines
sub connect {
@@
-203,7
+223,7
@@
sub connect {
$conn->{sort} = 'Outgoing';
# Create a new internet socket
$conn->{sort} = 'Outgoing';
# Create a new internet socket
- my $sock =
IO::Socket::INET
->new();
+ my $sock =
$io_socket
->new();
return undef unless $sock;
my $proto = getprotobyname('tcp');
return undef unless $sock;
my $proto = getprotobyname('tcp');
@@
-216,12
+236,12
@@
sub connect {
my $ip = gethostbyname($to_host);
return undef unless $ip;
my $ip = gethostbyname($to_host);
return undef unless $ip;
-# my $r = $sock->connect($to_port, $ip);
my $r = connect($sock, pack_sockaddr_in($to_port, $ip));
return undef unless $r || _err_will_block($!);
$conn->{sock} = $sock;
my $r = connect($sock, pack_sockaddr_in($to_port, $ip));
return undef unless $r || _err_will_block($!);
$conn->{sock} = $sock;
-
+ $conn->{peerhost} = $sock->peerhost; # for consistency
+
if ($conn->{rproc}) {
my $callback = sub {$conn->_rcv};
set_event_handler ($sock, read => $callback);
if ($conn->{rproc}) {
my $callback = sub {$conn->_rcv};
set_event_handler ($sock, read => $callback);
@@
-235,7
+255,7
@@
sub start_program
my $pid;
local $^F = 10000; # make sure it ain't closed on exec
my $pid;
local $^F = 10000; # make sure it ain't closed on exec
- my ($a, $b) =
IO::S
ocket->socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC);
+ my ($a, $b) =
$io_s
ocket->socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC);
if ($a && $b) {
$a->autoflush(1);
$b->autoflush(1);
if ($a && $b) {
$a->autoflush(1);
$b->autoflush(1);
@@
-346,10
+366,10
@@
sub _send {
# return to the event loop only after every message, or if it
# is likely to block in the middle of a message.
# return to the event loop only after every message, or if it
# is likely to block in the middle of a message.
-
if ($conn->{blocking} != $flush) {
-
blocking($sock, $flush);
-
$conn->{blocking} = $flush;
-
}
+
#
if ($conn->{blocking} != $flush) {
+
#
blocking($sock, $flush);
+
#
$conn->{blocking} = $flush;
+
#
}
my $offset = (exists $conn->{send_offset}) ? $conn->{send_offset} : 0;
while (@$rq) {
my $offset = (exists $conn->{send_offset}) ? $conn->{send_offset} : 0;
while (@$rq) {
@@
-378,6
+398,7
@@
sub _send {
my $call = $conn->{call} || 'none';
dbgdump('raw', "$call send $bytes_written: ", $msg);
}
my $call = $conn->{call} || 'none';
dbgdump('raw', "$call send $bytes_written: ", $msg);
}
+ $total_out += $bytes_written;
$offset += $bytes_written;
$bytes_to_write -= $bytes_written;
}
$offset += $bytes_written;
$bytes_to_write -= $bytes_written;
}
@@
-433,7
+454,7
@@
sub new_server {
my ($pkg, $my_host, $my_port, $login_proc) = @_;
my $self = $pkg->new($login_proc);
my ($pkg, $my_host, $my_port, $login_proc) = @_;
my $self = $pkg->new($login_proc);
- $self->{sock} =
IO::Socket::INET
->new (
+ $self->{sock} =
$io_socket
->new (
LocalAddr => "$my_host:$my_port",
# LocalPort => $my_port,
Listen => SOMAXCONN,
LocalAddr => "$my_host:$my_port",
# LocalPort => $my_port,
Listen => SOMAXCONN,
@@
-496,13
+517,14
@@
sub _rcv { # Complement to _send
return unless defined($sock);
my @lines;
return unless defined($sock);
my @lines;
-
if ($conn->{blocking}) {
-
blocking($sock, 0);
-
$conn->{blocking} = 0;
-
}
+
#
if ($conn->{blocking}) {
+
#
blocking($sock, 0);
+
#
$conn->{blocking} = 0;
+
#
}
$bytes_read = sysread ($sock, $msg, 1024, 0);
if (defined ($bytes_read)) {
if ($bytes_read > 0) {
$bytes_read = sysread ($sock, $msg, 1024, 0);
if (defined ($bytes_read)) {
if ($bytes_read > 0) {
+ $total_in += $bytes_read;
if (isdbg('raw')) {
my $call = $conn->{call} || 'none';
dbgdump('raw', "$call read $bytes_read: ", $msg);
if (isdbg('raw')) {
my $call = $conn->{call} || 'none';
dbgdump('raw', "$call read $bytes_read: ", $msg);