From 504f7a2981306032fff7084c0d90beaa45872ee0 Mon Sep 17 00:00:00 2001 From: Manish Katiyar Date: Thu, 4 Sep 2008 14:44:38 +0530 Subject: [PATCH] badblocks: Display time and percentage complete in verbose mode. Addresses-Debian-Bug: #429739. Signed-off-by: "Manish Katiyar" Signed-off-by: "Theodore Ts'o" --- misc/badblocks.c | 50 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/misc/badblocks.c b/misc/badblocks.c index 1d0f95a3..e7e99684 100644 --- a/misc/badblocks.c +++ b/misc/badblocks.c @@ -55,7 +55,6 @@ extern int optind; #include #include #include -#include #include "et/com_err.h" #include "ext2fs/ext2_io.h" @@ -78,6 +77,7 @@ static int current_O_DIRECT = 0; /* Current status of O_DIRECT flag */ static int exclusive_ok = 0; static unsigned int max_bb = 0; /* Abort test if more than this number of bad blocks has been encountered */ static unsigned int d_flag = 0; /* delay factor between reads */ +static struct timeval time_start; #define T_INC 32 @@ -161,11 +161,52 @@ static int bb_output (blk_t bad) return 1; } +static char *time_diff_format(struct timeval *tv1, + struct timeval *tv2, char *buf) +{ + time_t diff = (tv1->tv_sec - tv2->tv_sec); + int hr,min,sec; + + sec = diff % 60; + diff /= 60; + min = diff % 60; + hr = diff / 60; + + if (hr) + sprintf(buf, "%d:%02d:%02d", hr, min, sec); + else + sprintf(buf, "%d:%02d", min, sec); + return buf; +} + +static float calc_percent(unsigned long current, unsigned long total) { + float percent = 0.0; + if (total <= 0) + return percent; + if (current >= total) { + percent = 100.0; + } else { + percent=(100.0*(float)current/(float)total); + } + return percent; +} + static void print_status(void) { - fprintf(stderr, "%15lu/%15lu", (unsigned long) currently_testing, - (unsigned long) num_blocks); - fputs("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", stderr); + struct timeval time_end; + char diff_buf[32], line_buf[128]; + int len; + + gettimeofday(&time_end, 0); + len = snprintf(line_buf, sizeof(line_buf), + _("%6.2f%% done, %s elapsed"), + calc_percent((unsigned long) currently_testing, + (unsigned long) num_blocks), + time_diff_format(&time_end, &time_start, diff_buf)); + fputs(line_buf, stderr); + memset(line_buf, '\b', len); + line_buf[len] = 0; + fputs(line_buf, stderr); fflush (stderr); } @@ -989,6 +1030,7 @@ int main (int argc, char ** argv) break; case 'v': v_flag++; + gettimeofday(&time_start, 0); break; case 'w': if (w_flag)