diff options
author | Jared Yanovich <jaredy@cvs.openbsd.org> | 2005-06-07 13:25:24 +0000 |
---|---|---|
committer | Jared Yanovich <jaredy@cvs.openbsd.org> | 2005-06-07 13:25:24 +0000 |
commit | 7aad1a2eda0a9b360cf81dc33ec374c42957dcb3 (patch) | |
tree | 668088cb11821421701fec2a07e5c5512ce9f3c4 /usr.bin/ssh/progressmeter.c | |
parent | 857f27a5cf92416e01c2488cc9c428118bb6e3e4 (diff) |
catch SIGWINCH and resize progress meter accordingly; ok markus dtucker
Diffstat (limited to 'usr.bin/ssh/progressmeter.c')
-rw-r--r-- | usr.bin/ssh/progressmeter.c | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/usr.bin/ssh/progressmeter.c b/usr.bin/ssh/progressmeter.c index 5686fc25ba4..541317ddd32 100644 --- a/usr.bin/ssh/progressmeter.c +++ b/usr.bin/ssh/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" @@ -41,6 +41,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); @@ -56,6 +60,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"; @@ -216,6 +221,10 @@ update_progress_meter(int ignore) save_errno = errno; + if (win_resized) { + setscreensize(); + win_resized = 0; + } if (can_output()) refresh_progress_meter(); @@ -227,8 +236,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; @@ -237,20 +244,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); } @@ -268,3 +267,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 */ +} |