xref: /aosp_15_r20/external/sg3_utils/testing/tst_sg_lib.c (revision 44704f698541f6367e81f991ef8bb54ccbf3fc18)
1*44704f69SBart Van Assche /*
2*44704f69SBart Van Assche  * Copyright (c) 2013-2022 Douglas Gilbert.
3*44704f69SBart Van Assche  * All rights reserved.
4*44704f69SBart Van Assche  * Use of this source code is governed by a BSD-style
5*44704f69SBart Van Assche  * license that can be found in the BSD_LICENSE file.
6*44704f69SBart Van Assche  *
7*44704f69SBart Van Assche  * SPDX-License-Identifier: BSD-2-Clause
8*44704f69SBart Van Assche  */
9*44704f69SBart Van Assche 
10*44704f69SBart Van Assche #include <unistd.h>
11*44704f69SBart Van Assche #include <fcntl.h>
12*44704f69SBart Van Assche #include <stdio.h>
13*44704f69SBart Van Assche #include <stdlib.h>
14*44704f69SBart Van Assche #include <stdarg.h>
15*44704f69SBart Van Assche #include <string.h>
16*44704f69SBart Van Assche #include <getopt.h>
17*44704f69SBart Van Assche #include <ctype.h>
18*44704f69SBart Van Assche #include <errno.h>
19*44704f69SBart Van Assche #define __STDC_FORMAT_MACROS 1
20*44704f69SBart Van Assche #include <inttypes.h>
21*44704f69SBart Van Assche 
22*44704f69SBart Van Assche #include <time.h>
23*44704f69SBart Van Assche 
24*44704f69SBart Van Assche #if defined(__GNUC__) && ! defined(SG_LIB_FREEBSD)
25*44704f69SBart Van Assche #include <byteswap.h>
26*44704f69SBart Van Assche #endif
27*44704f69SBart Van Assche 
28*44704f69SBart Van Assche #ifdef HAVE_CONFIG_H
29*44704f69SBart Van Assche #include "config.h"     /* need this to see if HAVE_BYTESWAP_H */
30*44704f69SBart Van Assche #endif
31*44704f69SBart Van Assche 
32*44704f69SBart Van Assche #include "sg_lib.h"
33*44704f69SBart Van Assche #include "sg_pr2serr.h"
34*44704f69SBart Van Assche 
35*44704f69SBart Van Assche /* Uncomment the next two undefs to force use of the generic (i.e. shifting)
36*44704f69SBart Van Assche  * unaligned functions (i.e. sg_get_* and sg_put_*). Use "-b 16|32|64
37*44704f69SBart Van Assche  * -n 100m" to see the differences in timing. */
38*44704f69SBart Van Assche /* #undef HAVE_CONFIG_H */
39*44704f69SBart Van Assche /* #undef HAVE_BYTESWAP_H */
40*44704f69SBart Van Assche #include "sg_unaligned.h"
41*44704f69SBart Van Assche 
42*44704f69SBart Van Assche /*
43*44704f69SBart Van Assche  * A utility program to test sg_libs string handling, specifically
44*44704f69SBart Van Assche  * related to snprintf().
45*44704f69SBart Van Assche  */
46*44704f69SBart Van Assche 
47*44704f69SBart Van Assche static const char * version_str = "1.17 20220717";
48*44704f69SBart Van Assche 
49*44704f69SBart Van Assche 
50*44704f69SBart Van Assche #define MY_NAME "tst_sg_lib"
51*44704f69SBart Van Assche 
52*44704f69SBart Van Assche #define MAX_LINE_LEN 1024
53*44704f69SBart Van Assche 
54*44704f69SBart Van Assche 
55*44704f69SBart Van Assche static struct option long_options[] = {
56*44704f69SBart Van Assche         {"byteswap",  required_argument, 0, 'b'},
57*44704f69SBart Van Assche         {"exit", no_argument, 0, 'e'},
58*44704f69SBart Van Assche         {"help", no_argument, 0, 'h'},
59*44704f69SBart Van Assche         {"hex2",  no_argument, 0, 'H'},
60*44704f69SBart Van Assche         {"json", optional_argument, 0, 'j'},
61*44704f69SBart Van Assche         {"leadin",  required_argument, 0, 'l'},
62*44704f69SBart Van Assche         {"num",  required_argument, 0, 'n'},
63*44704f69SBart Van Assche         {"printf", no_argument, 0, 'p'},
64*44704f69SBart Van Assche         {"sense", no_argument, 0, 's'},
65*44704f69SBart Van Assche         {"unaligned", no_argument, 0, 'u'},
66*44704f69SBart Van Assche         {"verbose", no_argument, 0, 'v'},
67*44704f69SBart Van Assche         {"version", no_argument, 0, 'V'},
68*44704f69SBart Van Assche         {0, 0, 0, 0},   /* sentinel */
69*44704f69SBart Van Assche };
70*44704f69SBart Van Assche 
71*44704f69SBart Van Assche static const uint8_t desc_sense_data1[] = {
72*44704f69SBart Van Assche    /* unrec_err, excessive_writes, sdat_ovfl, additional_len=? */
73*44704f69SBart Van Assche     0x72, 0x1, 0x3, 0x2, 0x80, 0x0, 0x0, 12+12+8+4+8+4+28,
74*44704f69SBart Van Assche    /* Information: 0x11223344556677bb */
75*44704f69SBart Van Assche     0x0, 0xa, 0x80, 0x0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0xbb,
76*44704f69SBart Van Assche    /* command specific: 0x3344556677bbccff */
77*44704f69SBart Van Assche     0x1, 0xa, 0x0, 0x0, 0x33, 0x44, 0x55, 0x66, 0x77, 0xbb, 0xcc, 0xff,
78*44704f69SBart Van Assche    /* sense key specific: SKSV=1, actual_count=257 (hex: 0x101) */
79*44704f69SBart Van Assche     0x2, 0x6, 0x0, 0x0, 0x80, 0x1, 0x1, 0x0,
80*44704f69SBart Van Assche    /* field replaceable code=0x45 */
81*44704f69SBart Van Assche     0x3, 0x2, 0x0, 0x45,
82*44704f69SBart Van Assche    /* another progress report indicator */
83*44704f69SBart Van Assche     0xa, 0x6, 0x2, 0x1, 0x2, 0x0, 0x32, 0x01,
84*44704f69SBart Van Assche    /* incorrect length indicator (ILI) */
85*44704f69SBart Van Assche     0x5, 0x2, 0x0, 0x20,
86*44704f69SBart Van Assche    /* user data segment referral */
87*44704f69SBart Van Assche     0xb, 26, 0x1, 0x0,
88*44704f69SBart Van Assche         0,0,0,1, 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,
89*44704f69SBart Van Assche                  0x1,0x2,0x3,0x4,0x55,0x6,0x7,0x8,
90*44704f69SBart Van Assche         2,0,0x12,0x34,
91*44704f69SBart Van Assche     };
92*44704f69SBart Van Assche 
93*44704f69SBart Van Assche static const uint8_t desc_sense_data2[] = {
94*44704f69SBart Van Assche    /* ill_req, inv fld in para list, additional_len=? */
95*44704f69SBart Van Assche     0x72, 0x5, 0x26, 0x0, 0x0, 0x0, 0x0, 8+4,
96*44704f69SBart Van Assche    /* sense key specific: SKSV=1, C/D*=0, bitp=7 bytep=34 */
97*44704f69SBart Van Assche     0x2, 0x6, 0x0, 0x0, 0x8f, 0x0, 0x34, 0x0,
98*44704f69SBart Van Assche    /* field replaceable code=0x45 */
99*44704f69SBart Van Assche     0x3, 0x2, 0x0, 0x45,
100*44704f69SBart Van Assche     };
101*44704f69SBart Van Assche 
102*44704f69SBart Van Assche static const uint8_t desc_sense_data3[] = {
103*44704f69SBart Van Assche    /* medium err, vibration induced ..., additional_len=? */
104*44704f69SBart Van Assche     0x72, 0x3, 0x9, 0x5, 0x0, 0x0, 0x0, 32+16,
105*44704f69SBart Van Assche    /* 0xd: block dev: sense key specific: SKSV=1, retry_count=257, fru=0x45
106*44704f69SBart Van Assche     * info=0x1122334455, command_specific=0x1   */
107*44704f69SBart Van Assche     0xd, 0x1e, 0xa0, 0x0, 0x80, 0x1, 0x1, 0x45,
108*44704f69SBart Van Assche     0x0, 0x0, 0x0, 0x11, 0x22, 0x33, 0x44, 0x55,
109*44704f69SBart Van Assche     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
110*44704f69SBart Van Assche     /* following sbc3 (standard) and sbc4r10 inconsistency; add padding */
111*44704f69SBart Van Assche     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
112*44704f69SBart Van Assche     /* 0xe: reason: send_to_given+henceforth, lu, naa-5, 0x5333333000001f40 */
113*44704f69SBart Van Assche     0xe, 0xe, 0x0, 0x1, 0x1, 0x3, 0x0, 0x8,
114*44704f69SBart Van Assche         0x53, 0x33, 0x33, 0x30, 0x0, 0x0, 0x1f, 0x40,
115*44704f69SBart Van Assche     };
116*44704f69SBart Van Assche 
117*44704f69SBart Van Assche static const uint8_t desc_sense_data4[] = {
118*44704f69SBart Van Assche    /* ill_req, inv fld in para list, additional_len=? */
119*44704f69SBart Van Assche     0x72, 0x5, 0x26, 0x0, 0x0, 0x0, 0x0, 24,
120*44704f69SBart Van Assche    /* Forwarded sense data, FSDT=0, sd_src=7, f_status=2 */
121*44704f69SBart Van Assche     0xc, 22, 0x7, 0x2,
122*44704f69SBart Van Assche    /* ill_req, inv fld in para list, additional_len=? */
123*44704f69SBart Van Assche     0x72, 0x5, 0x26, 0x0, 0x0, 0x0, 0x0, 8+4,
124*44704f69SBart Van Assche    /* sense key specific: SKSV=1, C/D*=0, bitp=7 bytep=34 */
125*44704f69SBart Van Assche     0x2, 0x6, 0x0, 0x0, 0x8f, 0x0, 0x34, 0x0,
126*44704f69SBart Van Assche    /* field replaceable code=0x45 */
127*44704f69SBart Van Assche     0x3, 0x2, 0x0, 0x45,
128*44704f69SBart Van Assche     };
129*44704f69SBart Van Assche 
130*44704f69SBart Van Assche static const uint8_t desc_sense_data5[] = {
131*44704f69SBart Van Assche    /* no_sense, ATA info available */
132*44704f69SBart Van Assche     0x72, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 14+14,
133*44704f69SBart Van Assche    /* ATA descriptor extend=1 */
134*44704f69SBart Van Assche     0x9, 0xc, 0x1, 0x0, 0x34, 0x12, 0x44, 0x11,
135*44704f69SBart Van Assche     0x55, 0x22, 0x66, 0x33, 0x1, 0x0,
136*44704f69SBart Van Assche    /* ATA descriptor extend=0 */
137*44704f69SBart Van Assche     0x9, 0xc, 0x0, 0x0, 0x34, 0x12, 0x44, 0x11,
138*44704f69SBart Van Assche     0x55, 0x22, 0x66, 0x33, 0x1, 0x0,
139*44704f69SBart Van Assche     };
140*44704f69SBart Van Assche 
141*44704f69SBart Van Assche static const uint8_t desc_sense_data6[] = {
142*44704f69SBart Van Assche    /* UA, req, subsidiary binding */
143*44704f69SBart Van Assche     0x72, 0x6, 0x3f, 0x1a, 0x0, 0x0, 0x0, 26+12+12,
144*44704f69SBart Van Assche     /* 0xe: designator, reason: preferred admin lu, uuid */
145*44704f69SBart Van Assche     0xe, 0x18, 0x0, 0x4, 0x1, 0xa, 0x0, 0x12,
146*44704f69SBart Van Assche         0x10, 0x0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
147*44704f69SBart Van Assche         0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee,
148*44704f69SBart Van Assche         0xfe, 0xdc,
149*44704f69SBart Van Assche     /* 0x0: Information(valid): lun */
150*44704f69SBart Van Assche     0x0, 0xa, 0x80, 0x0,
151*44704f69SBart Van Assche     0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
152*44704f69SBart Van Assche     /* 0x1: Command specific: 0x1 */
153*44704f69SBart Van Assche     0x1, 0xa, 0x0, 0x0,
154*44704f69SBart Van Assche     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
155*44704f69SBart Van Assche     };
156*44704f69SBart Van Assche 
157*44704f69SBart Van Assche static const char * leadin = NULL;
158*44704f69SBart Van Assche 
159*44704f69SBart Van Assche 
160*44704f69SBart Van Assche static void
usage()161*44704f69SBart Van Assche usage()
162*44704f69SBart Van Assche {
163*44704f69SBart Van Assche     fprintf(stderr,
164*44704f69SBart Van Assche             "Usage: tst_sg_lib [--exit] [--help] [--hex2] [--leadin=STR] "
165*44704f69SBart Van Assche             "[--printf]\n"
166*44704f69SBart Van Assche             "                  [--sense] [--unaligned] [--verbose] "
167*44704f69SBart Van Assche             "[--version]\n"
168*44704f69SBart Van Assche             "  where:\n"
169*44704f69SBart Van Assche #if defined(__GNUC__) && ! defined(SG_LIB_FREEBSD)
170*44704f69SBart Van Assche             "    --byteswap=B|-b B    B is 16, 32 or 64; tests NUM "
171*44704f69SBart Van Assche             "byteswaps\n"
172*44704f69SBart Van Assche             "                         compared to sg_unaligned "
173*44704f69SBart Van Assche             "equivalent\n"
174*44704f69SBart Van Assche             "    --exit|-e          test exit status strings\n"
175*44704f69SBart Van Assche #else
176*44704f69SBart Van Assche             "    --exit|-e          test exit status strings\n"
177*44704f69SBart Van Assche #endif
178*44704f69SBart Van Assche             "    --help|-h          print out usage message\n"
179*44704f69SBart Van Assche             "    --hex2|-H          test hex2* variants\n"
180*44704f69SBart Van Assche             "    --leadin=STR|-l STR    every line output by --sense "
181*44704f69SBart Van Assche             "should\n"
182*44704f69SBart Van Assche             "                           be prefixed by STR\n"
183*44704f69SBart Van Assche             "    --num=NUM|-n NUM    number of iterations (def=1)\n"
184*44704f69SBart Van Assche             "    --printf|-p        test library printf variants\n"
185*44704f69SBart Van Assche             "    --sense|-s         test sense data handling\n"
186*44704f69SBart Van Assche             "    --unaligned|-u     test unaligned data handling\n"
187*44704f69SBart Van Assche             "    --verbose|-v       increase verbosity\n"
188*44704f69SBart Van Assche             "    --version|-V       print version string and exit\n\n"
189*44704f69SBart Van Assche             "Test various parts of sg_lib, see options. Sense data tests "
190*44704f69SBart Van Assche             "overlap\nsomewhat with examples/sg_sense_test .\n"
191*44704f69SBart Van Assche            );
192*44704f69SBart Van Assche 
193*44704f69SBart Van Assche }
194*44704f69SBart Van Assche 
195*44704f69SBart Van Assche static char *
get_exit_status_str(int exit_status,bool longer,int b_len,char * b)196*44704f69SBart Van Assche get_exit_status_str(int exit_status, bool longer, int b_len, char * b)
197*44704f69SBart Van Assche {
198*44704f69SBart Van Assche     int n;
199*44704f69SBart Van Assche 
200*44704f69SBart Van Assche     n = sg_scnpr(b, b_len, "  ES=%d: ", exit_status);
201*44704f69SBart Van Assche     if (n >= (b_len - 1))
202*44704f69SBart Van Assche         return b;
203*44704f69SBart Van Assche     if (sg_exit2str(exit_status, longer, b_len - n, b + n)) {
204*44704f69SBart Van Assche         n = (int)strlen(b);
205*44704f69SBart Van Assche         if (n < (b_len - 1))
206*44704f69SBart Van Assche             sg_scnpr(b + n, b_len - n, " [ok=true]");
207*44704f69SBart Van Assche         return b;
208*44704f69SBart Van Assche     } else
209*44704f69SBart Van Assche         snprintf(b, b_len, "  No ES string for %d%s", exit_status,
210*44704f69SBart Van Assche                  (longer ? " [ok=false]" : ""));
211*44704f69SBart Van Assche     return b;
212*44704f69SBart Van Assche }
213*44704f69SBart Van Assche 
214*44704f69SBart Van Assche static uint8_t arr[64];
215*44704f69SBart Van Assche 
216*44704f69SBart Van Assche #define OFF 7   /* in byteswap mode, can test different alignments (def: 8) */
217*44704f69SBart Van Assche 
218*44704f69SBart Van Assche int
main(int argc,char * argv[])219*44704f69SBart Van Assche main(int argc, char * argv[])
220*44704f69SBart Van Assche {
221*44704f69SBart Van Assche     bool as_json = false;
222*44704f69SBart Van Assche     bool do_exit_status = false;
223*44704f69SBart Van Assche     bool ok;
224*44704f69SBart Van Assche     int k, c, n, len;
225*44704f69SBart Van Assche     int byteswap_sz = 0;
226*44704f69SBart Van Assche     int do_hex2 = 0;
227*44704f69SBart Van Assche     int do_num = 1;
228*44704f69SBart Van Assche     int do_printf = 0;
229*44704f69SBart Van Assche     int do_sense = 0;
230*44704f69SBart Van Assche     int do_unaligned = 0;
231*44704f69SBart Van Assche     int did_something = 0;
232*44704f69SBart Van Assche     int vb = 0;
233*44704f69SBart Van Assche     int ret = 0;
234*44704f69SBart Van Assche     sgj_opaque_p jop = NULL;
235*44704f69SBart Van Assche     sgj_opaque_p jo2p;
236*44704f69SBart Van Assche     sgj_state json_st SG_C_CPP_ZERO_INIT;
237*44704f69SBart Van Assche     sgj_state * jsp = &json_st;
238*44704f69SBart Van Assche     char b[2048];
239*44704f69SBart Van Assche     char bb[256];
240*44704f69SBart Van Assche     const int b_len = sizeof(b);
241*44704f69SBart Van Assche 
242*44704f69SBart Van Assche     while (1) {
243*44704f69SBart Van Assche         int option_index = 0;
244*44704f69SBart Van Assche 
245*44704f69SBart Van Assche         c = getopt_long(argc, argv, "b:ehHj::l:n:psuvV", long_options,
246*44704f69SBart Van Assche                         &option_index);
247*44704f69SBart Van Assche         if (c == -1)
248*44704f69SBart Van Assche             break;
249*44704f69SBart Van Assche 
250*44704f69SBart Van Assche         switch (c) {
251*44704f69SBart Van Assche         case 'b':
252*44704f69SBart Van Assche             byteswap_sz = sg_get_num(optarg);
253*44704f69SBart Van Assche             if (! ((16 == byteswap_sz) || (32 == byteswap_sz) ||
254*44704f69SBart Van Assche                    (64 == byteswap_sz))) {
255*44704f69SBart Van Assche                 fprintf(stderr, "--byteswap= requires 16, 32 or 64\n");
256*44704f69SBart Van Assche                 return 1;
257*44704f69SBart Van Assche             }
258*44704f69SBart Van Assche             break;
259*44704f69SBart Van Assche         case 'e':
260*44704f69SBart Van Assche             do_exit_status = true;
261*44704f69SBart Van Assche             break;
262*44704f69SBart Van Assche         case 'h':
263*44704f69SBart Van Assche         case '?':
264*44704f69SBart Van Assche             usage();
265*44704f69SBart Van Assche             return 0;
266*44704f69SBart Van Assche         case 'H':
267*44704f69SBart Van Assche             ++do_hex2;
268*44704f69SBart Van Assche             break;
269*44704f69SBart Van Assche         case 'j':
270*44704f69SBart Van Assche             if (! sgj_init_state(&json_st, optarg)) {
271*44704f69SBart Van Assche                 pr2serr("bad argument to --json= option, unrecognized "
272*44704f69SBart Van Assche                         "character '%c'\n", json_st.first_bad_char);
273*44704f69SBart Van Assche                 return SG_LIB_SYNTAX_ERROR;
274*44704f69SBart Van Assche             }
275*44704f69SBart Van Assche             break;
276*44704f69SBart Van Assche 
277*44704f69SBart Van Assche         case 'l':
278*44704f69SBart Van Assche             leadin = optarg;
279*44704f69SBart Van Assche             break;
280*44704f69SBart Van Assche         case 'n':
281*44704f69SBart Van Assche             do_num = sg_get_num(optarg);
282*44704f69SBart Van Assche             if (do_num < 0) {
283*44704f69SBart Van Assche                 fprintf(stderr, "--num= unable decode argument as number\n");
284*44704f69SBart Van Assche                 return 1;
285*44704f69SBart Van Assche             }
286*44704f69SBart Van Assche             break;
287*44704f69SBart Van Assche         case 'p':
288*44704f69SBart Van Assche             ++do_printf;
289*44704f69SBart Van Assche             break;
290*44704f69SBart Van Assche         case 's':
291*44704f69SBart Van Assche             ++do_sense;
292*44704f69SBart Van Assche             break;
293*44704f69SBart Van Assche         case 'u':
294*44704f69SBart Van Assche             ++do_unaligned;
295*44704f69SBart Van Assche             break;
296*44704f69SBart Van Assche         case 'v':
297*44704f69SBart Van Assche             ++vb;
298*44704f69SBart Van Assche             break;
299*44704f69SBart Van Assche         case 'V':
300*44704f69SBart Van Assche             fprintf(stderr, "version: %s\n", version_str);
301*44704f69SBart Van Assche             return 0;
302*44704f69SBart Van Assche         default:
303*44704f69SBart Van Assche             fprintf(stderr, "unrecognised switch code 0x%x ??\n", c);
304*44704f69SBart Van Assche             usage();
305*44704f69SBart Van Assche             return 1;
306*44704f69SBart Van Assche         }
307*44704f69SBart Van Assche     }
308*44704f69SBart Van Assche     if (optind < argc) {
309*44704f69SBart Van Assche         if (optind < argc) {
310*44704f69SBart Van Assche             for (; optind < argc; ++optind)
311*44704f69SBart Van Assche                 fprintf(stderr, "Unexpected extra argument: %s\n",
312*44704f69SBart Van Assche                         argv[optind]);
313*44704f69SBart Van Assche             usage();
314*44704f69SBart Van Assche             return 1;
315*44704f69SBart Van Assche         }
316*44704f69SBart Van Assche     }
317*44704f69SBart Van Assche 
318*44704f69SBart Van Assche     as_json = json_st.pr_as_json;
319*44704f69SBart Van Assche     if (as_json)
320*44704f69SBart Van Assche         jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
321*44704f69SBart Van Assche 
322*44704f69SBart Van Assche     if (do_exit_status) {
323*44704f69SBart Van Assche         ++did_something;
324*44704f69SBart Van Assche 
325*44704f69SBart Van Assche         printf("Test Exit Status strings (add -v for long version):\n");
326*44704f69SBart Van Assche         printf("  No error (es=0): %s\n",
327*44704f69SBart Van Assche                sg_get_category_sense_str(0, b_len, b, vb));
328*44704f69SBart Van Assche         ok = sg_exit2str(0, true, b_len, b);
329*44704f69SBart Van Assche         printf("  No error (force verbose): %s\n", b);
330*44704f69SBart Van Assche         if (vb)
331*44704f69SBart Van Assche             printf("    for previous line sg_exit2str() returned: %s\n",
332*44704f69SBart Van Assche                    (ok ? "true" : "false"));
333*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(1, (vb > 0), b_len, b));
334*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(2, (vb > 0), b_len, b));
335*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(3, (vb > 0), b_len, b));
336*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(4, (vb > 0), b_len, b));
337*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(5, (vb > 0), b_len, b));
338*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(6, (vb > 0), b_len, b));
339*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(7, (vb > 0), b_len, b));
340*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(8, (vb > 0), b_len, b));
341*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(25, (vb > 0), b_len, b));
342*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(33, (vb > 0), b_len, b));
343*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(36, (vb > 0), b_len, b));
344*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(48, (vb > 0), b_len, b));
345*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(50, (vb > 0), b_len, b));
346*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(51, (vb > 0), b_len, b));
347*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(96, (vb > 0), b_len, b));
348*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(97, (vb > 0), b_len, b));
349*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(97, (vb > 0), b_len, b));
350*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(255, (vb > 0), b_len, b));
351*44704f69SBart Van Assche         printf("%s\n", get_exit_status_str(-1, (vb > 0), b_len, b));
352*44704f69SBart Van Assche 
353*44704f69SBart Van Assche         printf("\n");
354*44704f69SBart Van Assche     }
355*44704f69SBart Van Assche 
356*44704f69SBart Van Assche     if (do_sense ) {
357*44704f69SBart Van Assche         ++did_something;
358*44704f69SBart Van Assche         if (as_json) {
359*44704f69SBart Van Assche             jo2p = sgj_named_subobject_r(jsp, jop, "desc_sense_data__test1");
360*44704f69SBart Van Assche             sgj_js_sense(jsp, jo2p,  desc_sense_data1,
361*44704f69SBart Van Assche                          (int)sizeof(desc_sense_data1));
362*44704f69SBart Van Assche         } else {
363*44704f69SBart Van Assche             printf("desc_sense_data test1:\n");
364*44704f69SBart Van Assche             sg_print_sense(leadin, desc_sense_data1,
365*44704f69SBart Van Assche                            (int)sizeof(desc_sense_data1), vb);
366*44704f69SBart Van Assche             printf("\n");
367*44704f69SBart Van Assche         }
368*44704f69SBart Van Assche #if 1
369*44704f69SBart Van Assche         if (as_json) {
370*44704f69SBart Van Assche             sgj_js_str_out(jsp, "sg_get_sense_str(ds_data1)", 999);
371*44704f69SBart Van Assche             sg_get_sense_str(leadin, desc_sense_data1,
372*44704f69SBart Van Assche                              sizeof(desc_sense_data1), vb, b_len, b);
373*44704f69SBart Van Assche             sgj_js_str_out(jsp, b, strlen(b));
374*44704f69SBart Van Assche 
375*44704f69SBart Van Assche         } else {
376*44704f69SBart Van Assche             printf("sg_get_sense_str(ds_data1):\n");
377*44704f69SBart Van Assche             sg_get_sense_str(leadin, desc_sense_data1,
378*44704f69SBart Van Assche                              sizeof(desc_sense_data1), vb, b_len, b);
379*44704f69SBart Van Assche             printf("sg_get_sense_str: strlen(b)->%u\n", (uint32_t)strlen(b));
380*44704f69SBart Van Assche             printf("%s", b);
381*44704f69SBart Van Assche             printf("\n");
382*44704f69SBart Van Assche         }
383*44704f69SBart Van Assche #endif
384*44704f69SBart Van Assche         if (as_json) {
385*44704f69SBart Van Assche             jo2p = sgj_named_subobject_r(jsp, jop, "desc_sense_data__test2");
386*44704f69SBart Van Assche             sgj_js_sense(jsp, jo2p,  desc_sense_data2,
387*44704f69SBart Van Assche                          (int)sizeof(desc_sense_data2));
388*44704f69SBart Van Assche         } else {
389*44704f69SBart Van Assche             printf("desc_sense_data test2\n");
390*44704f69SBart Van Assche             sg_print_sense(leadin, desc_sense_data2,
391*44704f69SBart Van Assche                            (int)sizeof(desc_sense_data2), vb);
392*44704f69SBart Van Assche             printf("\n");
393*44704f69SBart Van Assche         }
394*44704f69SBart Van Assche         if (as_json) {
395*44704f69SBart Van Assche             jo2p = sgj_named_subobject_r(jsp, jop,
396*44704f69SBart Van Assche                                          "desc_sense_block_combo_test3");
397*44704f69SBart Van Assche             sgj_js_sense(jsp, jo2p,  desc_sense_data3,
398*44704f69SBart Van Assche                             (int)sizeof(desc_sense_data3));
399*44704f69SBart Van Assche         } else {
400*44704f69SBart Van Assche             printf("desc_sense block dev combo plus designator test3\n");
401*44704f69SBart Van Assche             sg_print_sense(leadin, desc_sense_data3,
402*44704f69SBart Van Assche                            (int)sizeof(desc_sense_data3), vb);
403*44704f69SBart Van Assche             printf("\n");
404*44704f69SBart Van Assche         }
405*44704f69SBart Van Assche         if (as_json) {
406*44704f69SBart Van Assche             jo2p = sgj_named_subobject_r(jsp, jop,
407*44704f69SBart Van Assche                                          "desc_sense_forwarded_sense_test4");
408*44704f69SBart Van Assche             sgj_js_sense(jsp, jo2p,  desc_sense_data4,
409*44704f69SBart Van Assche                          (int)sizeof(desc_sense_data4));
410*44704f69SBart Van Assche         } else {
411*44704f69SBart Van Assche             printf("desc_sense forwarded sense test4\n");
412*44704f69SBart Van Assche             sg_print_sense(leadin, desc_sense_data4,
413*44704f69SBart Van Assche                            (int)sizeof(desc_sense_data4), vb);
414*44704f69SBart Van Assche             printf("\n");
415*44704f69SBart Van Assche         }
416*44704f69SBart Van Assche         if (as_json) {
417*44704f69SBart Van Assche             jo2p = sgj_named_subobject_r(jsp, jop,
418*44704f69SBart Van Assche                                          "desc_sense_ata_info_test5");
419*44704f69SBart Van Assche             sgj_js_sense(jsp, jo2p,  desc_sense_data5,
420*44704f69SBart Van Assche                          (int)sizeof(desc_sense_data5));
421*44704f69SBart Van Assche         } else {
422*44704f69SBart Van Assche             printf("desc_sense ATA Info test5\n");
423*44704f69SBart Van Assche             sg_print_sense(leadin, desc_sense_data5,
424*44704f69SBart Van Assche                            (int)sizeof(desc_sense_data5), vb);
425*44704f69SBart Van Assche             printf("\n");
426*44704f69SBart Van Assche         }
427*44704f69SBart Van Assche         if (as_json) {
428*44704f69SBart Van Assche             jo2p = sgj_named_subobject_r(jsp, jop,
429*44704f69SBart Van Assche                                          "desc_sense_ua_binding_test6");
430*44704f69SBart Van Assche             sgj_js_sense(jsp, jo2p,  desc_sense_data6,
431*44704f69SBart Van Assche                          (int)sizeof(desc_sense_data6));
432*44704f69SBart Van Assche         } else {
433*44704f69SBart Van Assche             printf("desc_sense UA subsidiary binding changed test6\n");
434*44704f69SBart Van Assche             sg_print_sense(leadin, desc_sense_data6,
435*44704f69SBart Van Assche                            (int)sizeof(desc_sense_data6), vb);
436*44704f69SBart Van Assche             printf("\n");
437*44704f69SBart Van Assche             printf("\n");
438*44704f69SBart Van Assche         }
439*44704f69SBart Van Assche     }
440*44704f69SBart Van Assche 
441*44704f69SBart Van Assche     if (do_printf) {
442*44704f69SBart Van Assche         ++did_something;
443*44704f69SBart Van Assche         printf("Testing sg_scnpr():\n");
444*44704f69SBart Van Assche         b[0] = '\0';
445*44704f69SBart Van Assche         len = b_len;
446*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
447*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
448*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
449*44704f69SBart Van Assche         if (strlen(b) > 0)
450*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
451*44704f69SBart Van Assche 
452*44704f69SBart Van Assche         b[0] = '\0';
453*44704f69SBart Van Assche         len = -1;
454*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
455*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
456*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
457*44704f69SBart Van Assche         if (strlen(b) > 0)
458*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
459*44704f69SBart Van Assche 
460*44704f69SBart Van Assche         b[0] = '\0';
461*44704f69SBart Van Assche         len = 0;
462*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
463*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
464*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
465*44704f69SBart Van Assche         if (strlen(b) > 0)
466*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
467*44704f69SBart Van Assche 
468*44704f69SBart Van Assche         b[0] = '\0';
469*44704f69SBart Van Assche         len = 1;
470*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
471*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
472*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
473*44704f69SBart Van Assche         if (strlen(b) > 0)
474*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
475*44704f69SBart Van Assche 
476*44704f69SBart Van Assche         b[0] = '\0';
477*44704f69SBart Van Assche         len = 2;
478*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
479*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
480*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
481*44704f69SBart Van Assche         if (strlen(b) > 0)
482*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
483*44704f69SBart Van Assche 
484*44704f69SBart Van Assche         b[0] = '\0';
485*44704f69SBart Van Assche         len = 3;
486*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
487*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
488*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
489*44704f69SBart Van Assche         if (strlen(b) > 0)
490*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
491*44704f69SBart Van Assche 
492*44704f69SBart Van Assche         b[0] = '\0';
493*44704f69SBart Van Assche         len = 4;
494*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
495*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
496*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
497*44704f69SBart Van Assche         if (strlen(b) > 0)
498*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
499*44704f69SBart Van Assche 
500*44704f69SBart Van Assche         b[0] = '\0';
501*44704f69SBart Van Assche         len = 5;
502*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
503*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
504*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
505*44704f69SBart Van Assche         if (strlen(b) > 0)
506*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
507*44704f69SBart Van Assche 
508*44704f69SBart Van Assche         b[0] = '\0';
509*44704f69SBart Van Assche         len = 6;
510*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
511*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
512*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
513*44704f69SBart Van Assche         if (strlen(b) > 0)
514*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
515*44704f69SBart Van Assche 
516*44704f69SBart Van Assche         b[0] = '\0';
517*44704f69SBart Van Assche         len = 7;
518*44704f69SBart Van Assche         n = sg_scnpr(b, len, "%s", "test");
519*44704f69SBart Van Assche         printf("sg_scnpr(,%d,,\"test\") -> %d; strlen(b) -> %u\n",
520*44704f69SBart Van Assche                len, n, (uint32_t)strlen(b));
521*44704f69SBart Van Assche         if (strlen(b) > 0)
522*44704f69SBart Van Assche             printf("Resulting string: %s\n", b);
523*44704f69SBart Van Assche     }
524*44704f69SBart Van Assche     if (do_hex2) {
525*44704f69SBart Van Assche         uint8_t b[] = {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
526*44704f69SBart Van Assche                        0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
527*44704f69SBart Van Assche                        0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58};
528*44704f69SBart Van Assche 
529*44704f69SBart Van Assche         ++did_something;
530*44704f69SBart Van Assche         for (k = 0; k < 19; ++k) {
531*44704f69SBart Van Assche             printf("k=%d:\n", k);
532*44704f69SBart Van Assche             hex2stdout(b, k, 0);
533*44704f69SBart Van Assche             hex2str(b, k, "h2str0: ", 0, sizeof(bb), bb);
534*44704f69SBart Van Assche             printf("%s", bb);
535*44704f69SBart Van Assche             hex2stdout(b, k, 1);
536*44704f69SBart Van Assche             hex2str(b, k, "h2str1: ", 1, sizeof(bb), bb);
537*44704f69SBart Van Assche             printf("%s", bb);
538*44704f69SBart Van Assche             hex2str(b, k, "h2str2: ", 2, sizeof(bb), bb);
539*44704f69SBart Van Assche             printf("%s\n", bb);
540*44704f69SBart Van Assche             hex2stdout(b, k, -1);
541*44704f69SBart Van Assche             printf("\n");
542*44704f69SBart Van Assche         }
543*44704f69SBart Van Assche     }
544*44704f69SBart Van Assche     if (do_unaligned) {
545*44704f69SBart Van Assche         uint16_t u16 = 0x55aa;
546*44704f69SBart Van Assche         uint16_t u16r;
547*44704f69SBart Van Assche         uint32_t u24 = 0x224488;
548*44704f69SBart Van Assche         uint32_t u24r;
549*44704f69SBart Van Assche         uint32_t u32 = 0x224488aa;
550*44704f69SBart Van Assche         uint32_t u32r;
551*44704f69SBart Van Assche         uint64_t u48 = 0x112233445566ULL;
552*44704f69SBart Van Assche         uint64_t u48r;
553*44704f69SBart Van Assche         uint64_t u64 = 0x1122334455667788ULL;
554*44704f69SBart Van Assche         uint64_t u64r;
555*44704f69SBart Van Assche         uint8_t u8[64];
556*44704f69SBart Van Assche 
557*44704f69SBart Van Assche         ++did_something;
558*44704f69SBart Van Assche         if (vb)
559*44704f69SBart Van Assche             memset(u8, 0, sizeof(u8));
560*44704f69SBart Van Assche         printf("u16=0x%" PRIx16 "\n", u16);
561*44704f69SBart Van Assche         sg_put_unaligned_le16(u16, u8);
562*44704f69SBart Van Assche         printf("  le16:\n");
563*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 2, -1);
564*44704f69SBart Van Assche         u16r = sg_get_unaligned_le16(u8);
565*44704f69SBart Van Assche         printf("  u16r=0x%" PRIx16 "\n", u16r);
566*44704f69SBart Van Assche         sg_put_unaligned_be16(u16, u8);
567*44704f69SBart Van Assche         printf("  be16:\n");
568*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 2, -1);
569*44704f69SBart Van Assche         u16r = sg_get_unaligned_be16(u8);
570*44704f69SBart Van Assche         printf("  u16r=0x%" PRIx16 "\n\n", u16r);
571*44704f69SBart Van Assche 
572*44704f69SBart Van Assche         printf("u24=0x%" PRIx32 "\n", u24);
573*44704f69SBart Van Assche         sg_put_unaligned_le24(u24, u8);
574*44704f69SBart Van Assche         printf("  le24:\n");
575*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 3, -1);
576*44704f69SBart Van Assche         u24r = sg_get_unaligned_le24(u8);
577*44704f69SBart Van Assche         printf("  u24r=0x%" PRIx32 "\n", u24r);
578*44704f69SBart Van Assche         sg_put_unaligned_be24(u24, u8);
579*44704f69SBart Van Assche         printf("  be24:\n");
580*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 3, -1);
581*44704f69SBart Van Assche         u24r = sg_get_unaligned_be24(u8);
582*44704f69SBart Van Assche         printf("  u24r=0x%" PRIx32 "\n\n", u24r);
583*44704f69SBart Van Assche 
584*44704f69SBart Van Assche         printf("u32=0x%" PRIx32 "\n", u32);
585*44704f69SBart Van Assche         sg_put_unaligned_le32(u32, u8);
586*44704f69SBart Van Assche         printf("  le32:\n");
587*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 4, -1);
588*44704f69SBart Van Assche         u32r = sg_get_unaligned_le32(u8);
589*44704f69SBart Van Assche         printf("  u32r=0x%" PRIx32 "\n", u32r);
590*44704f69SBart Van Assche         sg_put_unaligned_be32(u32, u8);
591*44704f69SBart Van Assche         printf("  be32:\n");
592*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 4, -1);
593*44704f69SBart Van Assche         u32r = sg_get_unaligned_be32(u8);
594*44704f69SBart Van Assche         printf("  u32r=0x%" PRIx32 "\n\n", u32r);
595*44704f69SBart Van Assche 
596*44704f69SBart Van Assche         printf("u48=0x%" PRIx64 "\n", u48);
597*44704f69SBart Van Assche         sg_put_unaligned_le48(u48, u8);
598*44704f69SBart Van Assche         printf("  le48:\n");
599*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 6, -1);
600*44704f69SBart Van Assche         u48r = sg_get_unaligned_le48(u8);
601*44704f69SBart Van Assche         printf("  u48r=0x%" PRIx64 "\n", u48r);
602*44704f69SBart Van Assche         sg_put_unaligned_be48(u48, u8);
603*44704f69SBart Van Assche         printf("  be48:\n");
604*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 6, -1);
605*44704f69SBart Van Assche         u48r = sg_get_unaligned_be48(u8);
606*44704f69SBart Van Assche         printf("  u48r=0x%" PRIx64 "\n\n", u48r);
607*44704f69SBart Van Assche 
608*44704f69SBart Van Assche         printf("u64=0x%" PRIx64 "\n", u64);
609*44704f69SBart Van Assche         sg_put_unaligned_le64(u64, u8);
610*44704f69SBart Van Assche         printf("  le64:\n");
611*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 8, -1);
612*44704f69SBart Van Assche         u64r = sg_get_unaligned_le64(u8);
613*44704f69SBart Van Assche         printf("  u64r=0x%" PRIx64 "\n", u64r);
614*44704f69SBart Van Assche         sg_put_unaligned_be64(u64, u8);
615*44704f69SBart Van Assche         printf("  be64:\n");
616*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 8, -1);
617*44704f69SBart Van Assche         u64r = sg_get_unaligned_be64(u8);
618*44704f69SBart Van Assche         printf("  u64r=0x%" PRIx64 "\n\n", u64r);
619*44704f69SBart Van Assche 
620*44704f69SBart Van Assche         printf("  be[v=8 bytes]:\n");
621*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 8, -1);
622*44704f69SBart Van Assche         u64r = sg_get_unaligned_be(8, u8);
623*44704f69SBart Van Assche         printf("  u64r[v=8 bytes]=0x%" PRIx64 "\n", u64r);
624*44704f69SBart Van Assche         printf("  le[v=8 bytes]:\n");
625*44704f69SBart Van Assche         hex2stdout(u8, vb ? 10 : 8, -1);
626*44704f69SBart Van Assche         u64r = sg_get_unaligned_le(8, u8);
627*44704f69SBart Van Assche         printf("  u64r[v=8 bytes]=0x%" PRIx64 "\n\n", u64r);
628*44704f69SBart Van Assche     }
629*44704f69SBart Van Assche 
630*44704f69SBart Van Assche #if defined(__GNUC__) && ! defined(SG_LIB_FREEBSD)
631*44704f69SBart Van Assche     if (byteswap_sz > 0) {
632*44704f69SBart Van Assche         uint32_t elapsed_msecs;
633*44704f69SBart Van Assche         uint16_t count16 = 0;
634*44704f69SBart Van Assche         uint32_t count32 = 0;
635*44704f69SBart Van Assche         uint64_t count64 = 0;
636*44704f69SBart Van Assche         struct timespec start_tm, end_tm;
637*44704f69SBart Van Assche 
638*44704f69SBart Van Assche         ++did_something;
639*44704f69SBart Van Assche         if (0 != clock_gettime(CLOCK_MONOTONIC, &start_tm)) {
640*44704f69SBart Van Assche             perror("clock_gettime(CLOCK_MONOTONIC)\n");
641*44704f69SBart Van Assche             return 1;
642*44704f69SBart Van Assche         }
643*44704f69SBart Van Assche         for (k = 0; k < do_num; ++k) {
644*44704f69SBart Van Assche             switch (byteswap_sz) {
645*44704f69SBart Van Assche             case 16:
646*44704f69SBart Van Assche                 sg_put_unaligned_be16(count16 + 1, arr + OFF);
647*44704f69SBart Van Assche                 count16 = sg_get_unaligned_be16(arr + OFF);
648*44704f69SBart Van Assche                 break;
649*44704f69SBart Van Assche             case 32:
650*44704f69SBart Van Assche                 sg_put_unaligned_be32(count32 + 1, arr + OFF);
651*44704f69SBart Van Assche                 count32 = sg_get_unaligned_be32(arr + OFF);
652*44704f69SBart Van Assche                 break;
653*44704f69SBart Van Assche             case 64:
654*44704f69SBart Van Assche                 sg_put_unaligned_be64(count64 + 1, arr + OFF);
655*44704f69SBart Van Assche                 count64 = sg_get_unaligned_be64(arr + OFF);
656*44704f69SBart Van Assche                 break;
657*44704f69SBart Van Assche             default:
658*44704f69SBart Van Assche                 break;
659*44704f69SBart Van Assche             }
660*44704f69SBart Van Assche         }
661*44704f69SBart Van Assche         if (0 != clock_gettime(CLOCK_MONOTONIC, &end_tm)) {
662*44704f69SBart Van Assche             perror("clock_gettime(CLOCK_MONOTONIC)\n");
663*44704f69SBart Van Assche             return 1;
664*44704f69SBart Van Assche         }
665*44704f69SBart Van Assche         elapsed_msecs = (end_tm.tv_sec - start_tm.tv_sec) * 1000;
666*44704f69SBart Van Assche         elapsed_msecs += (end_tm.tv_nsec - start_tm.tv_nsec) / 1000000;
667*44704f69SBart Van Assche         if (16 == byteswap_sz)
668*44704f69SBart Van Assche             printf("  last k=%d, last count16=%u\n", k, count16);
669*44704f69SBart Van Assche         else if (32 == byteswap_sz)
670*44704f69SBart Van Assche             printf("  last k=%d, last count32=%u\n", k, count32);
671*44704f69SBart Van Assche         else
672*44704f69SBart Van Assche             printf("  last k=%d, last count64=%" PRIu64 "\n", k, count64);
673*44704f69SBart Van Assche         printf("Unaligned elapsed milliseconds: %u\n", elapsed_msecs);
674*44704f69SBart Van Assche         count16 = 0;
675*44704f69SBart Van Assche         count32 = 0;
676*44704f69SBart Van Assche         count64 = 0;
677*44704f69SBart Van Assche 
678*44704f69SBart Van Assche         if (0 != clock_gettime(CLOCK_MONOTONIC, &start_tm)) {
679*44704f69SBart Van Assche             perror("clock_gettime(CLOCK_MONOTONIC)\n");
680*44704f69SBart Van Assche             return 1;
681*44704f69SBart Van Assche         }
682*44704f69SBart Van Assche         for (k = 0; k < do_num; ++k) {
683*44704f69SBart Van Assche             switch (byteswap_sz) {
684*44704f69SBart Van Assche             case 16:
685*44704f69SBart Van Assche                 count16 = bswap_16(count16 + 1);
686*44704f69SBart Van Assche                 memcpy(arr + OFF, &count16, 2);
687*44704f69SBart Van Assche                 memcpy(&count16, arr + OFF, 2);
688*44704f69SBart Van Assche                 count16 = bswap_16(count16);
689*44704f69SBart Van Assche                 break;
690*44704f69SBart Van Assche             case 32:
691*44704f69SBart Van Assche                 count32 = bswap_32(count32 + 1);
692*44704f69SBart Van Assche                 memcpy(arr + OFF, &count32, 4);
693*44704f69SBart Van Assche                 memcpy(&count32, arr + OFF, 4);
694*44704f69SBart Van Assche                 count32 = bswap_32(count32);
695*44704f69SBart Van Assche                 break;
696*44704f69SBart Van Assche             case 64:
697*44704f69SBart Van Assche                 count64 = bswap_64(count64 + 1);
698*44704f69SBart Van Assche                 memcpy(arr + OFF, &count64, 8);
699*44704f69SBart Van Assche                 memcpy(&count64, arr + OFF, 8);
700*44704f69SBart Van Assche                 count64 = bswap_64(count64);
701*44704f69SBart Van Assche                 break;
702*44704f69SBart Van Assche             default:
703*44704f69SBart Van Assche                 break;
704*44704f69SBart Van Assche             }
705*44704f69SBart Van Assche         }
706*44704f69SBart Van Assche         if (0 != clock_gettime(CLOCK_MONOTONIC, &end_tm)) {
707*44704f69SBart Van Assche             perror("clock_gettime(CLOCK_MONOTONIC)\n");
708*44704f69SBart Van Assche             return 1;
709*44704f69SBart Van Assche         }
710*44704f69SBart Van Assche         elapsed_msecs = (end_tm.tv_sec - start_tm.tv_sec) * 1000;
711*44704f69SBart Van Assche         elapsed_msecs += (end_tm.tv_nsec - start_tm.tv_nsec) / 1000000;
712*44704f69SBart Van Assche         if (16 == byteswap_sz)
713*44704f69SBart Van Assche             printf("  last k=%d, last count16=%u\n", k, count16);
714*44704f69SBart Van Assche         else if (32 == byteswap_sz)
715*44704f69SBart Van Assche             printf("  last k=%d, last count32=%u\n", k, count32);
716*44704f69SBart Van Assche         else
717*44704f69SBart Van Assche             printf("  last k=%d, last count64=%" PRIu64 "\n", k, count64);
718*44704f69SBart Van Assche         printf("Byteswap/memcpy elapsed milliseconds: %u\n", elapsed_msecs);
719*44704f69SBart Van Assche         count16 = 0;
720*44704f69SBart Van Assche         count32 = 0;
721*44704f69SBart Van Assche         count64 = 0;
722*44704f69SBart Van Assche     }
723*44704f69SBart Van Assche #endif
724*44704f69SBart Van Assche 
725*44704f69SBart Van Assche     if (0 == did_something)
726*44704f69SBart Van Assche         printf("Looks like no tests done, check usage with '-h'\n");
727*44704f69SBart Van Assche     ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
728*44704f69SBart Van Assche     if (as_json) {
729*44704f69SBart Van Assche         if (0 == do_hex2)
730*44704f69SBart Van Assche             sgj_js2file(jsp, NULL, ret, stdout);
731*44704f69SBart Van Assche         sgj_finish(jsp);
732*44704f69SBart Van Assche     }
733*44704f69SBart Van Assche     return ret;
734*44704f69SBart Van Assche }
735