mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] When the download is finished, print the time the download took.
Always invoke SIZE, not only when continuing the download.
This commit is contained in:
parent
e24bc5db1b
commit
319f52d756
@ -1,3 +1,13 @@
|
|||||||
|
2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
|
* ftp.c (getftp): Always invoke SIZE, not only when continuing a
|
||||||
|
download.
|
||||||
|
|
||||||
|
* main.c (main): Ditto here.
|
||||||
|
|
||||||
|
* progress.c (create_image): When the download is finished, print
|
||||||
|
how long it took.
|
||||||
|
|
||||||
2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
|
2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
* main.c (main): Print the downloaded and quota amounts with the
|
* main.c (main): Print the downloaded and quota amounts with the
|
||||||
|
26
src/ftp.c
26
src/ftp.c
@ -50,8 +50,6 @@ so, delete this exception statement from your version. */
|
|||||||
#include "convert.h" /* for downloaded_file */
|
#include "convert.h" /* for downloaded_file */
|
||||||
#include "recur.h" /* for INFINITE_RECURSION */
|
#include "recur.h" /* for INFINITE_RECURSION */
|
||||||
|
|
||||||
extern SUM_SIZE_INT total_downloaded_bytes;
|
|
||||||
|
|
||||||
/* File where the "ls -al" listing will be saved. */
|
/* File where the "ls -al" listing will be saved. */
|
||||||
#define LIST_FILENAME ".listing"
|
#define LIST_FILENAME ".listing"
|
||||||
|
|
||||||
@ -212,7 +210,7 @@ ftp_do_port (int csock, int *local_sock)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_length (wgint size, wgint start, int authoritative)
|
print_length (wgint size, wgint start, bool authoritative)
|
||||||
{
|
{
|
||||||
logprintf (LOG_VERBOSE, _("Length: %s"), number_to_static_string (size));
|
logprintf (LOG_VERBOSE, _("Length: %s"), number_to_static_string (size));
|
||||||
if (size >= 1024)
|
if (size >= 1024)
|
||||||
@ -240,7 +238,8 @@ getftp (struct url *u, wgint *len, wgint restval, ccon *con)
|
|||||||
uerr_t err = RETROK; /* appease the compiler */
|
uerr_t err = RETROK; /* appease the compiler */
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char *user, *passwd, *respline;
|
char *user, *passwd, *respline;
|
||||||
char *tms, *tmrate;
|
char *tms;
|
||||||
|
const char *tmrate;
|
||||||
int cmd = con->cmd;
|
int cmd = con->cmd;
|
||||||
bool pasv_mode_open = false;
|
bool pasv_mode_open = false;
|
||||||
wgint expected_bytes = 0;
|
wgint expected_bytes = 0;
|
||||||
@ -585,7 +584,7 @@ Error in server response, closing control connection.\n"));
|
|||||||
else /* do not CWD */
|
else /* do not CWD */
|
||||||
logputs (LOG_VERBOSE, _("==> CWD not required.\n"));
|
logputs (LOG_VERBOSE, _("==> CWD not required.\n"));
|
||||||
|
|
||||||
if ((cmd & DO_RETR) && restval && *len == 0)
|
if ((cmd & DO_RETR) && *len == 0)
|
||||||
{
|
{
|
||||||
if (opt.verbose)
|
if (opt.verbose)
|
||||||
{
|
{
|
||||||
@ -598,7 +597,7 @@ Error in server response, closing control connection.\n"));
|
|||||||
switch (err)
|
switch (err)
|
||||||
{
|
{
|
||||||
case FTPRERR:
|
case FTPRERR:
|
||||||
case FTPSRVERR :
|
case FTPSRVERR:
|
||||||
logputs (LOG_VERBOSE, "\n");
|
logputs (LOG_VERBOSE, "\n");
|
||||||
logputs (LOG_NOTQUIET, _("\
|
logputs (LOG_NOTQUIET, _("\
|
||||||
Error in server response, closing control connection.\n"));
|
Error in server response, closing control connection.\n"));
|
||||||
@ -612,7 +611,8 @@ Error in server response, closing control connection.\n"));
|
|||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
if (!opt.server_response)
|
if (!opt.server_response)
|
||||||
logputs (LOG_VERBOSE, _("done.\n"));
|
logprintf (LOG_VERBOSE, *len ? "%s\n" : _("done.\n"),
|
||||||
|
number_to_static_string (*len));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If anything is to be retrieved, PORT (or PASV) must be sent. */
|
/* If anything is to be retrieved, PORT (or PASV) must be sent. */
|
||||||
@ -958,11 +958,11 @@ Error in server response, closing control connection.\n"));
|
|||||||
|
|
||||||
if (*len)
|
if (*len)
|
||||||
{
|
{
|
||||||
print_length (*len, restval, 1);
|
print_length (*len, restval, true);
|
||||||
expected_bytes = *len; /* for get_contents/show_progress */
|
expected_bytes = *len; /* for get_contents/show_progress */
|
||||||
}
|
}
|
||||||
else if (expected_bytes)
|
else if (expected_bytes)
|
||||||
print_length (expected_bytes, restval, 0);
|
print_length (expected_bytes, restval, false);
|
||||||
|
|
||||||
/* Get the contents of the document. */
|
/* Get the contents of the document. */
|
||||||
flags = 0;
|
flags = 0;
|
||||||
@ -975,7 +975,9 @@ Error in server response, closing control connection.\n"));
|
|||||||
restval, &rd_size, len, &con->dltime, flags);
|
restval, &rd_size, len, &con->dltime, flags);
|
||||||
|
|
||||||
tms = time_str (NULL);
|
tms = time_str (NULL);
|
||||||
tmrate = retr_rate (rd_size, con->dltime, 0);
|
tmrate = retr_rate (rd_size, con->dltime);
|
||||||
|
total_download_time += con->dltime;
|
||||||
|
|
||||||
/* Close data connection socket. */
|
/* Close data connection socket. */
|
||||||
fd_close (dtsock);
|
fd_close (dtsock);
|
||||||
fd_close (local_sock);
|
fd_close (local_sock);
|
||||||
@ -1092,7 +1094,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con)
|
|||||||
int count, orig_lp;
|
int count, orig_lp;
|
||||||
wgint restval, len = 0;
|
wgint restval, len = 0;
|
||||||
char *tms, *locf;
|
char *tms, *locf;
|
||||||
char *tmrate = NULL;
|
const char *tmrate = NULL;
|
||||||
uerr_t err;
|
uerr_t err;
|
||||||
struct_stat st;
|
struct_stat st;
|
||||||
|
|
||||||
@ -1228,7 +1230,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con)
|
|||||||
}
|
}
|
||||||
tms = time_str (NULL);
|
tms = time_str (NULL);
|
||||||
if (!opt.spider)
|
if (!opt.spider)
|
||||||
tmrate = retr_rate (len - restval, con->dltime, 0);
|
tmrate = retr_rate (len - restval, con->dltime);
|
||||||
|
|
||||||
/* If we get out of the switch above without continue'ing, we've
|
/* If we get out of the switch above without continue'ing, we've
|
||||||
successfully downloaded a file. Remember this fact. */
|
successfully downloaded a file. Remember this fact. */
|
||||||
|
@ -59,7 +59,6 @@ so, delete this exception statement from your version. */
|
|||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
|
|
||||||
extern char *version_string;
|
extern char *version_string;
|
||||||
extern SUM_SIZE_INT total_downloaded_bytes;
|
|
||||||
|
|
||||||
extern FILE *output_stream;
|
extern FILE *output_stream;
|
||||||
extern bool output_stream_regular;
|
extern bool output_stream_regular;
|
||||||
@ -1970,7 +1969,8 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
|
|||||||
bool use_ts, got_head = false;/* time-stamping info */
|
bool use_ts, got_head = false;/* time-stamping info */
|
||||||
char *filename_plus_orig_suffix;
|
char *filename_plus_orig_suffix;
|
||||||
char *local_filename = NULL;
|
char *local_filename = NULL;
|
||||||
char *tms, *locf, *tmrate;
|
char *tms, *locf;
|
||||||
|
const char *tmrate;
|
||||||
uerr_t err;
|
uerr_t err;
|
||||||
time_t tml = -1, tmr = -1; /* local and remote time-stamps */
|
time_t tml = -1, tmr = -1; /* local and remote time-stamps */
|
||||||
wgint local_size = 0; /* the size of the local file */
|
wgint local_size = 0; /* the size of the local file */
|
||||||
@ -2360,7 +2360,8 @@ The sizes do not match (local %s) -- retrieving.\n"),
|
|||||||
return RETROK;
|
return RETROK;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmrate = retr_rate (hstat.rd_size, hstat.dltime, 0);
|
tmrate = retr_rate (hstat.rd_size, hstat.dltime);
|
||||||
|
total_download_time += hstat.dltime;
|
||||||
|
|
||||||
if (hstat.len == hstat.contlen)
|
if (hstat.len == hstat.contlen)
|
||||||
{
|
{
|
||||||
|
32
src/main.c
32
src/main.c
@ -61,7 +61,6 @@ so, delete this exception statement from your version. */
|
|||||||
|
|
||||||
struct options opt;
|
struct options opt;
|
||||||
|
|
||||||
extern SUM_SIZE_INT total_downloaded_bytes;
|
|
||||||
extern char *version_string;
|
extern char *version_string;
|
||||||
|
|
||||||
extern struct cookie_jar *wget_cookie_jar;
|
extern struct cookie_jar *wget_cookie_jar;
|
||||||
@ -638,6 +637,31 @@ Recursive accept/reject:\n"),
|
|||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
secs_to_human_time (double secs_decimal)
|
||||||
|
{
|
||||||
|
static char buf[32];
|
||||||
|
int secs = (int) (secs_decimal + 0.5);
|
||||||
|
int hours, mins, days;
|
||||||
|
|
||||||
|
days = secs / 86400, secs %= 86400;
|
||||||
|
hours = secs / 3600, secs %= 3600;
|
||||||
|
mins = secs / 60, secs %= 60;
|
||||||
|
|
||||||
|
if (days)
|
||||||
|
sprintf (buf, _("%dd %dh %dm %ds"), days, hours, mins, secs);
|
||||||
|
else if (hours)
|
||||||
|
sprintf (buf, _("%dh %dm %ds"), hours, mins, secs);
|
||||||
|
else if (mins)
|
||||||
|
sprintf (buf, _("%dm %ds"), mins, secs);
|
||||||
|
else if (secs_decimal >= 1)
|
||||||
|
sprintf (buf, _("%ds"), secs);
|
||||||
|
else
|
||||||
|
sprintf (buf, _("%.2fs"), secs_decimal);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_version (void)
|
print_version (void)
|
||||||
{
|
{
|
||||||
@ -960,10 +984,12 @@ Can't timestamp and not clobber old files at the same time.\n"));
|
|||||||
|| (opt.input_filename && total_downloaded_bytes != 0))
|
|| (opt.input_filename && total_downloaded_bytes != 0))
|
||||||
{
|
{
|
||||||
logprintf (LOG_NOTQUIET,
|
logprintf (LOG_NOTQUIET,
|
||||||
_("\nFINISHED --%s--\nDownloaded: %s in %d files\n"),
|
_("FINISHED --%s--\nDownloaded: %d files, %s in %s (%s)\n"),
|
||||||
time_str (NULL),
|
time_str (NULL),
|
||||||
|
opt.numurls,
|
||||||
human_readable (total_downloaded_bytes),
|
human_readable (total_downloaded_bytes),
|
||||||
opt.numurls);
|
secs_to_human_time (total_download_time / 1000),
|
||||||
|
retr_rate (total_downloaded_bytes, total_download_time));
|
||||||
/* Print quota warning, if exceeded. */
|
/* Print quota warning, if exceeded. */
|
||||||
if (opt.quota && total_downloaded_bytes > opt.quota)
|
if (opt.quota && total_downloaded_bytes > opt.quota)
|
||||||
logprintf (LOG_NOTQUIET,
|
logprintf (LOG_NOTQUIET,
|
||||||
|
101
src/progress.c
101
src/progress.c
@ -265,8 +265,8 @@ print_percentage (wgint bytes, wgint expected)
|
|||||||
static void
|
static void
|
||||||
print_download_speed (struct dot_progress *dp, wgint bytes, double dltime)
|
print_download_speed (struct dot_progress *dp, wgint bytes, double dltime)
|
||||||
{
|
{
|
||||||
logprintf (LOG_VERBOSE, " %s",
|
logprintf (LOG_VERBOSE, " %7s",
|
||||||
retr_rate (bytes, dltime - dp->last_timer_value, 1));
|
retr_rate (bytes, dltime - dp->last_timer_value));
|
||||||
dp->last_timer_value = dltime;
|
dp->last_timer_value = dltime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,7 +489,7 @@ struct bar_progress {
|
|||||||
int last_eta_value;
|
int last_eta_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void create_image (struct bar_progress *, double);
|
static void create_image (struct bar_progress *, double, bool);
|
||||||
static void display_image (char *);
|
static void display_image (char *);
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
@ -524,7 +524,7 @@ bar_create (wgint initial, wgint total)
|
|||||||
|
|
||||||
logputs (LOG_VERBOSE, "\n");
|
logputs (LOG_VERBOSE, "\n");
|
||||||
|
|
||||||
create_image (bp, 0);
|
create_image (bp, 0, false);
|
||||||
display_image (bp->buffer);
|
display_image (bp->buffer);
|
||||||
|
|
||||||
return bp;
|
return bp;
|
||||||
@ -573,7 +573,7 @@ bar_update (void *progress, wgint howmuch, double dltime)
|
|||||||
/* Don't update more often than five times per second. */
|
/* Don't update more often than five times per second. */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
create_image (bp, dltime);
|
create_image (bp, dltime, false);
|
||||||
display_image (bp->buffer);
|
display_image (bp->buffer);
|
||||||
bp->last_screen_update = dltime;
|
bp->last_screen_update = dltime;
|
||||||
}
|
}
|
||||||
@ -588,7 +588,7 @@ bar_finish (void *progress, double dltime)
|
|||||||
/* See bar_update() for explanation. */
|
/* See bar_update() for explanation. */
|
||||||
bp->total_length = bp->initial_length + bp->count;
|
bp->total_length = bp->initial_length + bp->count;
|
||||||
|
|
||||||
create_image (bp, dltime);
|
create_image (bp, dltime, true);
|
||||||
display_image (bp->buffer);
|
display_image (bp->buffer);
|
||||||
|
|
||||||
logputs (LOG_VERBOSE, "\n\n");
|
logputs (LOG_VERBOSE, "\n\n");
|
||||||
@ -700,7 +700,7 @@ update_speed_ring (struct bar_progress *bp, wgint howmuch, double dltime)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *eta_to_human (int);
|
static const char *eta_to_human_short (int);
|
||||||
|
|
||||||
#define APPEND_LITERAL(s) do { \
|
#define APPEND_LITERAL(s) do { \
|
||||||
memcpy (p, s, sizeof (s) - 1); \
|
memcpy (p, s, sizeof (s) - 1); \
|
||||||
@ -712,7 +712,7 @@ static const char *eta_to_human (int);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_image (struct bar_progress *bp, double dl_total_time)
|
create_image (struct bar_progress *bp, double dl_total_time, bool done)
|
||||||
{
|
{
|
||||||
char *p = bp->buffer;
|
char *p = bp->buffer;
|
||||||
wgint size = bp->initial_length + bp->count;
|
wgint size = bp->initial_length + bp->count;
|
||||||
@ -842,41 +842,50 @@ create_image (struct bar_progress *bp, double dl_total_time)
|
|||||||
else
|
else
|
||||||
APPEND_LITERAL (" --.--K/s");
|
APPEND_LITERAL (" --.--K/s");
|
||||||
|
|
||||||
/* " ETA ..m ..s"; wait for three seconds before displaying the ETA.
|
if (!done)
|
||||||
That's because the ETA value needs a while to become
|
|
||||||
reliable. */
|
|
||||||
if (bp->total_length > 0 && bp->count > 0 && dl_total_time > 3000)
|
|
||||||
{
|
{
|
||||||
int eta;
|
/* " eta ..m ..s"; wait for three seconds before displaying the ETA.
|
||||||
|
That's because the ETA value needs a while to become
|
||||||
/* Don't change the value of ETA more than approximately once
|
reliable. */
|
||||||
per second; doing so would cause flashing without providing
|
if (bp->total_length > 0 && bp->count > 0 && dl_total_time > 3000)
|
||||||
any value to the user. */
|
|
||||||
if (bp->total_length != size
|
|
||||||
&& bp->last_eta_value != 0
|
|
||||||
&& dl_total_time - bp->last_eta_time < 900)
|
|
||||||
eta = bp->last_eta_value;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* Calculate ETA using the average download speed to predict
|
int eta;
|
||||||
the future speed. If you want to use a speed averaged
|
|
||||||
over a more recent period, replace dl_total_time with
|
|
||||||
hist->total_time and bp->count with hist->total_bytes.
|
|
||||||
I found that doing that results in a very jerky and
|
|
||||||
ultimately unreliable ETA. */
|
|
||||||
double time_sofar = (double) dl_total_time / 1000;
|
|
||||||
wgint bytes_remaining = bp->total_length - size;
|
|
||||||
eta = (int) (time_sofar * bytes_remaining / bp->count + 0.5);
|
|
||||||
bp->last_eta_value = eta;
|
|
||||||
bp->last_eta_time = dl_total_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf (p, " eta %s", eta_to_human (eta));
|
/* Don't change the value of ETA more than approximately once
|
||||||
p += strlen (p);
|
per second; doing so would cause flashing without providing
|
||||||
|
any value to the user. */
|
||||||
|
if (bp->total_length != size
|
||||||
|
&& bp->last_eta_value != 0
|
||||||
|
&& dl_total_time - bp->last_eta_time < 900)
|
||||||
|
eta = bp->last_eta_value;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Calculate ETA using the average download speed to predict
|
||||||
|
the future speed. If you want to use a speed averaged
|
||||||
|
over a more recent period, replace dl_total_time with
|
||||||
|
hist->total_time and bp->count with hist->total_bytes.
|
||||||
|
I found that doing that results in a very jerky and
|
||||||
|
ultimately unreliable ETA. */
|
||||||
|
double time_sofar = (double) dl_total_time / 1000;
|
||||||
|
wgint bytes_remaining = bp->total_length - size;
|
||||||
|
eta = (int) (time_sofar * bytes_remaining / bp->count + 0.5);
|
||||||
|
bp->last_eta_value = eta;
|
||||||
|
bp->last_eta_time = dl_total_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf (p, " eta %s", eta_to_human_short (eta));
|
||||||
|
p += strlen (p);
|
||||||
|
}
|
||||||
|
else if (bp->total_length > 0)
|
||||||
|
{
|
||||||
|
APPEND_LITERAL (" ");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (bp->total_length > 0)
|
else
|
||||||
{
|
{
|
||||||
APPEND_LITERAL (" ");
|
/* When the download is done, print the elapsed time. */
|
||||||
|
sprintf (p, _(" in %s"), eta_to_human_short (dl_total_time / 1000 + 0.5));
|
||||||
|
p += strlen (p);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert (p - bp->buffer <= bp->width);
|
assert (p - bp->buffer <= bp->width);
|
||||||
@ -942,11 +951,11 @@ progress_handle_sigwinch (int sig)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Provide a human-readable rendition of the ETA. It never occupies
|
/* Provide a short human-readable rendition of the ETA. It never
|
||||||
more than 7 characters of screen space. */
|
occupies more than 7 characters of screen space. */
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
eta_to_human (int secs)
|
eta_to_human_short (int secs)
|
||||||
{
|
{
|
||||||
static char buf[10]; /* 8 is enough, but just in case */
|
static char buf[10]; /* 8 is enough, but just in case */
|
||||||
static int last = -1;
|
static int last = -1;
|
||||||
@ -959,16 +968,16 @@ eta_to_human (int secs)
|
|||||||
last = secs;
|
last = secs;
|
||||||
|
|
||||||
if (secs < 100)
|
if (secs < 100)
|
||||||
sprintf (buf, "%ds", secs);
|
sprintf (buf, _("%ds"), secs);
|
||||||
else if (secs < 100 * 60)
|
else if (secs < 100 * 60)
|
||||||
sprintf (buf, "%dm %ds", secs / 60, secs % 60);
|
sprintf (buf, _("%dm %ds"), secs / 60, secs % 60);
|
||||||
else if (secs < 100 * 3600)
|
else if (secs < 100 * 3600)
|
||||||
sprintf (buf, "%dh %dm", secs / 3600, (secs / 60) % 60);
|
sprintf (buf, _("%dh %dm"), secs / 3600, (secs / 60) % 60);
|
||||||
else if (secs < 100 * 86400)
|
else if (secs < 100 * 86400)
|
||||||
sprintf (buf, "%dd %dh", secs / 86400, (secs / 3600) % 60);
|
sprintf (buf, _("%dd %dh"), secs / 86400, (secs / 3600) % 60);
|
||||||
else
|
else
|
||||||
/* (2^31-1)/86400 doesn't overflow BUF. */
|
/* (2^31-1)/86400 doesn't overflow BUF. */
|
||||||
sprintf (buf, "%dd", secs / 86400);
|
sprintf (buf, _("%dd"), secs / 86400);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
15
src/retr.c
15
src/retr.c
@ -54,6 +54,9 @@ so, delete this exception statement from your version. */
|
|||||||
/* Total size of downloaded files. Used to enforce quota. */
|
/* Total size of downloaded files. Used to enforce quota. */
|
||||||
SUM_SIZE_INT total_downloaded_bytes;
|
SUM_SIZE_INT total_downloaded_bytes;
|
||||||
|
|
||||||
|
/* Total download time in milliseconds. */
|
||||||
|
double total_download_time;
|
||||||
|
|
||||||
/* If non-NULL, the stream to which output should be written. This
|
/* If non-NULL, the stream to which output should be written. This
|
||||||
stream is initialized when `-O' is used. */
|
stream is initialized when `-O' is used. */
|
||||||
FILE *output_stream;
|
FILE *output_stream;
|
||||||
@ -495,18 +498,18 @@ fd_read_line (int fd)
|
|||||||
return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
|
return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a printed representation of the download rate, as
|
/* Return a printed representation of the download rate, along with
|
||||||
appropriate for the speed. If PAD is true, strings will be padded
|
the units appropriate for the download speed. */
|
||||||
to the width of 7 characters (xxxx.xx). */
|
|
||||||
char *
|
const char *
|
||||||
retr_rate (wgint bytes, double msecs, bool pad)
|
retr_rate (wgint bytes, double msecs)
|
||||||
{
|
{
|
||||||
static char res[20];
|
static char res[20];
|
||||||
static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
|
static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
|
||||||
int units = 0;
|
int units = 0;
|
||||||
|
|
||||||
double dlrate = calc_rate (bytes, msecs, &units);
|
double dlrate = calc_rate (bytes, msecs, &units);
|
||||||
sprintf (res, pad ? "%7.2f %s" : "%.2f %s", dlrate, rate_names[units]);
|
sprintf (res, "%.2f %s", dlrate, rate_names[units]);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,9 @@ so, delete this exception statement from your version. */
|
|||||||
#ifndef RETR_H
|
#ifndef RETR_H
|
||||||
#define RETR_H
|
#define RETR_H
|
||||||
|
|
||||||
|
extern SUM_SIZE_INT total_downloaded_bytes;
|
||||||
|
extern double total_download_time;
|
||||||
|
|
||||||
/* Flags for fd_read_body. */
|
/* Flags for fd_read_body. */
|
||||||
enum {
|
enum {
|
||||||
rb_read_exactly = 1,
|
rb_read_exactly = 1,
|
||||||
@ -46,7 +49,7 @@ char *fd_read_line (int);
|
|||||||
uerr_t retrieve_url (const char *, char **, char **, const char *, int *);
|
uerr_t retrieve_url (const char *, char **, char **, const char *, int *);
|
||||||
uerr_t retrieve_from_file (const char *, bool, int *);
|
uerr_t retrieve_from_file (const char *, bool, int *);
|
||||||
|
|
||||||
char *retr_rate (wgint, double, bool);
|
const char *retr_rate (wgint, double);
|
||||||
double calc_rate (wgint, double, int *);
|
double calc_rate (wgint, double, int *);
|
||||||
void printwhat (int, int);
|
void printwhat (int, int);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user