[pve-devel] applied: [PATCH common v2] PVE::RESTEnvironment::fork_worker: put child in foreground
Thomas Lamprecht
t.lamprecht at proxmox.com
Fri Jun 29 11:59:33 CEST 2018
On 6/29/18 11:21 AM, Stoiko Ivanov wrote:
> * Fix #1819
> * 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
> * Ignore SIGTTOU in child process (otherwise it gets stopped upon tcsetpgrp)
>
> Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
> ---
> changes from v1:
> * check whether STDIN is actually a terminal (otherwise running commands using
> fork_worker and redirecting input (e.g. ansible) failed with
> Inappropriate ioctl for device
> * whitespace fixup
> * the comment that the combination of having $sync 1 in few cases was wrong
> (all cli invocations involving fork_worker are affected)
>
> src/PVE/RESTEnvironment.pm | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/src/PVE/RESTEnvironment.pm b/src/PVE/RESTEnvironment.pm
> index 32ffdd1..3155aac 100644
> --- a/src/PVE/RESTEnvironment.pm
> +++ b/src/PVE/RESTEnvironment.pm
> @@ -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;
>
applied, with improved commit message and a commit adding/improving the
surrounding comments. Much thanks for spotting and fixing this!
More information about the pve-devel
mailing list