2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 23:06:37 +00:00

Add BlockingInformParent (by Dirk)

git-svn-id: https://svn.fhem.de/fhem/trunk@2955 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2013-03-21 13:43:29 +00:00
parent 27ba198cad
commit 12b94e2d2d

View File

@ -15,8 +15,11 @@ use warnings;
use IO::Socket::INET; use IO::Socket::INET;
sub BlockingCall($$@); sub BlockingCall($$@);
sub BlockingExit($); sub BlockingExit();
sub BlockingKill($); sub BlockingKill($);
sub BlockingInformParent($;$$);
my $telnetDevice;
sub sub
BlockingCall($$@) BlockingCall($$@)
@ -25,8 +28,6 @@ BlockingCall($$@)
# Look for the telnetport # Look for the telnetport
# must be done before forking to be able to create a temporary device # must be done before forking to be able to create a temporary device
my $telnetDevice;
if($finishFn) {
my $tName = "telnetForBlockingFn"; my $tName = "telnetForBlockingFn";
$telnetDevice = $tName if($defs{$tName}); $telnetDevice = $tName if($defs{$tName});
@ -58,7 +59,6 @@ BlockingCall($$@)
Log 1, $msg; Log 1, $msg;
return $msg; return $msg;
} }
}
# do fork # do fork
my $pid = fork; my $pid = fork;
@ -78,15 +78,45 @@ BlockingCall($$@)
my $ret = &{$blockingFn}($arg); my $ret = &{$blockingFn}($arg);
use strict "refs"; use strict "refs";
BlockingExit(undef) if(!$finishFn); BlockingExit() if(!$finishFn);
# Write the data back, calling the function
BlockingInformParent($finishFn, $ret, 0);
BlockingExit();
}
sub
BlockingInformParent($;$$)
{
my ($informFn, $param, $waitForRead) = @_;
my $ret = undef;
$waitForRead = 1 if (undef($waitForRead));
# Write the data back, calling the function # Write the data back, calling the function
my $addr = "localhost:$defs{$telnetDevice}{PORT}"; my $addr = "localhost:$defs{$telnetDevice}{PORT}";
my $client = IO::Socket::INET->new(PeerAddr => $addr); my $client = IO::Socket::INET->new(PeerAddr => $addr);
Log 1, "CallBlockingFn: Can't connect to $addr\n" if(!$client); Log 1, "CallBlockingFn: Can't connect to $addr\n" if(!$client);
$ret =~ s/'/\\'/g;
syswrite($client, "{$finishFn('$ret')}\n"); if (defined($param)) {
BlockingExit($client); $param =~ s/'/\\'/g;
$param = "'$param'"
} else {
$param = "";
}
syswrite($client, "{$informFn($param)}\n");
if ($waitForRead) {
my $len = sysread($client, $ret, 4096);
chop($ret);
$ret = undef if(!defined($len));
}
if($^O =~ m/Win/) {
close($client) if($client);
}
return $ret;
} }
sub sub
@ -99,12 +129,10 @@ BlockingKill($)
} }
sub sub
BlockingExit($) BlockingExit()
{ {
my $client = shift;
if($^O =~ m/Win/) { if($^O =~ m/Win/) {
close($client) if($client);
eval "require threads;"; eval "require threads;";
threads->exit(); threads->exit();