version 1.22, 2004/07/11 17:48:47 |
version 1.22.4.1, 2005/09/04 18:40:02 |
|
|
static void format_size(char *, int, off_t); |
static void format_size(char *, int, off_t); |
static void format_rate(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 */ |
/* updates the progressmeter to reflect the current state of the transfer */ |
void refresh_progress_meter(void); |
void refresh_progress_meter(void); |
|
|
|
|
static long stalled; /* how long we have been stalled */ |
static long stalled; /* how long we have been stalled */ |
static int bytes_per_second; /* current speed in bytes per second */ |
static int bytes_per_second; /* current speed in bytes per second */ |
static int win_size; /* terminal window size */ |
static int win_size; /* terminal window size */ |
|
static volatile sig_atomic_t win_resized; /* for window resizing */ |
|
|
/* units for format_size */ |
/* units for format_size */ |
static const char unit[] = " KMGT"; |
static const char unit[] = " KMGT"; |
|
|
len = snprintf(buf, file_len + 1, "\r%s", file); |
len = snprintf(buf, file_len + 1, "\r%s", file); |
if (len < 0) |
if (len < 0) |
len = 0; |
len = 0; |
|
if (len >= file_len + 1) |
|
len = file_len; |
for (i = len; i < file_len; i++ ) |
for (i = len; i < file_len; i++ ) |
buf[i] = ' '; |
buf[i] = ' '; |
buf[file_len] = '\0'; |
buf[file_len] = '\0'; |
|
|
|
|
save_errno = errno; |
save_errno = errno; |
|
|
|
if (win_resized) { |
|
setscreensize(); |
|
win_resized = 0; |
|
} |
if (can_output()) |
if (can_output()) |
refresh_progress_meter(); |
refresh_progress_meter(); |
|
|
|
|
void |
void |
start_progress_meter(char *f, off_t filesize, off_t *ctr) |
start_progress_meter(char *f, off_t filesize, off_t *ctr) |
{ |
{ |
struct winsize winsize; |
|
|
|
start = last_update = time(NULL); |
start = last_update = time(NULL); |
file = f; |
file = f; |
end_pos = filesize; |
end_pos = filesize; |
|
|
stalled = 0; |
stalled = 0; |
bytes_per_second = 0; |
bytes_per_second = 0; |
|
|
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != -1 && |
setscreensize(); |
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 */ |
|
|
|
if (can_output()) |
if (can_output()) |
refresh_progress_meter(); |
refresh_progress_meter(); |
|
|
signal(SIGALRM, update_progress_meter); |
signal(SIGALRM, update_progress_meter); |
|
signal(SIGWINCH, sig_winch); |
alarm(UPDATE_INTERVAL); |
alarm(UPDATE_INTERVAL); |
} |
} |
|
|
|
|
refresh_progress_meter(); |
refresh_progress_meter(); |
|
|
atomicio(vwrite, STDOUT_FILENO, "\n", 1); |
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 */ |
} |
} |