or die "failed to set window size: $!\n";
}
-sub read_password(;$$) {
+sub read_password($;$$) {
my ($query, $infd, $outfd) = @_;
my $password = '';
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;
+ } elsif ($ord == 3) { # ^C
+ die "password input aborted\n";
} elsif ($ord == 0x7f) {
# backspace - if it's the first key disable
# asterisks
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 {