summaryrefslogtreecommitdiffstats
path: root/sbin/camcontrol/progress.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/camcontrol/progress.c')
-rw-r--r--sbin/camcontrol/progress.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/sbin/camcontrol/progress.c b/sbin/camcontrol/progress.c
index dc6109f..e4ee01d 100644
--- a/sbin/camcontrol/progress.c
+++ b/sbin/camcontrol/progress.c
@@ -124,6 +124,7 @@ progress_draw(progress_t *prog)
* stars should contain at least
* sizeof(buf) - BAROVERHEAD entries
*/
+#define MIN_BAR_LEN 10
static const char stars[] =
"*****************************************************************************"
"*****************************************************************************"
@@ -134,13 +135,31 @@ progress_draw(progress_t *prog)
uint64_t bytespersec;
uint64_t abbrevsize;
int64_t secsleft;
- size_t barlength;
+ ssize_t barlength;
size_t starc;
char hours[12];
char buf[256];
int len;
+ int prefix_len;
- barlength = MIN(sizeof(buf) - 1, (unsigned)prog->ttywidth) - BAROVERHEAD - strlen(prog->prefix);
+ prefix_len = strlen(prog->prefix);
+ barlength = MIN(sizeof(buf) - 1, (unsigned)prog->ttywidth) -
+ BAROVERHEAD - prefix_len;
+ if (barlength < MIN_BAR_LEN) {
+ int tmp_prefix_len;
+ /*
+ * In this case the TTY width is too small or the prefix is
+ * too large for a progress bar. We'll try decreasing the
+ * prefix length.
+ */
+ barlength = MIN_BAR_LEN;
+ tmp_prefix_len = MIN(sizeof(buf) - 1,(unsigned)prog->ttywidth) -
+ BAROVERHEAD - MIN_BAR_LEN;
+ if (tmp_prefix_len > 0)
+ prefix_len = tmp_prefix_len;
+ else
+ prefix_len = 0;
+ }
starc = (barlength * prog->percent) / 100;
abbrevsize = prog->done;
for (bytesabbrev = 0; abbrevsize >= 100000 && bytesabbrev < NSUFFIXES; bytesabbrev++) {
@@ -171,8 +190,8 @@ progress_draw(progress_t *prog)
}
secs = secsleft % SECSPERHOUR;
len = snprintf(buf, sizeof(buf),
- "\r%s %3lld%% |%.*s%*s| %5lld %-3s %3lld.%02d %.2sB/s %s%02d:%02d ETA",
- (prog->prefix) ? prog->prefix : "",
+ "\r%.*s %3lld%% |%.*s%*s| %5lld %-3s %3lld.%02d %.2sB/s %s%02d:%02d ETA",
+ prefix_len, (prog->prefix) ? prog->prefix : "",
(long long)prog->percent,
(int)starc, stars, (int)(barlength - starc), "",
(long long)abbrevsize,
OpenPOWER on IntegriCloud