aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2022-07-19 04:02:56 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2022-07-19 04:02:56 +0000
commit270cd7304dd379ee490df57120d281641c292398 (patch)
tree460d315db53c3b8214402650ad5b94bcba4c56dc
parentf1c4468bc5353fa361029e790b3ab370d22d5101 (diff)
downloadsg3_utils-270cd7304dd379ee490df57120d281641c292398.tar.gz
another round of sgj_* function renaming; sg_inq+sg_vpd: add new Block Limits VPD page code
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@961 6180dd3e-e324-4e3e-922d-17de1ae2f315
-rw-r--r--ChangeLog2
-rw-r--r--doc/sg3_utils.819
-rw-r--r--doc/sg3_utils_json.811
-rw-r--r--doc/sg_inq.82
-rw-r--r--include/sg_pr2serr.h177
-rw-r--r--inhex/README16
-rw-r--r--lib/sg_pr2serr.c766
-rw-r--r--src/sg_decode_sense.c38
-rw-r--r--src/sg_get_elem_status.c41
-rw-r--r--src/sg_get_lba_status.c52
-rw-r--r--src/sg_inq.c264
-rw-r--r--src/sg_opcodes.c96
-rw-r--r--src/sg_rep_zones.c144
-rw-r--r--src/sg_vpd.c233
-rw-r--r--src/sg_vpd_common.c760
-rw-r--r--src/sg_vpd_common.h7
-rw-r--r--testing/sg_tst_json_builder.c2
-rw-r--r--testing/tst_sg_lib.c52
18 files changed, 1459 insertions, 1223 deletions
diff --git a/ChangeLog b/ChangeLog
index 478481a3..a21aa5d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,7 +2,7 @@ Each utility has its own version number, date of last change and
some description at the top of its ".c" file. All utilities in the main
directory have their own "man" pages. There is also a sg3_utils man page.
-Changelog for pre-release sg3_utils-1.48 [20220714] [svn: r960]
+Changelog for pre-release sg3_utils-1.48 [20220718] [svn: r961]
- some utilities: add experimental --json[=JO] option
- sg_z_act_query: new utility for sending either a
Zone activate or Zone query command
diff --git a/doc/sg3_utils.8 b/doc/sg3_utils.8
index 92fd1d33..ab592361 100644
--- a/doc/sg3_utils.8
+++ b/doc/sg3_utils.8
@@ -754,18 +754,25 @@ hexadecimal values separated by whitespace. "Whitespace consists of either
spaces, tabs, blank lines, or any combination thereof". Hyphens (e.g. '\-')
are also allowed as separators. Each one or two digit ASCII hex pair is
decoded into a byte (i.e. 8 bits). The following will be decoded to
-valid (ascending valued) bytes: '0', '01', '3', 'c', 'F', '4a', 'cC', 'ff'.
-Lines containing only whitespace are ignored. The contents of any line
-containing a hash mark ('#') is ignored from that point until the end of that
-line. Users are encouraged to use hash marks to introduce comments in hex
-files. The author uses the extension'.hex' on such files. Examples can be
-found in the 'inhex' directory.
+valid (ascending valued) bytes: '0', '01', '3', 'c', 'F', '4a', 'cC'
+and 'ff'. Lines containing only whitespace are ignored. The contents of any
+line containing a hash mark ('#') are ignored from that point until the end
+of that line. Users are encouraged to use hash marks to introduce comments
+in hex files. The author uses the extension '.hex' on such files. Examples
+can be found in the 'inhex' directory. Note that this format does _not_
+have an index (counter) value at the beginning of each line (like, for
+example, the hexdump utility outputs).
.PP
The hexadecimal format described in the previous paragraph can be converted
to binary using the sg_decode_sense utility with these
options: "\fI\-\-inhex=HFN \-\-nodecode \-\-write=WFN\fR". The input (in
hex) is in the \fIHFN\fR file while the output is placed in the \fIWFN\fR
file.
+.PP
+To convert a binary file into a hexadecimal form that can be given as input
+to various sg3_utils utilities, the sg_decode_sense utility can also be
+used with these options: "\fI\-\-binary=BFN \-\-nodecode \-HHH\fR" and the
+hex output will be sent to the console (stdout).
.SH MICROCODE AND FIRMWARE
There are two standardized methods for downloading microcode (i.e. device
firmware) to a SCSI device. The more general way is with the SCSI WRITE
diff --git a/doc/sg3_utils_json.8 b/doc/sg3_utils_json.8
index e8080b59..be2983a6 100644
--- a/doc/sg3_utils_json.8
+++ b/doc/sg3_utils_json.8
@@ -263,14 +263,19 @@ As stated above, the default output is in human readable form using 7 bit
ASCII. The \fI\-\-json[=JO]\fR option is designed to be an alternative
to that human readable form. There are other alternative output formats
such as the response output as a hexadecimal sequence of bytes or
-in "raw" binary; both of those take precedence over the \fI\-\-json[=JO]\fR
-option. Other specialized output format (e.g. 'sg_inq \-\-export') will
-usually take precedence over JSON output.
+in "raw" binary output; both of those take precedence over the
+\fI\-\-json[=JO]\fR option. Other specialized output
+format (e.g. 'sg_inq \-\-export') will usually take precedence over JSON
+output.
.PP
When the \fI\-\-raw\fR option is used together with the \fI\-\-inhex=FN\fR
option only the data input to the utility is interpreted as binary. So the
output format defaults to human readable form and thus can be changed to
JSON if the \fI\-\-json[=JO]\fR option is also used.
+.PP
+There is typically only one form of JSON output so options like
+\fI\-\-brief\fR and \fI\-\-quiet\fR are ignored in the JSON output. In some
+cases (i.e 'sg_inq \-\-descriptors') the JSON output is expanded.
.SH AUTHORS
Written by Douglas Gilbert. Some utilities have been contributed, see the
CREDITS file and individual source files (in the 'src' directory).
diff --git a/doc/sg_inq.8 b/doc/sg_inq.8
index 759d7165..a7b4ef9f 100644
--- a/doc/sg_inq.8
+++ b/doc/sg_inq.8
@@ -1,4 +1,4 @@
-.TH SG_INQ "8" "January 2022" "sg3_utils\-1.48" SG3_UTILS
+.TH SG_INQ "8" "July 2022" "sg3_utils\-1.48" SG3_UTILS
.SH NAME
sg_inq \- issue SCSI INQUIRY command and/or decode its response
.SH SYNOPSIS
diff --git a/include/sg_pr2serr.h b/include/sg_pr2serr.h
index 23295a50..ad3cec94 100644
--- a/include/sg_pr2serr.h
+++ b/include/sg_pr2serr.h
@@ -37,12 +37,13 @@ int pr2serr(const char * fmt, ...) __printf(1, 2);
int pr2ws(const char * fmt, ...) __printf(1, 2);
/* Want safe, 'n += snprintf(b + n, blen - n, ...)' style sequence of
- * functions. Returns number of chars placed in cp excluding the
- * trailing null char. So for cp_max_len > 0 the return value is always
- * < cp_max_len; for cp_max_len <= 1 the return value is 0 and no chars are
- * written to cp. Note this means that when cp_max_len = 1, this function
- * assumes that cp[0] is the null character and does nothing (and returns
- * 0). Linux kernel has a similar function called scnprintf(). */
+ * functions that can be called mulriple times. Returns number of chars
+ * placed in cp excluding the trailing null char. So for cp_max_len > 0 the
+ * return value is always < cp_max_len; for cp_max_len <= 1 the return value
+ * is 0 and no chars are written to cp. Note this means that when
+ * cp_max_len = 1, this function assumes that cp[0] is the null character
+ * and does nothing (and returns 0). Linux kernel has a similar function
+ * called scnprintf(). */
int sg_scnpr(char * cp, int cp_max_len, const char * fmt, ...) __printf(3, 4);
/* JSON support functions and structures follow. The prefix "sgj_" is used
@@ -72,7 +73,7 @@ typedef struct sgj_state_t {
bool pr_exit_status; /* 'e' (def: true) */
bool pr_hex; /* 'h' (def: false) */
bool pr_leadin; /* 'l' (def: true) */
- bool pr_name_ex; /* 'n' name extra (information) (def: false) */
+ bool pr_name_ex; /* 'n' name_extra (information) (def: false) */
bool pr_out_hr; /* 'o' (def: false) */
bool pr_packed; /* 'k' (def: false) only when !pr_pretty */
bool pr_pretty; /* 'p' (def: true) */
@@ -96,6 +97,24 @@ typedef struct sgj_state_t {
* Note: strlen(in_name) should be <= max_sname_len . */
char * sgj_convert_to_snake_name(const char * in_name, char * sname,
int max_sname_len);
+/* There are many variants of JSON supporting functions below and some
+ * abbreaviations are used to shorten their function names:
+ * sgj_ - prefix of all the functions related to (non-)JSON output
+ * hr - human readable form (as it was before JSON)
+ * js - JSON only output (unless 'hr_js' given)
+ * pr - has printf() like variadic arguments
+ * _r - suffix indicating the return value should/must be used
+ * nv - adds a name-value JSON field (or several)
+ * o - value is the provided JSON object (or array)
+ * i - value is a JSON integer object (int64_t or uint64_t)
+ * b - value is a JSON boolean object
+ * s - value is a JSON string object
+ * str - same as s
+ * hex - value is hexadecimal in a JSON string object
+ * _nex - extra 'name_extra' JSON string object about name
+ * new - object that needs sgj_free_unattached() it not attached
+ *
+ * */
/* If jsp in non-NULL and jsp->pr_as_json is true then this call is ignored
* unless jsp->pr_out_hrp is true. Otherwise this function prints to stdout
@@ -126,16 +145,16 @@ bool sgj_init_state(sgj_state * jsp, const char * j_optarg);
* (creating it in the case when jsp->pr_leadin is false) and a pointer to
* that array object is placed in jsp->objectp . The returned pointer is not
* usually needed but if it is NULL then a heap allocation has failed. */
-sgj_opaque_p sgj_start(const char * util_name, const char * ver_str,
- int argc, char *argv[], sgj_state * jsp);
+sgj_opaque_p sgj_start_r(const char * util_name, const char * ver_str,
+ int argc, char *argv[], sgj_state * jsp);
/* These are low level functions returning a pointer to a newly created JSON
* object or array. If jsp is NULL or jsp->pr_as_json is false nothing happens
* and NULL is returned. Note that this JSON object is _not_ placed in the
* in-core tree controlled by jsp (jsp->basep); it may be added later as the
- * fourth argument to sgj_add_nv_o(), for example. */
-sgj_opaque_p sgj_new_unattached_object(sgj_state * jsp);
-sgj_opaque_p sgj_new_unattached_array(sgj_state * jsp);
+ * fourth argument to sgj_js_nv_o(), for example. */
+sgj_opaque_p sgj_new_unattached_object_r(sgj_state * jsp);
+sgj_opaque_p sgj_new_unattached_array_r(sgj_state * jsp);
/* If jsp is NULL or jsp->pr_as_json is false nothing happens and NULL is
* returned. Otherwise it creates a new named object (whose name is what
@@ -143,10 +162,10 @@ sgj_opaque_p sgj_new_unattached_array(sgj_state * jsp);
* to that empty object is returned. If 'jop' is NULL then jsp->basep is
* used instead. The returned value should always be checked (for NULL)
* and if not, used. */
-sgj_opaque_p sgj_new_named_object(sgj_state * jsp, sgj_opaque_p jop,
- const char * name);
-sgj_opaque_p sgj_new_snake_named_object(sgj_state * jsp, sgj_opaque_p jop,
- const char * conv2sname);
+sgj_opaque_p sgj_named_subobject_r(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name);
+sgj_opaque_p sgj_snake_named_subobject_r(sgj_state * jsp, sgj_opaque_p jop,
+ const char * conv2sname);
/* If jsp is NULL or jsp->pr_as_json is false nothing happens and NULL is
* returned. Otherwise it creates a new named object (whose name is what
@@ -154,10 +173,10 @@ sgj_opaque_p sgj_new_snake_named_object(sgj_state * jsp, sgj_opaque_p jop,
* to that empty array is returned. If 'jop' is NULL then jsp->basep is
* used instead. The returned value should always * be checked (for NULL)
* and if not, used. */
-sgj_opaque_p sgj_new_named_array(sgj_state * jsp, sgj_opaque_p jop,
- const char * name);
-sgj_opaque_p sgj_new_snake_named_array(sgj_state * jsp, sgj_opaque_p jop,
- const char * conv2sname);
+sgj_opaque_p sgj_named_subarray_r(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name);
+sgj_opaque_p sgj_snake_named_subarray_r(sgj_state * jsp, sgj_opaque_p jop,
+ const char * conv2sname);
/* If either jsp or value is NULL or jsp->pr_as_json is false then nothing
* happens and NULL is returned. The insertion point is at jop but if it is
@@ -166,11 +185,11 @@ sgj_opaque_p sgj_new_snake_named_array(sgj_state * jsp, sgj_opaque_p jop,
* 'value'. If 'name' is NULL then 'jop' is assumed to be a JSON array and
* a JSON string formed from 'value' is added. If successful returns a
* a pointer newly formed JSON string. */
-sgj_opaque_p sgj_add_nv_s(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, const char * value);
-sgj_opaque_p sgj_add_nv_s_len(sgj_state * jsp, sgj_opaque_p jop,
- const char * name,
- const char * value, int slen);
+sgj_opaque_p sgj_js_nv_s(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, const char * value);
+sgj_opaque_p sgj_js_nv_s_len(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name,
+ const char * value, int slen);
/* If either jsp is NULL or jsp->pr_as_json is false then nothing happens and
* NULL is returned. The insertion point is at jop but if it is NULL
@@ -179,8 +198,8 @@ sgj_opaque_p sgj_add_nv_s_len(sgj_state * jsp, sgj_opaque_p jop,
* 'value'. If 'name' is NULL then 'jop' is assumed to be a JSON array and
* a JSON integer formed from 'value' is added. If successful returns a
* a pointer newly formed JSON integer. */
-sgj_opaque_p sgj_add_nv_i(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, int64_t value);
+sgj_opaque_p sgj_js_nv_i(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, int64_t value);
/* If either jsp is NULL or jsp->pr_as_json is false then nothing happens and
* NULL is returned. The insertion point is at jop but if it is NULL
@@ -189,8 +208,8 @@ sgj_opaque_p sgj_add_nv_i(sgj_state * jsp, sgj_opaque_p jop,
* 'value'. If 'name' is NULL then 'jop' is assumed to be a JSON array and
* a JSON boolean formed from 'value' is added. If successful returns a
* a pointer newly formed JSON boolean. */
-sgj_opaque_p sgj_add_nv_b(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, bool value);
+sgj_opaque_p sgj_js_nv_b(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, bool value);
/* If jsp is NULL, jsp->pr_as_json is false or ua_jop is NULL nothing then
* happens and NULL is returned. 'jop' is the insertion point but if it is
@@ -200,12 +219,12 @@ sgj_opaque_p sgj_add_nv_b(sgj_state * jsp, sgj_opaque_p jop,
* it. If successful returns ua_jop . The "ua_" prefix stands for unattached.
* That should be the case before invocation and it will be attached to jop
* after a successful invocation. This means that ua_jop must have been
- * created by sgj_new_unattached_object() or similar. */
-sgj_opaque_p sgj_add_nv_o(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, sgj_opaque_p ua_jop);
+ * created by sgj_new_unattached_object_r() or similar. */
+sgj_opaque_p sgj_js_nv_o(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, sgj_opaque_p ua_jop);
/* The '_hr_js_' refers to generating output both for human readable and/or
- * JSON with a single invocation. If jsp is non_NULL and jsp->pr_out_hr is
+ * JSON with a single invocation. If jsp is non-NULL and jsp->pr_out_hr is
* true then both JSON and human readable output is formed (and the latter is
* placed in the jsp->out_hrp JSON array). The human readable form will have
* leadin_sp spaces followed by 'name' then a separator, then 'value' with a
@@ -215,26 +234,35 @@ sgj_opaque_p sgj_add_nv_o(sgj_state * jsp, sgj_opaque_p jop,
* made from 'value' is added to the JSON array pointed to by 'jop'.
* Otherwise a 'name'-d JSON object whose value is a JSON string object made
* from 'value' is added at 'jop'. */
-void sgj_pr_hr_js_vs(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep,
- const char * value);
+void sgj_hr_js_vs(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep,
+ const char * value);
-/* Similar to sgj_pr_hr_js_vs()'s description with 'JSON string object'
+/* Similar to sgj_hr_js_vs()'s description with 'JSON string object'
* replaced by 'JSON integer object'. */
-void sgj_pr_hr_js_vi(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep,
- int64_t value);
-void sgj_pr_hr_js_vi_nex(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep,
- int64_t value, const char * nex_s);
-sgj_opaque_p sgj_pr_hr_js_subo(sgj_state * jsp, sgj_opaque_p jop,
- int leadin_sp, const char * name,
- enum sgj_separator_t sep, int64_t value);
-
-/* Similar to sgj_pr_hr_js_vs()'s description with 'JSON string object'
+void sgj_hr_js_vi(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep,
+ int64_t value, bool hex_as_well);
+/* The '_nex' refers to a "name_extra" (information) sub-object (a JSON
+ * string) which explains a bit more about the 'name' entry. This is useful
+ * when T10 specifies the name as an abbreviation (e.g. SYSV). Whether this
+ * sub-object is shown in the JSON output is controlled by the 'n' control
+ * character. */
+void sgj_hr_js_vi_nex(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep,
+ int64_t value, bool hex_as_well, const char * nex_s);
+
+/* Similar to above '_hr_js_' calls but a named sub-object is always formed
+ * containing a JSON integer object named "i" whose value is 'value'. The
+ * returned pointer is to that sub-object. */
+sgj_opaque_p sgj_hr_js_subo_r(sgj_state * jsp, sgj_opaque_p jop,
+ int leadin_sp, const char * name,
+ enum sgj_separator_t sep, int64_t value);
+
+/* Similar to sgj_hr_js_vs()'s description with 'JSON string object'
* replaced by 'JSON boolean object'. */
-void sgj_pr_hr_js_vb(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep, bool value);
+void sgj_hr_js_vb(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep, bool value);
/* This function only produces JSON output if jsp is non-NULL and
* jsp->pr_as_json is true. It adds a named object at 'jop' (or jop->basep
@@ -243,8 +271,8 @@ void sgj_pr_hr_js_vb(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
* the other one named 'hex' with 'value' rendered as hex in a JSON string.
* If jsp->pr_hex is false then there are no sub-objects and the 'value' is
* rendered as JSON integer. */
-void sgj_add_nv_ihex(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, uint64_t value);
+void sgj_js_nv_ihex(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, uint64_t value);
/* This function only produces JSON output if jsp is non-NULL and
* jsp->pr_as_json is true. It adds a named object at 'jop' (or jop->basep
@@ -254,13 +282,13 @@ void sgj_add_nv_ihex(sgj_state * jsp, sgj_opaque_p jop,
* str_name is NULL then "meaning" will be used. If jsp->pr_string is false
* then there are no sub-objects and the 'val_i' is rendered as a JSON
* integer. */
-void sgj_add_nv_istr(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, int64_t val_i,
- const char * str_name, const char * val_s);
+void sgj_js_nv_istr(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, int64_t val_i,
+ const char * str_name, const char * val_s);
-void sgj_add_nv_ihexstr(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, int64_t val_i,
- const char * str_name, const char * val_s);
+void sgj_js_nv_ihexstr(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, int64_t val_i,
+ const char * str_name, const char * val_s);
/* This function only produces JSON output if jsp is non-NULL and
* jsp->pr_as_json is true. It adds a named object at 'jop' (or jop->basep
@@ -272,34 +300,33 @@ void sgj_add_nv_ihexstr(sgj_state * jsp, sgj_opaque_p jop,
* val_i. If jsp->pr_name_ex is false and either jsp->pr_hex or want_hex are
* false then there are no sub-objects and the 'val_i' is rendered as a JSON
* integer. */
-void sgj_add_nv_ihex_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- int64_t val_i, bool want_hex, const char * nex_s);
+void sgj_js_nv_ihex_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ int64_t val_i, bool want_hex, const char * nex_s);
-void sgj_add_nv_ihexstr_nex(sgj_state * jsp, sgj_opaque_p jop,
- const char * name, int64_t val_i, bool want_hex,
- const char * str_name, const char * val_s,
- const char * nex_s);
+void sgj_js_nv_ihexstr_nex(sgj_state * jsp, sgj_opaque_p jop,
+ const char * name, int64_t val_i, bool want_hex,
+ const char * str_name, const char * val_s,
+ const char * nex_s);
/* Add hex byte strings irrespective of jsp->pr_hex setting. */
-void
-sgj_add_nv_hex_bytes(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- const uint8_t * byte_arr, int num_bytes);
+void sgj_js_nv_hex_bytes(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ const uint8_t * byte_arr, int num_bytes);
/* Breaks up the string pointed to by 'sp' into lines and adds them to the
* jsp->out_hrp array. Treat '\n' in sp as line breaks. Consumes characters
* from sp until either a '\0' is found or slen is exhausted. Add each line
* to jsp->out_hrp JSON array (if conditions met). */
-void sgj_pr_str_out_hr(sgj_state * jsp, const char * sp, int slen);
+void sgj_js_str_out(sgj_state * jsp, const char * sp, int slen);
/* This function only produces JSON output if jsp is non-NULL and
* jsp->pr_as_json is true. 'sbp' is assumed to point to sense data as
* defined by T10 with a length of 'sb_len' bytes. Returns false if an
* issue is detetected, else it returns true. */
-bool sgj_pr_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
- int sb_len);
+bool sgj_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
+ int sb_len);
-bool sgj_pr_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
- const uint8_t * ddp, int dd_len);
+bool sgj_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
+ const uint8_t * ddp, int dd_len);
/* Nothing in the in-core JSON tree is actually printed to 'fp' (typically
* stdout) until this call is made. If jsp is NULL, jsp->pr_as_json is false
@@ -307,12 +334,12 @@ bool sgj_pr_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
* is true then a new JSON object named "exit_status" and the 'exit_status'
* value rendered as a JSON integer is appended to jsp->basep. The in-core
* JSON tree with jsp->basep as its root is streamed to 'fp'. */
-void sgj_pr2file(sgj_state * jsp, sgj_opaque_p jop, int exit_status,
+void sgj_js2file(sgj_state * jsp, sgj_opaque_p jop, int exit_status,
FILE * fp);
/* This function is only needed if the pointer returned from either
- * sgj_new_unattached_object() or sgj_new_unattached_array() has not been
- * attached into the in-core JSON tree whose root is jsp->basep . */
+ * sgj_new_unattached_object_r() or sgj_new_unattached_array_r() has not
+ * been attached into the in-core JSON tree whose root is jsp->basep . */
void sgj_free_unattached(sgj_opaque_p jop);
/* If jsp is NULL or jsp->basep is NULL then this function does nothing.
diff --git a/inhex/README b/inhex/README
index ed2419ce..77557a05 100644
--- a/inhex/README
+++ b/inhex/README
@@ -70,13 +70,19 @@ The second form of sg_decode_sense appends an ASCII rendering of the 16
bytes to the right of each line.
When ASCII hexadecimal is being used as input to a utility in this
-package, the "input offset" at the start of each line must (and the
-optional ASCII rendering to the right of each line, must not be given.
+package, the "input offset" at the start of each line (and the optional
+ASCII rendering to the right of each line) must not be given.
That can be done with hexdump:
hexdump -An -C -v vpd_zbdc.raw
+ ^^^
+That is a syntax error, there is no 'A' option <<<<<<<< check
+
+And the sg_decode_sense utility can do it with (with the --nodecode option):
+ sg_decode_sense -N --binary=vpd_zbdc.raw -HHH
+That will print suitable lines of hexadecimal (16 bytes per line) to the
+console (stdout) To go the other way (i.e. hexadecimal to binary):
+ sg_decode_sense -N --inhex=vpd_zbdc.hex --write=vpd_zbdc.bin
-And the sg_decode_sense utility can do it with:
- sg_decode_sense --binary=vpd_zbdc.raw -HHH
Conclusion
----------
@@ -85,4 +91,4 @@ that support --inhex and don't have hex data already. Special cases are
also welcome. They help the author test this code.
Douglas Gilbert
-21st January 2022
+18th July 2022
diff --git a/lib/sg_pr2serr.c b/lib/sg_pr2serr.c
index 05ea8e31..77ee84b4 100644
--- a/lib/sg_pr2serr.c
+++ b/lib/sg_pr2serr.c
@@ -267,8 +267,8 @@ sgj_init_state(sgj_state * jsp, const char * j_optarg)
}
sgj_opaque_p
-sgj_start(const char * util_name, const char * ver_str, int argc,
- char *argv[], sgj_state * jsp)
+sgj_start_r(const char * util_name, const char * ver_str, int argc,
+ char *argv[], sgj_state * jsp)
{
int k;
json_value * jvp = json_object_new(0);
@@ -336,7 +336,7 @@ sgj_start(const char * util_name, const char * ver_str, int argc,
if (bp) {
sg_json_usage(0, bp, 4096);
- sgj_pr_str_out_hr(jsp, bp, strlen(bp));
+ sgj_js_str_out(jsp, bp, strlen(bp));
free(bp);
}
}
@@ -345,7 +345,7 @@ sgj_start(const char * util_name, const char * ver_str, int argc,
}
void
-sgj_pr2file(sgj_state * jsp, sgj_opaque_p jop, int exit_status, FILE * fp)
+sgj_js2file(sgj_state * jsp, sgj_opaque_p jop, int exit_status, FILE * fp)
{
size_t len;
char * b;
@@ -364,7 +364,7 @@ sgj_pr2file(sgj_state * jsp, sgj_opaque_p jop, int exit_status, FILE * fp)
strncpy(d, "no errors", sizeof(d) - 1);
} else
strncpy(d, "not available", sizeof(d) - 1);
- sgj_add_nv_istr(jsp, jop, "exit_status", exit_status, NULL, d);
+ sgj_js_nv_istr(jsp, jop, "exit_status", exit_status, NULL, d);
}
memcpy(&out_settings, &def_out_settings, sizeof(out_settings));
if (jsp->pr_indent_size != def_out_settings.indent_size)
@@ -448,7 +448,7 @@ sgj_pr_hr(sgj_state * jsp, const char * fmt, ...)
/* jop will 'own' returned value (if non-NULL) */
sgj_opaque_p
-sgj_new_named_object(sgj_state * jsp, sgj_opaque_p jop, const char * name)
+sgj_named_subobject_r(sgj_state * jsp, sgj_opaque_p jop, const char * name)
{
sgj_opaque_p resp = NULL;
@@ -459,8 +459,8 @@ sgj_new_named_object(sgj_state * jsp, sgj_opaque_p jop, const char * name)
}
sgj_opaque_p
-sgj_new_snake_named_object(sgj_state * jsp, sgj_opaque_p jop,
- const char * conv2sname)
+sgj_snake_named_subobject_r(sgj_state * jsp, sgj_opaque_p jop,
+ const char * conv2sname)
{
if (jsp && jsp->pr_as_json && conv2sname) {
int olen = strlen(conv2sname);
@@ -476,7 +476,7 @@ sgj_new_snake_named_object(sgj_state * jsp, sgj_opaque_p jop,
/* jop will 'own' returned value (if non-NULL) */
sgj_opaque_p
-sgj_new_named_array(sgj_state * jsp, sgj_opaque_p jop, const char * name)
+sgj_named_subarray_r(sgj_state * jsp, sgj_opaque_p jop, const char * name)
{
sgj_opaque_p resp = NULL;
@@ -487,8 +487,8 @@ sgj_new_named_array(sgj_state * jsp, sgj_opaque_p jop, const char * name)
}
sgj_opaque_p
-sgj_new_snake_named_array(sgj_state * jsp, sgj_opaque_p jop,
- const char * conv2sname)
+sgj_snake_named_subarray_r(sgj_state * jsp, sgj_opaque_p jop,
+ const char * conv2sname)
{
if (jsp && jsp->pr_as_json && conv2sname) {
int olen = strlen(conv2sname);
@@ -504,21 +504,21 @@ sgj_new_snake_named_array(sgj_state * jsp, sgj_opaque_p jop,
/* Newly created object is un-attached to jsp->basep tree */
sgj_opaque_p
-sgj_new_unattached_object(sgj_state * jsp)
+sgj_new_unattached_object_r(sgj_state * jsp)
{
return (jsp && jsp->pr_as_json) ? json_object_new(0) : NULL;
}
/* Newly created array is un-attached to jsp->basep tree */
sgj_opaque_p
-sgj_new_unattached_array(sgj_state * jsp)
+sgj_new_unattached_array_r(sgj_state * jsp)
{
return (jsp && jsp->pr_as_json) ? json_array_new(0) : NULL;
}
sgj_opaque_p
-sgj_add_nv_s(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- const char * value)
+sgj_js_nv_s(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ const char * value)
{
if (jsp && jsp->pr_as_json && value) {
if (name)
@@ -532,8 +532,8 @@ sgj_add_nv_s(sgj_state * jsp, sgj_opaque_p jop, const char * name,
}
sgj_opaque_p
-sgj_add_nv_s_len(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- const char * value, int slen)
+sgj_js_nv_s_len(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ const char * value, int slen)
{
int k;
@@ -553,8 +553,8 @@ sgj_add_nv_s_len(sgj_state * jsp, sgj_opaque_p jop, const char * name,
}
sgj_opaque_p
-sgj_add_nv_i(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- int64_t value)
+sgj_js_nv_i(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ int64_t value)
{
if (jsp && jsp->pr_as_json) {
if (name)
@@ -569,7 +569,7 @@ sgj_add_nv_i(sgj_state * jsp, sgj_opaque_p jop, const char * name,
}
sgj_opaque_p
-sgj_add_nv_b(sgj_state * jsp, sgj_opaque_p jop, const char * name, bool value)
+sgj_js_nv_b(sgj_state * jsp, sgj_opaque_p jop, const char * name, bool value)
{
if (jsp && jsp->pr_as_json) {
if (name)
@@ -584,8 +584,8 @@ sgj_add_nv_b(sgj_state * jsp, sgj_opaque_p jop, const char * name, bool value)
/* jop will 'own' ua_jop (if returned value is non-NULL) */
sgj_opaque_p
-sgj_add_nv_o(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- sgj_opaque_p ua_jop)
+sgj_js_nv_o(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ sgj_opaque_p ua_jop)
{
if (jsp && jsp->pr_as_json && ua_jop) {
if (name)
@@ -599,70 +599,70 @@ sgj_add_nv_o(sgj_state * jsp, sgj_opaque_p jop, const char * name,
}
void
-sgj_add_nv_ihex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- uint64_t value)
+sgj_js_nv_ihex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ uint64_t value)
{
if ((NULL == jsp) || (NULL == name) || (! jsp->pr_as_json))
return;
else if (jsp->pr_hex) {
- sgj_opaque_p jo2p = sgj_new_named_object(jsp, jop, name);
+ sgj_opaque_p jo2p = sgj_named_subobject_r(jsp, jop, name);
char b[64];
if (NULL == jo2p)
return;
- sgj_add_nv_i(jsp, jo2p, "i", (int64_t)value);
+ sgj_js_nv_i(jsp, jo2p, "i", (int64_t)value);
snprintf(b, sizeof(b), "%" PRIx64, value);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
} else
- sgj_add_nv_i(jsp, jop, name, (int64_t)value);
+ sgj_js_nv_i(jsp, jop, name, (int64_t)value);
}
static const char * sc_mn_s = "meaning";
void
-sgj_add_nv_istr(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- int64_t val_i, const char * str_name, const char * val_s)
+sgj_js_nv_istr(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ int64_t val_i, const char * str_name, const char * val_s)
{
if ((NULL == jsp) || (! jsp->pr_as_json))
return;
else if (jsp->pr_string) {
- sgj_opaque_p jo2p = sgj_new_named_object(jsp, jop, name);
+ sgj_opaque_p jo2p = sgj_named_subobject_r(jsp, jop, name);
if (NULL == jo2p)
return;
- sgj_add_nv_i(jsp, jo2p, "i", (int64_t)val_i);
+ sgj_js_nv_i(jsp, jo2p, "i", (int64_t)val_i);
if (val_s)
- sgj_add_nv_s(jsp, jo2p, str_name ? str_name : sc_mn_s, val_s);
+ sgj_js_nv_s(jsp, jo2p, str_name ? str_name : sc_mn_s, val_s);
} else
- sgj_add_nv_i(jsp, jop, name, val_i);
+ sgj_js_nv_i(jsp, jop, name, val_i);
}
void
-sgj_add_nv_ihexstr(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- int64_t val_i, const char * str_name, const char * val_s)
+sgj_js_nv_ihexstr(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ int64_t val_i, const char * str_name, const char * val_s)
{
if ((NULL == jsp) || (! jsp->pr_as_json))
return;
if ((! jsp->pr_hex) && (! jsp->pr_string))
- sgj_add_nv_i(jsp, jop, name, val_i);
+ sgj_js_nv_i(jsp, jop, name, val_i);
else {
char b[64];
- sgj_opaque_p jo2p = sgj_new_named_object(jsp, jop, name);
+ sgj_opaque_p jo2p = sgj_named_subobject_r(jsp, jop, name);
if (NULL == jo2p)
return;
if (jsp->pr_string) {
- sgj_add_nv_i(jsp, jo2p, "i", (int64_t)val_i);
+ sgj_js_nv_i(jsp, jo2p, "i", (int64_t)val_i);
if (jsp->pr_hex) {
snprintf(b, sizeof(b), "%" PRIx64, val_i);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
}
if (val_s)
- sgj_add_nv_s(jsp, jo2p, str_name ? str_name : sc_mn_s, val_s);
+ sgj_js_nv_s(jsp, jo2p, str_name ? str_name : sc_mn_s, val_s);
} else if (jsp->pr_hex) {
- sgj_add_nv_i(jsp, jo2p, "i", (int64_t)val_i);
+ sgj_js_nv_i(jsp, jo2p, "i", (int64_t)val_i);
snprintf(b, sizeof(b), "%" PRIx64, val_i);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
}
}
}
@@ -670,8 +670,8 @@ sgj_add_nv_ihexstr(sgj_state * jsp, sgj_opaque_p jop, const char * name,
static const char * sc_nex_s = "name_extra";
void
-sgj_add_nv_ihex_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- int64_t val_i, bool want_hex, const char * nex_s)
+sgj_js_nv_ihex_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ int64_t val_i, bool want_hex, const char * nex_s)
{
bool as_hex = jsp->pr_hex && want_hex;
bool as_nex = jsp->pr_name_ex && nex_s;
@@ -679,32 +679,32 @@ sgj_add_nv_ihex_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
if ((NULL == jsp) || (! jsp->pr_as_json))
return;
if (! (as_hex || as_nex))
- sgj_add_nv_i(jsp, jop, name, val_i);
+ sgj_js_nv_i(jsp, jop, name, val_i);
else {
char b[64];
sgj_opaque_p jo2p =
- sgj_new_named_object(jsp, jop, name);
+ sgj_named_subobject_r(jsp, jop, name);
if (NULL == jo2p)
return;
- sgj_add_nv_i(jsp, jo2p, "i", (int64_t)val_i);
+ sgj_js_nv_i(jsp, jo2p, "i", (int64_t)val_i);
if (as_nex) {
if (jsp->pr_hex && want_hex) {
snprintf(b, sizeof(b), "%" PRIx64, val_i);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
}
- sgj_add_nv_s(jsp, jo2p, sc_nex_s, nex_s);
+ sgj_js_nv_s(jsp, jo2p, sc_nex_s, nex_s);
} else if (as_hex) {
snprintf(b, sizeof(b), "%" PRIx64, val_i);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
}
}
}
/* Add hex byte strings irrespective of jsp->pr_hex setting. */
void
-sgj_add_nv_hex_bytes(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- const uint8_t * byte_arr, int num_bytes)
+sgj_js_nv_hex_bytes(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ const uint8_t * byte_arr, int num_bytes)
{
int blen = num_bytes * 4;
char * bp;
@@ -714,15 +714,15 @@ sgj_add_nv_hex_bytes(sgj_state * jsp, sgj_opaque_p jop, const char * name,
bp = (char *)calloc(blen + 4, 1);
if (bp) {
hex2str(byte_arr, num_bytes, NULL, 2, blen, bp);
- sgj_add_nv_s(jsp, jop, name, bp);
+ sgj_js_nv_s(jsp, jop, name, bp);
free(bp);
}
}
void
-sgj_add_nv_ihexstr_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
- int64_t val_i, bool want_hex, const char * str_name,
- const char * val_s, const char * nex_s)
+sgj_js_nv_ihexstr_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
+ int64_t val_i, bool want_hex, const char * str_name,
+ const char * val_s, const char * nex_s)
{
bool as_hex = jsp->pr_hex && want_hex;
bool as_str = jsp->pr_string && val_s;
@@ -732,31 +732,31 @@ sgj_add_nv_ihexstr_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
if ((NULL == jsp) || (! jsp->pr_as_json))
return;
if (! (as_hex || as_nex || as_str))
- sgj_add_nv_i(jsp, jop, name, val_i);
+ sgj_js_nv_i(jsp, jop, name, val_i);
else {
char b[64];
sgj_opaque_p jo2p =
- sgj_new_named_object(jsp, jop, name);
+ sgj_named_subobject_r(jsp, jop, name);
if (NULL == jo2p)
return;
- sgj_add_nv_i(jsp, jo2p, "i", (int64_t)val_i);
+ sgj_js_nv_i(jsp, jo2p, "i", (int64_t)val_i);
if (as_nex) {
if (as_hex) {
snprintf(b, sizeof(b), "%" PRIx64, val_i);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
}
if (as_str) {
- sgj_add_nv_s(jsp, jo2p, sname, val_s);
+ sgj_js_nv_s(jsp, jo2p, sname, val_s);
}
- sgj_add_nv_s(jsp, jo2p, sc_nex_s, nex_s);
+ sgj_js_nv_s(jsp, jo2p, sc_nex_s, nex_s);
} else if (as_hex) {
snprintf(b, sizeof(b), "%" PRIx64, val_i);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
if (as_str)
- sgj_add_nv_s(jsp, jo2p, sname, val_s);
+ sgj_js_nv_s(jsp, jo2p, sname, val_s);
} else if (as_str)
- sgj_add_nv_s(jsp, jo2p, sname, val_s);
+ sgj_js_nv_s(jsp, jo2p, sname, val_s);
}
}
@@ -764,7 +764,7 @@ sgj_add_nv_ihexstr_nex(sgj_state * jsp, sgj_opaque_p jop, const char * name,
* a '\0' is found or slen is exhausted. Add each line to jsp->out_hrp JSON
* array (if conditions met). */
void
-sgj_pr_str_out_hr(sgj_state * jsp, const char * sp, int slen)
+sgj_js_str_out(sgj_state * jsp, const char * sp, int slen)
{
char c;
int k, n;
@@ -781,13 +781,13 @@ sgj_pr_str_out_hr(sgj_state * jsp, const char * sp, int slen)
else if ('\n' == c) {
n = cur_sp - prev_sp;
/* when name is NULL, add to array (jsp->out_hrp) */
- sgj_add_nv_s_len(jsp, jsp->out_hrp, NULL, prev_sp, n);
+ sgj_js_nv_s_len(jsp, jsp->out_hrp, NULL, prev_sp, n);
prev_sp = cur_sp + 1;
}
}
if (prev_sp < cur_sp) {
n = cur_sp - prev_sp;
- sgj_add_nv_s_len(jsp, jsp->out_hrp, NULL, prev_sp, n);
+ sgj_js_nv_s_len(jsp, jsp->out_hrp, NULL, prev_sp, n);
}
}
@@ -874,9 +874,9 @@ sgj_jtype_to_s(char * b, int blen_max, json_value * jvp)
}
static int
-sgj_pr_hr_js_hr(char * b, int blen_max, const char * name,
- enum sgj_separator_t sep, bool use_jvp,
- json_value * jvp, int64_t val_instead)
+sgj_hr_js_helper(char * b, int blen_max, const char * name,
+ enum sgj_separator_t sep, bool use_jvp,
+ json_value * jvp, int64_t val_instead)
{
int n = 0;
@@ -921,9 +921,9 @@ sgj_pr_hr_js_hr(char * b, int blen_max, const char * name,
}
static void
-sgj_pr_hr_js_xx(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep,
- json_value * jvp, const char * nex_s)
+sgj_hr_js_xx(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep,
+ json_value * jvp, bool hex_as_well, const char * nex_s)
{
bool eaten = false;
bool as_json = (jsp && jsp->pr_as_json);
@@ -972,13 +972,13 @@ sgj_pr_hr_js_xx(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
case json_string:
break;
case json_integer:
- sgj_add_nv_ihex_nex(jsp, jop, jname, jvp->u.integer,
- false, nex_s);
+ sgj_js_nv_ihex_nex(jsp, jop, jname, jvp->u.integer,
+ hex_as_well, nex_s);
done = true;
break;
case json_boolean:
- sgj_add_nv_ihex_nex(jsp, jop, jname, jvp->u.boolean,
- false, nex_s);
+ sgj_js_nv_ihex_nex(jsp, jop, jname, jvp->u.boolean,
+ hex_as_well, nex_s);
done = true;
break;
case json_none:
@@ -994,7 +994,7 @@ sgj_pr_hr_js_xx(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
}
}
if (jvp && ((as_json && jsp->pr_out_hr) || (! as_json)))
- n += sgj_pr_hr_js_hr(b + n, blen - n, name, sep, true, jvp, 0);
+ n += sgj_hr_js_helper(b + n, blen - n, name, sep, true, jvp, 0);
if (as_json && jsp->pr_out_hr)
json_array_push((json_value *)jsp->out_hrp, json_string_new(b));
@@ -1006,51 +1006,52 @@ fini:
}
void
-sgj_pr_hr_js_vs(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep,
- const char * value)
+sgj_hr_js_vs(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep,
+ const char * value)
{
json_value * jvp;
/* make json_value even if jsp->pr_as_json is false */
jvp = value ? json_string_new(value) : NULL;
- sgj_pr_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, NULL);
+ sgj_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, false, NULL);
}
void
-sgj_pr_hr_js_vi(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep, int64_t value)
+sgj_hr_js_vi(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep, int64_t value,
+ bool hex_as_well)
{
json_value * jvp;
jvp = json_integer_new(value);
- sgj_pr_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, NULL);
+ sgj_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, hex_as_well, NULL);
}
void
-sgj_pr_hr_js_vi_nex(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+sgj_hr_js_vi_nex(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
const char * name, enum sgj_separator_t sep,
- int64_t value, const char * nex_s)
+ int64_t value, bool hex_as_well, const char * nex_s)
{
json_value * jvp;
jvp = json_integer_new(value);
- sgj_pr_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, nex_s);
+ sgj_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, hex_as_well, nex_s);
}
void
-sgj_pr_hr_js_vb(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+sgj_hr_js_vb(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
const char * name, enum sgj_separator_t sep, bool value)
{
json_value * jvp;
jvp = json_boolean_new(value);
- sgj_pr_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, NULL);
+ sgj_hr_js_xx(jsp, jop, leadin_sp, name, sep, jvp, false, NULL);
}
sgj_opaque_p
-sgj_pr_hr_js_subo(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
- const char * name, enum sgj_separator_t sep, int64_t value)
+sgj_hr_js_subo_r(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
+ const char * name, enum sgj_separator_t sep, int64_t value)
{
bool as_json = (jsp && jsp->pr_as_json);
int n = 0;
@@ -1064,7 +1065,7 @@ sgj_pr_hr_js_subo(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
b[n] = ' ';
b[n] = '\0';
if ((! as_json) || (jsp && jsp->pr_out_hr))
- n += sgj_pr_hr_js_hr(b + n, blen - n, name, sep, false, NULL, value);
+ n += sgj_hr_js_helper(b + n, blen - n, name, sep, false, NULL, value);
if (as_json && jsp->pr_out_hr)
json_array_push((json_value *)jsp->out_hrp, json_string_new(b));
@@ -1073,9 +1074,9 @@ sgj_pr_hr_js_subo(sgj_state * jsp, sgj_opaque_p jop, int leadin_sp,
if (as_json) {
sgj_name_to_snake(name, b, blen);
- jo2p = sgj_new_named_object(jsp, jop, b);
+ jo2p = sgj_named_subobject_r(jsp, jop, b);
if (jo2p)
- sgj_add_nv_i(jsp, jo2p, "i", value);
+ sgj_js_nv_i(jsp, jo2p, "i", value);
return jo2p;
}
return NULL;
@@ -1090,8 +1091,8 @@ static const char * naa_exp = "Network Address Authority";
static const char * aoi_exp = "IEEE-Administered Organizational Identifier";
bool
-sgj_pr_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
- const uint8_t * ddp, int dd_len)
+sgj_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
+ const uint8_t * ddp, int dd_len)
{
int p_id, piv, c_set, assoc, desig_type, d_id, naa;
int n, aoi, vsi, dlen;
@@ -1106,14 +1107,14 @@ sgj_pr_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
static const int elen = sizeof(e);
if (dd_len < 4) {
- sgj_add_nv_s(jsp, jop, ddep, "too short");
+ sgj_js_nv_s(jsp, jop, ddep, "too short");
return false;
}
dlen = ddp[3];
if (dlen > (dd_len - 4)) {
snprintf(e, elen, "too long: says it is %d bytes, but given %d "
"bytes\n", dlen, dd_len - 4);
- sgj_add_nv_s(jsp, jop, ddep, e);
+ sgj_js_nv_s(jsp, jop, ddep, e);
return false;
}
ip = ddp + 4;
@@ -1125,172 +1126,171 @@ sgj_pr_js_designation_descriptor(sgj_state * jsp, sgj_opaque_p jop,
cp = sg_get_desig_assoc_str(assoc);
if (assoc == 3)
cp = "Reserved [0x3]"; /* should not happen */
- sgj_add_nv_ihexstr(jsp, jop, "association", assoc, NULL, cp);
+ sgj_js_nv_ihexstr(jsp, jop, "association", assoc, NULL, cp);
cp = sg_get_desig_type_str(desig_type);
if (NULL == cp)
cp = "unknown";
- sgj_add_nv_ihexstr(jsp, jop, "designator_type", desig_type,
+ sgj_js_nv_ihexstr(jsp, jop, "designator_type", desig_type,
NULL, cp);
cp = sg_get_desig_code_set_str(c_set);
if (NULL == cp)
cp = "unknown";
- sgj_add_nv_ihexstr(jsp, jop, "code_set", desig_type,
- NULL, cp);
- sgj_add_nv_ihex_nex(jsp, jop, "piv", piv, false,
- "Protocol Identifier Valid");
+ sgj_js_nv_ihexstr(jsp, jop, "code_set", desig_type,
+ NULL, cp);
+ sgj_js_nv_ihex_nex(jsp, jop, "piv", piv, false,
+ "Protocol Identifier Valid");
sg_get_trans_proto_str(p_id, elen, e);
- sgj_add_nv_ihexstr(jsp, jop, "protocol_identifier", p_id, NULL, e);
+ sgj_js_nv_ihexstr(jsp, jop, "protocol_identifier", p_id, NULL, e);
switch (desig_type) {
case 0: /* vendor specific */
- sgj_add_nv_hex_bytes(jsp, jop, "vendor_specific_hexbytes", ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop, "vendor_specific_hexbytes", ip, dlen);
break;
case 1: /* T10 vendor identification */
n = (dlen < 8) ? dlen : 8;
snprintf(b, blen, "%.*s", n, ip);
- sgj_add_nv_s(jsp, jop, "t10_vendor_identification", b);
+ sgj_js_nv_s(jsp, jop, "t10_vendor_identification", b);
b[0] = '\0';
if (dlen > 8)
snprintf(b, blen, "%.*s", dlen - 8, ip + 8);
- sgj_add_nv_s(jsp, jop, "vendor_specific_identifier", b);
+ sgj_js_nv_s(jsp, jop, "vendor_specific_identifier", b);
break;
case 2: /* EUI-64 based */
- sgj_add_nv_i(jsp, jop, "eui_64_based_designator_length", dlen);
+ sgj_js_nv_i(jsp, jop, "eui_64_based_designator_length", dlen);
ull = sg_get_unaligned_be64(ip);
switch (dlen) {
case 8:
- sgj_add_nv_ihex(jsp, jop, "ieee_identifier", ull);
+ sgj_js_nv_ihex(jsp, jop, "ieee_identifier", ull);
break;
case 12:
- sgj_add_nv_ihex(jsp, jop, "ieee_identifier", ull);
- sgj_add_nv_ihex(jsp, jop, "directory_id",
+ sgj_js_nv_ihex(jsp, jop, "ieee_identifier", ull);
+ sgj_js_nv_ihex(jsp, jop, "directory_id",
sg_get_unaligned_be32(ip + 8));
break;
case 16:
- sgj_add_nv_ihex(jsp, jop, "identifier_extension", ull);
- sgj_add_nv_ihex(jsp, jop, "ieee_identifier",
+ sgj_js_nv_ihex(jsp, jop, "identifier_extension", ull);
+ sgj_js_nv_ihex(jsp, jop, "ieee_identifier",
sg_get_unaligned_be64(ip + 8));
break;
default:
- sgj_add_nv_s(jsp, jop, "eui_64", "decoding failed");
+ sgj_js_nv_s(jsp, jop, "eui_64", "decoding failed");
break;
}
break;
case 3: /* NAA <n> */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop, "full_naa_hexbytes", ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop, "full_naa_hexbytes", ip, dlen);
naa = (ip[0] >> 4) & 0xff;
switch (naa) {
case 2:
naa_sp = "IEEE Extended";
- sgj_add_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
- naa_exp);
+ sgj_js_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
+ naa_exp);
d_id = (((ip[0] & 0xf) << 8) | ip[1]);
- sgj_add_nv_ihex(jsp, jop, "vendor_specific_identifier_a", d_id);
+ sgj_js_nv_ihex(jsp, jop, "vendor_specific_identifier_a", d_id);
aoi = sg_get_unaligned_be24(ip + 2);
- sgj_add_nv_ihex_nex(jsp, jop, "aoi", aoi, true, aoi_exp);
+ sgj_js_nv_ihex_nex(jsp, jop, "aoi", aoi, true, aoi_exp);
vsi = sg_get_unaligned_be24(ip + 5);
- sgj_add_nv_ihex(jsp, jop, "vendor_specific_identifier_b", vsi);
+ sgj_js_nv_ihex(jsp, jop, "vendor_specific_identifier_b", vsi);
break;
case 3:
naa_sp = "Locally Assigned";
- sgj_add_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
- naa_exp);
+ sgj_js_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
+ naa_exp);
ull = sg_get_unaligned_be64(ip + 0) & 0xfffffffffffffffULL;
- sgj_add_nv_ihex(jsp, jop, "locally_administered_value", ull);
+ sgj_js_nv_ihex(jsp, jop, "locally_administered_value", ull);
break;
case 5:
naa_sp = "IEEE Registered";
- sgj_add_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
- naa_exp);
+ sgj_js_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
+ naa_exp);
aoi = (sg_get_unaligned_be32(ip + 0) >> 4) & 0xffffff;
- sgj_add_nv_ihex_nex(jsp, jop, "aoi", aoi, true, aoi_exp);
+ sgj_js_nv_ihex_nex(jsp, jop, "aoi", aoi, true, aoi_exp);
ull = sg_get_unaligned_be48(ip + 2) & 0xfffffffffULL;
- sgj_add_nv_ihex(jsp, jop, "vendor_specific_identifier", ull);
+ sgj_js_nv_ihex(jsp, jop, "vendor_specific_identifier", ull);
break;
case 6:
naa_sp = "IEEE Registered Extended";
- sgj_add_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
- naa_exp);
+ sgj_js_nv_ihexstr_nex(jsp, jop, "naa", naa, false, NULL, naa_sp,
+ naa_exp);
aoi = (sg_get_unaligned_be32(ip + 0) >> 4) & 0xffffff;
- sgj_add_nv_ihex_nex(jsp, jop, "aoi", aoi, true, aoi_exp);
+ sgj_js_nv_ihex_nex(jsp, jop, "aoi", aoi, true, aoi_exp);
ull = sg_get_unaligned_be48(ip + 2) & 0xfffffffffULL;
- sgj_add_nv_ihex(jsp, jop, "vendor_specific_identifier", ull);
+ sgj_js_nv_ihex(jsp, jop, "vendor_specific_identifier", ull);
ull = sg_get_unaligned_be64(ip + 8);
- sgj_add_nv_ihex(jsp, jop, "vendor_specific_identifier_extension",
- ull);
+ sgj_js_nv_ihex(jsp, jop, "vendor_specific_identifier_extension",
+ ull);
break;
default:
snprintf(b, blen, "unknown NAA value=0x%x", naa);
- sgj_add_nv_ihexstr_nex(jsp, jop, "naa", naa, true, NULL, b,
- naa_exp);
- sgj_add_nv_hex_bytes(jsp, jop, "full_naa_hexbytes", ip, dlen);
+ sgj_js_nv_ihexstr_nex(jsp, jop, "naa", naa, true, NULL, b,
+ naa_exp);
+ sgj_js_nv_hex_bytes(jsp, jop, "full_naa_hexbytes", ip, dlen);
break;
}
break;
case 4: /* Relative target port */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop, "relative_target_port_hexbytes",
- ip, dlen);
- sgj_add_nv_ihex(jsp, jop, "relative_target_port_identifier",
- sg_get_unaligned_be16(ip + 2));
+ sgj_js_nv_hex_bytes(jsp, jop, "relative_target_port_hexbytes",
+ ip, dlen);
+ sgj_js_nv_ihex(jsp, jop, "relative_target_port_identifier",
+ sg_get_unaligned_be16(ip + 2));
break;
case 5: /* (primary) Target port group */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop, "target_port_group_hexbytes",
- ip, dlen);
- sgj_add_nv_ihex(jsp, jop, "target_port_group",
- sg_get_unaligned_be16(ip + 2));
+ sgj_js_nv_hex_bytes(jsp, jop, "target_port_group_hexbytes",
+ ip, dlen);
+ sgj_js_nv_ihex(jsp, jop, "target_port_group",
+ sg_get_unaligned_be16(ip + 2));
break;
case 6: /* Logical unit group */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop, "logical_unit_group_hexbytes",
- ip, dlen);
- sgj_add_nv_ihex(jsp, jop, "logical_unit_group",
- sg_get_unaligned_be16(ip + 2));
+ sgj_js_nv_hex_bytes(jsp, jop, "logical_unit_group_hexbytes",
+ ip, dlen);
+ sgj_js_nv_ihex(jsp, jop, "logical_unit_group",
+ sg_get_unaligned_be16(ip + 2));
break;
case 7: /* MD5 logical unit identifier */
- sgj_add_nv_hex_bytes(jsp, jop, "md5_logical_unit_hexbytes",
- ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop, "md5_logical_unit_hexbytes",
+ ip, dlen);
break;
case 8: /* SCSI name string */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop, "scsi_name_string_hexbytes",
- ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop, "scsi_name_string_hexbytes",
+ ip, dlen);
snprintf(b, blen, "%.*s", dlen, ip);
- sgj_add_nv_s(jsp, jop, "scsi_name_string", b);
+ sgj_js_nv_s(jsp, jop, "scsi_name_string", b);
break;
case 9: /* Protocol specific port identifier */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop,
- "protocol_specific_port_identifier_hexbytes",
- ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop,
+ "protocol_specific_port_identifier_hexbytes",
+ ip, dlen);
if (TPROTO_UAS == p_id) {
- jo2p = sgj_new_named_object(jsp, jop,
+ jo2p = sgj_named_subobject_r(jsp, jop,
"usb_target_port_identifier");
- sgj_add_nv_ihex(jsp, jo2p, "device_address", 0x7f & ip[0]);
- sgj_add_nv_ihex(jsp, jo2p, "interface_number", ip[2]);
+ sgj_js_nv_ihex(jsp, jo2p, "device_address", 0x7f & ip[0]);
+ sgj_js_nv_ihex(jsp, jo2p, "interface_number", ip[2]);
} else if (TPROTO_SOP == p_id) {
- jo2p = sgj_new_named_object(jsp, jop, "pci_express_routing_id");
- sgj_add_nv_ihex(jsp, jo2p, "routing_id",
- sg_get_unaligned_be16(ip + 0));
+ jo2p = sgj_named_subobject_r(jsp, jop, "pci_express_routing_id");
+ sgj_js_nv_ihex(jsp, jo2p, "routing_id",
+ sg_get_unaligned_be16(ip + 0));
} else
- sgj_add_nv_s(jsp, jop, "protocol_specific_port_identifier",
- "decoding failure");
+ sgj_js_nv_s(jsp, jop, "protocol_specific_port_identifier",
+ "decoding failure");
break;
case 0xa: /* UUID identifier */
if (jsp->pr_hex)
- sgj_add_nv_hex_bytes(jsp, jop, "uuid_hexbytes",
- ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop, "uuid_hexbytes", ip, dlen);
sg_t10_uuid_desig2str(ip, dlen, c_set, false, true, NULL, blen, b);
n = strlen(b);
if ((n > 0) && ('\n' == b[n - 1]))
b[n - 1] = '\0';
- sgj_add_nv_s(jsp, jop, "uuid", b);
+ sgj_js_nv_s(jsp, jop, "uuid", b);
break;
default: /* reserved */
- sgj_add_nv_hex_bytes(jsp, jop, "reserved_designator_hexbytes",
- ip, dlen);
+ sgj_js_nv_hex_bytes(jsp, jop, "reserved_designator_hexbytes",
+ ip, dlen);
break;
}
return true;
@@ -1305,20 +1305,20 @@ sgj_progress_indication(sgj_state * jsp, sgj_opaque_p jop,
char b[64];
if (is_another)
- jo2p = sgj_new_named_object(jsp, jop, "another_progress_indication");
+ jo2p = sgj_named_subobject_r(jsp, jop, "another_progress_indication");
else
- jo2p = sgj_new_named_object(jsp, jop, "progress_indication");
+ jo2p = sgj_named_subobject_r(jsp, jop, "progress_indication");
if (NULL == jo2p)
return;
progress = prog_indic;
- sgj_add_nv_i(jsp, jo2p, "i", progress);
+ sgj_js_nv_i(jsp, jo2p, "i", progress);
snprintf(b, sizeof(b), "%x", progress);
- sgj_add_nv_s(jsp, jo2p, "hex", b);
+ sgj_js_nv_s(jsp, jo2p, "hex", b);
progress *= 100;
pr = progress / 65536;
rem = (progress % 65536) / 656;
snprintf(b, sizeof(b), "%d.02%d%%\n", pr, rem);
- sgj_add_nv_s(jsp, jo2p, "percentage", b);
+ sgj_js_nv_s(jsp, jo2p, "percentage", b);
}
static bool
@@ -1328,69 +1328,69 @@ sgj_decode_sks(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * dp, int dlen,
switch (sense_key) {
case SPC_SK_ILLEGAL_REQUEST:
if (dlen < 3) {
- sgj_add_nv_s(jsp, jop, "illegal_request_sks", dtsp);
+ sgj_js_nv_s(jsp, jop, "illegal_request_sks", dtsp);
return false;
}
- sgj_add_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
- sksvp);
- sgj_add_nv_ihex_nex(jsp, jop, "c_d", !! (dp[0] & 0x40), false,
- "c: cdb; d: data-out");
- sgj_add_nv_ihex_nex(jsp, jop, "bpv", !! (dp[0] & 0x8), false,
- "bit pointer (index) valid");
- sgj_add_nv_i(jsp, jop, "bit_pointer", dp[0] & 0x7);
- sgj_add_nv_ihex(jsp, jop, "field_pointer",
- sg_get_unaligned_be16(dp + 1));
+ sgj_js_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
+ sksvp);
+ sgj_js_nv_ihex_nex(jsp, jop, "c_d", !! (dp[0] & 0x40), false,
+ "c: cdb; d: data-out");
+ sgj_js_nv_ihex_nex(jsp, jop, "bpv", !! (dp[0] & 0x8), false,
+ "bit pointer (index) valid");
+ sgj_js_nv_i(jsp, jop, "bit_pointer", dp[0] & 0x7);
+ sgj_js_nv_ihex(jsp, jop, "field_pointer",
+ sg_get_unaligned_be16(dp + 1));
break;
case SPC_SK_HARDWARE_ERROR:
case SPC_SK_MEDIUM_ERROR:
case SPC_SK_RECOVERED_ERROR:
if (dlen < 3) {
- sgj_add_nv_s(jsp, jop, "actual_retry_count_sks", dtsp);
+ sgj_js_nv_s(jsp, jop, "actual_retry_count_sks", dtsp);
return false;
}
- sgj_add_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
- sksvp);
- sgj_add_nv_ihex(jsp, jop, "actual_retry_count",
- sg_get_unaligned_be16(dp + 1));
+ sgj_js_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
+ sksvp);
+ sgj_js_nv_ihex(jsp, jop, "actual_retry_count",
+ sg_get_unaligned_be16(dp + 1));
break;
case SPC_SK_NO_SENSE:
case SPC_SK_NOT_READY:
if (dlen < 7) {
- sgj_add_nv_s(jsp, jop, "progress_indication_sks", dtsp);
+ sgj_js_nv_s(jsp, jop, "progress_indication_sks", dtsp);
return false;
}
- sgj_add_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
- sksvp);
+ sgj_js_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
+ sksvp);
sgj_progress_indication(jsp, jop, sg_get_unaligned_be16(dp + 1),
false);
break;
case SPC_SK_COPY_ABORTED:
if (dlen < 7) {
- sgj_add_nv_s(jsp, jop, "segment_indication_sks", dtsp);
+ sgj_js_nv_s(jsp, jop, "segment_indication_sks", dtsp);
return false;
}
- sgj_add_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
- sksvp);
- sgj_add_nv_ihex_nex(jsp, jop, "sd", !! (dp[0] & 0x20), false,
- "field pointer relative to: 1->segment "
- "descriptor, 0->parameter list");
- sgj_add_nv_ihex_nex(jsp, jop, "bpv", !! (dp[0] & 0x8), false,
- "bit pointer (index) valid");
- sgj_add_nv_i(jsp, jop, "bit_pointer", dp[0] & 0x7);
- sgj_add_nv_ihex(jsp, jop, "field_pointer",
- sg_get_unaligned_be16(dp + 1));
+ sgj_js_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
+ sksvp);
+ sgj_js_nv_ihex_nex(jsp, jop, "sd", !! (dp[0] & 0x20), false,
+ "field pointer relative to: 1->segment "
+ "descriptor, 0->parameter list");
+ sgj_js_nv_ihex_nex(jsp, jop, "bpv", !! (dp[0] & 0x8), false,
+ "bit pointer (index) valid");
+ sgj_js_nv_i(jsp, jop, "bit_pointer", dp[0] & 0x7);
+ sgj_js_nv_ihex(jsp, jop, "field_pointer",
+ sg_get_unaligned_be16(dp + 1));
break;
case SPC_SK_UNIT_ATTENTION:
if (dlen < 7) {
- sgj_add_nv_s(jsp, jop, "segment_indication_sks", dtsp);
+ sgj_js_nv_s(jsp, jop, "segment_indication_sks", dtsp);
return false;
}
- sgj_add_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
- sksvp);
- sgj_add_nv_i(jsp, jop, "overflow", !! (dp[0] & 0x80));
+ sgj_js_nv_ihex_nex(jsp, jop, "sksv", !! (dp[0] & 0x80), false,
+ sksvp);
+ sgj_js_nv_i(jsp, jop, "overflow", !! (dp[0] & 0x80));
break;
default:
- sgj_add_nv_ihex(jsp, jop, "unexpected_sense_key", sense_key);
+ sgj_js_nv_ihex(jsp, jop, "unexpected_sense_key", sense_key);
return false;
}
return true;
@@ -1435,41 +1435,41 @@ sgj_uds_referral_descriptor(sgj_state * jsp, sgj_opaque_p jop,
sgj_opaque_p jap, jo2p, ja2p, jo3p;
char c[40];
- sgj_add_nv_ihex_nex(jsp, jop, "not_all_r", (dp[2] & 0x1), false,
- "Not all referrals");
+ sgj_js_nv_ihex_nex(jsp, jop, "not_all_r", (dp[2] & 0x1), false,
+ "Not all referrals");
dp += 4;
- jap = sgj_new_named_array(jsp, jop,
- "user_data_segment_referral_descriptor_list");
+ jap = sgj_named_subarray_r(jsp, jop,
+ "user_data_segment_referral_descriptor_list");
for (k = 0, f = 1; (k + 4) < dlen; k += g, dp += g, ++f) {
int ntpgd = dp[3];
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
g = (ntpgd * 4) + 20;
- sgj_add_nv_ihex(jsp, jo2p, "number_of_target_port_group_descriptors",
- ntpgd);
+ sgj_js_nv_ihex(jsp, jo2p, "number_of_target_port_group_descriptors",
+ ntpgd);
if ((k + g) > dlen) {
- sgj_add_nv_i(jsp, jo2p, "truncated_descriptor_dlen", dlen);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_i(jsp, jo2p, "truncated_descriptor_dlen", dlen);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
return false;
}
ull = sg_get_unaligned_be64(dp + 4);
- sgj_add_nv_ihex(jsp, jo2p, "first_user_date_sgment_lba", ull);
+ sgj_js_nv_ihex(jsp, jo2p, "first_user_date_sgment_lba", ull);
ull = sg_get_unaligned_be64(dp + 12);
- sgj_add_nv_ihex(jsp, jo2p, "last_user_date_sgment_lba", ull);
- ja2p = sgj_new_named_array(jsp, jo2p,
- "target_port_group_descriptor_list");
+ sgj_js_nv_ihex(jsp, jo2p, "last_user_date_sgment_lba", ull);
+ ja2p = sgj_named_subarray_r(jsp, jo2p,
+ "target_port_group_descriptor_list");
for (j = 0; j < ntpgd; ++j) {
- jo3p = sgj_new_unattached_object(jsp);
+ jo3p = sgj_new_unattached_object_r(jsp);
tp = dp + 20 + (j * 4);
aas = tp[0] & 0xf;
decode_tpgs_state(aas, c, sizeof(c));
- sgj_add_nv_ihexstr(jsp, jo3p, "asymmetric_access_state", aas,
- NULL, c);
- sgj_add_nv_ihex(jsp, jo3p, "target_port_group",
- sg_get_unaligned_be16(tp + 2));
- sgj_add_nv_o(jsp, ja2p, NULL /* name */, jo3p);
+ sgj_js_nv_ihexstr(jsp, jo3p, "asymmetric_access_state", aas,
+ NULL, c);
+ sgj_js_nv_ihex(jsp, jo3p, "target_port_group",
+ sg_get_unaligned_be16(tp + 2));
+ sgj_js_nv_o(jsp, ja2p, NULL /* name */, jo3p);
}
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
return true;
}
@@ -1484,9 +1484,9 @@ static const char * dd_usage_reason_str_arr[] = {
};
static bool
-sgj_pr_js_sense_descriptors(sgj_state * jsp, sgj_opaque_p jop,
- const struct sg_scsi_sense_hdr * sshp,
- const uint8_t * sbp, int sb_len)
+sgj_js_sense_descriptors(sgj_state * jsp, sgj_opaque_p jop,
+ const struct sg_scsi_sense_hdr * sshp,
+ const uint8_t * sbp, int sb_len)
{
bool processed = true;
int add_sb_len, desc_len, k, dt, sense_key, n, sds;
@@ -1506,13 +1506,13 @@ sgj_pr_js_sense_descriptors(sgj_state * jsp, sgj_opaque_p jop,
add_sb_len = sshp->additional_length;
add_sb_len = (add_sb_len < sb_len) ? add_sb_len : sb_len;
sense_key = sshp->sense_key;
- jap = sgj_new_named_array(jsp, jop, "sense_data_descriptor_list");
+ jap = sgj_named_subarray_r(jsp, jop, "sense_data_descriptor_list");
for (descp = sbp, k = 0; (k < add_sb_len);
k += desc_len, descp += desc_len) {
int add_d_len = (k < (add_sb_len - 1)) ? descp[1] : -1;
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
if ((k + add_d_len + 2) > add_sb_len)
add_d_len = add_sb_len - k - 2;
desc_len = add_d_len + 2;
@@ -1520,152 +1520,152 @@ sgj_pr_js_sense_descriptors(sgj_state * jsp, sgj_opaque_p jop,
dt = descp[0];
switch (dt) {
case 0:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt,
- NULL, "Information");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt,
+ NULL, "Information");
if (add_d_len >= 10) {
int valid = !! (0x80 & descp[2]);
- sgj_add_nv_ihexstr(jsp, jo2p, "valid", valid, NULL,
- valid ? "as per T10" : "Vendor specific");
- sgj_add_nv_ihex(jsp, jo2p, "information",
- sg_get_unaligned_be64(descp + 4));
+ sgj_js_nv_ihexstr(jsp, jo2p, "valid", valid, NULL,
+ valid ? "as per T10" : "Vendor specific");
+ sgj_js_nv_ihex(jsp, jo2p, "information",
+ sg_get_unaligned_be64(descp + 4));
} else {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 1:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt,
- NULL, "Command specific");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt,
+ NULL, "Command specific");
if (add_d_len >= 10) {
- sgj_add_nv_ihex(jsp, jo2p, "command_specific_information",
- sg_get_unaligned_be64(descp + 4));
+ sgj_js_nv_ihex(jsp, jo2p, "command_specific_information",
+ sg_get_unaligned_be64(descp + 4));
} else {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 2: /* Sense Key Specific */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Sense key specific");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Sense key specific");
processed = sgj_decode_sks(jsp, jo2p, descp + 4, desc_len - 4,
sense_key);
break;
case 3:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Field replaceable unit code");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Field replaceable unit code");
if (add_d_len >= 2)
- sgj_add_nv_ihex(jsp, jo2p, "field_replaceable_unit_code",
- descp[3]);
+ sgj_js_nv_ihex(jsp, jo2p, "field_replaceable_unit_code",
+ descp[3]);
else {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 4:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Stream commands");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Stream commands");
if (add_d_len >= 2) {
- sgj_add_nv_i(jsp, jo2p, "filemark", !! (descp[3] & 0x80));
- sgj_add_nv_ihex_nex(jsp, jo2p, "eom", !! (descp[3] & 0x40),
- false, "End Of Medium");
- sgj_add_nv_ihex_nex(jsp, jo2p, "ili", !! (descp[3] & 0x20),
- false, "Incorrect Length Indicator");
+ sgj_js_nv_i(jsp, jo2p, "filemark", !! (descp[3] & 0x80));
+ sgj_js_nv_ihex_nex(jsp, jo2p, "eom", !! (descp[3] & 0x40),
+ false, "End Of Medium");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "ili", !! (descp[3] & 0x20),
+ false, "Incorrect Length Indicator");
} else {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 5:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Block commands");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Block commands");
if (add_d_len >= 2)
- sgj_add_nv_ihex_nex(jsp, jo2p, "ili", !! (descp[3] & 0x20),
- false, "Incorrect Length Indicator");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "ili", !! (descp[3] & 0x20),
+ false, "Incorrect Length Indicator");
else {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 6:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "OSD object identification");
- sgj_add_nv_s(jsp, jo2p, parsing, "Unsupported");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "OSD object identification");
+ sgj_js_nv_s(jsp, jo2p, parsing, "Unsupported");
processed = false;
break;
case 7:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "OSD response integrity check value");
- sgj_add_nv_s(jsp, jo2p, parsing, "Unsupported");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "OSD response integrity check value");
+ sgj_js_nv_s(jsp, jo2p, parsing, "Unsupported");
break;
case 8:
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "OSD attribute identification");
- sgj_add_nv_s(jsp, jo2p, parsing, "Unsupported");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "OSD attribute identification");
+ sgj_js_nv_s(jsp, jo2p, parsing, "Unsupported");
processed = false;
break;
case 9: /* this is defined in SAT (SAT-2) */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "ATA status return");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "ATA status return");
if (add_d_len >= 12) {
- sgj_add_nv_i(jsp, jo2p, "extend", !! (descp[2] & 1));
- sgj_add_nv_ihex(jsp, jo2p, "error", descp[3]);
- sgj_add_nv_ihex(jsp, jo2p, "count",
- sg_get_unaligned_be16(descp + 4));
+ sgj_js_nv_i(jsp, jo2p, "extend", !! (descp[2] & 1));
+ sgj_js_nv_ihex(jsp, jo2p, "error", descp[3]);
+ sgj_js_nv_ihex(jsp, jo2p, "count",
+ sg_get_unaligned_be16(descp + 4));
ull = ((uint64_t)descp[10] << 40) |
((uint64_t)descp[8] << 32) |
(descp[6] << 24) |
(descp[11] << 16) |
(descp[9] << 8) |
descp[7];
- sgj_add_nv_ihex(jsp, jo2p, "lba", ull);
- sgj_add_nv_ihex(jsp, jo2p, "device", descp[12]);
- sgj_add_nv_ihex(jsp, jo2p, "status", descp[13]);
+ sgj_js_nv_ihex(jsp, jo2p, "lba", ull);
+ sgj_js_nv_ihex(jsp, jo2p, "device", descp[12]);
+ sgj_js_nv_ihex(jsp, jo2p, "status", descp[13]);
} else {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 0xa:
/* Added in SPC-4 rev 17, became 'Another ...' in rev 34 */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Another progress indication");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Another progress indication");
if (add_d_len < 6) {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
break;
}
- sgj_add_nv_ihex(jsp, jo2p, "another_sense_key", descp[2]);
- sgj_add_nv_ihex(jsp, jo2p, "another_additional_sense_code",
- descp[3]);
- sgj_add_nv_ihex(jsp, jo2p,
- "another_additional_sense_code_qualifier",
- descp[4]);
+ sgj_js_nv_ihex(jsp, jo2p, "another_sense_key", descp[2]);
+ sgj_js_nv_ihex(jsp, jo2p, "another_additional_sense_code",
+ descp[3]);
+ sgj_js_nv_ihex(jsp, jo2p,
+ "another_additional_sense_code_qualifier",
+ descp[4]);
sgj_progress_indication(jsp, jo2p,
sg_get_unaligned_be16(descp + 6), true);
break;
case 0xb: /* Added in SPC-4 rev 23, defined in SBC-3 rev 22 */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "User data segment referral");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "User data segment referral");
if (add_d_len < 2) {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
break;
}
if (! sgj_uds_referral_descriptor(jsp, jo2p, descp, add_d_len)) {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
}
break;
case 0xc: /* Added in SPC-4 rev 28 */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Forwarded sense data");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Forwarded sense data");
if (add_d_len < 2) {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
break;
}
- sgj_add_nv_ihex_nex(jsp, jo2p, "fsdt", !! (0x80 & descp[2]),
- false, "Forwarded Sense Data Truncated");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "fsdt", !! (0x80 & descp[2]),
+ false, "Forwarded Sense Data Truncated");
sds = (0x7 & descp[2]);
if (sds < 1)
snprintf(b, blen, "%s [%d]", "Unknown", sds);
@@ -1678,86 +1678,85 @@ sgj_pr_js_sense_descriptors(sgj_state * jsp, sgj_opaque_p jop,
if (sds > 1)
n += sg_scnpr(b + n, blen - n, " %d", sds - 1);
}
- sgj_add_nv_ihexstr(jsp, jo2p, "sense_data_source",
- (0x7 & descp[2]), NULL, b);
- jo3p = sgj_new_named_object(jsp, jo2p, "forwarded_sense_data");
- sgj_pr_js_sense(jsp, jo3p, descp + 4, desc_len - 4);
+ sgj_js_nv_ihexstr(jsp, jo2p, "sense_data_source",
+ (0x7 & descp[2]), NULL, b);
+ jo3p = sgj_named_subobject_r(jsp, jo2p, "forwarded_sense_data");
+ sgj_js_sense(jsp, jo3p, descp + 4, desc_len - 4);
break;
case 0xd: /* Added in SBC-3 rev 36d */
/* this descriptor combines descriptors 0, 1, 2 and 3 */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Direct-access block device");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Direct-access block device");
if (add_d_len < 28) {
- sgj_add_nv_s(jsp, jo2p, parsing, dtsp);
+ sgj_js_nv_s(jsp, jo2p, parsing, dtsp);
processed = false;
break;
}
- sgj_add_nv_i(jsp, jo2p, "valid", (0x80 & descp[2]));
- sgj_add_nv_ihex_nex(jsp, jo2p, "ili", !! (0x20 & descp[2]),
- false, "Incorrect Length Indicator");
+ sgj_js_nv_i(jsp, jo2p, "valid", (0x80 & descp[2]));
+ sgj_js_nv_ihex_nex(jsp, jo2p, "ili", !! (0x20 & descp[2]),
+ false, "Incorrect Length Indicator");
processed = sgj_decode_sks(jsp, jo2p, descp + 4, desc_len - 4,
sense_key);
- sgj_add_nv_ihex(jsp, jo2p, "field_replaceable_unit_code",
- descp[7]);
- sgj_add_nv_ihex(jsp, jo2p, "information",
- sg_get_unaligned_be64(descp + 8));
- sgj_add_nv_ihex(jsp, jo2p, "command_specific_information",
- sg_get_unaligned_be64(descp + 16));
+ sgj_js_nv_ihex(jsp, jo2p, "field_replaceable_unit_code",
+ descp[7]);
+ sgj_js_nv_ihex(jsp, jo2p, "information",
+ sg_get_unaligned_be64(descp + 8));
+ sgj_js_nv_ihex(jsp, jo2p, "command_specific_information",
+ sg_get_unaligned_be64(descp + 16));
break;
case 0xe: /* Added in SPC-5 rev 6 (for Bind/Unbind) */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Device designation");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Device designation");
n = descp[3];
cp = (n < (int)SG_ARRAY_SIZE(dd_usage_reason_str_arr)) ?
dd_usage_reason_str_arr[n] : "Unknown (reserved)";
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_usage_reason",
- n, NULL, cp);
- jo3p = sgj_new_named_object(jsp, jo2p,
- "device_designation_descriptor");
- sgj_pr_js_designation_descriptor(jsp, jo3p, descp + 4,
- desc_len - 4);
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_usage_reason",
+ n, NULL, cp);
+ jo3p = sgj_named_subobject_r(jsp, jo2p,
+ "device_designation_descriptor");
+ sgj_js_designation_descriptor(jsp, jo3p, descp + 4, desc_len - 4);
break;
case 0xf: /* Added in SPC-5 rev 10 (for Write buffer) */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "Microcode activation");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "Microcode activation");
if (add_d_len < 6) {
- sgj_add_nv_s(jsp, jop, parsing, dtsp);
+ sgj_js_nv_s(jsp, jop, parsing, dtsp);
processed = false;
break;
}
- sgj_add_nv_ihex(jsp, jo2p, "microcode_activation_time",
- sg_get_unaligned_be16(descp + 6));
+ sgj_js_nv_ihex(jsp, jo2p, "microcode_activation_time",
+ sg_get_unaligned_be16(descp + 6));
break;
case 0xde: /* NVME Status Field; vendor (sg3_utils) specific */
- sgj_add_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
- "NVME status (sg3_utils)");
+ sgj_js_nv_ihexstr(jsp, jo2p, "descriptor_type", dt, NULL,
+ "NVME status (sg3_utils)");
if (add_d_len < 6) {
- sgj_add_nv_s(jsp, jop, parsing, dtsp);
+ sgj_js_nv_s(jsp, jop, parsing, dtsp);
processed = false;
break;
}
- sgj_add_nv_ihex_nex(jsp, jo2p, "dnr", !! (0x80 & descp[5]),
- false, "Do not retry");
- sgj_add_nv_ihex_nex(jsp, jo2p, "m", !! (0x40 & descp[5]),
- false, "More");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "dnr", !! (0x80 & descp[5]),
+ false, "Do not retry");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "m", !! (0x40 & descp[5]),
+ false, "More");
sct_sc = sg_get_unaligned_be16(descp + 6);
- sgj_add_nv_ihexstr_nex
+ sgj_js_nv_ihexstr_nex
(jsp, jo2p, "sct_sc", sct_sc, true, NULL,
sg_get_nvme_cmd_status_str(sct_sc, blen, b),
"Status Code Type (upper 8 bits) and Status Code");
break;
default:
if (dt >= 0x80)
- sgj_add_nv_ihex(jsp, jo2p, "vendor_specific_descriptor_type",
- dt);
+ sgj_js_nv_ihex(jsp, jo2p, "vendor_specific_descriptor_type",
+ dt);
else
- sgj_add_nv_ihex(jsp, jo2p, "unknown_descriptor_type", dt);
- sgj_add_nv_hex_bytes(jsp, jo2p, "descriptor_hexbytes",
- descp, desc_len);
+ sgj_js_nv_ihex(jsp, jo2p, "unknown_descriptor_type", dt);
+ sgj_js_nv_hex_bytes(jsp, jo2p, "descriptor_hexbytes",
+ descp, desc_len);
processed = false;
break;
}
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
return processed;
}
@@ -1766,8 +1765,8 @@ sgj_pr_js_sense_descriptors(sgj_state * jsp, sgj_opaque_p jop,
/* Fetch sense information */
bool
-sgj_pr_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
- int sb_len)
+sgj_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
+ int sb_len)
{
bool descriptor_format = false;
bool sdat_ovfl = false;
@@ -1827,21 +1826,20 @@ sgj_pr_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
ebp = ebuff;
break;
}
- sgj_add_nv_ihexstr(jsp, jop, "response_code", resp_code, NULL, ebp);
- sgj_add_nv_b(jsp, jop, "descriptor_format", descriptor_format);
- sgj_add_nv_ihex_nex(jsp, jop, "sdat_ovfl", sdat_ovfl, false,
- "Sense data overflow");
- sgj_add_nv_ihexstr(jsp, jop, "sense_key", ssh.sense_key, NULL,
- sg_lib_sense_key_desc[ssh.sense_key]);
- sgj_add_nv_ihex(jsp, jop, "additional_sense_code", ssh.asc);
- sgj_add_nv_ihex(jsp, jop, "additional_sense_code_qualifier", ssh.ascq);
- sgj_add_nv_s(jsp, jop, "additional_sense_str",
- sg_get_additional_sense_str(ssh.asc, ssh.ascq, false,
+ sgj_js_nv_ihexstr(jsp, jop, "response_code", resp_code, NULL, ebp);
+ sgj_js_nv_b(jsp, jop, "descriptor_format", descriptor_format);
+ sgj_js_nv_ihex_nex(jsp, jop, "sdat_ovfl", sdat_ovfl, false,
+ "Sense data overflow");
+ sgj_js_nv_ihexstr(jsp, jop, "sense_key", ssh.sense_key, NULL,
+ sg_lib_sense_key_desc[ssh.sense_key]);
+ sgj_js_nv_ihex(jsp, jop, "additional_sense_code", ssh.asc);
+ sgj_js_nv_ihex(jsp, jop, "additional_sense_code_qualifier", ssh.ascq);
+ sgj_js_nv_s(jsp, jop, "additional_sense_str",
+ sg_get_additional_sense_str(ssh.asc, ssh.ascq, false,
blen, b));
if (descriptor_format) {
if (len > 8) {
- ret = sgj_pr_js_sense_descriptors(jsp, jop, &ssh, sbp + 8,
- len - 8);
+ ret = sgj_js_sense_descriptors(jsp, jop, &ssh, sbp + 8, len - 8);
if (ret == false) {
ebp = "unable to decode sense descriptor";
goto fini;
@@ -1850,36 +1848,36 @@ sgj_pr_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
} else if ((len > 12) && (0 == ssh.asc) &&
(ASCQ_ATA_PT_INFO_AVAILABLE == ssh.ascq)) {
/* SAT ATA PASS-THROUGH fixed format */
- sgj_add_nv_ihex(jsp, jop, "error", sbp[3]);
- sgj_add_nv_ihex(jsp, jop, "status", sbp[4]);
- sgj_add_nv_ihex(jsp, jop, "device", sbp[5]);
- sgj_add_nv_i(jsp, jop, "extend", !! (0x80 & sbp[8]));
- sgj_add_nv_i(jsp, jop, "count_upper_nonzero", !! (0x40 & sbp[8]));
- sgj_add_nv_i(jsp, jop, "lba_upper_nonzero", !! (0x20 & sbp[8]));
- sgj_add_nv_i(jsp, jop, "log_index", (0x7 & sbp[8]));
- sgj_add_nv_i(jsp, jop, "lba", sg_get_unaligned_le24(sbp + 9));
+ sgj_js_nv_ihex(jsp, jop, "error", sbp[3]);
+ sgj_js_nv_ihex(jsp, jop, "status", sbp[4]);
+ sgj_js_nv_ihex(jsp, jop, "device", sbp[5]);
+ sgj_js_nv_i(jsp, jop, "extend", !! (0x80 & sbp[8]));
+ sgj_js_nv_i(jsp, jop, "count_upper_nonzero", !! (0x40 & sbp[8]));
+ sgj_js_nv_i(jsp, jop, "lba_upper_nonzero", !! (0x20 & sbp[8]));
+ sgj_js_nv_i(jsp, jop, "log_index", (0x7 & sbp[8]));
+ sgj_js_nv_i(jsp, jop, "lba", sg_get_unaligned_le24(sbp + 9));
} else if (len > 2) { /* fixed format */
- sgj_add_nv_i(jsp, jop, "valid", valid_info_fld);
- sgj_add_nv_i(jsp, jop, "filemark", !! (sbp[2] & 0x80));
- sgj_add_nv_ihex_nex(jsp, jop, "eom", !! (sbp[2] & 0x40),
- false, "End Of Medium");
- sgj_add_nv_ihex_nex(jsp, jop, "ili", !! (sbp[2] & 0x20),
- false, "Incorrect Length Indicator");
+ sgj_js_nv_i(jsp, jop, "valid", valid_info_fld);
+ sgj_js_nv_i(jsp, jop, "filemark", !! (sbp[2] & 0x80));
+ sgj_js_nv_ihex_nex(jsp, jop, "eom", !! (sbp[2] & 0x40),
+ false, "End Of Medium");
+ sgj_js_nv_ihex_nex(jsp, jop, "ili", !! (sbp[2] & 0x20),
+ false, "Incorrect Length Indicator");
info = sg_get_unaligned_be32(sbp + 3);
- sgj_add_nv_ihex(jsp, jop, "information", info);
- sgj_add_nv_ihex(jsp, jop, "additional_sense_length", sbp[7]);
+ sgj_js_nv_ihex(jsp, jop, "information", info);
+ sgj_js_nv_ihex(jsp, jop, "additional_sense_length", sbp[7]);
if (sb_len > 11) {
info = sg_get_unaligned_be32(sbp + 8);
- sgj_add_nv_ihex(jsp, jop, "command_specific_information", info);
+ sgj_js_nv_ihex(jsp, jop, "command_specific_information", info);
}
if (sb_len > 14)
- sgj_add_nv_ihex(jsp, jop, "field_replaceable_unit_code", sbp[14]);
+ sgj_js_nv_ihex(jsp, jop, "field_replaceable_unit_code", sbp[14]);
if (sb_len > 17)
sgj_decode_sks(jsp, jop, sbp + 15, sb_len - 15, ssh.sense_key);
n = sbp[7];
n = (sb_len > n) ? n : sb_len;
- sgj_add_nv_ihex(jsp, jop, "number_of_bytes_beyond_18",
- (n > 18) ? n - 18 : 0);
+ sgj_js_nv_ihex(jsp, jop, "number_of_bytes_beyond_18",
+ (n > 18) ? n - 18 : 0);
} else {
snprintf(ebuff, sizeof(ebuff), "sb_len=%d too short", sb_len);
ebp = ebuff;
@@ -1887,7 +1885,7 @@ sgj_pr_js_sense(sgj_state * jsp, sgj_opaque_p jop, const uint8_t * sbp,
}
fini:
if ((! ret) && ebp)
- sgj_add_nv_s(jsp, jop, "sense_decode_error", ebp);
+ sgj_js_nv_s(jsp, jop, "sense_decode_error", ebp);
return ret;
}
diff --git a/src/sg_decode_sense.c b/src/sg_decode_sense.c
index 8950cdbd..63e2ab26 100644
--- a/src/sg_decode_sense.c
+++ b/src/sg_decode_sense.c
@@ -30,7 +30,7 @@
#include "sg_unaligned.h"
-static const char * version_str = "1.29 20220711";
+static const char * version_str = "1.30 20220717";
#define MY_NAME "sg_decode_sense"
@@ -118,7 +118,7 @@ usage()
" --inhex=HFN|-i HFN same as action as --file=HFN\n"
" --json[=JO]|-j[JO] output in JSON instead of human "
"readable text.\n"
- " Use --json=? for JSON help\n"
+ " Use --json=? for JSON help\n"
" --nodecode|-N do not decode, may be neither sense "
"nor cdb\n"
" --nospace|-n no spaces or other separators between "
@@ -372,7 +372,7 @@ main(int argc, char *argv[])
as_json = op->json_st.pr_as_json;
jsp = &op->json_st;
if (as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
if (op->err_given) {
char d[128];
@@ -504,11 +504,11 @@ main(int argc, char *argv[])
printf("%s\n", b);
} else {
if (as_json) {
- sgj_pr_js_sense(jsp, jop, op->sense, op->sense_len);
+ sgj_js_sense(jsp, jop, op->sense, op->sense_len);
if (jsp->pr_out_hr) {
sg_get_sense_str(NULL, op->sense, op->sense_len,
op->verbose, blen, b);
- sgj_pr_str_out_hr(jsp, b, strlen(b));
+ sgj_js_str_out(jsp, b, strlen(b));
}
} else {
sg_get_sense_str(NULL, op->sense, op->sense_len,
@@ -519,34 +519,8 @@ main(int argc, char *argv[])
}
fini:
if (as_json) {
-
-#if 0
-// <<<< testing
-{
- sgj_opaque_p jo2p;
-
-// uint8_t dd[] = {0x1, 0x0, 0x0, 0x6, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
-
-// uint8_t dd[] = {0x01, 0x00, 0x00, 0x16, 0x11, 0x22, 0x33, 0x44 , 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc,
-// 0xdd, 0xee, 0xff, 0xed, 0xcb, 0xa9, 0x87, 0x65 , 0x43, 0x21};
-
-// uint8_t dd[] = {0x2, 0x1, 0x0, 0x14,
-// 0x41, 0x42, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20,
-// 0x58, 0x59, 0x5a, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
-
-// uint8_t dd[] = {0x01, 0x03, 0x00, 0x08, 0x51, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
-// uint8_t dd[] = {0x01, 0x03, 0x00, 0x10, 0x61, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xee, 0xdd};
-
-uint8_t dd[] = {0x01, 0x14, 0x00, 0x04, 0x0, 0x0, 0x0, 0x2, };
-
-jo2p = sgj_new_named_object(jsp, jop, "designation_descriptor");
-sgj_get_designation_descriptor(jsp, jo2p, dd, sizeof(dd));
-}
-// <<<< end of testing
-#endif
-
if (0 == op->hex_count)
- sgj_pr2file(&op->json_st, NULL, ret, stdout);
+ sgj_js2file(&op->json_st, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;
diff --git a/src/sg_get_elem_status.c b/src/sg_get_elem_status.c
index 4501a935..f7f06a1f 100644
--- a/src/sg_get_elem_status.c
+++ b/src/sg_get_elem_status.c
@@ -37,7 +37,7 @@
* given SCSI device.
*/
-static const char * version_str = "1.12 20220626"; /* sbc5r01 */
+static const char * version_str = "1.13 20220717"; /* sbc5r02 */
#define MY_NAME "sg_get_elem_status"
@@ -435,7 +435,7 @@ main(int argc, char * argv[])
return 0;
}
if (jsp->pr_as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
if (maxlen > DEF_GPES_BUFF_LEN) {
gpesBuffp = (uint8_t *)sg_memalign(maxlen, 0, &free_gpesBuffp,
@@ -556,12 +556,12 @@ start_response:
goto fini;
}
- sgj_pr_hr_js_vi(jsp, jop, 0, "Number of descriptors",
- SGJ_SEP_COLON_1_SPACE, num_desc);
- sgj_pr_hr_js_vi(jsp, jop, 0, "Number of descriptors returned",
- SGJ_SEP_COLON_1_SPACE, num_desc_ret);
- sgj_pr_hr_js_vi(jsp, jop, 0, "Identifier of element being depopulated",
- SGJ_SEP_COLON_1_SPACE, id_elem_depop);
+ sgj_hr_js_vi(jsp, jop, 0, "Number of descriptors",
+ SGJ_SEP_COLON_1_SPACE, num_desc, true);
+ sgj_hr_js_vi(jsp, jop, 0, "Number of descriptors returned",
+ SGJ_SEP_COLON_1_SPACE, num_desc_ret, true);
+ sgj_hr_js_vi(jsp, jop, 0, "Identifier of element being depopulated",
+ SGJ_SEP_COLON_1_SPACE, id_elem_depop, true);
if (rlen < 64) {
sgj_pr_hr(jsp, "No complete physical element status descriptors "
"available\n");
@@ -573,27 +573,26 @@ start_response:
}
if (jsp->pr_as_json)
- jap = sgj_new_named_array(jsp, jop,
- "physical_element_status_descriptor");
+ jap = sgj_named_subarray_r(jsp, jop,
+ "physical_element_status_descriptor");
for (bp = gpesBuffp + GPES_DESC_OFFSET, k = 0; k < (int)num_desc_ret;
bp += GPES_DESC_LEN, ++k) {
if ((0 == k) && (do_brief < 2))
sgj_pr_hr(jsp, "Element descriptors:\n");
decode_elem_status_desc(bp, &a_ped);
if (jsp->pr_as_json) {
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_ihex(jsp, jo2p, "element_identifier",
- (int64_t)a_ped.elem_id);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_ihex(jsp, jo2p, "element_identifier",
+ (int64_t)a_ped.elem_id);
cp = (1 == a_ped.phys_elem_type) ? "storage" : "reserved";
- sgj_add_nv_istr(jsp, jo2p, "physical_element_type",
- a_ped.phys_elem_type, "meaning", cp);
+ sgj_js_nv_istr(jsp, jo2p, "physical_element_type",
+ a_ped.phys_elem_type, "meaning", cp);
j = a_ped.phys_elem_health;
fetch_health_str(j, b, blen);
- sgj_add_nv_istr(jsp, jo2p, "physical_element_health", j,
- "meaning", b);
- sgj_add_nv_ihex(jsp, jo2p, "associated_capacity",
- (int64_t)a_ped.assoc_cap);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_istr(jsp, jo2p, "physical_element_health", j, NULL, b);
+ sgj_js_nv_ihex(jsp, jo2p, "associated_capacity",
+ (int64_t)a_ped.assoc_cap);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
} else if (do_brief) {
sgj_pr_hr(jsp, "%u: %u,%u\n", a_ped.elem_id, a_ped.phys_elem_type,
a_ped.phys_elem_health);
@@ -655,7 +654,7 @@ fini:
ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
if (jsp->pr_as_json) {
if (0 == do_hex)
- sgj_pr2file(jsp, NULL, ret, stdout);
+ sgj_js2file(jsp, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;
diff --git a/src/sg_get_lba_status.c b/src/sg_get_lba_status.c
index d85c5231..4ed45c81 100644
--- a/src/sg_get_lba_status.c
+++ b/src/sg_get_lba_status.c
@@ -35,7 +35,7 @@
* device.
*/
-static const char * version_str = "1.28 20220626"; /* sbc5r01 */
+static const char * version_str = "1.29 20220717"; /* sbc5r01 */
#define MY_NAME "sg_get_lba_status"
@@ -198,7 +198,7 @@ get_prov_status_str(int ps, char * b, int blen)
}
static char *
-get_add_status_str(int as, char * b, int blen)
+get_pr_status_str(int as, char * b, int blen)
{
switch (as) {
case 0:
@@ -402,7 +402,7 @@ main(int argc, char * argv[])
return 0;
}
if (jsp->pr_as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
if (maxlen > DEF_GLBAS_BUFF_LEN) {
glbasBuffp = (uint8_t *)sg_memalign(maxlen, 0, &free_glbasBuffp,
@@ -550,8 +550,8 @@ start_response:
sgj_pr_hr(jsp,"p_status: %d add_status: 0x%x\n", res,
(unsigned int)add_status);
if (jsp->pr_as_json) {
- sgj_add_nv_i(jsp, jop, prov_stat_s, res);
- sgj_add_nv_i(jsp, jop, add_stat_s, add_status);
+ sgj_js_nv_i(jsp, jop, prov_stat_s, res);
+ sgj_js_nv_i(jsp, jop, add_stat_s, add_status);
}
goto fini;
}
@@ -563,8 +563,8 @@ start_response:
num_descs = (rlen - 8) / 16;
completion_cond = (*(glbasBuffp + 7) >> 1) & 7; /* added sbc4r14 */
if (do_brief)
- sgj_pr_hr_js_vi(jsp, jop, 0, compl_cond_s,
- SGJ_SEP_EQUAL_NO_SPACE, completion_cond);
+ sgj_hr_js_vi(jsp, jop, 0, compl_cond_s, SGJ_SEP_EQUAL_NO_SPACE,
+ completion_cond, true);
else {
switch (completion_cond) {
case 0:
@@ -587,15 +587,15 @@ start_response:
break;
}
sgj_pr_hr(jsp, "%s\n", b);
- sgj_add_nv_istr(jsp, jop, compl_cond_s, completion_cond,
- NULL /* "meaning" */, b);
+ sgj_js_nv_istr(jsp, jop, compl_cond_s, completion_cond,
+ NULL /* "meaning" */, b);
}
- sgj_pr_hr_js_vi(jsp, jop, 0, "RTP", SGJ_SEP_EQUAL_NO_SPACE,
- *(glbasBuffp + 7) & 0x1); /* added sbc4r12 */
+ sgj_hr_js_vi(jsp, jop, 0, "RTP", SGJ_SEP_EQUAL_NO_SPACE,
+ *(glbasBuffp + 7) & 0x1, true); /* added sbc4r12 */
if (verbose)
pr2serr("%d complete LBA status descriptors found\n", num_descs);
if (jsp->pr_as_json)
- jap = sgj_new_named_array(jsp, jop, "lba_status_descriptor");
+ jap = sgj_named_subarray_r(jsp, jop, "lba_status_descriptor");
for (bp = glbasBuffp + 8, k = 0; k < num_descs; bp += 16, ++k) {
res = decode_lba_status_desc(bp, &d_lba, &d_blocks, &add_status);
@@ -603,7 +603,7 @@ start_response:
pr2serr("descriptor %d: bad LBA status descriptor returned "
"%d\n", k + 1, res);
if (jsp->pr_as_json)
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
if (do_brief) {
n = 0;
n += sg_scnpr(b + n, blen - n, "0x");
@@ -616,18 +616,18 @@ start_response:
n += sg_scnpr(b + n, blen - n, " %u %d %d",
(unsigned int)d_blocks, res, add_status);
sgj_pr_hr(jsp, "%s\n", b);
- sgj_add_nv_ihex(jsp, jo2p, "lba", d_lba);
- sgj_add_nv_ihex(jsp, jo2p, "blocks", d_blocks);
- sgj_add_nv_i(jsp, jo2p, prov_stat_s, res);
- sgj_add_nv_i(jsp, jo2p, add_stat_s, add_status);
+ sgj_js_nv_ihex(jsp, jo2p, "lba", d_lba);
+ sgj_js_nv_ihex(jsp, jo2p, "blocks", d_blocks);
+ sgj_js_nv_i(jsp, jo2p, prov_stat_s, res);
+ sgj_js_nv_i(jsp, jo2p, add_stat_s, add_status);
} else {
if (jsp->pr_as_json) {
- sgj_add_nv_ihex(jsp, jo2p, "lba", d_lba);
- sgj_add_nv_ihex(jsp, jo2p, "blocks", d_blocks);
- sgj_add_nv_istr(jsp, jo2p, prov_stat_s, res, NULL,
- get_prov_status_str(res, b, blen));
- sgj_add_nv_istr(jsp, jo2p, add_stat_s, add_status, NULL,
- get_add_status_str(add_status, b, blen));
+ sgj_js_nv_ihex(jsp, jo2p, "lba", d_lba);
+ sgj_js_nv_ihex(jsp, jo2p, "blocks", d_blocks);
+ sgj_js_nv_istr(jsp, jo2p, prov_stat_s, res, NULL,
+ get_prov_status_str(res, b, blen));
+ sgj_js_nv_istr(jsp, jo2p, add_stat_s, add_status, NULL,
+ get_pr_status_str(add_status, b, blen));
} else {
char c[64];
@@ -644,14 +644,14 @@ start_response:
(unsigned int)d_blocks);
get_prov_status_str(res, c, sizeof(c));
n += sg_scnpr(b + n, blen - n, " %s", c);
- get_add_status_str(add_status, c, sizeof(c));
+ get_pr_status_str(add_status, c, sizeof(c));
if (strlen(c) > 0)
n += sg_scnpr(b + n, blen - n, " [%s]", c);
sgj_pr_hr(jsp, "%s\n", b);
}
}
if (jsp->pr_as_json)
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
if ((num_descs * 16) + 8 < rlen)
pr2serr("incomplete trailing LBA status descriptors found\n");
@@ -688,7 +688,7 @@ fini:
ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
if (jsp->pr_as_json) {
if (0 == do_hex)
- sgj_pr2file(jsp, NULL, ret, stdout);
+ sgj_js2file(jsp, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 98f505d6..cf7c4064 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -53,7 +53,7 @@
#include "sg_vpd_common.h" /* for shared VPD page processing with sg_vpd */
-static const char * version_str = "2.21 20220714"; /* spc6r06 */
+static const char * version_str = "2.22 20220718"; /* spc6r06 */
#define MY_NAME "sg_inq"
@@ -128,14 +128,15 @@ static void decode_dev_ids(const char * leadin, uint8_t * buff, int len,
static int vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
int off);
-// Testing <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-#undef SG_SCSI_STRINGS
+// Test define that will only work for Linux
+// #define HDIO_GET_IDENTITY 1
#if defined(SG_LIB_LINUX) && defined(SG_SCSI_STRINGS) && \
defined(HDIO_GET_IDENTITY)
+#include <sys/ioctl.h>
+
static int try_ata_identify(int ata_fd, int do_hex, int do_raw,
int verbose);
-struct opts_t;
static void prepare_ata_identify(const struct opts_t * op, int inhex_len);
#endif
@@ -1102,12 +1103,12 @@ decode_supported_vpd(uint8_t * buff, int len, struct opts_t * op,
snprintf(b, sizeof(b), "0x%x", vpd);
vnp = get_vpd_page_info(vpd, pdt);
if (jsp->pr_as_json && jap) {
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_i(jsp, jo2p, "i", vpd);
- sgj_add_nv_s(jsp, jo2p, "hex", b + 2);
- sgj_add_nv_s(jsp, jo2p, "name", vnp ? vnp->name : "unknown");
- sgj_add_nv_s(jsp, jo2p, "acronym", vnp ? vnp->acron : "unknown");
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_i(jsp, jo2p, "i", vpd);
+ sgj_js_nv_s(jsp, jo2p, "hex", b + 2);
+ sgj_js_nv_s(jsp, jo2p, "name", vnp ? vnp->name : "unknown");
+ sgj_js_nv_s(jsp, jo2p, "acronym", vnp ? vnp->acron : "unknown");
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
if (vnp)
sgj_pr_hr(jsp, " %s\t%s\n", b, vnp->name);
@@ -1216,16 +1217,16 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
len -= 4;
bp = buff + 4;
for (k = 0; k < len; k += bump, bp += bump) {
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
rel_port = sg_get_unaligned_be16(bp + 2);
sgj_pr_hr(jsp, "Relative port=%d\n", rel_port);
- sgj_add_nv_i(jsp, jo2p, "relative_port", rel_port);
+ sgj_js_nv_i(jsp, jo2p, "relative_port", rel_port);
ip_tid_len = sg_get_unaligned_be16(bp + 6);
bump = 8 + ip_tid_len;
if ((k + bump) > len) {
pr2serr("SCSI Ports VPD page, short descriptor "
"length=%d, left=%d\n", bump, (len - k));
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
return;
}
if (ip_tid_len > 0) {
@@ -1239,7 +1240,7 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
sg_decode_transportid_str(" ", bp + 8, ip_tid_len,
true, sizeof(b), b);
if (jsp->pr_as_json)
- sgj_add_nv_s(jsp, jo2p, "initiator_port_transport_id", b);
+ sgj_js_nv_s(jsp, jo2p, "initiator_port_transport_id", b);
sgj_pr_hr(jsp, "%s",
sg_decode_transportid_str(" ", bp + 8,
ip_tid_len, true, sizeof(b), b));
@@ -1249,7 +1250,7 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
if ((k + bump + tpd_len + 4) > len) {
pr2serr("SCSI Ports VPD page, short descriptor(tgt) "
"length=%d, left=%d\n", bump, (len - k));
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
return;
}
if (tpd_len > 0) {
@@ -1258,7 +1259,7 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
hex2stdout(bp + bump + 4, tpd_len,
(1 == op->do_hex) ? 1 : -1);
else {
- sgj_opaque_p ja2p = sgj_new_named_array(jsp, jo2p,
+ sgj_opaque_p ja2p = sgj_named_subarray_r(jsp, jo2p,
"target_port_descriptor_list");
decode_dev_ids("SCSI Ports", bp + bump + 4, tpd_len,
@@ -1266,7 +1267,7 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
}
}
bump += tpd_len + 4;
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
}
@@ -1563,7 +1564,7 @@ decode_dev_ids(const char * leadin, uint8_t * buff, int len,
}
sgj_pr_hr(jsp, " MD5 logical unit identifier:\n");
if (jsp->pr_out_hr)
- sgj_pr_str_out_hr(jsp, (const char *)ip, i_len);
+ sgj_js_str_out(jsp, (const char *)ip, i_len);
else
hex2stdout(ip, i_len, -1);
break;
@@ -1944,9 +1945,6 @@ static void
decode_b0_vpd(uint8_t * buff, int len, int do_hex)
{
int pdt;
- unsigned int u;
- uint64_t ull;
- bool ugavalid;
if (do_hex) {
hex2stdout(buff, len, (1 == do_hex) ? 0 : -1);
@@ -1955,118 +1953,7 @@ decode_b0_vpd(uint8_t * buff, int len, int do_hex)
pdt = PDT_MASK & buff[0];
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
- if (len < 16) {
- pr2serr("Block limits VPD page length too short=%d\n", len);
- return;
- }
- u = buff[5];
- printf(" Maximum compare and write length: ");
- if (0 == u)
- printf("0 blocks [Command not implemented]\n");
- else
- printf("%u blocks\n", buff[5]);
- u = sg_get_unaligned_be16(buff + 6);
- printf(" Optimal transfer length granularity: ");
- if (0 == u)
- printf("0 blocks [not reported]\n");
- else
- printf("%u blocks\n", u);
- u = sg_get_unaligned_be32(buff + 8);
- printf(" Maximum transfer length: ");
- if (0 == u)
- printf("0 blocks [not reported]\n");
- else
- printf("%u blocks\n", u);
- u = sg_get_unaligned_be32(buff + 12);
- printf(" Optimal transfer length: ");
- if (0 == u)
- printf("0 blocks [not reported]\n");
- else
- printf("%u blocks\n", u);
- if (len > 19) { /* added in sbc3r09 */
- u = sg_get_unaligned_be32(buff + 16);
- printf(" Maximum prefetch transfer length: ");
- if (0 == u)
- printf("0 blocks [ignored]\n");
- else
- printf("%u blocks\n", u);
- }
- if (len > 27) { /* added in sbc3r18 */
- u = sg_get_unaligned_be32(buff + 20);
- printf(" Maximum unmap LBA count: ");
- if (0 == u)
- printf("0 [Unmap command not implemented]\n");
- else if (SG_LIB_UNBOUNDED_32BIT == u)
- printf("-1 [unbounded]\n");
- else
- printf("%u\n", u);
- u = sg_get_unaligned_be32(buff + 24);
- printf(" Maximum unmap block descriptor count: ");
- if (0 == u)
- printf("0 [Unmap command not implemented]\n");
- else if (SG_LIB_UNBOUNDED_32BIT == u)
- printf("-1 [unbounded]\n");
- else
- printf("%u\n", u);
- }
- if (len > 35) { /* added in sbc3r19 */
- u = sg_get_unaligned_be32(buff + 28);
- printf(" Optimal unmap granularity: ");
- if (0 == u)
- printf("0 blocks [not reported]\n");
- else
- printf("%u blocks\n", u);
-
- ugavalid = !!(buff[32] & 0x80);
- printf(" Unmap granularity alignment valid: %s\n",
- ugavalid ? "true" : "false");
- u = 0x7fffffff & sg_get_unaligned_be32(buff + 32);
- printf(" Unmap granularity alignment: %u%s\n", u,
- ugavalid ? "" : " [invalid]");
- }
- if (len > 43) { /* added in sbc3r26 */
- ull = sg_get_unaligned_be64(buff + 36);
- printf(" Maximum write same length: ");
- if (0 == ull)
- printf("0 blocks [not reported]\n");
- else
- printf("0x%" PRIx64 " blocks\n", ull);
- }
- if (len > 44) { /* added in sbc4r02 */
- u = sg_get_unaligned_be32(buff + 44);
- printf(" Maximum atomic transfer length: ");
- if (0 == u)
- printf("0 blocks [not reported]\n");
- else
- printf("%u blocks\n", u);
- u = sg_get_unaligned_be32(buff + 48);
- printf(" Atomic alignment: ");
- if (0 == u)
- printf("0 [unaligned atomic writes permitted]\n");
- else
- printf("%u\n", u);
- u = sg_get_unaligned_be32(buff + 52);
- printf(" Atomic transfer length granularity: ");
- if (0 == u)
- printf("0 [no granularity requirement\n");
- else
- printf("%u\n", u);
- }
- if (len > 56) {
- u = sg_get_unaligned_be32(buff + 56);
- printf(" Maximum atomic transfer length with atomic "
- "boundary: ");
- if (0 == u)
- printf("0 blocks [not reported]\n");
- else
- printf("%u blocks\n", u);
- u = sg_get_unaligned_be32(buff + 60);
- printf(" Maximum atomic boundary size: ");
- if (0 == u)
- printf("0 blocks [can only write atomic 1 block]\n");
- else
- printf("%u blocks\n", u);
- }
+ /* done by decode_block_limits_vpd() */
break;
case PDT_TAPE: case PDT_MCHANGER:
printf(" WORM=%d\n", !!(buff[4] & 0x1));
@@ -2727,7 +2614,7 @@ std_inq_decode(struct opts_t * op, sgj_opaque_p jop, int off)
if ((0 == op->maxlen) && usn_buff[0])
sgj_pr_hr(jsp, " Unit serial number: %s\n", usn_buff);
if (op->do_descriptors) {
- sgj_opaque_p jap = sgj_new_named_array(jsp, jo2p,
+ sgj_opaque_p jap = sgj_named_subarray_r(jsp, jo2p,
"version_descriptor_list");
if (0 == vdesc_arr[0]) {
sgj_pr_hr(jsp, "\n");
@@ -2736,7 +2623,7 @@ std_inq_decode(struct opts_t * op, sgj_opaque_p jop, int off)
sgj_pr_hr(jsp, "\n");
sgj_pr_hr(jsp, " Version descriptors:\n");
for (k = 0; k < 8; ++k) {
- sgj_opaque_p jo3p = sgj_new_unattached_object(jsp);
+ sgj_opaque_p jo3p = sgj_new_unattached_object_r(jsp);
int vdv = vdesc_arr[k];
if (0 == vdv)
@@ -2747,9 +2634,9 @@ std_inq_decode(struct opts_t * op, sgj_opaque_p jop, int off)
else
sgj_pr_hr(jsp, " [unrecognised version descriptor "
"code: 0x%x]\n", vdv);
- sgj_add_nv_ihexstr(jsp, jo3p, "version_descriptor", vdv,
- NULL, cp ? cp : "unknown");
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo3p);
+ sgj_js_nv_ihexstr(jsp, jo3p, "version_descriptor", vdv,
+ NULL, cp ? cp : "unknown");
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo3p);
}
}
}
@@ -3208,7 +3095,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"supported_vpd_page_list");
}
decode_supported_vpd(rp, len, op, jap);
@@ -3256,7 +3143,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
k = encode_unicode((uint8_t *)obuff, len);
if (k > 0) {
sgj_pr_hr(jsp, " Unit serial number: %s\n", obuff);
- sgj_add_nv_s(jsp, jo2p, "unit_serial_number", obuff);
+ sgj_js_nv_s(jsp, jo2p, "unit_serial_number", obuff);
}
}
}
@@ -3277,7 +3164,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"designation_descriptor_list");
}
decode_id_vpd(rp, len, op, jap);
@@ -3295,7 +3182,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"software_interface_identifier_list");
}
decode_softw_inf_id(rp, len, op, jap);
@@ -3316,7 +3203,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
// pqual = (rp[0] & 0xe0) >> 5;
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"network_services_descriptor_list");
}
decode_net_man_vpd(rp, len, op, jap);
@@ -3349,7 +3236,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"mode_page_policy_descriptor_list");
}
decode_mode_policy_vpd(rp, len, op, jap);
@@ -3367,7 +3254,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"scsi_ports_descriptor_list");
}
decode_scsi_ports_vpd(rp, len, op, jap);
@@ -3395,7 +3282,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
}
break;
case VPD_POWER_CONDITION: /* 0x8a ["pc"] */
- np = "Power condition page VPD page";
+ np = "Power condition VPD page";
if (!op->do_raw && (op->do_hex < 2))
sgj_pr_hr(jsp, "VPD INQUIRY: %s\n", np);
res = vpd_fetch_page_from_dev(sg_fd, rp, pn, op->maxlen, vb, &len);
@@ -3409,6 +3296,24 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
decode_power_condition(rp, len, op, jo2p);
}
break;
+ case VPD_POWER_CONSUMPTION: /* 0x8d ["psm"] */
+ np = "Power consumption VPD page";
+ if (!op->do_raw && (op->do_hex < 2))
+ sgj_pr_hr(jsp, "VPD INQUIRY: %s\n", np);
+ res = vpd_fetch_page_from_dev(sg_fd, rp, pn, op->maxlen, vb, &len);
+ if (res)
+ break;
+ if (op->do_raw)
+ dStrRaw((const char *)rp, len);
+ else {
+ if (as_json) {
+ jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
+ jap = sgj_named_subarray_r(jsp, jo2p,
+ "power_consumption_descriptor_list");
+ }
+ decode_power_consumption(rp, len, jop, jap);
+ }
+ break;
case VPD_DEVICE_CONSTITUENTS: /* 0x8b ["dc"] */
np = "Device constituents page VPD page";
if (!op->do_raw && (op->do_hex < 2))
@@ -3421,7 +3326,7 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"constituent_descriptor_list");
}
decode_dev_constit_vpd(rp, len, op, jap, recurse_vpd_decode);
@@ -3439,36 +3344,57 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off)
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"feature_set_code_list");
}
decode_feature_sets_vpd(rp, len, op, jap);
}
break;
case 0xb0: /* VPD pages in B0h to BFh range depend on pdt */
+ np = NULL;
res = vpd_fetch_page_from_dev(sg_fd, rp, pn, op->maxlen, vb, &len);
if (0 == res) {
+ bool bl = false;
+ bool sad = false;
+ bool oi = false;
+ const char * ep = "";
+
+ if (op->do_raw) {
+ dStrRaw((const char *)rp, len);
+ break;
+ }
pdt = rp[0] & PDT_MASK;
- if (! op->do_raw && (op->do_hex < 2)) {
- switch (pdt) {
- case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
- printf("VPD INQUIRY: Block limits page (SBC)\n");
- break;
- case PDT_TAPE: case PDT_MCHANGER:
- printf("VPD INQUIRY: Sequential access device "
- "capabilities (SSC)\n");
- break;
- case PDT_OSD:
- printf("VPD INQUIRY: OSD information (OSD)\n");
- break;
- default:
- printf("VPD INQUIRY: page=0x%x, pdt=0x%x\n", 0xb0, pdt);
- break;
- }
+ switch (pdt) {
+ case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
+ np = "Block limits VPD page";
+ ep = "(SBC)";
+ bl = true;
+ break;
+ case PDT_TAPE: case PDT_MCHANGER:
+ np = "Sequential-access device capabilities VPD page";
+ ep = "(SSC)";
+ sad = true;
+ break;
+ case PDT_OSD:
+ np = "OSD information VPD page";
+ ep = "(OSD)";
+ oi = true;
+ break;
+ default:
+ np = NULL;
+ break;
}
- if (op->do_raw)
- dStrRaw((const char *)rp, len);
- else
+ if (op->do_hex < 2) {
+ if (NULL == np)
+ sgj_pr_hr(jsp, "VPD page=0x%x, pdt=0x%x:\n", pn, pdt);
+ else
+ sgj_pr_hr(jsp, "VPD INQUIRY: %s %s\n", np, ep);
+ }
+ if (as_json)
+ jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
+ if (bl)
+ decode_block_limits_vpd(rp, len, op, jo2p);
+ else if (sad || oi) // more work here <<<<<<<<<<
decode_b0_vpd(rp, len, op->do_hex);
} else if (! op->do_raw)
pr2serr("VPD INQUIRY: page=0xb0\n");
@@ -4108,7 +4034,7 @@ main(int argc, char * argv[])
jsp = &op->json_st;
as_json = jsp->pr_as_json;
if (as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
rsp_buff = sg_memalign(rsp_buff_sz, 0 /* page align */, &free_rsp_buff,
false);
@@ -4397,7 +4323,7 @@ err_out:
ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
if (as_json) {
if (0 == op->do_hex)
- sgj_pr2file(jsp, NULL, ret, stdout);
+ sgj_js2file(jsp, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;
diff --git a/src/sg_opcodes.c b/src/sg_opcodes.c
index 4d8fe0c7..bb092065 100644
--- a/src/sg_opcodes.c
+++ b/src/sg_opcodes.c
@@ -33,7 +33,7 @@
#include "sg_pt.h"
-static const char * version_str = "0.84 20220626"; /* spc6r06 */
+static const char * version_str = "0.85 20220717"; /* spc6r06 */
#define MY_NAME "sg_opcodes"
@@ -785,9 +785,9 @@ list_all_codes(uint8_t * rsoc_buff, int rsoc_len, struct opts_t * op,
(op->do_alpha ? opcode_alpha_compare : opcode_num_compare));
}
- jap = sgj_new_named_array(jsp, jsp->basep, "all_command_descriptor");
+ jap = sgj_named_subarray_r(jsp, jsp->basep, "all_command_descriptor");
for (k = 0, j = 0; k < cd_len; ++j, k += len) {
- jop = sgj_new_unattached_object(jsp);
+ jop = sgj_new_unattached_object_r(jsp);
bp = op->do_unsorted ? (rsoc_buff + 4 + k) : sort_arr[j];
byt5 = bp[5];
@@ -858,22 +858,22 @@ list_all_codes(uint8_t * rsoc_buff, int rsoc_len, struct opts_t * op,
}
if (jsp->pr_as_json) {
snprintf(b, blen, "0x%x", opcode);
- sgj_add_nv_s(jsp, jop, "operation_code", b);
+ sgj_js_nv_s(jsp, jop, "operation_code", b);
if (sa_v) {
snprintf(b, blen, "0x%x", serv_act);
- sgj_add_nv_s(jsp, jop, "service_action", b);
+ sgj_js_nv_s(jsp, jop, "service_action", b);
}
if (name_buff[0])
- sgj_add_nv_s(jsp, jop, "name", name_buff);
- sgj_add_nv_i(jsp, jop, "rwcdlp", (byt5 >> 6) & 0x1);
- sgj_add_nv_i(jsp, jop, "mlu", (byt5 >> 4) & 0x3);
- sgj_add_nv_i(jsp, jop, "cdlp", (byt5 >> 2) & 0x3);
- sgj_add_nv_i(jsp, jop, "ctdp", (byt5 >> 1) & 0x1);
- sgj_add_nv_i(jsp, jop, "servactv", byt5 & 0x1);
- sgj_add_nv_i(jsp, jop, "cdb_length",
- sg_get_unaligned_be16(bp + 6));
-
- sgj_add_nv_o(jsp, jap, NULL /* implies an array add */, jop);
+ sgj_js_nv_s(jsp, jop, "name", name_buff);
+ sgj_js_nv_i(jsp, jop, "rwcdlp", (byt5 >> 6) & 0x1);
+ sgj_js_nv_i(jsp, jop, "mlu", (byt5 >> 4) & 0x3);
+ sgj_js_nv_i(jsp, jop, "cdlp", (byt5 >> 2) & 0x3);
+ sgj_js_nv_i(jsp, jop, "ctdp", (byt5 >> 1) & 0x1);
+ sgj_js_nv_i(jsp, jop, "servactv", byt5 & 0x1);
+ sgj_js_nv_i(jsp, jop, "cdb_length",
+ sg_get_unaligned_be16(bp + 6));
+
+ sgj_js_nv_o(jsp, jap, NULL /* implies an array add */, jop);
}
if (op->do_mask && ptvp) {
@@ -903,14 +903,14 @@ list_all_codes(uint8_t * rsoc_buff, int rsoc_len, struct opts_t * op,
if (jsp->pr_as_json) {
int l;
char *b2p = b + nn;
- sgj_opaque_p jo2p = sgj_new_named_object(jsp, jop,
+ sgj_opaque_p jo2p = sgj_named_subobject_r(jsp, jop,
"one_command_descriptor");
l = strlen(b2p);
if ((l > 0) && (' ' == b2p[l - 1]))
b2p[l - 1] = '\0';
- sgj_add_nv_i(jsp, jo2p, "cdb_size", cdb_sz);
- sgj_add_nv_s(jsp, jo2p, "cdb_usage_data", b2p);
+ sgj_js_nv_i(jsp, jo2p, "cdb_size", cdb_sz);
+ sgj_js_nv_s(jsp, jo2p, "cdb_usage_data", b2p);
}
}
} else
@@ -948,9 +948,9 @@ decode_cmd_timeout_desc(uint8_t * dp, int max_b_len, char * b,
else
snprintf(b, max_b_len, "nominal timeout: %u secs, ", timeout);
if (jsp->pr_as_json) {
- sgj_add_nv_i(jsp, jsp->userp, "command_specific", dp[3]);
- sgj_add_nv_i(jsp, jsp->userp, "nominal_command_processing_timeout",
- timeout);
+ sgj_js_nv_i(jsp, jsp->userp, "command_specific", dp[3]);
+ sgj_js_nv_i(jsp, jsp->userp, "nominal_command_processing_timeout",
+ timeout);
}
len = strlen(b);
max_b_len -= len;
@@ -961,7 +961,7 @@ decode_cmd_timeout_desc(uint8_t * dp, int max_b_len, char * b,
else
snprintf(b, max_b_len, "recommended timeout: %u secs", timeout);
if (jsp->pr_as_json)
- sgj_add_nv_i(jsp, jsp->userp, "recommended_command_timeout", timeout);
+ sgj_js_nv_i(jsp, jsp->userp, "recommended_command_timeout", timeout);
return;
}
@@ -986,7 +986,7 @@ list_one(uint8_t * rsoc_buff, int cd_len, int rep_opts,
const int blen = sizeof(b);
- jop = sgj_new_named_object(jsp, jsp->basep, "one_command_descriptor");
+ jop = sgj_named_subobject_r(jsp, jsp->basep, "one_command_descriptor");
n += sg_scnpr(b + n, blen - n, "\n Opcode=0x%.2x", op->opcode);
if (rep_opts > 1)
n += sg_scnpr(b + n, blen - n, " Service_action=0x%.4x", op->servact);
@@ -1077,29 +1077,29 @@ list_one(uint8_t * rsoc_buff, int cd_len, int rep_opts,
int l;
snprintf(b, blen, "0x%x", op->opcode);
- sgj_add_nv_s(jsp, jop, "operation_code", b);
+ sgj_js_nv_s(jsp, jop, "operation_code", b);
if (rep_opts > 1) {
snprintf(b, blen, "0x%x", op->servact);
- sgj_add_nv_s(jsp, jop, "service_action", b);
+ sgj_js_nv_s(jsp, jop, "service_action", b);
}
- sgj_add_nv_i(jsp, jop, "rwcdlp", rwcdlp);
- sgj_add_nv_i(jsp, jop, "ctdp", ctdp);
- sgj_add_nv_i(jsp, jop, "mlu", mlu);
- sgj_add_nv_i(jsp, jop, "cdlp", cdlp);
- sgj_add_nv_i(jsp, jop, "support", support);
- sgj_add_nv_s(jsp, jop, "support_str", cp);
- sgj_add_nv_i(jsp, jop, "cdb_size", cd_len);
+ sgj_js_nv_i(jsp, jop, "rwcdlp", rwcdlp);
+ sgj_js_nv_i(jsp, jop, "ctdp", ctdp);
+ sgj_js_nv_i(jsp, jop, "mlu", mlu);
+ sgj_js_nv_i(jsp, jop, "cdlp", cdlp);
+ sgj_js_nv_i(jsp, jop, "support", support);
+ sgj_js_nv_s(jsp, jop, "support_str", cp);
+ sgj_js_nv_i(jsp, jop, "cdb_size", cd_len);
n = 0;
for (k = 0; k < cd_len; ++k)
n += sg_scnpr(b + n, blen - n, "%.2x ", rsoc_buff[k + 4]);
l = strlen(b);
if ((l > 0) && (' ' == b[l - 1]))
b[l - 1] = '\0';
- sgj_add_nv_s(jsp, jop, "cdb_usage_data", b);
+ sgj_js_nv_s(jsp, jop, "cdb_usage_data", b);
}
if (ctdp) {
- jsp->userp = sgj_new_named_object(jsp, jsp->basep,
- "command_timeouts_descriptor");
+ jsp->userp = sgj_named_subobject_r(jsp, jsp->basep,
+ "command_timeouts_descriptor");
bp = rsoc_buff + 4 + cd_len;
decode_cmd_timeout_desc(bp, NAME_BUFF_SZ, name_buff, op);
sgj_pr_hr(jsp, " %s\n", name_buff);
@@ -1144,7 +1144,7 @@ main(int argc, char * argv[])
jsp = &op->json_st;
as_json = jsp->pr_as_json;
if (as_json) {
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
}
#ifdef DEBUG
pr2serr("In DEBUG mode, ");
@@ -1375,17 +1375,17 @@ start_response:
goto fini;
}
if (jsp->pr_as_json) {
- sgj_add_nv_b(jsp, jop, "ats", rsoc_buff[0] & 0x80);
- sgj_add_nv_b(jsp, jop, "atss", rsoc_buff[0] & 0x40);
- sgj_add_nv_b(jsp, jop, "cacas", rsoc_buff[0] & 0x20);
- sgj_add_nv_b(jsp, jop, "ctss", rsoc_buff[0] & 0x10);
- sgj_add_nv_b(jsp, jop, "lurs", rsoc_buff[0] & 0x8);
- sgj_add_nv_b(jsp, jop, "qts", rsoc_buff[0] & 0x4);
- sgj_add_nv_b(jsp, jop, "trs", rsoc_buff[0] & 0x2);
- sgj_add_nv_b(jsp, jop, "ws", rsoc_buff[0] & 0x1);
- sgj_add_nv_b(jsp, jop, "qaes", rsoc_buff[1] & 0x4);
- sgj_add_nv_b(jsp, jop, "qtss", rsoc_buff[1] & 0x2);
- sgj_add_nv_b(jsp, jop, "itnrs", rsoc_buff[1] & 0x1);
+ sgj_js_nv_b(jsp, jop, "ats", rsoc_buff[0] & 0x80);
+ sgj_js_nv_b(jsp, jop, "atss", rsoc_buff[0] & 0x40);
+ sgj_js_nv_b(jsp, jop, "cacas", rsoc_buff[0] & 0x20);
+ sgj_js_nv_b(jsp, jop, "ctss", rsoc_buff[0] & 0x10);
+ sgj_js_nv_b(jsp, jop, "lurs", rsoc_buff[0] & 0x8);
+ sgj_js_nv_b(jsp, jop, "qts", rsoc_buff[0] & 0x4);
+ sgj_js_nv_b(jsp, jop, "trs", rsoc_buff[0] & 0x2);
+ sgj_js_nv_b(jsp, jop, "ws", rsoc_buff[0] & 0x1);
+ sgj_js_nv_b(jsp, jop, "qaes", rsoc_buff[1] & 0x4);
+ sgj_js_nv_b(jsp, jop, "qtss", rsoc_buff[1] & 0x2);
+ sgj_js_nv_b(jsp, jop, "itnrs", rsoc_buff[1] & 0x1);
if (! jsp->pr_out_hr)
goto fini;
}
@@ -1493,7 +1493,7 @@ err_out:
res = (res >= 0) ? res : SG_LIB_CAT_OTHER;
if (as_json) {
if (0 == op->do_hex)
- sgj_pr2file(jsp, NULL, res, stdout);
+ sgj_js2file(jsp, NULL, res, stdout);
sgj_finish(jsp);
}
return res;
diff --git a/src/sg_rep_zones.c b/src/sg_rep_zones.c
index 8fc733ff..d6c03e7c 100644
--- a/src/sg_rep_zones.c
+++ b/src/sg_rep_zones.c
@@ -40,7 +40,7 @@
* Based on zbc2r12.pdf
*/
-static const char * version_str = "1.40 20220625";
+static const char * version_str = "1.41 20220717";
#define MY_NAME "sg_rep_zones"
@@ -394,28 +394,28 @@ prt_a_zn_desc(const uint8_t *bp, const struct opts_t * op,
zc = (bp[1] >> 4) & 0xf;
sg_get_zone_type_str(zt, sizeof(b), b);
sgj_pr_hr(jsp, " Zone type: %s\n", b);
- sgj_add_nv_istr(jsp, jop, "zone_type", zt, meaning_s, b);
+ sgj_js_nv_istr(jsp, jop, "zone_type", zt, meaning_s, b);
zone_condition_str(zc, b, sizeof(b), op->vb);
sgj_pr_hr(jsp, " Zone condition: %s\n", b);
- sgj_add_nv_istr(jsp, jop, "zone_condition", zc, meaning_s, b);
- sgj_pr_hr_js_vi(jsp, jop, 3, "PUEP", SGJ_SEP_COLON_1_SPACE,
- !!(bp[1] & 0x4));
- sgj_pr_hr_js_vi(jsp, jop, 3, "NON_SEQ", SGJ_SEP_COLON_1_SPACE,
- !!(bp[1] & 0x2));
- sgj_pr_hr_js_vi(jsp, jop, 3, "RESET", SGJ_SEP_COLON_1_SPACE,
- !!(bp[1] & 0x1));
+ sgj_js_nv_istr(jsp, jop, "zone_condition", zc, meaning_s, b);
+ sgj_hr_js_vi(jsp, jop, 3, "PUEP", SGJ_SEP_COLON_1_SPACE,
+ !!(bp[1] & 0x4), false);
+ sgj_hr_js_vi(jsp, jop, 3, "NON_SEQ", SGJ_SEP_COLON_1_SPACE,
+ !!(bp[1] & 0x2), false);
+ sgj_hr_js_vi(jsp, jop, 3, "RESET", SGJ_SEP_COLON_1_SPACE,
+ !!(bp[1] & 0x1), false);
len = sg_get_unaligned_be64(bp + 8);
sgj_pr_hr(jsp, " Zone Length: 0x%" PRIx64 "\n", len);
- sgj_add_nv_ihex(jsp, jop, "zone_length", (int64_t)len);
+ sgj_js_nv_ihex(jsp, jop, "zone_length", (int64_t)len);
lba = sg_get_unaligned_be64(bp + 16);
sgj_pr_hr(jsp, " Zone start LBA: 0x%" PRIx64 "\n", lba);
- sgj_add_nv_ihex(jsp, jop, "zone_start_lba", (int64_t)lba);
+ sgj_js_nv_ihex(jsp, jop, "zone_start_lba", (int64_t)lba);
wp = sg_get_unaligned_be64(bp + 24);
if (sg_all_ffs((const uint8_t *)&wp, sizeof(wp)))
sgj_pr_hr(jsp, " Write pointer LBA: -1\n");
else
sgj_pr_hr(jsp, " Write pointer LBA: 0x%" PRIx64 "\n", wp);
- sgj_add_nv_ihex(jsp, jop, "write_pointer_lba", (int64_t)wp);
+ sgj_js_nv_ihex(jsp, jop, "write_pointer_lba", (int64_t)wp);
return lba + len;
}
@@ -456,12 +456,12 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
"granularity";
sgj_pr_hr(jsp, " Same=%d: %s\n", same, same_desc_arr[same]);
- sgj_add_nv_istr(jsp, jop, "same", same, meaning_s,
- same_desc_arr[same]);
+ sgj_js_nv_istr(jsp, jop, "same", same, meaning_s,
+ same_desc_arr[same]);
sgj_pr_hr(jsp, " Maximum LBA: 0x%" PRIx64 "\n\n", mx_lba);
- sgj_add_nv_ihex(jsp, jop, "maximum_lba", mx_lba);
+ sgj_js_nv_ihex(jsp, jop, "maximum_lba", mx_lba);
sgj_pr_hr(jsp, " %s: 0x%" PRIx64 "\n\n", rzslbag_s, rzslbag);
- sgj_add_nv_ihex(jsp, jop, rzslbag_s, rzslbag);
+ sgj_js_nv_ihex(jsp, jop, rzslbag_s, rzslbag);
}
if (op->do_num > 0)
num_zd = (num_zd > op->do_num) ? op->do_num : num_zd;
@@ -482,7 +482,7 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
}
sgj_pr_hr(jsp, "From last descriptor in this response:\n");
sgj_pr_hr(jsp, " %s%d\n", zn_dnum_s, num_zd - 1);
- sgj_add_nv_i(jsp, jop, "zone_descriptor_index", num_zd - 1);
+ sgj_js_nv_i(jsp, jop, "zone_descriptor_index", num_zd - 1);
ul = prt_a_zn_desc(bp, op, jsp, jop);
if (ul > mx_lba)
sgj_pr_hr(jsp, " >> This zone seems to be the last one\n");
@@ -492,7 +492,7 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
return 0;
}
if (as_json)
- jap = sgj_new_named_array(jsp, NULL, "zone_descriptors_list");
+ jap = sgj_named_subarray_r(jsp, NULL, "zone_descriptors_list");
for (k = 0, bp = rzBuff + 64; k < num_zd;
++k, bp += REPORT_ZONES_DESC_LEN) {
sgj_opaque_p jo2p;
@@ -512,15 +512,15 @@ decode_rep_zones(const uint8_t * rzBuff, int act_len, uint32_t decod_len,
sgj_pr_hr(jsp, "-1\n");
else
sgj_pr_hr(jsp, "0x%" PRIx64 "\n", wp);
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_ihex(jsp, jo2p, "write_pointer_lba", (int64_t)wp);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_ihex(jsp, jo2p, "write_pointer_lba", (int64_t)wp);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
continue;
}
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
prt_a_zn_desc(bp, op, jsp, jo2p);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
if ((op->do_num == 0) && (! op->wp_only) && (! op->do_hex)) {
if ((64 + (REPORT_ZONES_DESC_LEN * (uint32_t)num_zd)) < decod_len)
@@ -552,12 +552,12 @@ decode_rep_realms(const uint8_t * rzBuff, int act_len,
nr_locator = sg_get_unaligned_be64(rzBuff + 12);
else
nr_locator = 0;
- sgj_pr_hr_js_vi(jsp, jop, 0, "Realms_count", SGJ_SEP_EQUAL_NO_SPACE,
- realms_count);
- sgj_pr_hr_js_vi(jsp, jop, 0, "Realms_descriptor_length",
- SGJ_SEP_EQUAL_NO_SPACE, r_desc_len);
+ sgj_hr_js_vi(jsp, jop, 0, "Realms_count", SGJ_SEP_EQUAL_NO_SPACE,
+ realms_count, true);
+ sgj_hr_js_vi(jsp, jop, 0, "Realms_descriptor_length",
+ SGJ_SEP_EQUAL_NO_SPACE, r_desc_len, true);
sgj_pr_hr(jsp, "Next_realm_locator=0x%" PRIx64 "\n", nr_locator);
- sgj_add_nv_ihex(jsp, jop, "Next_realm_locator", nr_locator);
+ sgj_js_nv_ihex(jsp, jop, "Next_realm_locator", nr_locator);
if ((realms_count < 1) || (act_len < (64 + 16)) || (r_desc_len < 16)) {
if (op->vb) {
pr2serr("%s: exiting early because ", __func__);
@@ -587,7 +587,7 @@ decode_rep_realms(const uint8_t * rzBuff, int act_len,
if (op->do_num > 0)
realms_count = (realms_count > (uint32_t)op->do_num) ?
(uint32_t)op->do_num : realms_count;
- jap = sgj_new_named_array(jsp, jop, "realm_descriptors_list");
+ jap = sgj_named_subarray_r(jsp, jop, "realm_descriptors_list");
for (k = 0, bp = rzBuff + 64; k < realms_count; ++k, bp += r_desc_len) {
uint32_t j;
@@ -595,37 +595,37 @@ decode_rep_realms(const uint8_t * rzBuff, int act_len,
const uint8_t * zp;
sgj_opaque_p jo2p;
- jo2p = sgj_new_unattached_object(jsp);
- sgj_pr_hr_js_vi(jsp, jo2p, 1, "Realms_id", SGJ_SEP_EQUAL_NO_SPACE,
- sg_get_unaligned_be32(bp + 0));
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_hr_js_vi(jsp, jo2p, 1, "Realms_id", SGJ_SEP_EQUAL_NO_SPACE,
+ sg_get_unaligned_be32(bp + 0), true);
if (op->do_hex) {
hex2stdout(bp, r_desc_len, -1);
continue;
}
restrictions = sg_get_unaligned_be16(bp + 4);
sgj_pr_hr(jsp, " realm_restrictions=0x%hu\n", restrictions);
- sgj_add_nv_ihex(jsp, jo2p, "realm_restrictions", restrictions);
- sgj_pr_hr_js_vi(jsp, jo2p, 3, "active_zone_domain_id",
- SGJ_SEP_EQUAL_NO_SPACE, bp[7]);
+ sgj_js_nv_ihex(jsp, jo2p, "realm_restrictions", restrictions);
+ sgj_hr_js_vi(jsp, jo2p, 3, "active_zone_domain_id",
+ SGJ_SEP_EQUAL_NO_SPACE, bp[7], true);
- ja2p = sgj_new_named_array(jsp, jo2p,
- "realm_start_end_descriptors_list");
+ ja2p = sgj_named_subarray_r(jsp, jo2p,
+ "realm_start_end_descriptors_list");
for (j = 0, zp = bp + 16; j < zdomains_count; ++j, zp += 16) {
uint64_t lba;
sgj_opaque_p jo3p;
- jo3p = sgj_new_unattached_object(jsp);
+ jo3p = sgj_new_unattached_object_r(jsp);
sgj_pr_hr(jsp, " zone_domain=%u\n", j);
- sgj_add_nv_i(jsp, jo3p, "corresponding_zone_domain_id", j);
+ sgj_js_nv_i(jsp, jo3p, "corresponding_zone_domain_id", j);
lba = sg_get_unaligned_be64(zp + 0);
sgj_pr_hr(jsp, " starting_lba=0x%" PRIx64 "\n", lba);
- sgj_add_nv_ihex(jsp, jo3p, "realm_starting_lba", (int64_t)lba);
+ sgj_js_nv_ihex(jsp, jo3p, "realm_starting_lba", (int64_t)lba);
lba = sg_get_unaligned_be64(zp + 8);
sgj_pr_hr(jsp, " ending_lba=0x%" PRIx64 "\n", lba);
- sgj_add_nv_ihex(jsp, jo3p, "realm_ending_lba", (int64_t)lba);
- sgj_add_nv_o(jsp, ja2p, NULL /* name */, jo3p);
+ sgj_js_nv_ihex(jsp, jo3p, "realm_ending_lba", (int64_t)lba);
+ sgj_js_nv_o(jsp, ja2p, NULL /* name */, jo3p);
}
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
return 0;
}
@@ -654,46 +654,46 @@ decode_rep_zdomains(const uint8_t * rzBuff, int act_len,
zd_locator = sg_get_unaligned_be64(rzBuff + 16);
else
zd_locator = 0;
- sgj_pr_hr_js_vi(jsp, jop, 0, "Zone_domains_returned_list_length=",
- SGJ_SEP_EQUAL_NO_SPACE, zd_ret_len);
- sgj_pr_hr_js_vi(jsp, jop, 0, "Zone_domains_supported",
- SGJ_SEP_EQUAL_NO_SPACE, zdoms_sup);
- sgj_pr_hr_js_vi(jsp, jop, 0, "Zone_domains_reported",
- SGJ_SEP_EQUAL_NO_SPACE, zdoms_rep);
+ sgj_hr_js_vi(jsp, jop, 0, "Zone_domains_returned_list_length=",
+ SGJ_SEP_EQUAL_NO_SPACE, zd_ret_len, true);
+ sgj_hr_js_vi(jsp, jop, 0, "Zone_domains_supported",
+ SGJ_SEP_EQUAL_NO_SPACE, zdoms_sup, true);
+ sgj_hr_js_vi(jsp, jop, 0, "Zone_domains_reported",
+ SGJ_SEP_EQUAL_NO_SPACE, zdoms_rep, true);
sgj_pr_hr(jsp, "Reporting_options=0x%x\n", zd_rep_opts);
- sgj_add_nv_ihex(jsp, jop, "Reporting_options", zd_rep_opts);
+ sgj_js_nv_ihex(jsp, jop, "Reporting_options", zd_rep_opts);
sgj_pr_hr(jsp, "Zone_domain_locator=0x%" PRIx64 "\n", zd_locator);
- sgj_add_nv_ihex(jsp, jop, "Zone_domain_locator", zd_locator);
+ sgj_js_nv_ihex(jsp, jop, "Zone_domain_locator", zd_locator);
der_zdoms = zd_len / 96;
if (op->vb > 1)
pr2serr("Derived zdomains=%u\n", der_zdoms);
num = ((der_zdoms < zdoms_rep) ? der_zdoms : zdoms_rep) * 96;
- jap = sgj_new_named_array(jsp, jop, "zone_domain_descriptors_list");
+ jap = sgj_named_subarray_r(jsp, jop, "zone_domain_descriptors_list");
for (k = 0, bp = rzBuff + 64; k < num; k += 96, bp += 96) {
uint64_t lba;
sgj_opaque_p jo2p;
- jo2p = sgj_new_unattached_object(jsp);
- sgj_pr_hr_js_vi(jsp, jo2p, 3, "zone_domain",
- SGJ_SEP_EQUAL_NO_SPACE, bp[0]);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_hr_js_vi(jsp, jo2p, 3, "zone_domain",
+ SGJ_SEP_EQUAL_NO_SPACE, bp[0], true);
lba = sg_get_unaligned_be64(bp + 16);
sgj_pr_hr(jsp, " zone_count=%" PRIu64 "\n", lba);
- sgj_add_nv_ihex(jsp, jo2p, "zone_count", lba);
+ sgj_js_nv_ihex(jsp, jo2p, "zone_count", lba);
lba = sg_get_unaligned_be64(bp + 24);
sgj_pr_hr(jsp, " starting_lba=0x%" PRIx64 "\n", lba);
- sgj_add_nv_ihex(jsp, jo2p, "starting_lba", lba);
+ sgj_js_nv_ihex(jsp, jo2p, "starting_lba", lba);
lba = sg_get_unaligned_be64(bp + 32);
sgj_pr_hr(jsp, " ending_lba=0x%" PRIx64 "\n", lba);
- sgj_add_nv_ihex(jsp, jo2p, "ending_lba", lba);
+ sgj_js_nv_ihex(jsp, jo2p, "ending_lba", lba);
sgj_pr_hr(jsp, " zone_domain_zone_type=0x%x\n", bp[40]);
- sgj_add_nv_ihex(jsp, jo2p, "zone_domain_zone_type", bp[40]);
- sgj_pr_hr_js_vi(jsp, jo2p, 5, "VZDZT", SGJ_SEP_EQUAL_NO_SPACE,
- !!(0x2 & bp[42]));
- sgj_pr_hr_js_vi(jsp, jo2p, 5, "SRB", SGJ_SEP_EQUAL_NO_SPACE,
- !!(0x1 & bp[42]));
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_ihex(jsp, jo2p, "zone_domain_zone_type", bp[40]);
+ sgj_hr_js_vi(jsp, jo2p, 5, "VZDZT", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(0x2 & bp[42]), false);
+ sgj_hr_js_vi(jsp, jo2p, 5, "SRB", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(0x1 & bp[42]), false);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
return 0;
}
@@ -760,7 +760,7 @@ find_report_zones(int sg_fd, uint8_t * rzBuff, const char * cmd_name,
} /* end of outer for loop */
if (res == 0) {
sgj_opaque_p jo2p = as_json ?
- sgj_new_named_object(jsp, NULL, "find_condition") : NULL;
+ sgj_named_subobject_r(jsp, NULL, "find_condition") : NULL;
if (found) {
if (op->do_hex) {
@@ -770,8 +770,8 @@ find_report_zones(int sg_fd, uint8_t * rzBuff, const char * cmd_name,
} else {
sgj_pr_hr(jsp, "Condition met at:\n");
sgj_pr_hr(jsp, " %s: %d\n", zn_dnum_s, zn_dnum);
- sgj_add_nv_b(jsp, jo2p, "met", true);
- sgj_add_nv_i(jsp, jo2p, "zone_descriptor_index", zn_dnum);
+ sgj_js_nv_b(jsp, jo2p, "met", true);
+ sgj_js_nv_i(jsp, jo2p, "zone_descriptor_index", zn_dnum);
prt_a_zn_desc(bp, op, jsp, jo2p);
}
} else {
@@ -779,8 +779,8 @@ find_report_zones(int sg_fd, uint8_t * rzBuff, const char * cmd_name,
memset(b, 0xff, 64);
hex2stdout((const uint8_t *)b, 64, -1);
} else {
- sgj_add_nv_b(jsp, jo2p, "met", false);
- sgj_add_nv_i(jsp, jo2p, "zone_descriptor_index", zn_dnum);
+ sgj_js_nv_b(jsp, jo2p, "met", false);
+ sgj_js_nv_i(jsp, jo2p, "zone_descriptor_index", zn_dnum);
if (num_rem < 1)
sgj_pr_hr(jsp, "Condition NOT met, checked %d zones; "
"next %s%u\n", op->do_num, zn_dnum_s, zn_dnum);
@@ -1333,7 +1333,7 @@ main(int argc, char * argv[])
as_json = op->json_st.pr_as_json;
jsp = &op->json_st;
if (as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
if (op->do_zdomains && op->do_realms) {
pr2serr("Can't have both --domain and --realm\n");
@@ -1343,7 +1343,7 @@ main(int argc, char * argv[])
else if (op->do_realms)
cmd_name = "Report realms";
if (as_json)
- sgj_add_nv_s(jsp, jop, "scsi_command_name", cmd_name);
+ sgj_js_nv_s(jsp, jop, "scsi_command_name", cmd_name);
if ((op->serv_act != REPORT_ZONES_SA) && op->do_partial) {
pr2serr("Can only use --partial with REPORT ZONES\n");
return SG_LIB_SYNTAX_ERROR;
@@ -1518,7 +1518,7 @@ the_end:
ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
if (as_json) {
if (0 == op->do_hex)
- sgj_pr2file(jsp, NULL, ret, stdout);
+ sgj_js2file(jsp, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
index 206fe91d..8cb231d7 100644
--- a/src/sg_vpd.c
+++ b/src/sg_vpd.c
@@ -42,7 +42,7 @@
*/
-static const char * version_str = "1.75 20220714"; /* spc6r06 + sbc5r01 */
+static const char * version_str = "1.76 20220717"; /* spc6r06 + sbc5r01 */
#define MY_NAME "sg_vpd"
@@ -99,6 +99,8 @@ static struct option long_options[] = {
{"page", required_argument, 0, 'p'},
{"quiet", no_argument, 0, 'q'},
{"raw", no_argument, 0, 'r'},
+ {"sinq_inraw", required_argument, 0, 'Q'},
+ {"sinq-inraw", required_argument, 0, 'Q'},
{"vendor", required_argument, 0, 'M'},
{"verbose", no_argument, 0, 'v'},
{"version", no_argument, 0, 'V'},
@@ -177,9 +179,9 @@ usage()
"[--help] [--hex]\n"
" [--ident] [--inhex=FN] [--long] [--maxlen=LEN] "
"[--page=PG]\n"
- " [--quiet] [--raw] [--vendor=VP] [--verbose] "
- "[--version]\n"
- " DEVICE\n");
+ " [--quiet] [--raw] [--sinq_inraw=RFN] "
+ "[--vendor=VP] [--verbose] "
+ " [--version] DEVICE\n");
pr2serr(" where:\n"
" --all|-a output all pages listed in the supported "
"pages VPD\n"
@@ -218,6 +220,9 @@ usage()
"also\n"
" given, FN is in binary (else FN is in "
"hex)\n"
+ " --sinq_inraw=RFN|-Q RFN read raw (binary) standard "
+ "INQUIRY\n"
+ " response from the RFN filename\n"
" --vendor=VP|-M VP vendor/product abbreviation [or "
"number]\n"
" --verbose|-v increase verbosity\n"
@@ -540,8 +545,8 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
for (k = 0; k < len; k += bump, bp += bump) {
rel_port = sg_get_unaligned_be16(bp + 2);
sgj_pr_hr(jsp, " Relative port=%d\n", rel_port);
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_i(jsp, jo2p, "relative_port", rel_port);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_i(jsp, jo2p, "relative_port", rel_port);
ip_tid_len = sg_get_unaligned_be16(bp + 6);
bump = 8 + ip_tid_len;
if ((k + bump) > len) {
@@ -559,7 +564,7 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
sg_decode_transportid_str(" ", bp + 8, ip_tid_len,
true, sizeof(b), b);
if (jsp->pr_as_json)
- sgj_add_nv_s(jsp, jo2p, "initiator_port_transport_id", b);
+ sgj_js_nv_s(jsp, jo2p, "initiator_port_transport_id", b);
sgj_pr_hr(jsp, "%s",
sg_decode_transportid_str(" ", bp + 8,
ip_tid_len, true, sizeof(b), b));
@@ -579,18 +584,18 @@ decode_scsi_ports_vpd(uint8_t * buff, int len, struct opts_t * op,
if ((0 == op->do_quiet) || (ip_tid_len > 0))
sgj_pr_hr(jsp, " Target port descriptor(s):\n");
if (jsp->pr_as_json) {
- sgj_opaque_p jo3p = sgj_new_named_object(jsp, jo2p,
- "target_port");
+ sgj_opaque_p jo3p = sgj_named_subobject_r(jsp, jo2p,
+ "target_port");
- ja2p = sgj_new_named_array(jsp, jo3p,
- "designation_descriptor_list");
+ ja2p = sgj_named_subarray_r(jsp, jo3p,
+ "designation_descriptor_list");
}
filter_dev_ids("", 2 /* leading spaces */, bp + bump + 4,
tpd_len, VPD_ASSOC_TPORT, op, ja2p);
}
}
bump += tpd_len + 4;
- sgj_add_nv_o(jsp, jap, NULL, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL, jo2p);
}
}
@@ -843,7 +848,7 @@ filter_dev_ids(const char * print_if_found, int num_leading, uint8_t * buff,
if (strlen(print_if_found) > 0) {
snprintf(b, blen, " %s:", print_if_found);
if (sgj_out_hr)
- sgj_pr_str_out_hr(jsp, b, strlen(b));
+ sgj_js_str_out(jsp, b, strlen(b));
else
printf("%s\n", b);
}
@@ -851,14 +856,14 @@ filter_dev_ids(const char * print_if_found, int num_leading, uint8_t * buff,
if (NULL == print_if_found) {
snprintf(b, blen, " %s%s:", sp, sg_get_desig_assoc_str(assoc));
if (sgj_out_hr)
- sgj_pr_str_out_hr(jsp, b, strlen(b));
+ sgj_js_str_out(jsp, b, strlen(b));
else
printf("%s\n", b);
}
sg_get_designation_descriptor_str(sp, bp, i_len + 4, false,
op->do_long, blen, b);
if (sgj_out_hr)
- sgj_pr_str_out_hr(jsp, b, strlen(b));
+ sgj_js_str_out(jsp, b, strlen(b));
else
printf("%s", b);
}
@@ -869,60 +874,6 @@ filter_dev_ids(const char * print_if_found, int num_leading, uint8_t * buff,
return 0;
}
-static const char * power_unit_arr[] =
-{
- "Gigawatts",
- "Megawatts",
- "Kilowatts",
- "Watts",
- "Milliwatts",
- "Microwatts",
- "Unit reserved",
- "Unit reserved",
-};
-
-/* VPD_POWER_CONSUMPTION */
-static void
-decode_power_consumption_vpd(uint8_t * buff, int len, int do_hex)
-{
- int k, bump;
- uint8_t * bp;
- unsigned int value;
- static const char * pcp = "Power consumption VPD page";
-
- if ((1 == do_hex) || (do_hex > 2)) {
- hex2stdout(buff, len, (1 == do_hex) ? 1 : -1);
- return;
- }
- if (len < 4) {
- pr2serr("%s length too short=%d\n", pcp,len);
- return;
- }
- len -= 4;
- bp = buff + 4;
- for (k = 0; k < len; k += bump, bp += bump) {
- bump = 4;
- if ((k + bump) > len) {
- pr2serr("%s, short descriptor length=%d, left=%d\n", pcp, bump,
- (len - k));
- return;
- }
- if (do_hex > 1)
- hex2stdout(bp, 4, 1);
- else {
- value = sg_get_unaligned_be16(bp + 2);
- printf(" Power consumption identifier: 0x%x", bp[0]);
- if (value >= 1000 && (bp[1] & 0x7) > 0)
- printf(" Maximum power consumption: %d.%03d %s\n",
- value / 1000, value % 1000,
- power_unit_arr[(bp[1] & 0x7) - 1]);
- else
- printf(" Maximum power consumption: %u %s\n",
- value, power_unit_arr[bp[1] & 0x7]);
- }
- }
-}
-
/* This is xcopy(LID4) related: "ROD" == Representation Of Data
* Used by VPD_3PARTY_COPY */
static void
@@ -1946,10 +1897,10 @@ decode_b3_vpd(uint8_t * b, int len, int pdt, struct opts_t * op,
sgj_pr_hr(jsp, "%s0 [per sense descriptor]\n", d);
else
sgj_pr_hr(jsp, "%s%u\n", d, u);
- sgj_add_nv_ihex(jsp, jop, "user_data_segment_size", u);
+ sgj_js_nv_ihex(jsp, jop, "user_data_segment_size", u);
u = sg_get_unaligned_be32(b + 12);
- sgj_pr_hr_js_vi(jsp, jop, 2, "User data segment multiplier",
- SGJ_SEP_COLON_1_SPACE, u);
+ sgj_hr_js_vi(jsp, jop, 2, "User data segment multiplier",
+ SGJ_SEP_COLON_1_SPACE, u, true);
break;
case PDT_TAPE: case PDT_MCHANGER:
memset(obuff, 0, sizeof(obuff));
@@ -2320,6 +2271,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
sgj_opaque_p jap = NULL;
sgj_opaque_p jo2p = NULL;
const char * np;
+ const char * ep;
const char * pre = (prefix ? prefix : "");;
const char * pdt_str;
bool as_json = jsp->pr_as_json;
@@ -2426,8 +2378,8 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
num = (len - 4);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
- "supported_vpd_page_list");
+ jap = sgj_named_subarray_r(jsp, jo2p,
+ "supported_vpd_page_list");
}
for (k = 0; k < num; ++k) {
pn = rp[4 + k];
@@ -2454,17 +2406,17 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
} else
sgj_pr_hr(jsp, " %s\n", b);
if (as_json) {
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_i(jsp, jo2p, "i", pn);
- sgj_add_nv_s(jsp, jo2p, "hex", b + 2);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_i(jsp, jo2p, "i", pn);
+ sgj_js_nv_s(jsp, jo2p, "hex", b + 2);
if (vnp) {
- sgj_add_nv_s(jsp, jo2p, "name", vnp->name);
- sgj_add_nv_s(jsp, jo2p, "acronym", vnp->acron);
+ sgj_js_nv_s(jsp, jo2p, "name", vnp->name);
+ sgj_js_nv_s(jsp, jo2p, "acronym", vnp->acron);
} else {
- sgj_add_nv_s(jsp, jo2p, "name", "unknown");
- sgj_add_nv_s(jsp, jo2p, "acronym", "unknown");
+ sgj_js_nv_s(jsp, jo2p, "name", "unknown");
+ sgj_js_nv_s(jsp, jo2p, "acronym", "unknown");
}
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
}
}
@@ -2493,8 +2445,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
len = sizeof(obuff) - 1;
memcpy(obuff, rp + 4, len);
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- sgj_pr_hr_js_vs(jsp, jo2p, 2, np, SGJ_SEP_COLON_1_SPACE,
- obuff);
+ sgj_hr_js_vs(jsp, jo2p, 2, np, SGJ_SEP_COLON_1_SPACE, obuff);
}
return 0;
}
@@ -2517,8 +2468,8 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
"%s]\n", pqual, pdt_str);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
- "designation_descriptor_list");
+ jap = sgj_named_subarray_r(jsp, jo2p,
+ "designation_descriptor_list");
}
device_id_vpd_variants(rp, len, subvalue, op, jap);
}
@@ -2541,7 +2492,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
"%s]\n", pqual, pdt_str);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"software_interface_identifier_list");
}
decode_softw_inf_id(rp, len, op, jap);
@@ -2562,7 +2513,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
else {
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"network_services_descriptor_list");
}
decode_net_man_vpd(rp, len, op, jap);
@@ -2619,7 +2570,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
"%s]\n", pqual, pdt_str);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"mode_page_policy_descriptor_list");
}
decode_mode_policy_vpd(rp, len, op, jap);
@@ -2643,8 +2594,8 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
"%s]\n", pqual, pdt_str);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
- "scsi_ports_descriptor_list");
+ jap = sgj_named_subarray_r(jsp, jo2p,
+ "scsi_ports_descriptor_list");
}
decode_scsi_ports_vpd(rp, len, op, jap);
}
@@ -2718,29 +2669,34 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
"%s]\n", pqual, pdt_str);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
- "constituent_descriptor_list");
+ jap = sgj_named_subarray_r(jsp, jo2p,
+ "constituent_descriptor_list");
}
decode_dev_constit_vpd(rp, len, op, jap, recurse_vpd_decode);
}
return 0;
}
break;
- case VPD_POWER_CONSUMPTION: /* 0x8d */
- np = "Power consumption VPD page:";
+ case VPD_POWER_CONSUMPTION: /* 0x8d ["psm"] */
+ np = "Power consumption VPD page";
if (allow_name)
- printf("%s%s\n", pre, np);
+ sgj_pr_hr(jsp, "%s%s:\n", pre, np);
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
if (! allow_name && allow_if_found)
- printf("%s%s\n", pre, np);
+ sgj_pr_hr(jsp, "%s%s\n", pre, np);
if (op->do_raw)
dStrRaw(rp, len);
else {
if (vb || long_notquiet)
- printf(" [PQual=%d Peripheral device type: %s]\n",
- pqual, pdt_str);
- decode_power_consumption_vpd(rp, len, op->do_hex);
+ sgj_pr_hr(jsp, " [PQual=%d Peripheral device type: "
+ "%s]\n", pqual, pdt_str);
+ if (as_json) {
+ jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
+ jap = sgj_named_subarray_r(jsp, jo2p,
+ "power_consumption_descriptor_list");
+ }
+ decode_power_consumption(rp, len, op, jap);
}
return 0;
}
@@ -2820,7 +2776,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
"%s]\n", pqual, pdt_str);
if (as_json) {
jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
- jap = sgj_new_named_array(jsp, jo2p,
+ jap = sgj_named_subarray_r(jsp, jo2p,
"feature_set_code_list");
}
decode_feature_sets_vpd(rp, len, op, jap);
@@ -2831,31 +2787,51 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop,
case 0xb0: /* depends on pdt */
res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len);
if (0 == res) {
+ bool bl = false;
+ bool sad = false;
+ bool oi = false;
+
switch (pdt) {
case PDT_DISK: case PDT_WO: case PDT_OPTICAL: case PDT_ZBC:
- np = "Block limits VPD page (SBC):";
+ np = "Block limits VPD page";
+ ep = "(SBC)";
+ bl = true;
break;
case PDT_TAPE: case PDT_MCHANGER:
- np = "Sequential-access device capabilities VPD page (SSC):";
+ np = "Sequential-access device capabilities VPD page";
+ ep = "(SSC)";
+ sad = true;
break;
case PDT_OSD:
- np = "OSD information VPD page (OSD):";
+ np = "OSD information VPD page";
+ ep = "(OSD)";
+ oi = true;
break;
default:
np = NULL;
break;
}
if (NULL == np)
- printf("VPD page=0x%x, pdt=0x%x:\n", pn, pdt);
+ sgj_pr_hr(jsp, "VPD page=0x%x, pdt=0x%x:\n", pn, pdt);
else if (allow_name || allow_if_found)
- printf("%s%s\n", pre, np);
+ sgj_pr_hr(jsp, "%s%s %s\n", pre, np, ep ? ep : "");
if (op->do_raw)
dStrRaw(rp, len);
else {
if (vb || long_notquiet)
- printf(" [PQual=%d Peripheral device type: %s]\n",
- pqual, pdt_str);
- decode_b0_vpd(rp, len, op->do_hex, pdt);
+ sgj_pr_hr(jsp, " [PQual=%d Peripheral device type: "
+ "%s]\n", pqual, pdt_str);
+ if (as_json)
+ jo2p = sg_vpd_js_hdr(jsp, jop, np, rp);
+ if (bl)
+ decode_block_limits_vpd(rp, len, op, jo2p);
+ else if (sad) {
+ decode_b0_vpd(rp, len, op->do_hex, pdt);
+ } else if (oi) {
+ decode_b0_vpd(rp, len, op->do_hex, pdt);
+ } else {
+
+ }
}
return 0;
} else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) &&
@@ -3313,6 +3289,7 @@ main(int argc, char * argv[])
int c, res, matches;
int sg_fd = -1;
int inhex_len = 0;
+ int inraw_len = 0;
int ret = 0;
int subvalue = 0;
const char * cp;
@@ -3328,7 +3305,7 @@ main(int argc, char * argv[])
while (1) {
int option_index = 0;
- c = getopt_long(argc, argv, "aeEfhHiI:j::lm:M:p:qrvV", long_options,
+ c = getopt_long(argc, argv, "aeEfhHiI:j::lm:M:p:qQ:rvV", long_options,
&option_index);
if (c == -1)
break;
@@ -3414,6 +3391,9 @@ main(int argc, char * argv[])
case 'q':
op->do_quiet = true;
break;
+ case 'Q':
+ op->sinq_inraw_fn = optarg;
+ break;
case 'r':
++op->do_raw;
break;
@@ -3519,7 +3499,7 @@ main(int argc, char * argv[])
jsp = &op->json_st;
as_json = jsp->pr_as_json;
if (as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
if (op->page_str) {
if ('-' == op->page_str[0])
@@ -3611,6 +3591,20 @@ main(int argc, char * argv[])
ret = sg_convert_errno(ENOMEM);
goto fini;
}
+ if (op->sinq_inraw_fn) {
+ if ((ret = sg_f2hex_arr(op->sinq_inraw_fn, true, false, rsp_buff,
+ &inraw_len, rsp_buff_sz))) {
+ goto err_out;
+ }
+ if (inraw_len < 36) {
+ pr2serr("Unable to read 36 or more bytes from %s\n",
+ op->sinq_inraw_fn);
+ ret = SG_LIB_FILE_ERROR;
+ goto err_out;
+ }
+ memcpy(op->std_inq_a, rsp_buff, 36);
+ op->std_inq_a_valid = true;
+ }
if (op->inhex_fn) {
if (op->device_name) {
pr2serr("Cannot have both a DEVICE and --inhex= option\n");
@@ -3652,7 +3646,7 @@ main(int argc, char * argv[])
}
}
}
- } else if (NULL == op->device_name) {
+ } else if ((NULL == op->device_name) && (! op->std_inq_a_valid)) {
pr2serr("No DEVICE argument given\n\n");
usage();
ret = SG_LIB_SYNTAX_ERROR;
@@ -3696,6 +3690,19 @@ main(int argc, char * argv[])
}
ret = res;
goto err_out;
+ } else if (op->std_inq_a_valid && (NULL == op->device_name)) {
+ /* nothing else to do ... */
+ /* --sinq_inraw=RFN contents still in rsp_buff */
+ if (op->do_raw)
+ dStrRaw(rsp_buff, inraw_len);
+ else if (op->do_hex) {
+ if (! op->do_quiet && (op->do_hex < 3))
+ sgj_pr_hr(jsp, "Standard Inquiry data format:\n");
+ hex2stdout(rsp_buff, inraw_len, (1 == op->do_hex) ? 0 : -1);
+ } else
+ std_inq_decode(rsp_buff, inraw_len, op, jop);
+ ret = 0;
+ goto fini;
}
if ((sg_fd = sg_cmds_open_device(op->device_name, true /* ro */,
@@ -3753,7 +3760,7 @@ fini:
ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
if (as_json) {
if (0 == op->do_hex)
- sgj_pr2file(jsp, NULL, ret, stdout);
+ sgj_js2file(jsp, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;
diff --git a/src/sg_vpd_common.c b/src/sg_vpd_common.c
index 7f168c5b..111185a1 100644
--- a/src/sg_vpd_common.c
+++ b/src/sg_vpd_common.c
@@ -51,15 +51,15 @@ sg_vpd_js_hdr(sgj_state * jsp, sgj_opaque_p jop, const char * name,
int pqual = (vpd_hdrp[0] & 0xe0) >> 5;
int pn = vpd_hdrp[1];
const char * pdt_str;
- sgj_opaque_p jo2p = sgj_new_snake_named_object(jsp, jop, name);
+ sgj_opaque_p jo2p = sgj_snake_named_subobject_r(jsp, jop, name);
char d[64];
pdt_str = sg_get_pdt_str(pdt, sizeof(d), d);
- sgj_add_nv_ihexstr(jsp, jo2p, "peripheral_qualifier",
- pqual, NULL, pqual_str(pqual));
- sgj_add_nv_ihexstr(jsp, jo2p, "peripheral_device_type",
- pdt, NULL, pdt_str);
- sgj_add_nv_ihex(jsp, jo2p, "page_code", pn);
+ sgj_js_nv_ihexstr(jsp, jo2p, "peripheral_qualifier",
+ pqual, NULL, pqual_str(pqual));
+ sgj_js_nv_ihexstr(jsp, jo2p, "peripheral_device_type",
+ pdt, NULL, pdt_str);
+ sgj_js_nv_ihex(jsp, jo2p, "page_code", pn);
return jo2p;
}
@@ -128,14 +128,14 @@ decode_net_man_vpd(uint8_t * buff, int len, struct opts_t * op,
sgj_pr_hr(jsp, " %s, Service type: %s\n", assoc_str, nst_str);
na_len = sg_get_unaligned_be16(bp + 2);
if (jsp->pr_as_json) {
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_ihexstr(jsp, jo2p, "association", assoc, NULL,
- assoc_str);
- sgj_add_nv_ihexstr(jsp, jo2p, "service_type", nst, NULL,
- nst_str);
- sgj_add_nv_s_len(jsp, jo2p, "network_address",
- (const char *)(bp + 4), na_len);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_ihexstr(jsp, jo2p, "association", assoc, NULL,
+ assoc_str);
+ sgj_js_nv_ihexstr(jsp, jo2p, "service_type", nst, NULL,
+ nst_str);
+ sgj_js_nv_s_len(jsp, jo2p, "network_address",
+ (const char *)(bp + 4), na_len);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
if (na_len > 0) {
if (op->do_hex > 1) {
@@ -189,7 +189,7 @@ decode_x_inq_vpd(uint8_t * b, int len, bool protect, struct opts_t * op,
if (cp[0])
snprintf(d, dlen, " [%s]", cp);
sgj_pr_hr(jsp, " ACTIVATE_MICROCODE=%d%s\n", n, d);
- sgj_add_nv_ihexstr(jsp, jop, "activate_microcode", n, NULL, cp);
+ sgj_js_nv_ihexstr(jsp, jop, "activate_microcode", n, NULL, cp);
n = (b[4] >> 3) & 0x7;
if (protect) {
switch (n)
@@ -227,46 +227,50 @@ decode_x_inq_vpd(uint8_t * b, int len, bool protect, struct opts_t * op,
if (cp[0])
snprintf(d, dlen, " [%s]", cp);
sgj_pr_hr(jsp, " SPT=%d%s\n", n, d);
- sgj_add_nv_ihexstr_nex(jsp, jop, "spt", n, false, NULL,
- cp, "Supported Protection Type");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "GRD_CHK", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[4] & 0x4), "guard check");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "APP_CHK", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[4] & 0x2), "application tag check");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "REF_CHK", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[4] & 0x1), "reference tag check");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "UASK_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[5] & 0x20), "Unit Attention condition Sense "
- "Key specific data Supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "GROUP_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[5] & 0x10), "grouping function supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "PRIOR_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[5] & 0x8), "priority supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "HEADSUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[5] & 0x4), "head of queue supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "ORDSUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[5] & 0x2), "ordered (task attribute) "
- "supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "SIMPSUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[5] & 0x1), "simple (task attribute) "
- "supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "WU_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[6] & 0x8), "Write uncorrectable supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "CRD_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[6] & 0x4), "Correction disable supported "
- "(obsolete SPC-5)");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "NV_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[6] & 0x2), "Nonvolatile cache supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "V_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[6] & 0x1), "Volatile cache supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "NO_PI_CHK", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[7] & 0x20), "No protection information "
- "checking"); /* spc5r02 */
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "P_I_I_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[7] & 0x10), "Protection information "
- "interval supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "LUICLR", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[7] & 0x1), "Logical unit I_T nexus clear");
+ sgj_js_nv_ihexstr_nex(jsp, jop, "spt", n, false, NULL,
+ cp, "Supported Protection Type");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "GRD_CHK", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[4] & 0x4), false, "guard check");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "APP_CHK", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[4] & 0x2), false, "application tag check");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "REF_CHK", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[4] & 0x1), false, "reference tag check");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "UASK_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[5] & 0x20), false, "Unit Attention "
+ "condition Sense Key specific data Supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "GROUP_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[5] & 0x10), false, "grouping function "
+ "supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "PRIOR_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[5] & 0x8), false, "priority supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "HEADSUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[5] & 0x4), false, "head of queue supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "ORDSUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[5] & 0x2), false, "ordered (task attribute) "
+ "supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "SIMPSUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[5] & 0x1), false, "simple (task attribute) "
+ "supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "WU_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[6] & 0x8), false, "Write uncorrectable "
+ "supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "CRD_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[6] & 0x4), false, "Correction disable "
+ "supported (obsolete SPC-5)");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "NV_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[6] & 0x2), false, "Nonvolatile cache "
+ "supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "V_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[6] & 0x1), false, "Volatile cache supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "NO_PI_CHK", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[7] & 0x20), false, "No protection "
+ "information checking"); /* spc5r02 */
+ sgj_hr_js_vi_nex(jsp, jop, 2, "P_I_I_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[7] & 0x10), false, "Protection information "
+ "interval supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "LUICLR", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[7] & 0x1), false, "Logical unit I_T nexus "
+ "clear");
np = "LU_COLL_TYPE";
n = (b[8] >> 5) & 0x7;
nex_p = "Logical unit collection type";
@@ -285,85 +289,87 @@ decode_x_inq_vpd(uint8_t * b, int len, bool protect, struct opts_t * op,
cp = "reserved";
break;
}
- jo2p = sgj_pr_hr_js_subo(jsp, jop, 2, np, SGJ_SEP_EQUAL_NO_SPACE,
- n);
- sgj_add_nv_s(jsp, jo2p, "meaning", cp);
+ jo2p = sgj_hr_js_subo_r(jsp, jop, 2, np, SGJ_SEP_EQUAL_NO_SPACE,
+ n);
+ sgj_js_nv_s(jsp, jo2p, "meaning", cp);
if (jsp->pr_name_ex)
- sgj_add_nv_s(jsp, jo2p, "abbreviated_name_expansion", nex_p);
+ sgj_js_nv_s(jsp, jo2p, "abbreviated_name_expansion", nex_p);
} else
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, np, SGJ_SEP_EQUAL_NO_SPACE, n,
- nex_p);
-
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "R_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[8] & 0x10), "Referrals supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "RTD_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[8] & 0x8), "Revert to defaults supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "HSSRELEF", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[8] & 0x2),
- "History snapshots release effects");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "CBCS", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[8] & 0x1), "Capability-based command "
- "security (obsolete SPC-5)");
- sgj_pr_hr_js_vi(jsp, jop, 2, "Multi I_T nexus microcode download",
- SGJ_SEP_EQUAL_NO_SPACE, b[9] & 0xf);
- sgj_pr_hr_js_vi(jsp, jop, 2, "Extended self-test completion minutes",
- SGJ_SEP_EQUAL_NO_SPACE,
- sg_get_unaligned_be16(b + 10));
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "POA_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[12] & 0x80),
- "Power on activation supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "HRA_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[12] & 0x40),
- "Hard reset activation supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "VSA_SUP", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[12] & 0x20),
- "Vendor specific activation supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DMS_VALID", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[12] & 0x10),
- "Download microcode support byte valid");
- sgj_pr_hr_js_vi(jsp, jop, 2, "Maximum supported sense data length",
- SGJ_SEP_EQUAL_NO_SPACE, b[13]);
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "IBS", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[14] & 0x80), "Implicit bind supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "IAS", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[14] & 0x40),
- "Implicit affiliation supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "SAC", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[14] & 0x4),
- "Set affiliation command supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "NRD1", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[14] & 0x2),
- "No redirect one supported (BIND)");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "NRD0", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[14] & 0x1),
- "No redirect zero supported (BIND)");
- sgj_pr_hr_js_vi(jsp, jop, 2, "Maximum inquiry change logs",
- SGJ_SEP_EQUAL_NO_SPACE,
- sg_get_unaligned_be16(b + 15));
- sgj_pr_hr_js_vi(jsp, jop, 2, "Maximum mode page change logs",
- SGJ_SEP_EQUAL_NO_SPACE,
- sg_get_unaligned_be16(b + 17));
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_4", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x80),
- "Download microcode mode 4 supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_5", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x40),
- "Download microcode mode 5 supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_6", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x20),
- "Download microcode mode 6 supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_7", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x10),
- "Download microcode mode 7 supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_D", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x8),
- "Download microcode mode 0xd supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_E", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x4),
- "Download microcode mode 0xe supported");
- sgj_pr_hr_js_vi_nex(jsp, jop, 2, "DM_MD_F", SGJ_SEP_EQUAL_NO_SPACE,
- !!(b[19] & 0x2),
- "Download microcode mode 0xf supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, np, SGJ_SEP_EQUAL_NO_SPACE, n,
+ true, nex_p);
+
+ sgj_hr_js_vi_nex(jsp, jop, 2, "R_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[8] & 0x10), false, "Referrals supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "RTD_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[8] & 0x8), false,
+ "Revert to defaults supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "HSSRELEF", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[8] & 0x2), false,
+ "History snapshots release effects");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "CBCS", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[8] & 0x1), false, "Capability-based command "
+ "security (obsolete SPC-5)");
+ sgj_hr_js_vi(jsp, jop, 2, "Multi I_T nexus microcode download",
+ SGJ_SEP_EQUAL_NO_SPACE, b[9] & 0xf, true);
+ sgj_hr_js_vi(jsp, jop, 2, "Extended self-test completion minutes",
+ SGJ_SEP_EQUAL_NO_SPACE,
+ sg_get_unaligned_be16(b + 10), true);
+ sgj_hr_js_vi_nex(jsp, jop, 2, "POA_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[12] & 0x80), false,
+ "Power on activation supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "HRA_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[12] & 0x40), false,
+ "Hard reset activation supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "VSA_SUP", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[12] & 0x20), false,
+ "Vendor specific activation supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DMS_VALID", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[12] & 0x10), false,
+ "Download microcode support byte valid");
+ sgj_hr_js_vi(jsp, jop, 2, "Maximum supported sense data length",
+ SGJ_SEP_EQUAL_NO_SPACE, b[13], true);
+ sgj_hr_js_vi_nex(jsp, jop, 2, "IBS", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[14] & 0x80), false,
+ "Implicit bind supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "IAS", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[14] & 0x40), false,
+ "Implicit affiliation supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "SAC", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[14] & 0x4), false,
+ "Set affiliation command supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "NRD1", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[14] & 0x2), false,
+ "No redirect one supported (BIND)");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "NRD0", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[14] & 0x1), false,
+ "No redirect zero supported (BIND)");
+ sgj_hr_js_vi(jsp, jop, 2, "Maximum inquiry change logs",
+ SGJ_SEP_EQUAL_NO_SPACE,
+ sg_get_unaligned_be16(b + 15), true);
+ sgj_hr_js_vi(jsp, jop, 2, "Maximum mode page change logs",
+ SGJ_SEP_EQUAL_NO_SPACE,
+ sg_get_unaligned_be16(b + 17), true);
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_4", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x80), false,
+ "Download microcode mode 4 supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_5", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x40), false,
+ "Download microcode mode 5 supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_6", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x20), false,
+ "Download microcode mode 6 supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_7", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x10), false,
+ "Download microcode mode 7 supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_D", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x8), false,
+ "Download microcode mode 0xd supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_E", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x4), false,
+ "Download microcode mode 0xe supported");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "DM_MD_F", SGJ_SEP_EQUAL_NO_SPACE,
+ !!(b[19] & 0x2), false,
+ "Download microcode mode 0xf supported");
if (do_long_nq || (! jsp->pr_out_hr))
return;
}
@@ -423,9 +429,9 @@ decode_softw_inf_id(uint8_t * buff, int len, struct opts_t * op,
ieee_id = sg_get_unaligned_be48(buff + 0);
sgj_pr_hr(jsp, " IEEE identifier: 0x%" PRIx64 "\n", ieee_id);
if (jsp->pr_as_json) {
- jop = sgj_new_unattached_object(jsp);
- sgj_add_nv_ihex(jsp, jop, "ieee_identifier", ieee_id);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jop);
+ jop = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_ihex(jsp, jop, "ieee_identifier", ieee_id);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jop);
}
}
}
@@ -483,14 +489,14 @@ decode_mode_policy_vpd(uint8_t * buff, int len, struct opts_t * op,
sgj_pr_hr(jsp, " MLUS=%d, Policy: %s\n", !!(bp[2] & 0x80),
mode_page_policy_arr[bp[2] & 0x3]);
if (jsp->pr_as_json) {
- jo2p = sgj_new_unattached_object(jsp);
- sgj_add_nv_ihex(jsp, jo2p, "policy_page_code", ppc);
- sgj_add_nv_ihex(jsp, jo2p, "policy_subpage_code", pspc);
- sgj_add_nv_ihex_nex(jsp, jo2p, "mlus", !!(bp[2] & 0x80), false,
- "Multiple logical units share");
- sgj_add_nv_ihexstr(jsp, jo2p, "mode_page_policy", bp[2] & 0x3,
- NULL, mode_page_policy_arr[bp[2] & 0x3]);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_nv_ihex(jsp, jo2p, "policy_page_code", ppc);
+ sgj_js_nv_ihex(jsp, jo2p, "policy_subpage_code", pspc);
+ sgj_js_nv_ihex_nex(jsp, jo2p, "mlus", !!(bp[2] & 0x80), false,
+ "Multiple logical units share");
+ sgj_js_nv_ihexstr(jsp, jo2p, "mode_page_policy", bp[2] & 0x3,
+ NULL, mode_page_policy_arr[bp[2] & 0x3]);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
}
}
@@ -515,24 +521,30 @@ decode_power_condition(uint8_t * buff, int len, struct opts_t * op,
"Idle_a=%d\n", !!(buff[4] & 0x2), !!(buff[4] & 0x1),
!!(buff[5] & 0x4), !!(buff[5] & 0x2), !!(buff[5] & 0x1));
if (jsp->pr_as_json) {
- sgj_add_nv_ihex(jsp, jop, "standby_y", !!(buff[4] & 0x2));
- sgj_add_nv_ihex(jsp, jop, "standby_z", !!(buff[4] & 0x1));
- sgj_add_nv_ihex(jsp, jop, "idle_c", !!(buff[5] & 0x4));
- sgj_add_nv_ihex(jsp, jop, "idle_b", !!(buff[5] & 0x2));
- sgj_add_nv_ihex(jsp, jop, "idle_a", !!(buff[5] & 0x1));
- }
- sgj_pr_hr_js_vi(jsp, jop, 2, "Stopped condition recovery time (ms)",
- SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 6));
- sgj_pr_hr_js_vi(jsp, jop, 2, "Standby_z condition recovery time (ms)",
- SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 8));
- sgj_pr_hr_js_vi(jsp, jop, 2, "Standby_y condition recovery time (ms)",
- SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 10));
- sgj_pr_hr_js_vi(jsp, jop, 2, "Idle_a condition recovery time (ms)",
- SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 12));
- sgj_pr_hr_js_vi(jsp, jop, 2, "Idle_b condition recovery time (ms)",
- SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 14));
- sgj_pr_hr_js_vi(jsp, jop, 2, "Idle_c condition recovery time (ms)",
- SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 16));
+ sgj_js_nv_ihex(jsp, jop, "standby_y", !!(buff[4] & 0x2));
+ sgj_js_nv_ihex(jsp, jop, "standby_z", !!(buff[4] & 0x1));
+ sgj_js_nv_ihex(jsp, jop, "idle_c", !!(buff[5] & 0x4));
+ sgj_js_nv_ihex(jsp, jop, "idle_b", !!(buff[5] & 0x2));
+ sgj_js_nv_ihex(jsp, jop, "idle_a", !!(buff[5] & 0x1));
+ }
+ sgj_hr_js_vi_nex(jsp, jop, 2, "Stopped condition recovery time",
+ SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 6),
+ true, "unit: millisecond");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "Standby_z condition recovery time",
+ SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 8),
+ true, "unit: millisecond");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "Standby_y condition recovery time",
+ SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 10),
+ true, "unit: millisecond");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "Idle_a condition recovery time",
+ SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 12),
+ true, "unit: millisecond");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "Idle_b condition recovery time",
+ SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 14),
+ true, "unit: millisecond");
+ sgj_hr_js_vi_nex(jsp, jop, 2, "Idle_c condition recovery time",
+ SGJ_SEP_SPACE_1, sg_get_unaligned_be16(buff + 16),
+ true, "unit: millisecond");
}
int
@@ -553,9 +565,9 @@ filter_json_dev_ids(uint8_t * buff, int len, int m_assoc, struct opts_t * op,
" remaining response length=%d\n", (len - off));
return SG_LIB_CAT_MALFORMED;
}
- jo2p = sgj_new_unattached_object(jsp);
- sgj_pr_js_designation_descriptor(jsp, jo2p, bp, i_len + 4);
- sgj_add_nv_o(jsp, jap, NULL /* name */, jo2p);
+ jo2p = sgj_new_unattached_object_r(jsp);
+ sgj_js_designation_descriptor(jsp, jo2p, bp, i_len + 4);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
}
if (-2 == u) {
pr2serr("VPD page error: short designator around offset %d\n", off);
@@ -564,7 +576,7 @@ filter_json_dev_ids(uint8_t * buff, int len, int m_assoc, struct opts_t * op,
return 0;
}
-/* VPD_ATA_INFO 0x89 ['ai"] */
+/* VPD_ATA_INFO 0x89 ["ai"] */
void
decode_ata_info_vpd(const uint8_t * buff, int len, struct opts_t * op,
sgj_opaque_p jop)
@@ -644,15 +656,15 @@ decode_ata_info_vpd(const uint8_t * buff, int len, struct opts_t * op,
(unsigned int)cc);
if (jsp->pr_as_json) {
sgj_convert_to_snake_name(sat_vip, d, dlen);
- sgj_add_nv_s_len(jsp, jop, d, (const char *)(buff + 8), 8);
+ sgj_js_nv_s_len(jsp, jop, d, (const char *)(buff + 8), 8);
sgj_convert_to_snake_name(sat_pip, d, dlen);
- sgj_add_nv_s_len(jsp, jop, d, (const char *)(buff + 16), 16);
+ sgj_js_nv_s_len(jsp, jop, d, (const char *)(buff + 16), 16);
sgj_convert_to_snake_name(sat_prlp, d, dlen);
- sgj_add_nv_s_len(jsp, jop, d, (const char *)(buff + 32), 4);
- sgj_add_nv_hex_bytes(jsp, jop, "ata_device_signature", buff + 36, 20);
- sgj_add_nv_ihex(jsp, jop, "command_code", buff[56]);
- sgj_add_nv_s(jsp, jop, "ata_identify_device_data_example",
- "sg_vpd -p ai -HHH /dev/sdc | hdparm --Istdin");
+ sgj_js_nv_s_len(jsp, jop, d, (const char *)(buff + 32), 4);
+ sgj_js_nv_hex_bytes(jsp, jop, "ata_device_signature", buff + 36, 20);
+ sgj_js_nv_ihex(jsp, jop, "command_code", buff[56]);
+ sgj_js_nv_s(jsp, jop, "ata_identify_device_data_example",
+ "sg_vpd -p ai -HHH /dev/sdc | hdparm --Istdin");
}
if (len < 572)
return;
@@ -687,7 +699,7 @@ decode_feature_sets_vpd(uint8_t * buff, int len, struct opts_t * op,
len -= 8;
bp = buff + 8;
for (k = 0; k < len; k += bump, bp += bump) {
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
sf_code = sg_get_unaligned_be16(bp);
bump = 2;
if ((k + bump) > len) {
@@ -710,12 +722,12 @@ decode_feature_sets_vpd(uint8_t * buff, int len, struct opts_t * op,
(unsigned int)sf_code, found ? "true" : "false");
else
sgj_pr_hr(jsp, "%s\n", b);
- sgj_add_nv_ihexstr(jsp, jo2p, "feature_set_code", sf_code, NULL,
- d);
+ sgj_js_nv_ihexstr(jsp, jo2p, "feature_set_code", sf_code, NULL,
+ d);
if (jsp->verbose)
- sgj_add_nv_b(jsp, jo2p, "meaning_is_match", found);
+ sgj_js_nv_b(jsp, jo2p, "meaning_is_match", found);
}
- sgj_add_nv_o(jsp, jap, NULL, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL, jo2p);
}
}
@@ -752,13 +764,13 @@ decode_dev_constit_vpd(const uint8_t * buff, int len, struct opts_t * op,
len -= 4;
bp = buff + 4;
for (k = 0, j = 0; k < len; k += bump, bp += bump, ++j) {
- jo2p = sgj_new_unattached_object(jsp);
+ jo2p = sgj_new_unattached_object_r(jsp);
if (j > 0)
sgj_pr_hr(jsp, "\n");
sgj_pr_hr(jsp, " Constituent descriptor %d:\n", j + 1);
if ((k + 36) > len) {
pr2serr("short descriptor length=36, left=%d\n", (len - k));
- sgj_add_nv_o(jsp, jap, NULL, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL, jo2p);
return;
}
constit_type = sg_get_unaligned_be16(bp + 0);
@@ -778,18 +790,18 @@ decode_dev_constit_vpd(const uint8_t * buff, int len, struct opts_t * op,
sg_get_pdt_str(PDT_MASK & bp[2], dlen, d), bp[2]);
snprintf(b, blen, "%.8s", bp + 4);
sgj_pr_hr(jsp, " %s: %s\n", t10_vendor_id_hr, b);
- sgj_add_nv_s(jsp, jo2p, t10_vendor_id_js, b);
+ sgj_js_nv_s(jsp, jo2p, t10_vendor_id_js, b);
snprintf(b, blen, "%.16s", bp + 12);
sgj_pr_hr(jsp, " %s: %s\n", product_id_hr, b);
- sgj_add_nv_s(jsp, jo2p, product_id_js, b);
+ sgj_js_nv_s(jsp, jo2p, product_id_js, b);
snprintf(b, blen, "%.4s", bp + 28);
sgj_pr_hr(jsp, " %s: %s\n", product_rev_lev_hr, b);
- sgj_add_nv_s(jsp, jo2p, product_rev_lev_js, b);
+ sgj_js_nv_s(jsp, jo2p, product_rev_lev_js, b);
csd_len = sg_get_unaligned_be16(bp + 34);
bump = 36 + csd_len;
if ((k + bump) > len) {
pr2serr("short descriptor length=%d, left=%d\n", bump, (len - k));
- sgj_add_nv_o(jsp, jap, NULL, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL, jo2p);
return;
}
if (csd_len > 0) {
@@ -799,16 +811,16 @@ decode_dev_constit_vpd(const uint8_t * buff, int len, struct opts_t * op,
const uint8_t * cs_bp;
sgj_pr_hr(jsp, " Constituent specific descriptors:\n");
- ja2p = sgj_new_named_array(jsp, jo2p,
+ ja2p = sgj_named_subarray_r(jsp, jo2p,
"constituent_specific_descriptor_list");
for (m = 0, q = 0, cs_bp = bp + 36; m < csd_len;
m += cs_bump, ++q, cs_bp += cs_bump) {
- jo3p = sgj_new_unattached_object(jsp);
+ jo3p = sgj_new_unattached_object_r(jsp);
cs_type = cs_bp[0];
cs_len = sg_get_unaligned_be16(cs_bp + 2);
cs_bump = cs_len + 4;
- sgj_add_nv_ihex(jsp, jo3p, "constituent_specific_type",
- cs_type);
+ sgj_js_nv_ihex(jsp, jo3p, "constituent_specific_type",
+ cs_type);
if (1 == cs_type) { /* VPD page */
int off = cs_bp + 4 - buff;
@@ -828,16 +840,16 @@ decode_dev_constit_vpd(const uint8_t * buff, int len, struct opts_t * op,
sgj_pr_hr(jsp, " Reserved [0x%x] specific "
"data (in hex):\n", cs_type);
if (jsp->pr_as_json)
- sgj_add_nv_hex_bytes(jsp, jo3p,
- "constituent_specific_data_hex",
- cs_bp + 4, cs_len);
+ sgj_js_nv_hex_bytes(jsp, jo3p,
+ "constituent_specific_data_hex",
+ cs_bp + 4, cs_len);
else
hex2stdout(cs_bp + 4, cs_len, 0 /* plus ASCII */);
}
- sgj_add_nv_o(jsp, ja2p, NULL, jo3p);
+ sgj_js_nv_o(jsp, ja2p, NULL, jo3p);
} /* end of Constituent specific descriptor loop */
}
- sgj_add_nv_o(jsp, jap, NULL, jo2p);
+ sgj_js_nv_o(jsp, jap, NULL, jo2p);
} /* end Constituent descriptor loop */
}
@@ -907,66 +919,334 @@ std_inq_decode_js(const uint8_t * b, int len, struct opts_t * op,
char c[256];
static const int clen = sizeof(c);
- jo2p = sgj_new_named_object(jsp, jop, "standard_inquiry_data_format");
- sgj_add_nv_ihexstr(jsp, jo2p, "peripheral_qualifier", pqual, NULL,
- pqual_str(pqual));
- sgj_add_nv_ihexstr(jsp, jo2p, "peripheral_device_type", pdt, NULL,
- sg_get_pdt_str(pdt, clen, c));
- sgj_add_nv_ihex_nex(jsp, jo2p, "rmb", !!(b[1] & 0x80), false,
- "Removable Medium Bit");
- sgj_add_nv_ihex_nex(jsp, jo2p, "lu_cong", !!(b[1] & 0x40), false,
- "Logical Unit Conglomerate");
- sgj_add_nv_ihexstr(jsp, jo2p, "hot_pluggable", hp, NULL,
- hot_pluggable_str(hp));
+ jo2p = sgj_named_subobject_r(jsp, jop, "standard_inquiry_data_format");
+ sgj_js_nv_ihexstr(jsp, jo2p, "peripheral_qualifier", pqual, NULL,
+ pqual_str(pqual));
+ sgj_js_nv_ihexstr(jsp, jo2p, "peripheral_device_type", pdt, NULL,
+ sg_get_pdt_str(pdt, clen, c));
+ sgj_js_nv_ihex_nex(jsp, jo2p, "rmb", !!(b[1] & 0x80), false,
+ "Removable Medium Bit");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "lu_cong", !!(b[1] & 0x40), false,
+ "Logical Unit Conglomerate");
+ sgj_js_nv_ihexstr(jsp, jo2p, "hot_pluggable", hp, NULL,
+ hot_pluggable_str(hp));
snprintf(c, clen, "%s", (ver > 0xf) ? "old or reserved version code" :
sg_ansi_version_arr[ver]);
- sgj_add_nv_ihexstr(jsp, jo2p, "version", ver, NULL, c);
- sgj_add_nv_ihex_nex(jsp, jo2p, "aerc", !!(b[3] & 0x80), false,
- "Asynchronous Event Reporting Capability (obsolete "
- "SPC-3)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "trmtsk", !!(b[3] & 0x40), false,
- "Terminate Task (obsolete SPC-2)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "normaca", !!(b[3] & 0x20), false,
- "Normal ACA (Auto Contingent Allegiance)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "hisup", !!(b[3] & 0x10), false,
- "Hierarchial Support");
- sgj_add_nv_ihex(jsp, jo2p, "response_data_format", b[3] & 0xf);
- sgj_add_nv_ihex_nex(jsp, jo2p, "sccs", !!(b[5] & 0x80), false,
- "SCC (SCSI Storage Commands) Supported");
- sgj_add_nv_ihex_nex(jsp, jo2p, "acc", !!(b[5] & 0x40), false,
- "Access Commands Coordinator (obsolete SPC-5)");
+ sgj_js_nv_ihexstr(jsp, jo2p, "version", ver, NULL, c);
+ sgj_js_nv_ihex_nex(jsp, jo2p, "aerc", !!(b[3] & 0x80), false,
+ "Asynchronous Event Reporting Capability (obsolete "
+ "SPC-3)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "trmtsk", !!(b[3] & 0x40), false,
+ "Terminate Task (obsolete SPC-2)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "normaca", !!(b[3] & 0x20), false,
+ "Normal ACA (Auto Contingent Allegiance)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "hisup", !!(b[3] & 0x10), false,
+ "Hierarchial Support");
+ sgj_js_nv_ihex(jsp, jo2p, "response_data_format", b[3] & 0xf);
+ sgj_js_nv_ihex_nex(jsp, jo2p, "sccs", !!(b[5] & 0x80), false,
+ "SCC (SCSI Storage Commands) Supported");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "acc", !!(b[5] & 0x40), false,
+ "Access Commands Coordinator (obsolete SPC-5)");
tpgs = (b[5] >> 4) & 0x3;
- sgj_add_nv_ihexstr_nex(jsp, jo2p, "tpgs", tpgs, false, NULL,
- tpgs_str(tpgs), "Target Port Group Support");
- sgj_add_nv_ihex_nex(jsp, jo2p, "3pc", !!(b[5] & 0x8), false,
- "Third Party Copy");
- sgj_add_nv_ihex(jsp, jo2p, "protect", !!(b[5] & 0x1));
+ sgj_js_nv_ihexstr_nex(jsp, jo2p, "tpgs", tpgs, false, NULL,
+ tpgs_str(tpgs), "Target Port Group Support");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "3pc", !!(b[5] & 0x8), false,
+ "Third Party Copy");
+ sgj_js_nv_ihex(jsp, jo2p, "protect", !!(b[5] & 0x1));
/* Skip SPI specific flags which have been obsolete for a while) */
- sgj_add_nv_ihex_nex(jsp, jo2p, "bque", !!(b[6] & 0x80), false,
- "Basic task management model (obsolete SPC-4)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "encserv", !!(b[6] & 0x40), false,
- "Enclousure Services supported");
- sgj_add_nv_ihex_nex(jsp, jo2p, "multip", !!(b[6] & 0x10), false,
- "Multiple SCSI port");
- sgj_add_nv_ihex_nex(jsp, jo2p, "mchngr", !!(b[6] & 0x8), false,
- "Medium changer (obsolete SPC-4)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "reladr", !!(b[7] & 0x80), false,
- "Relative Addressing (obsolete in SPC-4)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "linked", !!(b[7] & 0x8), false,
- "Linked Commands (obsolete in SPC-4)");
- sgj_add_nv_ihex_nex(jsp, jo2p, "cmdque", !!(b[7] & 0x2), false,
- "Command Management Model (command queuing)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "bque", !!(b[6] & 0x80), false,
+ "Basic task management model (obsolete SPC-4)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "encserv", !!(b[6] & 0x40), false,
+ "Enclousure Services supported");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "multip", !!(b[6] & 0x10), false,
+ "Multiple SCSI port");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "mchngr", !!(b[6] & 0x8), false,
+ "Medium changer (obsolete SPC-4)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "reladr", !!(b[7] & 0x80), false,
+ "Relative Addressing (obsolete in SPC-4)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "linked", !!(b[7] & 0x8), false,
+ "Linked Commands (obsolete in SPC-4)");
+ sgj_js_nv_ihex_nex(jsp, jo2p, "cmdque", !!(b[7] & 0x2), false,
+ "Command Management Model (command queuing)");
if (len < 16)
return jo2p;
snprintf(c, clen, "%.8s", b + 8);
- sgj_add_nv_s(jsp, jo2p, t10_vendor_id_js, c);
+ sgj_js_nv_s(jsp, jo2p, t10_vendor_id_js, c);
if (len < 32)
return jo2p;
snprintf(c, clen, "%.16s", b + 16);
- sgj_add_nv_s(jsp, jo2p, product_id_js, c);
+ sgj_js_nv_s(jsp, jo2p, product_id_js, c);
if (len < 36)
return jo2p;
snprintf(c, clen, "%.4s", b + 32);
- sgj_add_nv_s(jsp, jo2p, product_rev_lev_js, c);
+ sgj_js_nv_s(jsp, jo2p, product_rev_lev_js, c);
return jo2p;
}
+
+static const char * power_unit_arr[] =
+{
+ "Gigawatts",
+ "Megawatts",
+ "Kilowatts",
+ "Watts",
+ "Milliwatts",
+ "Microwatts",
+ "Unit reserved",
+ "Unit reserved",
+};
+
+/* VPD_POWER_CONSUMPTION 0x8d ["psm"] */
+void
+decode_power_consumption(uint8_t * buff, int len, struct opts_t * op,
+ sgj_opaque_p jap)
+{
+ int k, bump, pcmp_id, pcmp_unit;
+ unsigned int pcmp_val;
+ sgj_state * jsp = &op->json_st;
+ sgj_opaque_p jo2p;
+ uint8_t * bp;
+ char b[128];
+ static const int blen = sizeof(b);
+ static const char * pcmp = "power_consumption";
+ static const char * pci = "Power consumption identifier";
+ static const char * mpc = "Maximum power consumption";
+
+ if ((1 == op->do_hex) || (op->do_hex > 2)) {
+ hex2stdout(buff, len, (1 == op->do_hex) ? 1 : -1);
+ return;
+ }
+ if (len < 4) {
+ pr2serr("length too short=%d\n", len);
+ return;
+ }
+ len -= 4;
+ bp = buff + 4;
+ for (k = 0; k < len; k += bump, bp += bump) {
+ bump = 4;
+ if ((k + bump) > len) {
+ pr2serr("short descriptor length=%d, left=%d\n", bump,
+ (len - k));
+ return;
+ }
+ if (op->do_hex > 1)
+ hex2stdout(bp, 4, 1);
+ else {
+ jo2p = sgj_new_unattached_object_r(jsp);
+ pcmp_id = bp[0];
+ pcmp_unit = 0x7 & bp[1];
+ pcmp_val = sg_get_unaligned_be16(bp + 2);
+ if (jsp->pr_as_json) {
+ sgj_convert_to_snake_name(pci, b, blen);
+ sgj_js_nv_ihex(jsp, jo2p, b, pcmp_id);
+ snprintf(b, blen, "%s_units", pcmp);
+ sgj_js_nv_ihexstr(jsp, jo2p, b, pcmp_unit, NULL,
+ power_unit_arr[pcmp_unit]);
+ snprintf(b, blen, "%s_value", pcmp);
+ sgj_js_nv_ihex(jsp, jo2p, b, pcmp_val);
+ }
+ snprintf(b, blen, " %s: 0x%x", pci, pcmp_id);
+ if (pcmp_val >= 1000 && pcmp_unit > 0)
+ sgj_pr_hr(jsp, "%s %s: %d.%03d %s\n", b, mpc,
+ pcmp_val / 1000, pcmp_val % 1000,
+ power_unit_arr[pcmp_unit - 1]); /* up one unit */
+ else
+ sgj_pr_hr(jsp, "%s %s: %u %s\n", b, mpc, pcmp_val,
+ power_unit_arr[pcmp_unit]);
+ sgj_js_nv_o(jsp, jap, NULL /* name */, jo2p);
+ }
+ }
+}
+
+/* VPD_BLOCK_LIMITS 0xb0 ["bl"] */
+void
+decode_block_limits_vpd(const uint8_t * buff, int len, struct opts_t * op,
+ sgj_opaque_p jop)
+{
+ int wsnz, ugavalid;
+ uint32_t u;
+ uint64_t ull;
+ sgj_state * jsp = &op->json_st;
+ char b[144];
+ static const int blen = sizeof(b);
+ static const char * mcawl = "Maximum compare and write length";
+ static const char * otlg = "Optimal transfer length granularity";
+ static const char * cni = "command not implemented";
+ static const char * nr = "not reported";
+ static const char * ul = "unlimited";
+ static const char * mtl = "Maximum transfer length";
+ static const char * otl = "Optimal transfer length";
+ static const char * mpl = "Maximum prefetch length";
+ static const char * mulc = "Maximum unmap LBA count";
+ static const char * mubdc = "Maximum unmap block descriptor count";
+ static const char * oug = "Optimal unmap granularity";
+ static const char * ugav = "Unmap granularity alignment valid";
+ static const char * uga = "Unmap granularity alignment";
+ static const char * mwsl = "Maximum write same length";
+ static const char * matl = "Maximum atomic transfer length";
+ static const char * aa = "Atomic alignment";
+ static const char * atlg = "Atomic transfer length granularity";
+ static const char * matlwab = "Maximum atomic transfer length with "
+ "atomic boundary";
+ static const char * mabs = "Maximum atomic boundary size";
+
+ if (len < 16) {
+ pr2serr("page length too short=%d\n", len);
+ return;
+ }
+ wsnz = !!(buff[4] & 0x1);
+ sgj_pr_hr(jsp, " Write same non-zero (WSNZ): %d\n", wsnz);
+ sgj_js_nv_ihex_nex(jsp, jop, "wsnz", wsnz, false,
+ "Write Same Non-Zero (number of LBs must be > 0)");
+ u = buff[5];
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", mcawl, cni);
+ sgj_convert_to_snake_name(mcawl, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, cni);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, mcawl, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+
+ u = sg_get_unaligned_be16(buff + 6);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", otlg, nr);
+ sgj_convert_to_snake_name(otlg, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, otlg, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+
+ u = sg_get_unaligned_be32(buff + 8);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", mtl, nr);
+ sgj_convert_to_snake_name(mtl, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, mtl, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+
+ u = sg_get_unaligned_be32(buff + 12);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", otl, nr);
+ sgj_convert_to_snake_name(otl, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, otl, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+ if (len > 19) { /* added in sbc3r09 */
+ u = sg_get_unaligned_be32(buff + 16);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", mpl, nr);
+ sgj_convert_to_snake_name(mpl, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, mpl, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+ }
+ if (len > 27) { /* added in sbc3r18 */
+ u = sg_get_unaligned_be32(buff + 20);
+ sgj_convert_to_snake_name(mulc, b, blen);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", mulc, cni);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, cni);
+ } else if (0xffffffff == u) {
+ sgj_pr_hr(jsp, " %s: %s blocks\n", ul, mulc);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, ul);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, mulc, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+
+ u = sg_get_unaligned_be32(buff + 24);
+ sgj_convert_to_snake_name(mulc, b, blen);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 block descriptors [%s]\n", mubdc, cni);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, cni);
+ } else if (0xffffffff == u) {
+ sgj_pr_hr(jsp, " %s: %s block descriptors\n", ul, mubdc);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, ul);
+ } else
+ sgj_hr_js_vi(jsp, jop, 2, mubdc, SGJ_SEP_COLON_1_SPACE,
+ u, true);
+ }
+ if (len > 35) { /* added in sbc3r19 */
+ u = sg_get_unaligned_be32(buff + 28);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", oug, nr);
+ sgj_convert_to_snake_name(oug, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, oug, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+
+ ugavalid = !!(buff[32] & 0x80);
+ sgj_pr_hr(jsp, " %s: %s\n", ugav, ugavalid ? "true" : "false");
+ sgj_js_nv_i(jsp, jop, ugav, ugavalid);
+ if (ugavalid) {
+ u = 0x7fffffff & sg_get_unaligned_be32(buff + 32);
+ sgj_hr_js_vi_nex(jsp, jop, 2, uga, SGJ_SEP_COLON_1_SPACE, u,
+ true, "unit: LB");
+ }
+ }
+ if (len > 43) { /* added in sbc3r26 */
+ ull = sg_get_unaligned_be64(buff + 36);
+ if (0 == ull) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", mwsl, nr);
+ sgj_convert_to_snake_name(mwsl, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, ull, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, mwsl, SGJ_SEP_COLON_1_SPACE,
+ ull, true, "unit: LB");
+ }
+ if (len > 47) { /* added in sbc4r02 */
+ u = sg_get_unaligned_be32(buff + 44);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", matl, nr);
+ sgj_convert_to_snake_name(matl, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, matl, SGJ_SEP_COLON_1_SPACE,
+ u, true, "unit: LB");
+
+ u = sg_get_unaligned_be32(buff + 48);
+ if (0 == u) {
+ static const char * uawp = "unaligned atomic writes permitted";
+
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", aa, uawp);
+ sgj_convert_to_snake_name(aa, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, uawp);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, aa, SGJ_SEP_COLON_1_SPACE,
+ u, true, "unit: LB");
+
+ u = sg_get_unaligned_be32(buff + 52);
+ if (0 == u) {
+ static const char * ngr = "no granularity requirement";
+
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", atlg, ngr);
+ sgj_convert_to_snake_name(atlg, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, ngr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, aa, SGJ_SEP_COLON_1_SPACE,
+ u, true, "unit: LB");
+ }
+ if (len > 56) {
+ u = sg_get_unaligned_be32(buff + 56);
+ if (0 == u) {
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", matlwab, nr);
+ sgj_convert_to_snake_name(matlwab, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, nr);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, matlwab, SGJ_SEP_COLON_1_SPACE,
+ u, true, "unit: LB");
+
+ u = sg_get_unaligned_be32(buff + 60);
+ if (0 == u) {
+ static const char * cowa1b = "can only write atomic 1 block";
+
+ sgj_pr_hr(jsp, " %s: 0 blocks [%s]\n", mabs, cowa1b);
+ sgj_convert_to_snake_name(mabs, b, blen);
+ sgj_js_nv_ihexstr(jsp, jop, b, u, NULL, cowa1b);
+ } else
+ sgj_hr_js_vi_nex(jsp, jop, 2, mabs, SGJ_SEP_COLON_1_SPACE,
+ u, true, "unit: LB");
+ }
+}
diff --git a/src/sg_vpd_common.h b/src/sg_vpd_common.h
index 7cb56293..3f182664 100644
--- a/src/sg_vpd_common.h
+++ b/src/sg_vpd_common.h
@@ -87,6 +87,7 @@ struct opts_t {
bool verbose_given; /* sg_inq + sg_vpd */
bool version_given; /* sg_inq + sg_vpd */
bool do_vpd; /* sg_inq */
+ bool std_inq_a_valid; /* sg_inq + sg_vpd */
#ifdef SG_SCSI_STRINGS
bool opt_new; /* sg_inq */
#endif
@@ -108,8 +109,10 @@ struct opts_t {
const char * device_name; /* sg_inq + sg_vpd */
const char * page_str; /* sg_inq + sg_vpd */
const char * inhex_fn; /* sg_inq + sg_vpd */
+ const char * sinq_inraw_fn; /* sg_inq + sg_vpd */
const char * vend_prod; /* sg_vpd */
sgj_state json_st;
+ uint8_t std_inq_a[36];
};
struct svpd_values_name_t {
@@ -147,6 +150,10 @@ void decode_dev_constit_vpd(const uint8_t * buff, int len,
recurse_vpd_decodep fp);
sgj_opaque_p std_inq_decode_js(const uint8_t * b, int len,
struct opts_t * op, sgj_opaque_p jop);
+void decode_power_consumption(uint8_t * buff, int len,
+ struct opts_t * op, sgj_opaque_p jap);
+void decode_block_limits_vpd(const uint8_t * buff, int len,
+ struct opts_t * op, sgj_opaque_p jop);
const char * pqual_str(int pqual);
void svpd_enumerate_vendor(int vend_prod_num);
diff --git a/testing/sg_tst_json_builder.c b/testing/sg_tst_json_builder.c
index d48e8cfe..0637e30b 100644
--- a/testing/sg_tst_json_builder.c
+++ b/testing/sg_tst_json_builder.c
@@ -53,7 +53,7 @@ main(int argc, char * argv[])
char b[8192];
sgj_init_state(jstp, NULL);
- jvp = sgj_start(MY_NAME, "0.02 20220503", argc, argv, jstp);
+ jvp = sgj_start_r(MY_NAME, "0.02 20220503", argc, argv, jstp);
jv1p = json_object_push(jvp, "contents", jsp);
if (jvp == jv1p)
diff --git a/testing/tst_sg_lib.c b/testing/tst_sg_lib.c
index e3cba30a..b65bdef1 100644
--- a/testing/tst_sg_lib.c
+++ b/testing/tst_sg_lib.c
@@ -44,7 +44,7 @@
* related to snprintf().
*/
-static const char * version_str = "1.16 20220710";
+static const char * version_str = "1.17 20220717";
#define MY_NAME "tst_sg_lib"
@@ -317,7 +317,7 @@ main(int argc, char * argv[])
as_json = json_st.pr_as_json;
if (as_json)
- jop = sgj_start(MY_NAME, version_str, argc, argv, jsp);
+ jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp);
if (do_exit_status) {
++did_something;
@@ -356,9 +356,9 @@ main(int argc, char * argv[])
if (do_sense ) {
++did_something;
if (as_json) {
- jo2p = sgj_new_named_object(jsp, jop, "desc_sense_data__test1");
- sgj_pr_js_sense(jsp, jo2p, desc_sense_data1,
- (int)sizeof(desc_sense_data1));
+ jo2p = sgj_named_subobject_r(jsp, jop, "desc_sense_data__test1");
+ sgj_js_sense(jsp, jo2p, desc_sense_data1,
+ (int)sizeof(desc_sense_data1));
} else {
printf("desc_sense_data test1:\n");
sg_print_sense(leadin, desc_sense_data1,
@@ -367,10 +367,10 @@ main(int argc, char * argv[])
}
#if 1
if (as_json) {
- sgj_pr_str_out_hr(jsp, "sg_get_sense_str(ds_data1)", 999);
+ sgj_js_str_out(jsp, "sg_get_sense_str(ds_data1)", 999);
sg_get_sense_str(leadin, desc_sense_data1,
sizeof(desc_sense_data1), vb, b_len, b);
- sgj_pr_str_out_hr(jsp, b, strlen(b));
+ sgj_js_str_out(jsp, b, strlen(b));
} else {
printf("sg_get_sense_str(ds_data1):\n");
@@ -382,9 +382,9 @@ main(int argc, char * argv[])
}
#endif
if (as_json) {
- jo2p = sgj_new_named_object(jsp, jop, "desc_sense_data__test2");
- sgj_pr_js_sense(jsp, jo2p, desc_sense_data2,
- (int)sizeof(desc_sense_data2));
+ jo2p = sgj_named_subobject_r(jsp, jop, "desc_sense_data__test2");
+ sgj_js_sense(jsp, jo2p, desc_sense_data2,
+ (int)sizeof(desc_sense_data2));
} else {
printf("desc_sense_data test2\n");
sg_print_sense(leadin, desc_sense_data2,
@@ -392,9 +392,9 @@ main(int argc, char * argv[])
printf("\n");
}
if (as_json) {
- jo2p = sgj_new_named_object(jsp, jop,
- "desc_sense_block_combo_test3");
- sgj_pr_js_sense(jsp, jo2p, desc_sense_data3,
+ jo2p = sgj_named_subobject_r(jsp, jop,
+ "desc_sense_block_combo_test3");
+ sgj_js_sense(jsp, jo2p, desc_sense_data3,
(int)sizeof(desc_sense_data3));
} else {
printf("desc_sense block dev combo plus designator test3\n");
@@ -403,10 +403,10 @@ main(int argc, char * argv[])
printf("\n");
}
if (as_json) {
- jo2p = sgj_new_named_object(jsp, jop,
- "desc_sense_forwarded_sense_test4");
- sgj_pr_js_sense(jsp, jo2p, desc_sense_data4,
- (int)sizeof(desc_sense_data4));
+ jo2p = sgj_named_subobject_r(jsp, jop,
+ "desc_sense_forwarded_sense_test4");
+ sgj_js_sense(jsp, jo2p, desc_sense_data4,
+ (int)sizeof(desc_sense_data4));
} else {
printf("desc_sense forwarded sense test4\n");
sg_print_sense(leadin, desc_sense_data4,
@@ -414,10 +414,10 @@ main(int argc, char * argv[])
printf("\n");
}
if (as_json) {
- jo2p = sgj_new_named_object(jsp, jop,
- "desc_sense_ata_info_test5");
- sgj_pr_js_sense(jsp, jo2p, desc_sense_data5,
- (int)sizeof(desc_sense_data5));
+ jo2p = sgj_named_subobject_r(jsp, jop,
+ "desc_sense_ata_info_test5");
+ sgj_js_sense(jsp, jo2p, desc_sense_data5,
+ (int)sizeof(desc_sense_data5));
} else {
printf("desc_sense ATA Info test5\n");
sg_print_sense(leadin, desc_sense_data5,
@@ -425,10 +425,10 @@ main(int argc, char * argv[])
printf("\n");
}
if (as_json) {
- jo2p = sgj_new_named_object(jsp, jop,
- "desc_sense_ua_binding_test6");
- sgj_pr_js_sense(jsp, jo2p, desc_sense_data6,
- (int)sizeof(desc_sense_data6));
+ jo2p = sgj_named_subobject_r(jsp, jop,
+ "desc_sense_ua_binding_test6");
+ sgj_js_sense(jsp, jo2p, desc_sense_data6,
+ (int)sizeof(desc_sense_data6));
} else {
printf("desc_sense UA subsidiary binding changed test6\n");
sg_print_sense(leadin, desc_sense_data6,
@@ -727,7 +727,7 @@ main(int argc, char * argv[])
ret = (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
if (as_json) {
if (0 == do_hex2)
- sgj_pr2file(jsp, NULL, ret, stdout);
+ sgj_js2file(jsp, NULL, ret, stdout);
sgj_finish(jsp);
}
return ret;