diff options
-rw-r--r-- | progressmeter.c | 51 |
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) | |||
121 | void | 119 | void |
122 | refresh_progress_meter(void) | 120 | refresh_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 | ||