xref: /aosp_15_r20/external/sg3_utils/testing/sg_sense_test.c (revision 44704f698541f6367e81f991ef8bb54ccbf3fc18)
1*44704f69SBart Van Assche /*
2*44704f69SBart Van Assche  *  Copyright (C) 2004-2018 D. Gilbert
3*44704f69SBart Van Assche  *  This program is free software; you can redistribute it and/or modify
4*44704f69SBart Van Assche  *  it under the terms of the GNU General Public License as published by
5*44704f69SBart Van Assche  *  the Free Software Foundation; either version 2, or (at your option)
6*44704f69SBart Van Assche  *  any later version.
7*44704f69SBart Van Assche  *
8*44704f69SBart Van Assche  * SPDX-License-Identifier: GPL-2.0-or-later
9*44704f69SBart Van Assche  */
10*44704f69SBart Van Assche 
11*44704f69SBart Van Assche /* This is a simple program that tests the sense data descriptor format
12*44704f69SBart Van Assche  * printout function in sg_lib.c . */
13*44704f69SBart Van Assche 
14*44704f69SBart Van Assche #include <unistd.h>
15*44704f69SBart Van Assche #include <fcntl.h>
16*44704f69SBart Van Assche #include <stdio.h>
17*44704f69SBart Van Assche #include <stdlib.h>
18*44704f69SBart Van Assche #include <stdint.h>
19*44704f69SBart Van Assche #include <string.h>
20*44704f69SBart Van Assche #include <getopt.h>
21*44704f69SBart Van Assche 
22*44704f69SBart Van Assche #include "sg_lib.h"
23*44704f69SBart Van Assche 
24*44704f69SBart Van Assche 
25*44704f69SBart Van Assche #define EBUFF_SZ 256
26*44704f69SBart Van Assche 
27*44704f69SBart Van Assche #define ME "sg_sense_test: "
28*44704f69SBart Van Assche 
29*44704f69SBart Van Assche static const char * version_str = "2.04 20181207";
30*44704f69SBart Van Assche 
31*44704f69SBart Van Assche static struct option long_options[] = {
32*44704f69SBart Van Assche         {"help", no_argument, 0, 'h'},
33*44704f69SBart Van Assche         {"leadin",  required_argument, 0, 'l'},
34*44704f69SBart Van Assche         {"stdout",  no_argument, 0, 's'},
35*44704f69SBart Van Assche         {"verbose", no_argument, 0, 'v'},
36*44704f69SBart Van Assche         {"version", no_argument, 0, 'V'},
37*44704f69SBart Van Assche         {0, 0, 0, 0},   /* sentinel */
38*44704f69SBart Van Assche };
39*44704f69SBart Van Assche 
40*44704f69SBart Van Assche 
41*44704f69SBart Van Assche static void
usage()42*44704f69SBart Van Assche usage()
43*44704f69SBart Van Assche {
44*44704f69SBart Van Assche     fprintf(stderr,
45*44704f69SBart Van Assche             "Usage: %s [--help] [--leadin=STR] [--stdout] [--verbose] "
46*44704f69SBart Van Assche             "[--version]\n"
47*44704f69SBart Van Assche             "  where: --help|-h          print out usage message\n"
48*44704f69SBart Van Assche             "         --leadin=STR|-l STR    every line output by --sense "
49*44704f69SBart Van Assche             "should\n"
50*44704f69SBart Van Assche             "                                be prefixed by STR\n"
51*44704f69SBart Van Assche             "         --stdout|-s        send output to stdout (def: "
52*44704f69SBart Van Assche             "stderr)\n"
53*44704f69SBart Van Assche             "         --verbose|-v       increase verbosity\n"
54*44704f69SBart Van Assche             "         --version|-V       print version string and exit\n\n"
55*44704f69SBart Van Assche             "Test sense data handling of sg_lib. Overlaps somewhat with "
56*44704f69SBart Van Assche             "tst_sg_lib\n", ME
57*44704f69SBart Van Assche            );
58*44704f69SBart Van Assche 
59*44704f69SBart Van Assche }
60*44704f69SBart Van Assche 
61*44704f69SBart Van Assche int
main(int argc,char * argv[])62*44704f69SBart Van Assche main(int argc, char * argv[])
63*44704f69SBart Van Assche {
64*44704f69SBart Van Assche     bool to_stdout = false;
65*44704f69SBart Van Assche     int c, k, prev_len;
66*44704f69SBart Van Assche     int verbose = 0;
67*44704f69SBart Van Assche     const char * leadin = NULL;
68*44704f69SBart Van Assche     FILE * outfp = stderr;
69*44704f69SBart Van Assche     uint8_t err1[] = {0x72, 0x5, 0x24, 0x0, 0, 0, 0, 32,
70*44704f69SBart Van Assche                       0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0,
71*44704f69SBart Van Assche                       0, 0xa, 0x80, 0, 1, 2, 3, 4,
72*44704f69SBart Van Assche                       0xaa, 0xbb, 0xcc, 0xdd,
73*44704f69SBart Van Assche                       1, 0xa, 0, 0, 1, 2, 3, 4,
74*44704f69SBart Van Assche                       0xaa, 0xbb, 0xee, 0xff};
75*44704f69SBart Van Assche     uint8_t err2[] = {0x72, SPC_SK_MEDIUM_ERROR, 0x11, 0xb, 0x80, 0, 0,
76*44704f69SBart Van Assche                       32,
77*44704f69SBart Van Assche                       0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0,
78*44704f69SBart Van Assche                       0, 0xa, 0x80, 0, 1, 2, 3, 4,
79*44704f69SBart Van Assche                       0xaa, 0xbb, 0xcc, 0xdd,
80*44704f69SBart Van Assche                       1, 0xa, 0, 0, 1, 2, 3, 4,
81*44704f69SBart Van Assche                       0xaa, 0xbb, 0xee, 0xff};
82*44704f69SBart Van Assche                      /* Set SDAT_OVFL */
83*44704f69SBart Van Assche     uint8_t err3[] = {0x72, SPC_SK_NO_SENSE, 0x4, 0x4, 0, 0, 0, 8,
84*44704f69SBart Van Assche                       0x2, 0x6, 0, 0, 0xc8, 0x12, 0x34, 0};
85*44704f69SBart Van Assche     uint8_t err4[] = {0x73, SPC_SK_COPY_ABORTED, 0x8, 0x4, 0, 0, 0, 22,
86*44704f69SBart Van Assche                       0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0,
87*44704f69SBart Van Assche                       0x3, 0x2, 0, 0x55,
88*44704f69SBart Van Assche                       0x5, 0x2, 0, 0x20,
89*44704f69SBart Van Assche                       0x85, 0x4, 0, 0x20, 0x33, 0x44};
90*44704f69SBart Van Assche                      /* Set Filemark, EOM, ILI and SDAT_OVFL */
91*44704f69SBart Van Assche     uint8_t err5[] = {0xf1, 0, (0xf0 | SPC_SK_ILLEGAL_REQUEST), 0x11,
92*44704f69SBart Van Assche                       0x22, 0x33, 0x44, 0xa,
93*44704f69SBart Van Assche                       0x0, 0x0, 0, 0, 0x4, 0x1, 0, 0xcf, 0, 5,};
94*44704f69SBart Van Assche     uint8_t err6[] = {0x72, SPC_SK_NO_SENSE, 0x4, 0x1, 0, 0, 0, 14,
95*44704f69SBart Van Assche                       0x9, 0xc, 1, 0, 0x11, 0x22, 0x66, 0x33,
96*44704f69SBart Van Assche                       0x77, 0x44, 0x88, 0x55, 0x1, 0x2};
97*44704f69SBart Van Assche     uint8_t err7[] = {0xf1, 0, 0xe5, 0x11, 0x22, 0x33, 0x44, 0xa,
98*44704f69SBart Van Assche                       0x0, 0x0, 0x0, 0x0, 0x24, 0x1, 0xbb,
99*44704f69SBart Van Assche                       0xc9, 0x0, 0x2};
100*44704f69SBart Van Assche                      /* Vendor specific, with "valid" bit set */
101*44704f69SBart Van Assche     uint8_t err8[] = {0xff, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc,
102*44704f69SBart Van Assche                       0xd, 0xe, 0xf, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99,
103*44704f69SBart Van Assche                       0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0};
104*44704f69SBart Van Assche     char b[2048];
105*44704f69SBart Van Assche 
106*44704f69SBart Van Assche     while (1) {
107*44704f69SBart Van Assche         int option_index = 0;
108*44704f69SBart Van Assche 
109*44704f69SBart Van Assche         c = getopt_long(argc, argv, "hl:svV", long_options,
110*44704f69SBart Van Assche                         &option_index);
111*44704f69SBart Van Assche         if (c == -1)
112*44704f69SBart Van Assche             break;
113*44704f69SBart Van Assche 
114*44704f69SBart Van Assche         switch (c) {
115*44704f69SBart Van Assche         case 'h':
116*44704f69SBart Van Assche         case '?':
117*44704f69SBart Van Assche             usage();
118*44704f69SBart Van Assche             return 0;
119*44704f69SBart Van Assche         case 'l':
120*44704f69SBart Van Assche             leadin = optarg;
121*44704f69SBart Van Assche             break;
122*44704f69SBart Van Assche         case 's':
123*44704f69SBart Van Assche             to_stdout = true;
124*44704f69SBart Van Assche             break;
125*44704f69SBart Van Assche         case 'v':
126*44704f69SBart Van Assche             ++verbose;
127*44704f69SBart Van Assche             break;
128*44704f69SBart Van Assche         case 'V':
129*44704f69SBart Van Assche             fprintf(stderr, "version: %s\n", version_str);
130*44704f69SBart Van Assche             return 0;
131*44704f69SBart Van Assche         default:
132*44704f69SBart Van Assche             fprintf(stderr, "unrecognised switch code 0x%x ??\n", c);
133*44704f69SBart Van Assche             usage();
134*44704f69SBart Van Assche             return 1;
135*44704f69SBart Van Assche         }
136*44704f69SBart Van Assche     }
137*44704f69SBart Van Assche     if (optind < argc) {
138*44704f69SBart Van Assche         if (optind < argc) {
139*44704f69SBart Van Assche             for (; optind < argc; ++optind)
140*44704f69SBart Van Assche                 fprintf(stderr, "Unexpected extra argument: %s\n",
141*44704f69SBart Van Assche                         argv[optind]);
142*44704f69SBart Van Assche             usage();
143*44704f69SBart Van Assche             return 1;
144*44704f69SBart Van Assche         }
145*44704f69SBart Van Assche     }
146*44704f69SBart Van Assche     if (to_stdout) {
147*44704f69SBart Van Assche         outfp = stdout;
148*44704f69SBart Van Assche         sg_set_warnings_strm(outfp);
149*44704f69SBart Van Assche     }
150*44704f69SBart Van Assche 
151*44704f69SBart Van Assche     fprintf(outfp, "err1 test:\n");
152*44704f69SBart Van Assche     sg_print_sense(leadin, err1, sizeof(err1), verbose /* raw_info */);
153*44704f69SBart Van Assche     fprintf(outfp, "\n");
154*44704f69SBart Van Assche     fprintf(outfp, "err2 test:\n");
155*44704f69SBart Van Assche     sg_print_sense(leadin, err2, sizeof(err2), verbose);
156*44704f69SBart Van Assche     fprintf(outfp, "\n");
157*44704f69SBart Van Assche     fprintf(outfp, "err3 test:\n");
158*44704f69SBart Van Assche     sg_print_sense(leadin, err3, sizeof(err3), verbose);
159*44704f69SBart Van Assche     fprintf(outfp, "\n");
160*44704f69SBart Van Assche     fprintf(outfp, "err4 test:\n");
161*44704f69SBart Van Assche     sg_print_sense(leadin, err4, sizeof(err4), verbose);
162*44704f69SBart Van Assche     fprintf(outfp, "\n");
163*44704f69SBart Van Assche     fprintf(outfp, "err5 test: Set Filemark, EOM, ILI and SDAT_OVFL\n");
164*44704f69SBart Van Assche     sg_print_sense(leadin, err5, sizeof(err5), verbose);
165*44704f69SBart Van Assche     fprintf(outfp, "\n");
166*44704f69SBart Van Assche     fprintf(outfp, "err6 test:\n");
167*44704f69SBart Van Assche     sg_print_sense(leadin, err6, sizeof(err6), verbose);
168*44704f69SBart Van Assche     fprintf(outfp, "\n");
169*44704f69SBart Van Assche     fprintf(outfp, "err7 test:\n");
170*44704f69SBart Van Assche     sg_print_sense(leadin, err7, sizeof(err7), verbose);
171*44704f69SBart Van Assche     fprintf(outfp, "\n");
172*44704f69SBart Van Assche     fprintf(outfp, "err8 test (vendor specific):\n");
173*44704f69SBart Van Assche     sg_print_sense(leadin, err8, sizeof(err8), verbose);
174*44704f69SBart Van Assche     fprintf(outfp, "\n");
175*44704f69SBart Van Assche 
176*44704f69SBart Van Assche     if (verbose > 1) {
177*44704f69SBart Van Assche         fprintf(outfp, "\n\nTry different output string sizes with "
178*44704f69SBart Van Assche                "sg_get_sense_str(err2):\n");
179*44704f69SBart Van Assche         for (k = 1, prev_len = -1; k < 512; ++k) {
180*44704f69SBart Van Assche             /* snprintf(leadin, sizeof(leadin), "blen=%d", k); */
181*44704f69SBart Van Assche             sg_get_sense_str(NULL, err2, sizeof(err2), 0, k, b);
182*44704f69SBart Van Assche             fprintf(outfp, "%s\n", b);
183*44704f69SBart Van Assche             if (prev_len == (int)strlen(b))
184*44704f69SBart Van Assche                 break;
185*44704f69SBart Van Assche             else
186*44704f69SBart Van Assche                 prev_len = strlen(b);
187*44704f69SBart Van Assche         }
188*44704f69SBart Van Assche     }
189*44704f69SBart Van Assche 
190*44704f69SBart Van Assche     if (verbose > 2) {
191*44704f69SBart Van Assche         fprintf(outfp, "\n\nTry different output string sizes with "
192*44704f69SBart Van Assche                "sg_get_sense_str(err4):\n");
193*44704f69SBart Van Assche         for (k = 1, prev_len = -1; k < 512; ++k) {
194*44704f69SBart Van Assche             /* snprintf(leadin, sizeof(leadin), "blen=%d", k); */
195*44704f69SBart Van Assche             sg_get_sense_str(NULL, err4, sizeof(err4), 0, k, b);
196*44704f69SBart Van Assche             fprintf(outfp, "%s\n", b);
197*44704f69SBart Van Assche             if (prev_len == (int)strlen(b))
198*44704f69SBart Van Assche                 break;
199*44704f69SBart Van Assche             else
200*44704f69SBart Van Assche                 prev_len = strlen(b);
201*44704f69SBart Van Assche         }
202*44704f69SBart Van Assche     }
203*44704f69SBart Van Assche     return 0;
204*44704f69SBart Van Assche }
205