fix #1819: fork_worker: ensure sync'ed workers control terminal
authorStoiko Ivanov <s.ivanov@proxmox.com>
Fri, 29 Jun 2018 09:21:18 +0000 (11:21 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 29 Jun 2018 09:36:01 +0000 (11:36 +0200)
Use setpgid + tcsetpgrp instead of setsid if $sync (invocation via
cli), thus keeping /dev/tty - ssh-copy-id/ssh need it to read the
password, and putting the child in the forground. Further, ignore
SIGTTOU in child process (otherwise it gets stopped upon tcsetpgrp)

Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/RESTEnvironment.pm

index 32ffdd1..3155aac 100644 (file)
@@ -494,10 +494,16 @@ sub fork_worker {
        $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { die "received interrupt\n"; };
 
        $SIG{CHLD} = $SIG{PIPE} = 'DEFAULT';
+       $SIG{TTOU} = 'IGNORE';
 
        # set sess/process group - we want to be able to kill the
        # whole process group
-       POSIX::setsid();
+       if ($sync && -t STDIN) {
+           POSIX::setpgid(0,0) or die "failed to setpgid: $!\n";;
+           POSIX::tcsetpgrp(fileno(STDIN), $$) or die "failed to tcsetpgrp: $!\n";
+       } else {
+           POSIX::setsid();
+       }
 
        POSIX::close ($psync[0]);
        POSIX::close ($ctrlfd[0]) if $sync;