From a711fc132a7e18e67def6abeba3f8d18bbaae72f Mon Sep 17 00:00:00 2001 From: minima Date: Sat, 17 Mar 2001 13:25:39 +0000 Subject: [PATCH] put POSIX block check back in, try to deal with M$ lack of EWOULDBLOCK and EINPROGRESS --- Changes | 3 +++ perl/DXProtout.pm | 2 +- perl/Msg.pm | 25 +++++++++++++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Changes b/Changes index 2ccd8b4e..4b38e955 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,6 @@ +17Mar01======================================================================= +1. put block check back in, try a work around for EWOULDBLOCK/EINPROGRESS +for M$. 16Mar01======================================================================= 1. integrate build number into main cluster and change the PC18 to show version and build in the text portion diff --git a/perl/DXProtout.pm b/perl/DXProtout.pm index 86ab0e86..6ee4fbcc 100644 --- a/perl/DXProtout.pm +++ b/perl/DXProtout.pm @@ -102,7 +102,7 @@ sub pc17 # Request init string sub pc18 { - return "PC18^DXSpider Version $main::version Build $main::build^$DXProt::myprot_version^"; + return "PC18^DXSpider Version: $main::version Build: $main::build^$DXProt::myprot_version^"; } # diff --git a/perl/Msg.pm b/perl/Msg.pm index 839b5e45..b7be27d3 100644 --- a/perl/Msg.pm +++ b/perl/Msg.pm @@ -28,6 +28,22 @@ $wt_handles = IO::Select->new(); $er_handles = IO::Select->new(); $now = time; +my $blocking_supported = 0; + +BEGIN { + # Checks if blocking is supported + eval { + require POSIX; POSIX->import(qw (F_SETFL O_NONBLOCK)); + }; + $blocking_supported = 1 unless $@; +} + +my $w = $^W; +$^W = 0; +my $eagain = eval {EAGAIN()}; +my $einprogress = eval {EINPROGRESS()}; +my $ewouldblock = eval {EWOULDBLOCK()}; +$^W = $w; # #----------------------------------------------------------------- @@ -71,6 +87,8 @@ sub set_rproc sub blocking { + return unless $blocking_supported; + my $flags = fcntl ($_[0], F_GETFL, 0); if ($_[1]) { $flags &= ~O_NONBLOCK; @@ -137,9 +155,7 @@ sub connect { my $ip = gethostbyname($to_host); # my $r = $sock->connect($to_port, $ip); my $r = connect($sock, pack_sockaddr_in($to_port, $ip)); - unless ($r) { - return undef unless $! == EINPROGRESS; - } + return undef unless $r || _err_will_block($r); $conn->{sock} = $sock; @@ -265,7 +281,8 @@ sub _send { } sub _err_will_block { - return ($_[0] == EAGAIN || $_[0] == EWOULDBLOCK || $_[0] == EINPROGRESS); + return 0 unless $blocking_supported; + return ($_[0] == $eagain || $_[0] == $ewouldblock || $_[0] == $einprogress); } sub close_on_empty -- 2.34.1