]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authordtucker@openbsd.org <dtucker@openbsd.org>
Wed, 2 Mar 2016 22:42:40 +0000 (22:42 +0000)
committerDamien Miller <djm@mindrot.org>
Fri, 4 Mar 2016 04:12:19 +0000 (15:12 +1100)
Improve precision of progressmeter for sftp and scp by
 storing sub-second timestamps.  Pointed out by mmcc@, ok deraadt@ markus@

Upstream-ID: 38fd83a3d83dbf81c8ff7b5d1302382fe54970ab

misc.c
misc.h
progressmeter.c

diff --git a/misc.c b/misc.c
index de7e1facd68b4834a5b64572e873160d14bbcb6f..3136f3492ab4cdeede4024dac0b26528b6ef860c 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.101 2016/01/20 09:22:39 dtucker Exp $ */
+/* $OpenBSD: misc.c,v 1.102 2016/03/02 22:42:40 dtucker Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  * Copyright (c) 2005,2006 Damien Miller.  All rights reserved.
@@ -909,6 +909,17 @@ monotime(void)
        return time(NULL);
 }
 
+double
+monotime_double(void)
+{
+       struct timespec ts;
+
+       if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
+               fatal("clock_gettime: %s", strerror(errno));
+
+       return (ts.tv_sec + (double)ts.tv_nsec / 1000000000);
+}
+
 void
 bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
 {
diff --git a/misc.h b/misc.h
index 374c33ce14b3fd2c3d891e628835ba22cd83128d..434e06c01599b901728fbbea29d43d1d3c608b2c 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.h,v 1.54 2014/07/15 15:54:14 millert Exp $ */
+/* $OpenBSD: misc.h,v 1.55 2016/03/02 22:42:40 dtucker Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -55,6 +55,7 @@ void   sanitise_stdfd(void);
 void    ms_subtract_diff(struct timeval *, int *);
 void    ms_to_timeval(struct timeval *, int);
 time_t  monotime(void);
+double  monotime_double(void);
 void    lowercase(char *s);
 int     unix_listener(const char *, int, int);
 
index 319b7470acd1dab8498554b03bcd8e9fd8f1ab17..3a455408c38930b556e4d2a5fcfa60619495b08f 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: progressmeter.c,v 1.41 2015/01/14 13:54:13 djm Exp $ */
+/* $OpenBSD: progressmeter.c,v 1.42 2016/03/02 22:42:40 dtucker Exp $ */
 /*
  * Copyright (c) 2003 Nils Nordman.  All rights reserved.
  *
@@ -63,8 +63,8 @@ void refresh_progress_meter(void);
 /* 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 double start;           /* start progress */
+static double last_update;     /* last progress update */
 static const 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 */
@@ -120,9 +120,8 @@ void
 refresh_progress_meter(void)
 {
        char buf[MAX_WINSIZE + 1];
-       time_t now;
        off_t transferred;
-       double elapsed;
+       double elapsed, now;
        int percent;
        off_t bytes_left;
        int cur_speed;
@@ -132,7 +131,7 @@ refresh_progress_meter(void)
 
        transferred = *counter - (cur_pos ? cur_pos : start_pos);
        cur_pos = *counter;
-       now = monotime();
+       now = monotime_double();
        bytes_left = end_pos - cur_pos;
 
        if (bytes_left > 0)
@@ -250,7 +249,7 @@ update_progress_meter(int ignore)
 void
 start_progress_meter(const char *f, off_t filesize, off_t *ctr)
 {
-       start = last_update = monotime();
+       start = last_update = monotime_double();
        file = f;
        start_pos = *ctr;
        end_pos = filesize;