Merge branch 'vendor/OPENSSH'
[dragonfly.git] / crypto / openssh / progressmeter.c
index bbbc706..20fc2c4 100644 (file)
@@ -69,6 +69,8 @@ static char *file;            /* name of the file being transferred */
 static off_t start_pos;                /* initial position of transfer */
 static off_t end_pos;          /* ending position of transfer */
 static off_t cur_pos;          /* transfer position as of last refresh */
+static off_t last_pos;
+static off_t max_delta_pos = 0;
 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 */
@@ -129,12 +131,17 @@ refresh_progress_meter(void)
        int hours, minutes, seconds;
        int i, len;
        int file_len;
+       off_t delta_pos;
 
        transferred = *counter - (cur_pos ? cur_pos : start_pos);
        cur_pos = *counter;
        now = monotime();
        bytes_left = end_pos - cur_pos;
 
+       delta_pos = cur_pos - last_pos;
+       if (delta_pos > max_delta_pos)
+               max_delta_pos = delta_pos;
+
        if (bytes_left > 0)
                elapsed = now - last_update;
        else {
@@ -159,7 +166,7 @@ refresh_progress_meter(void)
 
        /* filename */
        buf[0] = '\0';
-       file_len = win_size - 35;
+       file_len = win_size - 45;
        if (file_len > 0) {
                len = snprintf(buf, file_len + 1, "\r%s", file);
                if (len < 0)
@@ -176,7 +183,8 @@ refresh_progress_meter(void)
                percent = ((float)cur_pos / end_pos) * 100;
        else
                percent = 100;
-       snprintf(buf + strlen(buf), win_size - strlen(buf),
+
+       snprintf(buf + strlen(buf), win_size - strlen(buf-8),
            " %3d%% ", percent);
 
        /* amount transferred */
@@ -189,6 +197,15 @@ refresh_progress_meter(void)
            (off_t)bytes_per_second);
        strlcat(buf, "/s ", win_size);
 
+       /* instantaneous rate */
+       if (bytes_left > 0)
+               format_rate(buf + strlen(buf), win_size - strlen(buf),
+                           delta_pos);
+       else
+               format_rate(buf + strlen(buf), win_size - strlen(buf),
+                           max_delta_pos);
+       strlcat(buf, "/s ", win_size);
+
        /* ETA */
        if (!transferred)
                stalled += elapsed;
@@ -225,6 +242,7 @@ refresh_progress_meter(void)
 
        atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1);
        last_update = now;
+       last_pos = cur_pos;
 }
 
 /*ARGSUSED*/