tweaking utilities in testing directory

git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@894 6180dd3e-e324-4e3e-922d-17de1ae2f315
diff --git a/testing/sg_iovec_tst.cpp b/testing/sg_iovec_tst.cpp
index 3ee728a..73c6168 100644
--- a/testing/sg_iovec_tst.cpp
+++ b/testing/sg_iovec_tst.cpp
@@ -114,7 +114,7 @@
            "                    [--skip=SKIP] [--verbose] [--version] "
            "SG_DEV OUT_F\n");
     printf("where:\n"
-           "    --async|-a       async sg usage (def: use ioctl(SGIO) )\n");
+           "    --async|-a       async sg usage (def: use ioctl(SG_IO) )\n");
     printf("    --bs=BS|-b BS    logical block size of SG_DEV (def: 512 "
            "bytes)\n");
     printf("    --elem_sz=ES|-e ES    iovec element size (def: BS bytes)\n");
@@ -126,9 +126,9 @@
     printf("    --help|-h        this usage message\n");
     printf("    --num=NUM|-n NUM    number of blocks to read from SG_DEV\n");
     printf("    --sgl=SFN|-S SFN    Sgl FileName (SFN) that is written to, "
-	   "with\n"
+           "with\n"
            "                        addresses and lengths having ES as "
-	   "their unit\n");
+           "their unit\n");
     printf("    --sgv4|-4        use the sg v4 interface (def: v3 "
            "interface)\n");
     printf("    --skip=SKIP|-s SKIP    SKIP blocks before reading S_DEV "
diff --git a/testing/sg_mrq_dd.cpp b/testing/sg_mrq_dd.cpp
index 832a21a..49f027a 100644
--- a/testing/sg_mrq_dd.cpp
+++ b/testing/sg_mrq_dd.cpp
@@ -30,7 +30,7 @@
  *
  */
 
-static const char * version_str = "1.25 20210331";
+static const char * version_str = "1.26 20210402";
 
 #define _XOPEN_SOURCE 600
 #ifndef _GNU_SOURCE
@@ -879,10 +879,11 @@
             "                null,sync]\n"
             "    count       number of blocks to copy (def: device size)\n"
             "    if          file or device to read from (def: stdin)\n"
-            "    iflag       comma separated list from: [coe,dio,"
+            "    iflag       comma separated list from: [00,coe,dio,"
             "direct,dpo,\n"
-            "                dsync,excl,fua,masync,mmap,nodur,\n"
-            "                null,order,qtail,serial,wq_excl]\n"
+            "                dsync,excl,ff,fua,masync,mmap,nodur,null,"
+            "order,\n"
+            "                qhead,qtail,random,serial,wq_excl]\n"
             "    of          file or device to write to (def: /dev/null "
             "N.B. different\n"
             "                from dd it defaults to stdout). If 'of=.' "
diff --git a/testing/sg_take_snap.c b/testing/sg_take_snap.c
index e0459db..852d3be 100644
--- a/testing/sg_take_snap.c
+++ b/testing/sg_take_snap.c
@@ -55,7 +55,7 @@
 
 #define ME "sg_take_snap: "
 
-static const char * version_str = "1.00.67 20210330";
+static const char * version_str = "1.01 20210403";
 
 #define SG_TAKE_MAX_DEVS 16
 
@@ -161,6 +161,29 @@
             sg_fd = -1;
             goto fini;
         }
+        if (0 == k) {
+            int t;
+
+            res = ioctl(sg_fd, SG_GET_VERSION_NUM, &t);
+            if ((res < 0) || (t < 30000)) {
+                pr2serr("sg driver prior to 3.0.00\n");
+                ret = SG_LIB_FILE_ERROR;
+                goto fini;
+            }
+            if (verbose) {
+                pr2serr("sg driver version: %d.%02d.%02d\n",
+                        t / 10000, (t % 10000) / 100, t % 100);
+            }
+            if (t < 40000) {
+                pr2serr("Warning: sg driver prior to 4.0.00\n");
+                ret = SG_LIB_FILE_ERROR;
+                goto fini;
+            } else if (t < 40045) {
+                pr2serr("Warning: sg driver prior to 4.0.45\n");
+                ret = SG_LIB_FILE_ERROR;
+                goto fini;
+            }
+        }
 
         seip = &sei;
         memset(seip, 0, sizeof(*seip));
diff --git a/testing/sg_tst_ioctl.c b/testing/sg_tst_ioctl.c
index 0dff9f1..f7a421e 100644
--- a/testing/sg_tst_ioctl.c
+++ b/testing/sg_tst_ioctl.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2018-2020 D. Gilbert
+ *  Copyright (C) 2018-2021 D. Gilbert
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2, or (at your option)
@@ -60,7 +60,7 @@
  * later of the Linux sg driver.  */
 
 
-static const char * version_str = "Version: 1.19  20200825";
+static const char * version_str = "Version: 1.20  20210406";
 
 #define INQ_REPLY_LEN 128
 #define INQ_CMD_LEN 6
@@ -1203,7 +1203,7 @@
     }
 
     cp = do_fork ? relative_cp : "";
-    if (! do_v3_only) {
+    if (! do_v3_only && (sg_drv_ver_num > 40030)) {
         if (tst_extended_ioctl(dname, sg_fd, second_fname, sg_fd2, sock,
                                cp))
             goto out;
diff --git a/testing/sgh_dd.cpp b/testing/sgh_dd.cpp
index 1d3bf6f..7fb4ae0 100644
--- a/testing/sgh_dd.cpp
+++ b/testing/sgh_dd.cpp
@@ -36,7 +36,7 @@
  * renamed [20181221]
  */
 
-static const char * version_str = "2.03 20210331";
+static const char * version_str = "2.04 20210402";
 
 #define _XOPEN_SOURCE 600
 #ifndef _GNU_SOURCE
@@ -415,8 +415,7 @@
 static const char * mrq_blk_s = "mrq: ordinary blocking";
 static const char * mrq_vb_s = "mrq: variable blocking";
 static const char * mrq_svb_s = "mrq: shared variable blocking (svb)";
-static const char * mrq_s_nb_s = "mrq: submit non-blocking";
-static const char * mrq_nw_nb_s = "mrq: waitless non-blocking";
+static const char * mrq_s_nb_s = "mrq: submit of full non-blocking";
 
 
 #ifdef __GNUC__
@@ -2500,8 +2499,9 @@
 }
 #endif
 
-/* do mrq 'submit (waitless) non-blocking' call. These are restricted to
- * a single file descriptor (i.e. the 'fd' argument). */
+/* do mrq 'full non-blocking' invocation so both submission and completion
+ * is async (i.e. uses SGV4_FLAG_IMMED flag). This type of mrq is
+ * restricted to a single file descriptor (i.e. the 'fd' argument). */
 static int
 sgh_do_async_mrq(Rq_elem * rep, mrq_arr_t & def_arr, int fd,
                  struct sg_io_v4 * ctlop, int nrq)
@@ -2520,11 +2520,11 @@
     a_v4p = def_arr.first.data();
     ctlop->flags = SGV4_FLAG_MULTIPLE_REQS;
     if (clp->in_flags.hipri || clp->out_flags.hipri) {
-        /* hipri non-blocking */
+        /* submit of full non-blocking with HIPRI */
         ctlop->flags |= (SGV4_FLAG_IMMED | SGV4_FLAG_HIPRI);
         if (!after1 && (clp->verbose > 1)) {
             after1 = true;
-            pr2serr_lk("%s: %s\n", __func__, mrq_nw_nb_s);
+            pr2serr_lk("%s: %s\n", __func__, mrq_s_nb_s);
         }
     } else {
         ctlop->flags |= SGV4_FLAG_IMMED;        /* submit non-blocking */
@@ -2835,8 +2835,7 @@
         v4hdr_out_lk("Controlling object before", &ctl_v4, id);
     }
     if (clp->mrq_async && (! rep->both_sg)) {
-        /* do 'submit non-blocking' or 'submit waitless non_blocking'
-         * multiple request */
+        /* do 'submit non-blocking' or 'full non-blocking' mrq */
         mrq_arr_t fd_def_arr;
         mrq_arr_t o_fd_def_arr;
 
diff --git a/testing/sgs_dd.c b/testing/sgs_dd.c
index 7f567d9..64ff86c 100644
--- a/testing/sgs_dd.c
+++ b/testing/sgs_dd.c
@@ -84,7 +84,7 @@
 #include "sg_unaligned.h"
 
 
-static const char * version_str = "4.18 20210331";
+static const char * version_str = "4.19 20210406";
 static const char * my_name = "sgs_dd";
 
 #ifndef SGV4_FLAG_HIPRI
@@ -940,7 +940,7 @@
     return blocks;
 }
 
-/* Returns 0 if SGIO/SIGPOLL or (SIGRTMIN + 1) received, else returns negated
+/* Returns 0 if SIGIO/SIGPOLL or (SIGRTMIN + 1) received, else returns negated
  * errno value; -EAGAIN for timeout. */
 static int
 do_sigwait(Rq_coll * clp, bool inc1_clear0)