lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <91b8b7f5-6054-77c9-d1f8-aa6ad6408a2d@keepertech.com>
Date:   Mon, 6 Nov 2017 14:21:12 -0500
From:   Wyllys Ingersoll <wyllys.ingersoll@...pertech.com>
To:     linux-ext4@...r.kernel.org
Subject: Re: [PATCH] badblocks: Add options for parseable status output


(Resubmitting with proper formatting)

This patch adds a couple of new command line arguments
to make it easier to control the frequency of the status output and make the
output more parseable.

[-a alarm_interval ]   Control the frequency of status output (in seconds)
[-P] makes the output more parseable by external programs
     (comma separated, LF terminated)
 

Signed-off-by: Wyllys Ingersoll <wyllys.ingersoll@...pertech.com>
---
 misc/badblocks.8.in | 16 +++++++++++++++-
 misc/badblocks.c    | 52
++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/misc/badblocks.8.in b/misc/badblocks.8.in
index ca4359382..043e420db 100644
--- a/misc/badblocks.8.in
+++ b/misc/badblocks.8.in
@@ -5,7 +5,11 @@ badblocks \- search a device for bad blocks
 .SH SYNOPSIS
 .B badblocks
 [
-.B \-svwnfBX
+.B \-svwnfBXP
+]
+[
+.B \-a
+.I alarm_interval
 ]
 [
 .B \-b
@@ -83,6 +87,9 @@ and
 programs.
 .SH OPTIONS
 .TP
+.BI \-a " alarm_interval"
+Interval (in seconds) used for displaying status updates. The default is 1.
+.TP
 .BI \-b " block_size"
 Specify the size of blocks in bytes.  The default is 1024.
 .TP
@@ -199,6 +206,13 @@ option, as they are mutually exclusive.
 .B \-B
 Use buffered I/O and do not use Direct I/O, even if it is available.
 .TP
+.B \-P
+Display status in machine parseable format. The data is comma separated and
+LF terminated to make it easier to parsing by external applications. The
+data format is:
+% completed, time elapsed, read errors, write errors, corruption errors.
+Example: 10.06, 1:22, 0, 0, 0
+.TP
 .B \-X
 Internal flag only to be used by
 .BR e2fsck (8)
diff --git a/misc/badblocks.c b/misc/badblocks.c
index e45939187..571856c21 100644
--- a/misc/badblocks.c
+++ b/misc/badblocks.c
@@ -84,6 +84,8 @@ static int t_max;            /* allocated test patterns */
 static unsigned int *t_patts;        /* test patterns */
 static int use_buffered_io;
 static int exclusive_ok;
+static int parseable_output = 0;  /* print output that can be easily
parsed */
+static int alarm_interval = 1;
 static unsigned int max_bb = MAX_BAD_BLOCKS;    /* Abort test if more
than this
                          * number of bad blocks has been
                          * encountered */
@@ -97,9 +99,10 @@ static unsigned int sys_page_size = 4096;
 static void usage(void)
 {
     fprintf(stderr, _(
-"Usage: %s [-b block_size] [-i input_file] [-o output_file] [-svwnf]\n"
+"Usage: %s [-b block_size] [-i input_file] [-o output_file] [-svwnfP]\n"
 "       [-c blocks_at_once] [-d delay_factor_between_reads] [-e
max_bad_blocks]\n"
 "       [-p num_passes] [-t test_pattern [-t test_pattern [...]]]\n"
+"       [-a alarm_interval]\n"
 "       device [last_block [first_block]]\n"),
          program_name);
     exit (1);
@@ -223,17 +226,23 @@ static void print_status(void)
     wchar_t wline_buf[128];
 #endif
     int len;
+    char format_str[128];
+
+    if (parseable_output) {
+        strcpy(format_str, "%6.2f, %s, %d, %d, %d");
+    } else {
+        strcpy(format_str, "%6.2f%% done, %s elapsed. (%d/%d/%d errors)");
+    }
 
     gettimeofday(&time_end, 0);
     len = snprintf(line_buf, sizeof(line_buf),
-               _("%6.2f%% done, %s elapsed. "
-                 "(%d/%d/%d errors)"),
-               calc_percent((unsigned long) currently_testing,
-                    (unsigned long) num_blocks),
-               time_diff_format(&time_end, &time_start, diff_buf),
-               num_read_errors,
-               num_write_errors,
-               num_corruption_errors);
+            _(format_str),
+            calc_percent((unsigned long) currently_testing,
+            (unsigned long) num_blocks),
+            time_diff_format(&time_end, &time_start, diff_buf),
+            num_read_errors,
+            num_write_errors,
+            num_corruption_errors);
 #ifdef HAVE_MBSTOWCS
     mbstowcs(wline_buf, line_buf, sizeof(line_buf));
     len = wcswidth(wline_buf, sizeof(line_buf));
@@ -241,16 +250,20 @@ static void print_status(void)
         len = strlen(line_buf); /* Should never happen... */
 #endif
     fputs(line_buf, stderr);
-    memset(line_buf, '\b', len);
-    line_buf[len] = 0;
-    fputs(line_buf, stderr);   
+    if (!parseable_output) {
+        memset(line_buf, '\b', len);
+        line_buf[len] = 0;
+        fputs(line_buf, stderr);
+    } else {
+        fputs("\n", stderr);
+    }
     fflush (stderr);
 }
 
 static void alarm_intr(int alnum EXT2FS_ATTR((unused)))
 {
     signal (SIGALRM, alarm_intr);
-    alarm(1);
+    alarm(alarm_interval);
     if (!num_blocks)
         return;
     print_status();
@@ -1094,7 +1107,7 @@ int main (int argc, char ** argv)
 
     if (argc && *argv)
         program_name = *argv;
-    while ((c = getopt (argc, argv, "b:d:e:fi:o:svwnc:p:h:t:BX")) != EOF) {
+    while ((c = getopt (argc, argv, "a:b:d:e:fi:o:svwnc:p:h:t:BXP")) !=
EOF) {
         switch (c) {
         case 'b':
             block_size = parse_uint(optarg, "block size");
@@ -1183,6 +1196,17 @@ int main (int argc, char ** argv)
         case 'X':
             exclusive_ok++;
             break;
+        case 'P':
+            parseable_output = 1;
+            break;
+        case 'a':
+            alarm_interval = parse_uint(optarg, "status alarm interval
(seconds)");
+            if (alarm_interval == 0) {
+                com_err(program_name, 0, "%s",
+                    _("Minimum alarm interval is 1 second"));
+                exit(1);
+            }
+            break;
         default:
             usage();
         }

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ