2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 09:16:53 +00:00

DevIo.pm: fix NonBlocking changes (Forum #54833)

git-svn-id: https://svn.fhem.de/fhem/trunk@11701 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2016-06-21 09:41:19 +00:00
parent 49d9886e5e
commit c8c687804c

View File

@ -201,17 +201,13 @@ DevIo_OpenDev($$$;$)
($dev, $baudrate) = split("@", $dev); ($dev, $baudrate) = split("@", $dev);
my ($databits, $parity, $stopbits) = (8, 'none', 1); my ($databits, $parity, $stopbits) = (8, 'none', 1);
sub my $doCb = sub ($$) {
doCb($)
{
my ($r) = @_; my ($r) = @_;
$callback->($hash,$r) if($callback); $callback->($hash,$r) if($callback);
return $r; return $r;
} };
sub my $doTailWork = sub {
doTailWork()
{
DevIo_setStates($hash, "opened"); DevIo_setStates($hash, "opened");
my $ret; my $ret;
@ -240,7 +236,7 @@ DevIo_OpenDev($$$;$)
DoTrigger($name, "CONNECTED") if($reopen && !$ret); DoTrigger($name, "CONNECTED") if($reopen && !$ret);
return undef; return undef;
} };
if($baudrate =~ m/(\d+)(,([78])(,([NEO])(,([012]))?)?)?/) { if($baudrate =~ m/(\d+)(,([78])(,([NEO])(,([012]))?)?)?/) {
$baudrate = $1 if(defined($1)); $baudrate = $1 if(defined($1));
@ -252,7 +248,7 @@ DevIo_OpenDev($$$;$)
if($hash->{DevIoJustClosed}) { if($hash->{DevIoJustClosed}) {
delete $hash->{DevIoJustClosed}; delete $hash->{DevIoJustClosed};
return doCb(undef); return &$doCb(undef);
} }
$hash->{PARTIAL} = ""; $hash->{PARTIAL} = "";
@ -269,14 +265,14 @@ DevIo_OpenDev($$$;$)
}; };
if($@) { if($@) {
Log3 $name, 1, $@; Log3 $name, 1, $@;
return doCb($@); return &$doCb($@);
} }
if(!$conn) { if(!$conn) {
Log3 $name, 3, "Can't connect to $dev: $!" if(!$reopen); Log3 $name, 3, "Can't connect to $dev: $!" if(!$reopen);
$readyfnlist{"$name.$dev"} = $hash; $readyfnlist{"$name.$dev"} = $hash;
DevIo_setStates($hash, "disconnected"); DevIo_setStates($hash, "disconnected");
return doCb(""); return &$doCb("");
} }
$hash->{TCPDev} = $conn; $hash->{TCPDev} = $conn;
$hash->{FD} = $conn->fileno(); $hash->{FD} = $conn->fileno();
@ -293,11 +289,11 @@ DevIo_OpenDev($$$;$)
if (!CallFn($devName, "IOOpenFn", $hash)) { if (!CallFn($devName, "IOOpenFn", $hash)) {
Log3 $name, 3, "Can't open $dev!"; Log3 $name, 3, "Can't open $dev!";
DevIo_setStates($hash, "disconnected"); DevIo_setStates($hash, "disconnected");
return doCb(""); return &$doCb("");
} }
} else { } else {
DevIo_setStates($hash, "disconnected"); DevIo_setStates($hash, "disconnected");
return doCb(""); return &$doCb("");
} }
} elsif($dev =~ m/^(.+):([0-9]+)$/) { # host:port } elsif($dev =~ m/^(.+):([0-9]+)$/) { # host:port
@ -306,13 +302,11 @@ DevIo_OpenDev($$$;$)
# for non-existent devices has a delay of 3 sec, we are sitting all the # for non-existent devices has a delay of 3 sec, we are sitting all the
# time in this connect. NEXT_OPEN tries to avoid this problem. # time in this connect. NEXT_OPEN tries to avoid this problem.
if($hash->{NEXT_OPEN} && time() < $hash->{NEXT_OPEN}) { if($hash->{NEXT_OPEN} && time() < $hash->{NEXT_OPEN}) {
return doCb(undef); return &$doCb(undef);
} }
my $timeout = $hash->{TIMEOUT} ? $hash->{TIMEOUT} : 3; my $timeout = $hash->{TIMEOUT} ? $hash->{TIMEOUT} : 3;
sub my $doTcpTail = sub($) {
doTcpTail($)
{
my ($conn) = @_; my ($conn) = @_;
if($conn) { if($conn) {
delete($hash->{NEXT_OPEN}); delete($hash->{NEXT_OPEN});
@ -331,7 +325,7 @@ DevIo_OpenDev($$$;$)
delete($readyfnlist{"$name.$dev"}); delete($readyfnlist{"$name.$dev"});
$selectlist{"$name.$dev"} = $hash; $selectlist{"$name.$dev"} = $hash;
return 1; return 1;
} };
if($callback) { if($callback) {
use HttpUtils; use HttpUtils;
@ -343,26 +337,26 @@ DevIo_OpenDev($$$;$)
callback=> sub() { callback=> sub() {
my ($h, $err, undef) = @_; my ($h, $err, undef) = @_;
return $callback->($hash, $err) if($err); return $callback->($hash, $err) if($err);
return doCb("") if(!doTcpTail($h->{conn})); return &$doCb("") if(!&$doTcpTail($h->{conn}));
return doCb(doTailWork()); return &$doCb(&$doTailWork());
} }
}); });
return doCb($err) if($err); return &$doCb($err) if($err);
return undef; return undef;
} else { } else {
my $conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => $timeout); my $conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => $timeout);
return doCb("") if(!doTcpTail($conn)); return &$doCb("") if(!&$doTcpTail($conn));
} }
} elsif($baudrate && lc($baudrate) eq "directio") { # w/o Device::SerialPort } elsif($baudrate && lc($baudrate) eq "directio") { # w/o Device::SerialPort
if(!open($po, "+<$dev")) { if(!open($po, "+<$dev")) {
return doCb(undef) if($reopen); return &$doCb(undef) if($reopen);
Log3 $name, 3, "Can't open $dev: $!"; Log3 $name, 3, "Can't open $dev: $!";
$readyfnlist{"$name.$dev"} = $hash; $readyfnlist{"$name.$dev"} = $hash;
DevIo_setStates($hash, "disconnected"); DevIo_setStates($hash, "disconnected");
return doCb(""); return &$doCb("");
} }
$hash->{DIODev} = $po; $hash->{DIODev} = $po;
@ -391,15 +385,15 @@ DevIo_OpenDev($$$;$)
} }
if($@) { if($@) {
Log3 $name, 1, $@; Log3 $name, 1, $@;
return doCb($@); return &$doCb($@);
} }
if(!$po) { if(!$po) {
return doCb(undef) if($reopen); return &$doCb(undef) if($reopen);
Log3 $name, 3, "Can't open $dev: $!"; Log3 $name, 3, "Can't open $dev: $!";
$readyfnlist{"$name.$dev"} = $hash; $readyfnlist{"$name.$dev"} = $hash;
DevIo_setStates($hash, "disconnected"); DevIo_setStates($hash, "disconnected");
return doCb(""); return &$doCb("");
} }
$hash->{USBDev} = $po; $hash->{USBDev} = $po;
if( $^O =~ /Win/ ) { if( $^O =~ /Win/ ) {
@ -443,7 +437,7 @@ DevIo_OpenDev($$$;$)
$po->write_settings; $po->write_settings;
} }
return doCb(doTailWork()); return &$doCb(&$doTailWork());
} }
sub sub