applied On Tue, Sep 12, 2017 at 01:25:30PM +0200, Thomas Lamprecht wrote: > Encode the result or the error in JSON. This way complex objects or > exceptions may be passed to the parent in a generic way. > > This allows to remove the second pipe 'pipe_err'. > > Allow also to return undef without any warnings to our caller. > This avoids a "use of uninitialized variable ..." warning > > Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> > --- > > changes v2 -> v3: > * adapt Dietmars idea and use JSON for serialization, which then > allows to omit the second pipe > > src/PVE/Tools.pm | 16 +++++++--------- > 1 file changed, 7 insertions(+), 9 deletions(-) > > diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm > index 81662b1..3080b3e 100644 > --- a/src/PVE/Tools.pm > +++ b/src/PVE/Tools.pm > @@ -20,6 +20,7 @@ use base 'Exporter'; > use URI::Escape; > use Encode; > use Digest::SHA; > +use JSON; > use Text::ParseWords; > use String::ShellQuote; > use Time::HiRes qw(usleep gettimeofday tv_interval alarm); > @@ -905,7 +906,6 @@ sub run_fork_with_timeout { > my $res; > my $error; > my $pipe_out = IO::Pipe->new(); > - my $pipe_err = IO::Pipe->new(); > > # disable pending alarms, save their remaining time > my $prev_alarm = alarm 0; > @@ -922,35 +922,33 @@ sub run_fork_with_timeout { > > if (!$child) { > $pipe_out->writer(); > - $pipe_err->writer(); > > eval { > $res = $sub->(); > - print {$pipe_out} "$res"; > + print {$pipe_out} encode_json({ result => $res }); > $pipe_out->flush(); > }; > if (my $err = $@) { > - print {$pipe_err} "$err"; > - $pipe_err->flush(); > + print {$pipe_out} encode_json({ error => $err }); > + $pipe_out->flush(); > POSIX::_exit(1); > } > POSIX::_exit(0); > } > > $pipe_out->reader(); > - $pipe_err->reader(); > > my $readvalues = sub { > local $/ = undef; > - $res = <$pipe_out>; > - $error = <$pipe_err>; > + my $child_res = decode_json(scalar<$pipe_out>); > + $res = $child_res->{result}; > + $error = $child_res->{error}; > }; > eval { > run_with_timeout($timeout, $readvalues); > }; > warn $@ if $@; > $pipe_out->close(); > - $pipe_err->close(); > kill('KILL', $child); > waitpid($child, 0); > > -- > 2.11.0
_______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel