summaryrefslogtreecommitdiff
path: root/progressmeter.c
diff options
context:
space:
mode:
Diffstat (limited to 'progressmeter.c')
-rw-r--r--progressmeter.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/progressmeter.c b/progressmeter.c
index 3a455408c..4fed2f4f0 100644
--- a/progressmeter.c
+++ b/progressmeter.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: progressmeter.c,v 1.42 2016/03/02 22:42:40 dtucker Exp $ */ 1/* $OpenBSD: progressmeter.c,v 1.43 2016/05/25 23:48:45 schwarze Exp $ */
2/* 2/*
3 * Copyright (c) 2003 Nils Nordman. All rights reserved. 3 * Copyright (c) 2003 Nils Nordman. All rights reserved.
4 * 4 *
@@ -31,6 +31,7 @@
31 31
32#include <errno.h> 32#include <errno.h>
33#include <signal.h> 33#include <signal.h>
34#include <stdarg.h>
34#include <stdio.h> 35#include <stdio.h>
35#include <string.h> 36#include <string.h>
36#include <time.h> 37#include <time.h>
@@ -39,6 +40,7 @@
39#include "progressmeter.h" 40#include "progressmeter.h"
40#include "atomicio.h" 41#include "atomicio.h"
41#include "misc.h" 42#include "misc.h"
43#include "utf8.h"
42 44
43#define DEFAULT_WINSIZE 80 45#define DEFAULT_WINSIZE 80
44#define MAX_WINSIZE 512 46#define MAX_WINSIZE 512
@@ -119,14 +121,14 @@ format_size(char *buf, int size, off_t bytes)
119void 121void
120refresh_progress_meter(void) 122refresh_progress_meter(void)
121{ 123{
122 char buf[MAX_WINSIZE + 1]; 124 char buf[MAX_WINSIZE * 4 + 1];
123 off_t transferred; 125 off_t transferred;
124 double elapsed, now; 126 double elapsed, now;
125 int percent; 127 int percent;
126 off_t bytes_left; 128 off_t bytes_left;
127 int cur_speed; 129 int cur_speed;
128 int hours, minutes, seconds; 130 int hours, minutes, seconds;
129 int i, len; 131 size_t i;
130 int file_len; 132 int file_len;
131 133
132 transferred = *counter - (cur_pos ? cur_pos : start_pos); 134 transferred = *counter - (cur_pos ? cur_pos : start_pos);
@@ -157,17 +159,16 @@ refresh_progress_meter(void)
157 bytes_per_second = cur_speed; 159 bytes_per_second = cur_speed;
158 160
159 /* filename */ 161 /* filename */
160 buf[0] = '\0'; 162 buf[0] = '\r';
163 buf[1] = '\0';
161 file_len = win_size - 35; 164 file_len = win_size - 35;
162 if (file_len > 0) { 165 if (file_len > 0) {
163 len = snprintf(buf, file_len + 1, "\r%s", file); 166 (void) snmprintf(buf + 1, sizeof(buf) - 1 - 35,
164 if (len < 0) 167 &file_len, "%s", file);
165 len = 0; 168 i = strlen(buf);
166 if (len >= file_len + 1) 169 while (++file_len < win_size - 35 && i + 1 < sizeof(buf))
167 len = file_len; 170 buf[i++] = ' ';
168 for (i = len; i < file_len; i++) 171 buf[i] = '\0';
169 buf[i] = ' ';
170 buf[file_len] = '\0';
171 } 172 }
172 173
173 /* percent of transfer done */ 174 /* percent of transfer done */
@@ -175,18 +176,18 @@ refresh_progress_meter(void)
175 percent = ((float)cur_pos / end_pos) * 100; 176 percent = ((float)cur_pos / end_pos) * 100;
176 else 177 else
177 percent = 100; 178 percent = 100;
178 snprintf(buf + strlen(buf), win_size - strlen(buf), 179 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
179 " %3d%% ", percent); 180 " %3d%% ", percent);
180 181
181 /* amount transferred */ 182 /* amount transferred */
182 format_size(buf + strlen(buf), win_size - strlen(buf), 183 format_size(buf + strlen(buf), sizeof(buf) - strlen(buf),
183 cur_pos); 184 cur_pos);
184 strlcat(buf, " ", win_size); 185 strlcat(buf, " ", sizeof(buf));
185 186
186 /* bandwidth usage */ 187 /* bandwidth usage */
187 format_rate(buf + strlen(buf), win_size - strlen(buf), 188 format_rate(buf + strlen(buf), sizeof(buf) - strlen(buf),
188 (off_t)bytes_per_second); 189 (off_t)bytes_per_second);
189 strlcat(buf, "/s ", win_size); 190 strlcat(buf, "/s ", sizeof(buf));
190 191
191 /* ETA */ 192 /* ETA */
192 if (!transferred) 193 if (!transferred)
@@ -195,9 +196,9 @@ refresh_progress_meter(void)
195 stalled = 0; 196 stalled = 0;
196 197
197 if (stalled >= STALL_TIME) 198 if (stalled >= STALL_TIME)
198 strlcat(buf, "- stalled -", win_size); 199 strlcat(buf, "- stalled -", sizeof(buf));
199 else if (bytes_per_second == 0 && bytes_left) 200 else if (bytes_per_second == 0 && bytes_left)
200 strlcat(buf, " --:-- ETA", win_size); 201 strlcat(buf, " --:-- ETA", sizeof(buf));
201 else { 202 else {
202 if (bytes_left > 0) 203 if (bytes_left > 0)
203 seconds = bytes_left / bytes_per_second; 204 seconds = bytes_left / bytes_per_second;
@@ -210,19 +211,21 @@ refresh_progress_meter(void)
210 seconds -= minutes * 60; 211 seconds -= minutes * 60;
211 212
212 if (hours != 0) 213 if (hours != 0)
213 snprintf(buf + strlen(buf), win_size - strlen(buf), 214 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
214 "%d:%02d:%02d", hours, minutes, seconds); 215 "%d:%02d:%02d", hours, minutes, seconds);
215 else 216 else
216 snprintf(buf + strlen(buf), win_size - strlen(buf), 217 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
217 " %02d:%02d", minutes, seconds); 218 " %02d:%02d", minutes, seconds);
218 219
219 if (bytes_left > 0) 220 if (bytes_left > 0)
220 strlcat(buf, " ETA", win_size); 221 strlcat(buf, " ETA", sizeof(buf));
221 else 222 else
222 strlcat(buf, " ", win_size); 223 strlcat(buf, " ", sizeof(buf));
223 } 224 }
225 if (win_size < 35)
226 buf[win_size] = '\0';
224 227
225 atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1); 228 atomicio(vwrite, STDOUT_FILENO, buf, strlen(buf));
226 last_update = now; 229 last_update = now;
227} 230}
228 231