diff --git a/progressmeter.c b/progressmeter.c index 8baf798f..b7d7fb0f 100644 --- a/progressmeter.c +++ b/progressmeter.c @@ -68,6 +68,8 @@ static const char *file; /* name of the file being transferred */ static off_t start_pos; /* initial position of transfer */ static off_t end_pos; /* ending position of transfer */ static off_t cur_pos; /* transfer position as of last refresh */ +static off_t last_pos; +static off_t max_delta_pos = 0; static volatile off_t *counter; /* progress counter */ static long stalled; /* how long we have been stalled */ static int bytes_per_second; /* current speed in bytes per second */ @@ -127,6 +129,7 @@ refresh_progress_meter(int force_update) int cur_speed; int hours, minutes, seconds; int file_len; + off_t delta_pos; if ((!force_update && !alarm_fired && !win_resized) || !can_output()) return; @@ -142,6 +145,10 @@ refresh_progress_meter(int force_update) now = monotime_double(); bytes_left = end_pos - cur_pos; + delta_pos = cur_pos - last_pos; + if (delta_pos > max_delta_pos) + max_delta_pos = delta_pos; + if (bytes_left > 0) elapsed = now - last_update; else { @@ -166,7 +173,7 @@ refresh_progress_meter(int force_update) /* filename */ buf[0] = '\0'; - file_len = win_size - 36; + file_len = win_size - 45; if (file_len > 0) { buf[0] = '\r'; snmprintf(buf+1, sizeof(buf)-1, &file_len, "%-*s", @@ -191,6 +198,15 @@ refresh_progress_meter(int force_update) (off_t)bytes_per_second); strlcat(buf, "/s ", win_size); + /* instantaneous rate */ + if (bytes_left > 0) + format_rate(buf + strlen(buf), win_size - strlen(buf), + delta_pos); + else + format_rate(buf + strlen(buf), win_size - strlen(buf), + max_delta_pos); + strlcat(buf, "/s ", win_size); + /* ETA */ if (!transferred) stalled += elapsed; @@ -227,6 +243,7 @@ refresh_progress_meter(int force_update) atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1); last_update = now; + last_pos = cur_pos; } /*ARGSUSED*/ diff --git a/ssh-keygen.c b/ssh-keygen.c index cfb5f115..986ff59b 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -2959,7 +2959,6 @@ do_download_sk(const char *skprovider, const char *device) if (skprovider == NULL) fatal("Cannot download keys without provider"); - pin = read_passphrase("Enter PIN for authenticator: ", RP_ALLOW_STDIN); if (!quiet) { printf("You may need to touch your authenticator "