]> andersk Git - gssapi-openssh.git/blobdiff - openssh/progressmeter.c
The man2html from jbasney on pkilab2 works whereas the standard one doesn't.
[gssapi-openssh.git] / openssh / progressmeter.c
index 3cda090616f15fd22524ee668d5e57b6a23ccf00..79d13bac1727a9c5f520e54d5ba836b12cb987d4 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenBSD: progressmeter.c,v 1.37 2006/08/03 03:34:42 deraadt Exp $ */
 /*
  * Copyright (c) 2003 Nils Nordman.  All rights reserved.
  *
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: progressmeter.c,v 1.24 2005/06/07 13:25:23 jaredy Exp $");
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/uio.h>
+
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
 
 #include "progressmeter.h"
 #include "atomicio.h"
@@ -57,6 +68,8 @@ 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 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 */
@@ -85,8 +98,8 @@ format_rate(char *buf, int size, off_t bytes)
                bytes = (bytes + 512) / 1024;
        }
        snprintf(buf, size, "%3lld.%1lld%c%s",
-           (int64_t) (bytes + 5) / 100,
-           (int64_t) (bytes + 5) / 10 % 10,
+           (long long) (bytes + 5) / 100,
+           (long long) (bytes + 5) / 10 % 10,
            unit[i],
            i ? "B" : " ");
 }
@@ -99,7 +112,7 @@ format_size(char *buf, int size, off_t bytes)
        for (i = 0; bytes >= 10000 && unit[i] != 'T'; i++)
                bytes = (bytes + 512) / 1024;
        snprintf(buf, size, "%4lld%c%s",
-           (int64_t) bytes,
+           (long long) bytes,
            unit[i],
            i ? "B" : " ");
 }
@@ -117,12 +130,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 = *counter;
        now = time(NULL);
        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 {
@@ -147,14 +165,14 @@ 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)
                        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[file_len] = '\0';
        }
@@ -164,7 +182,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 */
@@ -177,6 +196,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;
@@ -213,8 +241,10 @@ refresh_progress_meter(void)
 
        atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1);
        last_update = now;
+       last_pos = cur_pos;
 }
 
+/*ARGSUSED*/
 static void
 update_progress_meter(int ignore)
 {
@@ -269,6 +299,7 @@ stop_progress_meter(void)
        atomicio(vwrite, STDOUT_FILENO, "\n", 1);
 }
 
+/*ARGSUSED*/
 static void
 sig_winch(int sig)
 {
This page took 0.04625 seconds and 4 git commands to generate.