aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2016-02-02 04:21:27 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2016-02-02 04:21:27 +0000
commitc68b788ce091800ab12ad6a37681d0c1ee275ca0 (patch)
tree87fcb51f0e9ba2b6bdf98e732ae097238b116ba2 /examples
parent572d431816271830cc321c2c7b596236e5708ea0 (diff)
downloadsg3_utils-c68b788ce091800ab12ad6a37681d0c1ee275ca0.tar.gz
sg_unaligned.h: gets for variable length unsigned integers; sg_inq: version descriptor list to 20160125
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@658 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'examples')
-rw-r--r--examples/sg_sense_test.c164
1 files changed, 120 insertions, 44 deletions
diff --git a/examples/sg_sense_test.c b/examples/sg_sense_test.c
index 42b33e43..4ada185b 100644
--- a/examples/sg_sense_test.c
+++ b/examples/sg_sense_test.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <getopt.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -12,7 +13,7 @@
/* This is a simple program that tests the sense data descriptor format
printout function in sg_lib.c
-* Copyright (C) 2004-20013 D. Gilbert
+* Copyright (C) 2004-2016 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)
@@ -24,17 +25,43 @@
#define ME "sg_sense_test: "
+static char * version_str = "2.00 20160128";
+static struct option long_options[] = {
+ {"help", no_argument, 0, 'h'},
+ {"leadin", required_argument, 0, 'l'},
+ {"verbose", no_argument, 0, 'v'},
+ {"version", no_argument, 0, 'V'},
+ {0, 0, 0, 0}, /* sentinel */
+};
-int main(/* int argc, char * argv[] */)
+
+static void
+usage()
+{
+ fprintf(stderr,
+ "Usage: %s [--help] [--leadin=STR] [--verbose] [--version]\n"
+ " where: --help|-h print out usage message\n"
+ " --leadin=STR|-l STR every line output by --sense "
+ "should\n"
+ " be prefixed by STR\n"
+ " --verbose|-v increase verbosity\n"
+ " --version|-V print version string and exit\n\n"
+ "Test sense data handling of sg_lib. Overlaps somewhat with "
+ "utils/tst_sg_lib\n", ME
+ );
+
+}
+
+int main(int argc, char * argv[])
{
- unsigned char err1[] = {0x72, 0x5, 0x4, 0x1, 0, 0, 0, 32,
+ unsigned char err1[] = {0x72, 0x5, 0x24, 0x0, 0, 0, 0, 32,
0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0,
0, 0xa, 0x80, 0, 1, 2, 3, 4,
0xaa, 0xbb, 0xcc, 0xdd,
1, 0xa, 0, 0, 1, 2, 3, 4,
0xaa, 0xbb, 0xee, 0xff};
- unsigned char err2[] = {0x72, SPC_SK_MEDIUM_ERROR, 0x4, 0x1, 0x80, 0, 0,
+ unsigned char err2[] = {0x72, SPC_SK_MEDIUM_ERROR, 0x11, 0xb, 0x80, 0, 0,
32,
0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0,
0, 0xa, 0x80, 0, 1, 2, 3, 4,
@@ -42,9 +69,9 @@ int main(/* int argc, char * argv[] */)
1, 0xa, 0, 0, 1, 2, 3, 4,
0xaa, 0xbb, 0xee, 0xff};
/* Set SDAT_OVFL */
- unsigned char err3[] = {0x72, SPC_SK_NO_SENSE, 0x4, 0x1, 0, 0, 0, 8,
- 0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0};
- unsigned char err4[] = {0x73, SPC_SK_COPY_ABORTED, 0x4, 0x1, 0, 0, 0, 22,
+ unsigned char err3[] = {0x72, SPC_SK_NO_SENSE, 0x4, 0x4, 0, 0, 0, 8,
+ 0x2, 0x6, 0, 0, 0xc8, 0x12, 0x34, 0};
+ unsigned char err4[] = {0x73, SPC_SK_COPY_ABORTED, 0x8, 0x4, 0, 0, 0, 22,
0x2, 0x6, 0, 0, 0xc8, 0x0, 0x3, 0,
0x3, 0x2, 0, 0x55,
0x5, 0x2, 0, 0x20,
@@ -59,47 +86,96 @@ int main(/* int argc, char * argv[] */)
unsigned char err7[] = {0xf1, 0, 0xe5, 0x11, 0x22, 0x33, 0x44, 0xa,
0x0, 0x0, 0x0, 0x0, 0x24, 0x1, 0xbb,
0xc9, 0x0, 0x2};
- char leadin[128];
+ const char * leadin = NULL;
char b[2048];
- int k, prev_len;
-
- fprintf(stderr, "err1 test:\n");
- sg_print_sense(NULL, err1, sizeof(err1), 1 /* raw_info */);
- fprintf(stderr, "err2 test:\n");
- sg_print_sense(" ", err2, sizeof(err2), 1);
- fprintf(stderr, "err3 test:\n");
- sg_print_sense(" ", err3, sizeof(err3), 1);
- fprintf(stderr, "err4 test:\n");
- sg_print_sense("> ", err4, sizeof(err4), 1);
- fprintf(stderr, "err5 test:\n");
- sg_print_sense(">> ", err5, sizeof(err5), 1);
- fprintf(stderr, "err6 test:\n");
- sg_print_sense(">> ", err6, sizeof(err6), 1);
- fprintf(stderr, "err7 test:\n");
- sg_print_sense(">> ", err7, sizeof(err7), 1);
-
- printf("\n\nTry different output string sizes with "
- "sg_get_sense_str(err2):\n");
- for (k = 1, prev_len = -1; k < 512; ++k) {
- /* snprintf(leadin, sizeof(leadin), "blen=%d", k); */
- sg_get_sense_str(NULL, err2, sizeof(err2), 0, k, b);
- printf("%s\n", b);
- if (prev_len == (int)strlen(b))
+ int c, k, prev_len;
+ int verbose = 0;
+
+ while (1) {
+ int option_index = 0;
+
+ c = getopt_long(argc, argv, "hl:vV", long_options,
+ &option_index);
+ if (c == -1)
break;
- else
- prev_len = strlen(b);
- }
- printf("\n\nTry different output string sizes with "
- "sg_get_sense_str(err4):\n");
- for (k = 1, prev_len = -1; k < 512; ++k) {
- /* snprintf(leadin, sizeof(leadin), "blen=%d", k); */
- sg_get_sense_str(NULL, err4, sizeof(err4), 0, k, b);
- printf("%s\n", b);
- if (prev_len == (int)strlen(b))
+ switch (c) {
+ case 'h':
+ case '?':
+ usage();
+ return 0;
+ case 'l':
+ leadin = optarg;
break;
- else
- prev_len = strlen(b);
+ case 'v':
+ ++verbose;
+ break;
+ case 'V':
+ fprintf(stderr, "version: %s\n", version_str);
+ return 0;
+ default:
+ fprintf(stderr, "unrecognised switch code 0x%x ??\n", c);
+ usage();
+ return 1;
+ }
+ }
+ if (optind < argc) {
+ if (optind < argc) {
+ for (; optind < argc; ++optind)
+ fprintf(stderr, "Unexpected extra argument: %s\n",
+ argv[optind]);
+ usage();
+ return 1;
+ }
+ }
+
+ printf("err1 test:\n");
+ sg_print_sense(leadin, err1, sizeof(err1), verbose /* raw_info */);
+ printf("\n");
+ printf("err2 test:\n");
+ sg_print_sense(leadin, err2, sizeof(err2), verbose);
+ printf("\n");
+ printf("err3 test:\n");
+ sg_print_sense(leadin, err3, sizeof(err3), verbose);
+ printf("\n");
+ printf("err4 test:\n");
+ sg_print_sense(leadin, err4, sizeof(err4), verbose);
+ printf("\n");
+ printf("err5 test: Set Filemark, EOM, ILI and SDAT_OVFL\n");
+ sg_print_sense(leadin, err5, sizeof(err5), verbose);
+ printf("\n");
+ printf("err6 test:\n");
+ sg_print_sense(leadin, err6, sizeof(err6), verbose);
+ printf("\n");
+ printf("err7 test:\n");
+ sg_print_sense(leadin, err7, sizeof(err7), verbose);
+
+ if (verbose > 1) {
+ printf("\n\nTry different output string sizes with "
+ "sg_get_sense_str(err2):\n");
+ for (k = 1, prev_len = -1; k < 512; ++k) {
+ /* snprintf(leadin, sizeof(leadin), "blen=%d", k); */
+ sg_get_sense_str(NULL, err2, sizeof(err2), 0, k, b);
+ printf("%s\n", b);
+ if (prev_len == (int)strlen(b))
+ break;
+ else
+ prev_len = strlen(b);
+ }
+ }
+
+ if (verbose > 2) {
+ printf("\n\nTry different output string sizes with "
+ "sg_get_sense_str(err4):\n");
+ for (k = 1, prev_len = -1; k < 512; ++k) {
+ /* snprintf(leadin, sizeof(leadin), "blen=%d", k); */
+ sg_get_sense_str(NULL, err4, sizeof(err4), 0, k, b);
+ printf("%s\n", b);
+ if (prev_len == (int)strlen(b))
+ break;
+ else
+ prev_len = strlen(b);
+ }
}
return 0;
}