upstream: Have progressmeter force an update at the beginning and

end of each transfer.  Fixes the problem recently introduces where very quick
transfers do not display the progressmeter at all.  Spotted by naddy@

OpenBSD-Commit-ID: 68dc46c259e8fdd4f5db3ec2a130f8e4590a7a9a
This commit is contained in:
dtucker@openbsd.org 2019-01-24 16:52:17 +00:00 committed by Darren Tucker
parent 258e6ca003
commit bdc6c63c80
4 changed files with 11 additions and 14 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: progressmeter.c,v 1.46 2019/01/23 08:01:46 dtucker Exp $ */ /* $OpenBSD: progressmeter.c,v 1.47 2019/01/24 16:52:17 dtucker Exp $ */
/* /*
* Copyright (c) 2003 Nils Nordman. All rights reserved. * Copyright (c) 2003 Nils Nordman. All rights reserved.
* *
@ -59,9 +59,6 @@ static void format_rate(char *, int, off_t);
static void sig_winch(int); static void sig_winch(int);
static void setscreensize(void); static void setscreensize(void);
/* updates the progressmeter to reflect the current state of the transfer */
void refresh_progress_meter(void);
/* signal handler for updating the progress meter */ /* signal handler for updating the progress meter */
static void sig_alarm(int); static void sig_alarm(int);
@ -120,7 +117,7 @@ format_size(char *buf, int size, off_t bytes)
} }
void void
refresh_progress_meter(void) refresh_progress_meter(int force_update)
{ {
char buf[MAX_WINSIZE + 1]; char buf[MAX_WINSIZE + 1];
off_t transferred; off_t transferred;
@ -131,7 +128,7 @@ refresh_progress_meter(void)
int hours, minutes, seconds; int hours, minutes, seconds;
int file_len; int file_len;
if ((!alarm_fired && !win_resized) || !can_output()) if ((!force_update && !alarm_fired && !win_resized) || !can_output())
return; return;
alarm_fired = 0; alarm_fired = 0;
@ -254,7 +251,7 @@ start_progress_meter(const char *f, off_t filesize, off_t *ctr)
bytes_per_second = 0; bytes_per_second = 0;
setscreensize(); setscreensize();
refresh_progress_meter(); refresh_progress_meter(1);
signal(SIGALRM, sig_alarm); signal(SIGALRM, sig_alarm);
signal(SIGWINCH, sig_winch); signal(SIGWINCH, sig_winch);
@ -271,7 +268,7 @@ stop_progress_meter(void)
/* Ensure we complete the progress */ /* Ensure we complete the progress */
if (cur_pos != end_pos) if (cur_pos != end_pos)
refresh_progress_meter(); refresh_progress_meter(1);
atomicio(vwrite, STDOUT_FILENO, "\n", 1); atomicio(vwrite, STDOUT_FILENO, "\n", 1);
} }

View File

@ -1,4 +1,4 @@
/* $OpenBSD: progressmeter.h,v 1.4 2019/01/23 08:01:46 dtucker Exp $ */ /* $OpenBSD: progressmeter.h,v 1.5 2019/01/24 16:52:17 dtucker Exp $ */
/* /*
* Copyright (c) 2002 Nils Nordman. All rights reserved. * Copyright (c) 2002 Nils Nordman. All rights reserved.
* *
@ -24,5 +24,5 @@
*/ */
void start_progress_meter(const char *, off_t, off_t *); void start_progress_meter(const char *, off_t, off_t *);
void refresh_progress_meter(void); void refresh_progress_meter(int);
void stop_progress_meter(void); void stop_progress_meter(void);

4
scp.c
View File

@ -1,4 +1,4 @@
/* $OpenBSD: scp.c,v 1.200 2019/01/23 08:01:46 dtucker Exp $ */ /* $OpenBSD: scp.c,v 1.201 2019/01/24 16:52:17 dtucker Exp $ */
/* /*
* scp - secure remote copy. This is basically patched BSD rcp which * scp - secure remote copy. This is basically patched BSD rcp which
* uses ssh to do the data transfer (instead of using rcmd). * uses ssh to do the data transfer (instead of using rcmd).
@ -588,7 +588,7 @@ scpio(void *_cnt, size_t s)
off_t *cnt = (off_t *)_cnt; off_t *cnt = (off_t *)_cnt;
*cnt += s; *cnt += s;
refresh_progress_meter(); refresh_progress_meter(0);
if (limit_kbps > 0) if (limit_kbps > 0)
bandwidth_limit(&bwlimit, s); bandwidth_limit(&bwlimit, s);
return 0; return 0;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: sftp-client.c,v 1.132 2019/01/23 08:01:46 dtucker Exp $ */ /* $OpenBSD: sftp-client.c,v 1.133 2019/01/24 16:52:17 dtucker Exp $ */
/* /*
* Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
* *
@ -102,7 +102,7 @@ sftpio(void *_bwlimit, size_t amount)
{ {
struct bwlimit *bwlimit = (struct bwlimit *)_bwlimit; struct bwlimit *bwlimit = (struct bwlimit *)_bwlimit;
refresh_progress_meter(); refresh_progress_meter(0);
if (bwlimit != NULL) if (bwlimit != NULL)
bandwidth_limit(bwlimit, amount); bandwidth_limit(bwlimit, amount);
return 0; return 0;