diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/sg_dd.c | 14 | ||||
-rw-r--r-- | src/sg_inq.c | 118 | ||||
-rw-r--r-- | src/sg_prevent.c | 8 | ||||
-rw-r--r-- | src/sg_vpd.c | 74 | ||||
-rw-r--r-- | src/sg_vpd_common.c | 20 |
5 files changed, 140 insertions, 94 deletions
diff --git a/src/sg_dd.c b/src/sg_dd.c index 8392f31d..e099c335 100644 --- a/src/sg_dd.c +++ b/src/sg_dd.c @@ -70,7 +70,7 @@ #include "sg_unaligned.h" #include "sg_pr2serr.h" -static const char * version_str = "6.34 20220729"; +static const char * version_str = "6.35 20220826"; #define ME "sg_dd: " @@ -214,16 +214,16 @@ static void calc_duration_throughput(bool contin); static void -install_handler(int sig_num, void (*sig_handler) (int sig)) +install_handler(int sig_num, void (*sig_handler)(int sig)) { struct sigaction sigact; - sigaction (sig_num, NULL, &sigact); - if (sigact.sa_handler != SIG_IGN) - { + + sigaction(sig_num, NULL, &sigact); + if (sigact.sa_handler != SIG_IGN) { sigact.sa_handler = sig_handler; - sigemptyset (&sigact.sa_mask); + sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; - sigaction (sig_num, &sigact, NULL); + sigaction(sig_num, &sigact, NULL); } } diff --git a/src/sg_inq.c b/src/sg_inq.c index 47834743..edd571c7 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.28 20220818"; /* spc6r06, sbc5r03 */ +static const char * version_str = "2.30 20220904"; /* spc6r06, sbc5r03 */ #define MY_NAME "sg_inq" @@ -1071,6 +1071,7 @@ svpd_inhex_decode_all(struct opts_t * op, sgj_opaque_p jop) int bump, off; int in_len = op->maxlen; int prev_pn = -1; + sgj_state * jsp = &op->json_st; uint8_t vpd0_buff[512]; uint8_t * rp = vpd0_buff; @@ -1105,12 +1106,17 @@ svpd_inhex_decode_all(struct opts_t * op, sgj_opaque_p jop) "max_pn=0x%x\n", __func__, pn, max_pn); continue; } - if (op->do_long) - printf("[0x%x] ", pn); + if (op->do_long) { + if (jsp->pr_as_json) + sgj_pr_hr(jsp, "[0x%x]:\n", pn); + else + sgj_pr_hr(jsp, "[0x%x] ", pn); + } res = vpd_decode(-1, op, jop, off); if (SG_LIB_CAT_OTHER == res) { - ; // xxxxx + if (op->verbose) + pr2serr("Can't decode VPD page=0x%x\n", pn); } } return res; @@ -1204,6 +1210,7 @@ decode_ascii_inf(uint8_t * buff, int len, struct opts_t * op) int al, k, bump; uint8_t * bp; uint8_t * p; + sgj_state * jsp = &op->json_st; if (op->do_hex) { hex2stdout(buff, len, no_ascii_4hex(op)); @@ -1221,15 +1228,15 @@ decode_ascii_inf(uint8_t * buff, int len, struct opts_t * op) for (k = 0, bp = buff + 5; k < al; k += bump, bp += bump) { p = (uint8_t *)memchr(bp, 0, al - k); if (! p) { - printf(" %.*s\n", al - k, (const char *)bp); + sgj_pr_hr(jsp, " %.*s\n", al - k, (const char *)bp); break; } - printf(" %s\n", (const char *)bp); + sgj_pr_hr(jsp, " %s\n", (const char *)bp); bump = (p - bp) + 1; } bp = buff + 5 + al; if (bp < (buff + len)) { - printf("Vendor specific information in hex:\n"); + sgj_pr_hr(jsp, "Vendor specific information in hex:\n"); hex2stdout(bp, len - (al + 5), 0); } } @@ -1688,6 +1695,8 @@ decode_dev_ids(const char * leadin, uint8_t * buff, int len, pr2serr("%s VPD page error: around offset=%d\n", leadin, off); } +/* The --export and --json options are assumed to be mutually exclusive. + * Here the former takes precedence. */ static void export_dev_ids(uint8_t * buff, int len, int verbose) { @@ -2128,9 +2137,15 @@ static const char * failover_mode_arr[] = }; static void -decode_upr_vpd_c0_emc(uint8_t * buff, int len, struct opts_t * op) +decode_upr_vpd_c0_emc(uint8_t * buff, int len, struct opts_t * op, + sgj_opaque_p jop) { - int k, ip_mgmt, vpp80, lun_z; + uint8_t uc; + int k, n, ip_mgmt, vpp80, lun_z; + sgj_state * jsp = &op->json_st; + const char * cp; + char b[256]; + static const int blen = sizeof(b); if (len < 3) { pr2serr("EMC upr VPD page [0xc0]: length too short=%d\n", len); @@ -2145,50 +2160,64 @@ decode_upr_vpd_c0_emc(uint8_t * buff, int len, struct opts_t * op) buff[9]); return; } - printf(" LUN WWN: "); - for (k = 0; k < 16; ++k) - printf("%02x", buff[10 + k]); - printf("\n"); - printf(" Array Serial Number: "); - dStrRaw((const char *)&buff[50], buff[49]); - printf("\n"); + for (k = 0, n = 0; k < 16; ++k) + n += sg_scnpr(b + n, blen - n, "%02x", buff[10 + k]); + sgj_haj_vs(jsp, jop, 2, "LUN WWN", SGJ_SEP_COLON_1_SPACE, b); + snprintf(b, blen, "%.*s", buff[49], buff + 50); + sgj_haj_vs(jsp, jop, 2, "Array Serial Number", SGJ_SEP_COLON_1_SPACE, b); - printf(" LUN State: "); if (buff[4] > 0x02) - printf("Unknown (%x)\n", buff[4]); + snprintf(b, blen, "Unknown (%x)", buff[4]); else - printf("%s\n", lun_state_arr[buff[4]]); - - printf(" This path connects to: "); - if (buff[8] > 0x01) - printf("Unknown SP (%x)", buff[8]); + snprintf(b, blen, "%s", lun_state_arr[buff[4]]); + sgj_haj_vistr(jsp, jop, 2, "LUN State", SGJ_SEP_COLON_1_SPACE, + buff[4], true, b); + + uc = buff[8]; + n = 0; + if (uc > 0x01) + n += sg_scnpr(b + n, blen - n, "Unknown SP (%x)", uc); else - printf("%s", sp_arr[buff[8]]); - printf(", Port Number: %u\n", buff[7]); + n += sg_scnpr(b + n, blen - n, "%s", sp_arr[uc]); + sgj_js_nv_ihexstr(jsp, jop, "path_connects_to", uc, NULL, b); + n += sg_scnpr(b + n, blen - n, ", Port Number: %u", buff[7]); + sgj_pr_hr(jsp, " This path connects to: %s\n", b); + sgj_js_nv_ihex(jsp, jop, "port_number", buff[7]); - printf(" Default Owner: "); if (buff[5] > 0x01) - printf("Unknown (%x)\n", buff[5]); + snprintf(b, blen, "Unknown (%x)\n", buff[5]); else - printf("%s\n", sp_arr[buff[5]]); + snprintf(b, blen, "%s\n", sp_arr[buff[5]]); + sgj_haj_vistr(jsp, jop, 2, "Default owner", SGJ_SEP_COLON_1_SPACE, + buff[5], true, b); - printf(" NO_ATF: %s, Access Logix: %s\n", - buff[6] & 0x80 ? "set" : "not set", - buff[6] & 0x40 ? "supported" : "not supported"); + cp = (buff[6] & 0x40) ? "supported" : "not supported"; + sgj_pr_hr(jsp, " NO_ATF: %s, Access Logix: %s\n", + buff[6] & 0x80 ? "set" : "not set", cp); + sgj_js_nv_i(jsp, jop, "no_atf", !! (buff[6] & 0x80)); + sgj_js_nv_istr(jsp, jop, "access_logix", !! (buff[6] & 0x40), + NULL, cp); ip_mgmt = (buff[6] >> 4) & 0x3; - - printf(" SP IP Management Mode: %s\n", ip_mgmt_arr[ip_mgmt]); - if (ip_mgmt == 2) - printf(" SP IPv4 address: %u.%u.%u.%u\n", - buff[44], buff[45], buff[46], buff[47]); - else { + cp = ip_mgmt_arr[ip_mgmt]; + sgj_pr_hr(jsp, " SP IP Management Mode: %s\n", cp); + sgj_js_nv_istr(jsp, jop, "sp_ip_management_mode", !! ip_mgmt, + NULL, cp); + if (ip_mgmt == 2) { + snprintf(b, blen, "%u.%u.%u.%u", buff[44], buff[45], buff[46], + buff[47]); + sgj_pr_hr(jsp, " SP IPv4 address: %s\n", b); + sgj_js_nv_s(jsp, jop, "sp_ipv4_address", b); + } else if (ip_mgmt == 3) { printf(" SP IPv6 address: "); + n = 0; for (k = 0; k < 16; ++k) - printf("%02x", buff[32 + k]); - printf("\n"); + n += sg_scnpr(b + n, blen - n, "%02x", buff[32 + k]); + sgj_pr_hr(jsp, " SP IPv6 address: %s\n", b); + sgj_js_nv_hex_bytes(jsp, jop, "sp_ipv6_address", buff + 32, 16); } +// yyyyyyy more conversion work needed below this point vpp80 = buff[30] & 0x08; lun_z = buff[30] & 0x04; @@ -3811,15 +3840,20 @@ vpd_decode(int sg_fd, struct opts_t * op, sgj_opaque_p jop, int off) break; /* Vendor specific VPD pages (>= 0xc0) */ case VPD_UPR_EMC: /* 0xc0 */ + np = "Block device characteristics VPD page"; + ep = "(EMC)"; if (!op->do_raw && (op->do_hex < 3)) - printf("VPD INQUIRY: Unit Path Report Page (EMC)\n"); + sgj_pr_hr(jsp, "VPD INQUIRY: %s %s\n", np, ep); res = vpd_fetch_page(sg_fd, rp, pn, -1, qt, vb, &len); if (res) break; if (op->do_raw) dStrRaw((const char *)rp, len); - else - decode_upr_vpd_c0_emc(rp, len, op); + else { + if (as_json) + jo2p = sg_vpd_js_hdr(jsp, jop, np, rp); + decode_upr_vpd_c0_emc(rp, len, op, jo2p); + } break; case VPD_RDAC_VERS: /* 0xc2 */ if (!op->do_raw && (op->do_hex < 3)) diff --git a/src/sg_prevent.c b/src/sg_prevent.c index 487315ac..b2076c54 100644 --- a/src/sg_prevent.c +++ b/src/sg_prevent.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2018 Douglas Gilbert. + * Copyright (c) 2004-2022 Douglas Gilbert. * All rights reserved. * Use of this source code is governed by a BSD-style * license that can be found in the BSD_LICENSE file. @@ -29,7 +29,7 @@ * given SCSI device. */ -static const char * version_str = "1.12 20180627"; +static const char * version_str = "1.13 20220826"; #define ME "sg_prevent: " @@ -94,8 +94,8 @@ main(int argc, char * argv[]) usage(); return 0; case 'p': - prevent = sg_get_num(optarg); - if ((prevent < 0) || (prevent > 3)) { + prevent = sg_get_num(optarg); + if ((prevent < 0) || (prevent > 3)) { pr2serr("bad argument to '--prevent'\n"); return SG_LIB_SYNTAX_ERROR; } diff --git a/src/sg_vpd.c b/src/sg_vpd.c index 9aae8a72..707d3e12 100644 --- a/src/sg_vpd.c +++ b/src/sg_vpd.c @@ -42,7 +42,7 @@ */ -static const char * version_str = "1.81 20220818"; /* spc6r06 + sbc5r03 */ +static const char * version_str = "1.82 20220826"; /* spc6r06 + sbc5r03 */ #define MY_NAME "sg_vpd" @@ -290,9 +290,9 @@ static int count_standard_vpds(int vpd_pn) { const struct svpd_values_name_t * vnp; - int matches; + int matches = 0; - for (vnp = standard_vpd_pg, matches = 0; vnp->acron; ++vnp) { + for (vnp = standard_vpd_pg; vnp->acron; ++vnp) { if ((vpd_pn == vnp->value) && vnp->name) { if (0 == matches) printf("Matching standard VPD pages:\n"); @@ -1374,10 +1374,10 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, else { bool protect = false; - op->protect_not_sure = false; - if (op->std_inq_a_valid) - protect = !! (0x1 & op->std_inq_a[5]); - else if ((sg_fd >= 0) && (! op->do_force)) { + op->protect_not_sure = false; + if (op->std_inq_a_valid) + protect = !! (0x1 & op->std_inq_a[5]); + else if ((sg_fd >= 0) && (! op->do_force)) { struct sg_simple_inquiry_resp sir; res = sg_simple_inquiry(sg_fd, &sir, false, vb); @@ -1385,11 +1385,11 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, if (op->verbose) pr2serr("%s: sg_simple_inquiry() failed, " "res=%d\n", __func__, res); - op->protect_not_sure = true; + op->protect_not_sure = true; } else protect = !!(sir.byte_5 & 0x1); /* SPC-3 and later */ } else - op->protect_not_sure = true; + op->protect_not_sure = true; if (vb || long_notquiet) sgj_pr_hr(jsp," [PQual=%d Peripheral device type: " "%s]\n", pqual, pdt_str); @@ -1650,7 +1650,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, 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 { @@ -1719,7 +1719,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb0\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb0\n", pre); break; case 0xb1: /* depends on pdt */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -1770,7 +1770,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb1\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb1\n", pre); break; case 0xb2: /* VPD page depends on pdt */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -1815,7 +1815,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb2\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb2\n", pre); break; case 0xb3: /* VPD page depends on pdt */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -1857,7 +1857,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb3\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb3\n", pre); break; case 0xb4: /* VPD page depends on pdt */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -1902,7 +1902,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb4\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb4\n", pre); break; case 0xb5: /* VPD page depends on pdt */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -1951,7 +1951,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb5\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb5\n", pre); break; case VPD_ZBC_DEV_CHARS: /* 0xb6 for both pdt=0 and pdt=0x14 */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -1989,7 +1989,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb6\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb6\n", pre); break; case 0xb7: res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -2027,7 +2027,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb7\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb7\n", pre); break; case 0xb8: /* VPD_FORMAT_PRESETS */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -2068,7 +2068,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb8\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb8\n", pre); break; case 0xb9: /* VPD_CON_POS_RANGE */ res = vpd_fetch_page(sg_fd, rp, pn, op->maxlen, qt, vb, &len); @@ -2109,7 +2109,7 @@ svpd_decode_t10(int sg_fd, struct opts_t * op, sgj_opaque_p jop, return 0; } else if ((! op->do_raw) && (! op->do_quiet) && (op->do_hex < 3) && exam_not_given) - printf("%sVPD page=0xb8\n", pre); + sgj_pr_hr(jsp, "%sVPD page=0xb8\n", pre); break; default: return SG_LIB_CAT_OTHER; @@ -2123,6 +2123,7 @@ svpd_decode_all(int sg_fd, struct opts_t * op, sgj_opaque_p jop) int k, res, rlen, n, pn; int max_pn = 255; int any_err = 0; + sgj_state * jsp = &op->json_st; uint8_t vpd0_buff[512]; uint8_t * rp = vpd0_buff; @@ -2158,9 +2159,13 @@ svpd_decode_all(int sg_fd, struct opts_t * op, sgj_opaque_p jop) continue; op->vpd_pn = pn; if (k > 0) - printf("\n"); - if (op->do_long) - printf("[0x%x] ", pn); + sgj_pr_hr(jsp, "\n"); + if (op->do_long) { + if (jsp->pr_as_json) + sgj_pr_hr(jsp, "[0x%x]:\n", pn); + else + printf("[0x%x] ", pn); + } res = svpd_decode_t10(sg_fd, op, jop, 0, 0, NULL); if (SG_LIB_CAT_OTHER == res) { @@ -2215,8 +2220,12 @@ svpd_decode_all(int sg_fd, struct opts_t * op, sgj_opaque_p jop) "max_pn=0x%x\n", __func__, pn, max_pn); continue; } - if (op->do_long) - printf("[0x%x] ", pn); + if (op->do_long) { + if (jsp->pr_as_json) + sgj_pr_hr(jsp, "[0x%x]:\n", pn); + else + printf("[0x%x] ", pn); + } res = svpd_decode_t10(-1, op, jop, 0, off, NULL); if (SG_LIB_CAT_OTHER == res) { @@ -2237,6 +2246,7 @@ svpd_examine_all(int sg_fd, struct opts_t * op, sgj_opaque_p jop) int k, res, start; int max_pn; int any_err = 0; + sgj_state * jsp = &op->json_st; char b[80]; max_pn = (op->page_given ? op->vpd_pn : 0xff); @@ -2261,7 +2271,7 @@ svpd_examine_all(int sg_fd, struct opts_t * op, sgj_opaque_p jop) if (first) first = false; else if (got_one) { - printf("\n"); + sgj_pr_hr(jsp, "\n"); got_one = false; } if (op->do_long) @@ -2455,6 +2465,7 @@ main(int argc, char * argv[]) return 0; } + jsp = &op->json_st; if (op->do_enum) { if (op->device_name) pr2serr("Device name %s ignored when --enumerate given\n", @@ -2498,16 +2509,15 @@ main(int argc, char * argv[]) matches = svpd_count_vendor_vpds(op->vpd_pn, op->vend_prod_num); if (0 == matches) - printf("No matches found for VPD page number 0x%x\n", - op->vpd_pn); + sgj_pr_hr(jsp, "No matches found for VPD page number 0x%x\n", + op->vpd_pn); } else { /* enumerate standard then vendor VPD pages */ - printf("Standard VPD pages:\n"); + sgj_pr_hr(jsp, "Standard VPD pages:\n"); enumerate_vpds(1, 1); } return 0; } - jsp = &op->json_st; as_json = jsp->pr_as_json; if (as_json) jop = sgj_start_r(MY_NAME, version_str, argc, argv, jsp); @@ -2524,7 +2534,7 @@ main(int argc, char * argv[]) vnp = sdp_find_vpd_by_acron("sinq"); } else { pr2serr("abbreviation doesn't match a VPD page\n"); - printf("Available standard VPD pages:\n"); + sgj_pr_hr(jsp, "Available standard VPD pages:\n"); enumerate_vpds(1, 1); ret = SG_LIB_SYNTAX_ERROR; goto fini; @@ -2545,7 +2555,7 @@ main(int argc, char * argv[]) op->vpd_pn = sg_get_num_nomult(op->page_str); if ((op->vpd_pn < 0) || (op->vpd_pn > 255)) { pr2serr("Bad page code value after '-p' option\n"); - printf("Available standard VPD pages:\n"); + sgj_pr_hr(jsp, "Available standard VPD pages:\n"); enumerate_vpds(1, 1); ret = SG_LIB_SYNTAX_ERROR; goto fini; diff --git a/src/sg_vpd_common.c b/src/sg_vpd_common.c index 14b1bd2d..dcc7727b 100644 --- a/src/sg_vpd_common.c +++ b/src/sg_vpd_common.c @@ -1712,7 +1712,7 @@ decode_block_lb_prov_vpd(const uint8_t * buff, int len, struct opts_t * op, if (jsp->pr_as_json && jsp->pr_out_hr) sgj_js_str_out(jsp, b, strlen(b)); else - printf("%s", b); + sgj_pr_hr(jsp, "%s", b); } return 0; } @@ -2237,6 +2237,8 @@ decode_rod_descriptor(const uint8_t * buff, int len, struct opts_t * op, const uint8_t * bp = buff; sgj_state * jsp = &op->json_st; sgj_opaque_p jo2p; + char b[80]; + static const int blen = sizeof(b); static const char * ab_pdt = "abnormal use of 'pdt'"; for (k = 0; k < len; k += bump, bp += bump) { @@ -2285,11 +2287,11 @@ decode_rod_descriptor(const uint8_t * buff, int len, struct opts_t * op, sgj_haj_vi(jsp, jo2p, 4, "Maximum bytes in stream ROD", SGJ_SEP_COLON_1_SPACE, ull, true); ull = sg_get_unaligned_be64(bp + 16); - printf(" Optimal Bytes in stream ROD transfer: "); + snprintf(b, blen, " Optimal Bytes in stream ROD transfer: "); if (SG_LIB_UNBOUNDED_64BIT == ull) - printf("-1 [no limit]\n"); + sgj_pr_hr(jsp, "%s-1 [no limit]\n", b); else - printf("%" PRIu64 "\n", ull); + sgj_pr_hr(jsp, "%s%" PRIu64 "\n", b, ull); break; case 3: /* Copy manager ROD device type specific descriptor */ @@ -2297,14 +2299,14 @@ decode_rod_descriptor(const uint8_t * buff, int len, struct opts_t * op, pdt, false, NULL, "Copy manager ROD " "device type specific descriptor", ab_pdt); - printf(" Maximum Bytes in processor ROD: %" PRIu64 "\n", - sg_get_unaligned_be64(bp + 8)); + sgj_pr_hr(jsp, " Maximum Bytes in processor ROD: %" PRIu64 "\n", + sg_get_unaligned_be64(bp + 8)); ull = sg_get_unaligned_be64(bp + 16); - printf(" Optimal Bytes in processor ROD transfer: "); + snprintf(b, blen, " Optimal Bytes in processor ROD transfer: "); if (SG_LIB_UNBOUNDED_64BIT == ull) - printf("-1 [no limit]\n"); + sgj_pr_hr(jsp, "%s-1 [no limit]\n", b); else - printf("%" PRIu64 "\n", ull); + sgj_pr_hr(jsp, "%s%" PRIu64 "\n", b, ull); break; default: sgj_js_nv_ihexstr(jsp, jo2p, "peripheral_device_type", |