X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FMsg.pm;h=403303dd05df5bafa77a2b8bb1e37c4d09e0587f;hb=4f3bdfa16cf0d5adf08ef13fc06384e39db485c6;hp=eb6892a8f1f3568f41bbda4dd3316fe78f63ee98;hpb=15ee0303d77c205e68144dfd8d8a4e0110bbe5ea;p=spider.git diff --git a/perl/Msg.pm b/perl/Msg.pm index eb6892a8..403303dd 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; @@ -135,10 +153,9 @@ sub connect { blocking($sock, 0); my $ip = gethostbyname($to_host); - my $r = $sock->connect($to_port, $ip); - unless ($r) { - return undef unless $! == EINPROGRESS; - } +# 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; @@ -264,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