version 1.43, 2016/05/25 23:48:45 |
version 1.44, 2016/05/30 18:34:41 |
|
|
|
|
#include <errno.h> |
#include <errno.h> |
#include <signal.h> |
#include <signal.h> |
#include <stdarg.h> |
|
#include <stdio.h> |
#include <stdio.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
#include <time.h> |
|
|
#include "progressmeter.h" |
#include "progressmeter.h" |
#include "atomicio.h" |
#include "atomicio.h" |
#include "misc.h" |
#include "misc.h" |
#include "utf8.h" |
|
|
|
#define DEFAULT_WINSIZE 80 |
#define DEFAULT_WINSIZE 80 |
#define MAX_WINSIZE 512 |
#define MAX_WINSIZE 512 |
|
|
void |
void |
refresh_progress_meter(void) |
refresh_progress_meter(void) |
{ |
{ |
char buf[MAX_WINSIZE * 4 + 1]; |
char buf[MAX_WINSIZE + 1]; |
off_t transferred; |
off_t transferred; |
double elapsed, now; |
double elapsed, now; |
int percent; |
int percent; |
off_t bytes_left; |
off_t bytes_left; |
int cur_speed; |
int cur_speed; |
int hours, minutes, seconds; |
int hours, minutes, seconds; |
size_t i; |
int i, len; |
int file_len; |
int file_len; |
|
|
transferred = *counter - (cur_pos ? cur_pos : start_pos); |
transferred = *counter - (cur_pos ? cur_pos : start_pos); |
|
|
bytes_per_second = cur_speed; |
bytes_per_second = cur_speed; |
|
|
/* filename */ |
/* filename */ |
buf[0] = '\r'; |
buf[0] = '\0'; |
buf[1] = '\0'; |
|
file_len = win_size - 35; |
file_len = win_size - 35; |
if (file_len > 0) { |
if (file_len > 0) { |
(void) snmprintf(buf + 1, sizeof(buf) - 1 - 35, |
len = snprintf(buf, file_len + 1, "\r%s", file); |
&file_len, "%s", file); |
if (len < 0) |
i = strlen(buf); |
len = 0; |
while (++file_len < win_size - 35 && i + 1 < sizeof(buf)) |
if (len >= file_len + 1) |
buf[i++] = ' '; |
len = file_len; |
buf[i] = '\0'; |
for (i = len; i < file_len; i++) |
|
buf[i] = ' '; |
|
buf[file_len] = '\0'; |
} |
} |
|
|
/* percent of transfer done */ |
/* percent of transfer done */ |
|
|
percent = ((float)cur_pos / end_pos) * 100; |
percent = ((float)cur_pos / end_pos) * 100; |
else |
else |
percent = 100; |
percent = 100; |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), win_size - strlen(buf), |
" %3d%% ", percent); |
" %3d%% ", percent); |
|
|
/* amount transferred */ |
/* amount transferred */ |
format_size(buf + strlen(buf), sizeof(buf) - strlen(buf), |
format_size(buf + strlen(buf), win_size - strlen(buf), |
cur_pos); |
cur_pos); |
strlcat(buf, " ", sizeof(buf)); |
strlcat(buf, " ", win_size); |
|
|
/* bandwidth usage */ |
/* bandwidth usage */ |
format_rate(buf + strlen(buf), sizeof(buf) - strlen(buf), |
format_rate(buf + strlen(buf), win_size - strlen(buf), |
(off_t)bytes_per_second); |
(off_t)bytes_per_second); |
strlcat(buf, "/s ", sizeof(buf)); |
strlcat(buf, "/s ", win_size); |
|
|
/* ETA */ |
/* ETA */ |
if (!transferred) |
if (!transferred) |
|
|
stalled = 0; |
stalled = 0; |
|
|
if (stalled >= STALL_TIME) |
if (stalled >= STALL_TIME) |
strlcat(buf, "- stalled -", sizeof(buf)); |
strlcat(buf, "- stalled -", win_size); |
else if (bytes_per_second == 0 && bytes_left) |
else if (bytes_per_second == 0 && bytes_left) |
strlcat(buf, " --:-- ETA", sizeof(buf)); |
strlcat(buf, " --:-- ETA", win_size); |
else { |
else { |
if (bytes_left > 0) |
if (bytes_left > 0) |
seconds = bytes_left / bytes_per_second; |
seconds = bytes_left / bytes_per_second; |
|
|
seconds -= minutes * 60; |
seconds -= minutes * 60; |
|
|
if (hours != 0) |
if (hours != 0) |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), win_size - strlen(buf), |
"%d:%02d:%02d", hours, minutes, seconds); |
"%d:%02d:%02d", hours, minutes, seconds); |
else |
else |
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), |
snprintf(buf + strlen(buf), win_size - strlen(buf), |
" %02d:%02d", minutes, seconds); |
" %02d:%02d", minutes, seconds); |
|
|
if (bytes_left > 0) |
if (bytes_left > 0) |
strlcat(buf, " ETA", sizeof(buf)); |
strlcat(buf, " ETA", win_size); |
else |
else |
strlcat(buf, " ", sizeof(buf)); |
strlcat(buf, " ", win_size); |
} |
} |
if (win_size < 35) |
|
buf[win_size] = '\0'; |
|
|
|
atomicio(vwrite, STDOUT_FILENO, buf, strlen(buf)); |
atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1); |
last_update = now; |
last_update = now; |
} |
} |
|
|