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:
parent
49d9886e5e
commit
c8c687804c
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user