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