fix #1819: fork_worker: ensure sync'ed workers control terminal
[pve-common.git] / src / PVE / PTY.pm
index 1178ea7..e433c4e 100644 (file)
@@ -165,7 +165,7 @@ sub tcsetsize($$$) {
        or die "failed to set window size: $!\n";
 }
 
        or die "failed to set window size: $!\n";
 }
 
-sub read_password(;$$) {
+sub read_password($;$$) {
     my ($query, $infd, $outfd) = @_;
 
     my $password = '';
     my ($query, $infd, $outfd) = @_;
 
     my $password = '';
@@ -194,10 +194,13 @@ sub read_password(;$$) {
        syswrite($outfd, $query, length($query));
        while (($got = sysread($infd, $ch, 1))) {
            my ($ord) = unpack('C', $ch);
        syswrite($outfd, $query, length($query));
        while (($got = sysread($infd, $ch, 1))) {
            my ($ord) = unpack('C', $ch);
-           if ($ord == 0xD) {
+           last if $ord == 4; # ^D / EOF
+           if ($ord == 0xA || $ord == 0xD) {
                # newline, we're done
                syswrite($outfd, "\r\n", 2);
                last;
                # newline, we're done
                syswrite($outfd, "\r\n", 2);
                last;
+           } elsif ($ord == 3) { # ^C
+               die "password input aborted\n";
            } elsif ($ord == 0x7f) {
                # backspace - if it's the first key disable
                # asterisks
            } elsif ($ord == 0x7f) {
                # backspace - if it's the first key disable
                # asterisks
@@ -225,6 +228,13 @@ sub read_password(;$$) {
     return $password;
 }
 
     return $password;
 }
 
+sub get_confirmed_password {
+    my $pw1 = read_password('Enter new password: ');
+    my $pw2 = read_password('Retype new password: ');
+    die "passwords do not match\n" if $pw1 ne $pw2;
+    return $pw1;
+}
+
 # Class functions
 
 sub new {
 # Class functions
 
 sub new {