summaryrefslogtreecommitdiffstats
path: root/progressmeter.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2005-06-16 05:18:04 +0200
committerDamien Miller <djm@mindrot.org>2005-06-16 05:18:04 +0200
commit05656967b111a7c2b1f831eab0c31002dfac6fa9 (patch)
tree00ccc8ad688f10551743b372db71f9100548c4f6 /progressmeter.c
parenttypo (diff)
downloadopenssh-05656967b111a7c2b1f831eab0c31002dfac6fa9.tar.xz
openssh-05656967b111a7c2b1f831eab0c31002dfac6fa9.zip
- (djm) OpenBSD CVS Sync
- jaredy@cvs.openbsd.org 2005/06/07 13:25:23 [progressmeter.c] catch SIGWINCH and resize progress meter accordingly; ok markus dtucker
Diffstat (limited to 'progressmeter.c')
-rw-r--r--progressmeter.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/progressmeter.c b/progressmeter.c
index febe9aad5..3cda09061 100644
--- a/progressmeter.c
+++ b/progressmeter.c
@@ -23,7 +23,7 @@
*/
#include "includes.h"
-RCSID("$OpenBSD: progressmeter.c,v 1.23 2005/04/28 10:17:56 moritz Exp $");
+RCSID("$OpenBSD: progressmeter.c,v 1.24 2005/06/07 13:25:23 jaredy Exp $");
#include "progressmeter.h"
#include "atomicio.h"
@@ -42,6 +42,10 @@ static int can_output(void);
static void format_size(char *, int, off_t);
static void format_rate(char *, int, off_t);
+/* window resizing */
+static void sig_winch(int);
+static void setscreensize(void);
+
/* updates the progressmeter to reflect the current state of the transfer */
void refresh_progress_meter(void);
@@ -57,6 +61,7 @@ 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 */
static int win_size; /* terminal window size */
+static volatile sig_atomic_t win_resized; /* for window resizing */
/* units for format_size */
static const char unit[] = " KMGT";
@@ -217,6 +222,10 @@ update_progress_meter(int ignore)
save_errno = errno;
+ if (win_resized) {
+ setscreensize();
+ win_resized = 0;
+ }
if (can_output())
refresh_progress_meter();
@@ -228,8 +237,6 @@ update_progress_meter(int ignore)
void
start_progress_meter(char *f, off_t filesize, off_t *ctr)
{
- struct winsize winsize;
-
start = last_update = time(NULL);
file = f;
end_pos = filesize;
@@ -238,20 +245,12 @@ start_progress_meter(char *f, off_t filesize, off_t *ctr)
stalled = 0;
bytes_per_second = 0;
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != -1 &&
- winsize.ws_col != 0) {
- if (winsize.ws_col > MAX_WINSIZE)
- win_size = MAX_WINSIZE;
- else
- win_size = winsize.ws_col;
- } else
- win_size = DEFAULT_WINSIZE;
- win_size += 1; /* trailing \0 */
-
+ setscreensize();
if (can_output())
refresh_progress_meter();
signal(SIGALRM, update_progress_meter);
+ signal(SIGWINCH, sig_winch);
alarm(UPDATE_INTERVAL);
}
@@ -269,3 +268,25 @@ stop_progress_meter(void)
atomicio(vwrite, STDOUT_FILENO, "\n", 1);
}
+
+static void
+sig_winch(int sig)
+{
+ win_resized = 1;
+}
+
+static void
+setscreensize(void)
+{
+ struct winsize winsize;
+
+ if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != -1 &&
+ winsize.ws_col != 0) {
+ if (winsize.ws_col > MAX_WINSIZE)
+ win_size = MAX_WINSIZE;
+ else
+ win_size = winsize.ws_col;
+ } else
+ win_size = DEFAULT_WINSIZE;
+ win_size += 1; /* trailing \0 */
+}