]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/RESTEnvironment.pm
fork_worker: refactor child exit
[pve-common.git] / src / PVE / RESTEnvironment.pm
index 6a53741242349610902093342c2e3b7e04b5d6a6..c2fea2b1f047496d2a83744122fdc9e0b32f1e96 100644 (file)
@@ -26,7 +26,7 @@ my $rest_env;
 # and register forked processes with &$register_worker(pid)
 # Note: using $SIG{CHLD} = 'IGNORE' or $SIG{CHLD} = sub { wait (); } or ...
 # has serious side effects, because perls built in system() and open()
-# functions can't get the correct exit status of a child. So we cant use
+# functions can't get the correct exit status of a child. So we can't use
 # that (also see perlipc)
 
 my $WORKER_PIDS;
@@ -500,7 +500,7 @@ sub fork_worker {
        if ($sync && -t STDIN) {
            # some sync'ed workers operate on the tty but setsid sessions lose
            # the tty, so just create a new pgroup and give it the tty
-           POSIX::setpgid(0, 0) or die "failed to setpgid: $!\n";;
+           POSIX::setpgid(0, 0) or die "failed to setpgid: $!\n";
            POSIX::tcsetpgrp(fileno(STDIN), $$) or die "failed to tcsetpgrp: $!\n";
        } else {
            POSIX::setsid();
@@ -520,7 +520,7 @@ sub fork_worker {
                &$atfork();
            }
 
-           # same algorythm as used inside SA
+           # same algorithm as used inside SA
            # STDIN = /dev/null
            my $fd = fileno (STDIN);
 
@@ -579,22 +579,21 @@ sub fork_worker {
            }
            &$function($upid);
        };
+       my ($msg, $exitcode);
        my $err = $@;
        if ($err) {
            chomp $err;
            $err =~ s/\n/ /mg;
            syslog('err', $err);
-           my $msg = "TASK ERROR: $err\n";
-           POSIX::write($resfh, $msg, length($msg));
-           POSIX::close($resfh) if $sync;
-           POSIX::_exit(-1);
+           $msg = "TASK ERROR: $err\n";
+           $exitcode = -1;
        } else {
-           my $msg = "TASK OK\n";
-           POSIX::write($resfh, $msg, length($msg));
-           POSIX::close($resfh) if $sync;
-           POSIX::_exit(0);
+           $msg = "TASK OK\n";
+           $exitcode = 0;
        }
-       kill(-9, $$);
+       POSIX::write($resfh, $msg, length($msg));
+       POSIX::close($resfh) if $sync;
+       POSIX::_exit($exitcode);
     }
 
     # parent