*/
#include "includes.h"
-RCSID("$OpenBSD: progressmeter.c,v 1.15 2003/08/31 12:14:22 markus Exp $");
+RCSID("$OpenBSD: progressmeter.c,v 1.22 2004/07/11 17:48:47 deraadt Exp $");
#include "progressmeter.h"
#include "atomicio.h"
/* signal handler for updating the progress meter */
static void update_progress_meter(int);
-static time_t start; /* start progress */
-static time_t last_update; /* last progress update */
-static char *file; /* name of the file being transferred */
-static off_t end_pos; /* ending position of transfer */
-static off_t cur_pos; /* transfer position as of last refresh */
+static time_t start; /* start progress */
+static time_t last_update; /* last progress update */
+static char *file; /* name of the file being transferred */
+static off_t end_pos; /* ending position of transfer */
+static off_t cur_pos; /* transfer position as of last refresh */
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 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 */
/* units for format_size */
static const char unit[] = " KMGT";
bytes = (bytes + 512) / 1024;
}
snprintf(buf, size, "%3lld.%1lld%c%s",
- (int64_t) bytes / 100,
+ (int64_t) (bytes + 5) / 100,
(int64_t) (bytes + 5) / 10 % 10,
unit[i],
i ? "B" : " ");
off_t transferred;
double elapsed;
int percent;
- int bytes_left;
+ off_t bytes_left;
int cur_speed;
int hours, minutes, seconds;
int i, len;
if (bytes_left > 0)
elapsed = now - last_update;
- else
+ else {
elapsed = now - start;
+ /* Calculate true total speed when done */
+ transferred = end_pos;
+ bytes_per_second = 0;
+ }
/* calculate speed */
if (elapsed != 0)
cur_speed = (transferred / elapsed);
else
- cur_speed = 0;
+ cur_speed = transferred;
#define AGE_FACTOR 0.9
if (bytes_per_second != 0) {
/* bandwidth usage */
format_rate(buf + strlen(buf), win_size - strlen(buf),
- bytes_per_second);
+ (off_t)bytes_per_second);
strlcat(buf, "/s ", win_size);
/* ETA */
strlcat(buf, " ", win_size);
}
- atomicio(vwrite, STDOUT_FILENO, buf, win_size);
+ atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1);
last_update = now;
}
}
void
-start_progress_meter(char *f, off_t filesize, off_t *stat)
+start_progress_meter(char *f, off_t filesize, off_t *ctr)
{
struct winsize winsize;
file = f;
end_pos = filesize;
cur_pos = 0;
- counter = stat;
+ counter = ctr;
stalled = 0;
bytes_per_second = 0;