]> git.proxmox.com Git - qemu-server.git/commitdiff
vzdump: factor out fork_compressor_pipe
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 19 Mar 2020 17:34:31 +0000 (18:34 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 19 Mar 2020 17:34:31 +0000 (18:34 +0100)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
PVE/VZDump/QemuServer.pm

index c6dc99051ec3134c38e040c9660b2f24ddbe25e8..3b79b15d7451657b211a9f7809a7d8d7fec157a1 100644 (file)
@@ -501,6 +501,47 @@ sub archive_pbs {
     die $err if $err;
 }
 
+my $fork_compressor_pipe = sub {
+    my ($self, $comp, $outfileno) = @_;
+
+    my @pipefd = POSIX::pipe();
+    my $cpid = fork();
+    die "unable to fork worker - $!" if !defined($cpid) || $cpid < 0;
+    if ($cpid == 0) {
+       eval {
+           POSIX::close($pipefd[1]);
+           # redirect STDIN
+           my $fd = fileno(STDIN);
+           close STDIN;
+           POSIX::close(0) if $fd != 0;
+           die "unable to redirect STDIN - $!"
+               if !open(STDIN, "<&", $pipefd[0]);
+
+           # redirect STDOUT
+           $fd = fileno(STDOUT);
+           close STDOUT;
+           POSIX::close (1) if $fd != 1;
+
+           die "unable to redirect STDOUT - $!"
+               if !open(STDOUT, ">&", $outfileno);
+
+           exec($comp);
+           die "fork compressor '$comp' failed\n";
+       };
+       if (my $err = $@) {
+           $self->logerr($err);
+           POSIX::_exit(1);
+       }
+       POSIX::_exit(0);
+       kill(-9, $$);
+    } else {
+       POSIX::close($pipefd[0]);
+       $outfileno = $pipefd[1];
+    }
+
+    return ($cpid, $outfileno);
+};
+
 sub archive_vma {
     my ($self, $task, $vmid, $filename, $comp) = @_;
 
@@ -603,45 +644,10 @@ sub archive_vma {
            $outfh = IO::File->new($filename, "w") ||
                die "unable to open file '$filename' - $!\n";
        }
+       my $outfileno = fileno($outfh);
 
-       my $outfileno;
        if ($comp) {
-           my @pipefd = POSIX::pipe();
-           $cpid = fork();
-           die "unable to fork worker - $!" if !defined($cpid);
-           if ($cpid == 0) {
-               eval {
-                   POSIX::close($pipefd[1]);
-                   # redirect STDIN
-                   my $fd = fileno(STDIN);
-                   close STDIN;
-                   POSIX::close(0) if $fd != 0;
-                   die "unable to redirect STDIN - $!"
-                       if !open(STDIN, "<&", $pipefd[0]);
-
-                   # redirect STDOUT
-                   $fd = fileno(STDOUT);
-                   close STDOUT;
-                   POSIX::close (1) if $fd != 1;
-
-                   die "unable to redirect STDOUT - $!"
-                       if !open(STDOUT, ">&", fileno($outfh));
-
-                   exec($comp);
-                   die "fork compressor '$comp' failed\n";
-               };
-               if (my $err = $@) {
-                   $self->logerr($err);
-                   POSIX::_exit(1);
-               }
-               POSIX::_exit(0);
-               kill(-9, $$);
-           } else {
-               POSIX::close($pipefd[0]);
-               $outfileno = $pipefd[1];
-           }
-       } else {
-           $outfileno = fileno($outfh);
+           ($cpid, $outfileno) = $fork_compressor_pipe->($self, $comp, $outfileno);
        }
 
        my $add_fd_cb = sub {