aboutsummaryrefslogtreecommitdiff
path: root/src/sg_modes.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2016-04-05 03:18:04 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2016-04-05 03:18:04 +0000
commit63a8ecf3099475c7560036054dae728a1869685e (patch)
tree25077d46b98c0231e960624e7fea47dc7257f167 /src/sg_modes.c
parent61a0b017ebca98eca9c5d85264af45b3eb1853e5 (diff)
downloadsg3_utils-63a8ecf3099475c7560036054dae728a1869685e.tar.gz
clang --analyze static checker clean ups
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@689 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_modes.c')
-rw-r--r--src/sg_modes.c184
1 files changed, 98 insertions, 86 deletions
diff --git a/src/sg_modes.c b/src/sg_modes.c
index 01f2450a..1190edd0 100644
--- a/src/sg_modes.c
+++ b/src/sg_modes.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2000-2015 D. Gilbert
+ * Copyright (C) 2000-2016 D. Gilbert
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
@@ -16,6 +16,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -82,7 +83,7 @@ struct opts_t {
int page_control;
int pg_code;
int subpg_code;
- int subpg_code_set;
+ bool subpg_code_given;
const char * device_name;
int opt_new;
};
@@ -277,9 +278,8 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
return SG_LIB_SYNTAX_ERROR;
}
op->subpg_code = nn;
- op->subpg_code_set = 1;
- } else
- nn = 0;
+ op->subpg_code_given = true;
+ }
op->pg_code = n;
break;
case 'r':
@@ -326,8 +326,9 @@ process_cl_new(struct opts_t * op, int argc, char * argv[])
static int
process_cl_old(struct opts_t * op, int argc, char * argv[])
{
- int k, jmp_out, plen, num, n;
+ int k, plen, num, n;
unsigned int u, uu;
+ bool jmp_out;
const char * cp;
for (k = 1; k < argc; ++k) {
@@ -336,7 +337,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
if (plen <= 0)
continue;
if ('-' == *cp) {
- for (--plen, ++cp, jmp_out = 0; plen > 0; --plen, ++cp) {
+ for (--plen, ++cp, jmp_out = false; plen > 0; --plen, ++cp) {
switch (*cp) {
case '6':
++op->do_six;
@@ -387,7 +388,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
++op->do_help;
break;
default:
- jmp_out = 1;
+ jmp_out = true;
break;
}
if (jmp_out)
@@ -428,7 +429,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
}
op->pg_code = u;
op->subpg_code = uu;
- op->subpg_code_set = 1;
+ op->subpg_code_given = true;
} else {
pr2serr("Bad page code, subpage code sequence after 'p=' "
"option\n");
@@ -443,7 +444,7 @@ process_cl_old(struct opts_t * op, int argc, char * argv[])
return SG_LIB_SYNTAX_ERROR;
}
op->subpg_code = u;
- op->subpg_code_set = 1;
+ op->subpg_code_given = true;
if (-1 == op->pg_code)
op->pg_code = 0;
} else if (0 == strncmp("-old", cp, 4))
@@ -603,43 +604,47 @@ static struct page_code_desc pc_desc_adc[] = {
{0xe, 0x4, "Target device serial number"},
};
+/* Returns pointer to base of table for scsi_ptype or pointer to common
+ * table if scsi_ptype is -1. Yields numbers of elements in returned
+ * table via pointer sizep. If scsi_ptype not known then returns NULL
+ * with *sizep set to zero. */
static struct page_code_desc *
-mode_page_cs_table(int scsi_ptype, int * size)
+get_mpage_tbl_size(int scsi_ptype, int * sizep)
{
switch (scsi_ptype)
{
case -1: /* common list */
- *size = sizeof(pc_desc_common) / sizeof(pc_desc_common[0]);
+ *sizep = sizeof(pc_desc_common) / sizeof(pc_desc_common[0]);
return &pc_desc_common[0];
case PDT_DISK: /* disk (direct access) type devices */
case PDT_WO:
case PDT_OPTICAL:
- *size = sizeof(pc_desc_disk) / sizeof(pc_desc_disk[0]);
+ *sizep = sizeof(pc_desc_disk) / sizeof(pc_desc_disk[0]);
return &pc_desc_disk[0];
case PDT_TAPE: /* tape devices */
case PDT_PRINTER:
- *size = sizeof(pc_desc_tape) / sizeof(pc_desc_tape[0]);
+ *sizep = sizeof(pc_desc_tape) / sizeof(pc_desc_tape[0]);
return &pc_desc_tape[0];
case PDT_MMC: /* cd/dvd/bd devices */
- *size = sizeof(pc_desc_cddvd) / sizeof(pc_desc_cddvd[0]);
+ *sizep = sizeof(pc_desc_cddvd) / sizeof(pc_desc_cddvd[0]);
return &pc_desc_cddvd[0];
case PDT_MCHANGER: /* medium changer devices */
- *size = sizeof(pc_desc_smc) / sizeof(pc_desc_smc[0]);
+ *sizep = sizeof(pc_desc_smc) / sizeof(pc_desc_smc[0]);
return &pc_desc_smc[0];
case PDT_SAC: /* storage array devices */
- *size = sizeof(pc_desc_scc) / sizeof(pc_desc_scc[0]);
+ *sizep = sizeof(pc_desc_scc) / sizeof(pc_desc_scc[0]);
return &pc_desc_scc[0];
case PDT_SES: /* enclosure services devices */
- *size = sizeof(pc_desc_ses) / sizeof(pc_desc_ses[0]);
+ *sizep = sizeof(pc_desc_ses) / sizeof(pc_desc_ses[0]);
return &pc_desc_ses[0];
case PDT_RBC: /* simplified direct access device */
- *size = sizeof(pc_desc_rbc) / sizeof(pc_desc_rbc[0]);
+ *sizep = sizeof(pc_desc_rbc) / sizeof(pc_desc_rbc[0]);
return &pc_desc_rbc[0];
case PDT_ADC: /* automation device/interface */
- *size = sizeof(pc_desc_adc) / sizeof(pc_desc_adc[0]);
+ *sizep = sizeof(pc_desc_adc) / sizeof(pc_desc_adc[0]);
return &pc_desc_adc[0];
}
- *size = 0;
+ *sizep = 0;
return NULL;
}
@@ -674,24 +679,24 @@ static struct page_code_desc pc_desc_t_adc[] = {
};
static struct page_code_desc *
-mode_page_transp_table(int t_proto, int * size)
+get_mpage_trans_tbl_size(int t_proto, int * sizep)
{
switch (t_proto)
{
case TPROTO_FCP:
- *size = sizeof(pc_desc_t_fcp) / sizeof(pc_desc_t_fcp[0]);
+ *sizep = sizeof(pc_desc_t_fcp) / sizeof(pc_desc_t_fcp[0]);
return &pc_desc_t_fcp[0];
case TPROTO_SPI:
- *size = sizeof(pc_desc_t_spi4) / sizeof(pc_desc_t_spi4[0]);
+ *sizep = sizeof(pc_desc_t_spi4) / sizeof(pc_desc_t_spi4[0]);
return &pc_desc_t_spi4[0];
case TPROTO_SAS:
- *size = sizeof(pc_desc_t_sas) / sizeof(pc_desc_t_sas[0]);
+ *sizep = sizeof(pc_desc_t_sas) / sizeof(pc_desc_t_sas[0]);
return &pc_desc_t_sas[0];
case TPROTO_ADT:
- *size = sizeof(pc_desc_t_adc) / sizeof(pc_desc_t_adc[0]);
+ *sizep = sizeof(pc_desc_t_adc) / sizeof(pc_desc_t_adc[0]);
return &pc_desc_t_adc[0];
}
- *size = 0;
+ *sizep = 0;
return NULL;
}
@@ -704,7 +709,7 @@ find_page_code_desc(int page_num, int subpage_num, int scsi_ptype,
const struct page_code_desc * pcdp;
if (t_proto >= 0) {
- pcdp = mode_page_transp_table(t_proto, &num);
+ pcdp = get_mpage_trans_tbl_size(t_proto, &num);
if (pcdp) {
for (k = 0; k < num; ++k, ++pcdp) {
if ((page_num == pcdp->page_code) &&
@@ -715,7 +720,7 @@ find_page_code_desc(int page_num, int subpage_num, int scsi_ptype,
}
}
}
- pcdp = mode_page_cs_table(scsi_ptype, &num);
+ pcdp = get_mpage_tbl_size(scsi_ptype, &num);
if (pcdp) {
for (k = 0; k < num; ++k, ++pcdp) {
if ((page_num == pcdp->page_code) &&
@@ -727,7 +732,7 @@ find_page_code_desc(int page_num, int subpage_num, int scsi_ptype,
}
if ((0xd != scsi_ptype) && (inq_byte6 & 0x40)) {
/* check for attached enclosure services processor */
- pcdp = mode_page_cs_table(0xd, &num);
+ pcdp = get_mpage_tbl_size(0xd, &num);
if (pcdp) {
for (k = 0; k < num; ++k, ++pcdp) {
if ((page_num == pcdp->page_code) &&
@@ -740,7 +745,7 @@ find_page_code_desc(int page_num, int subpage_num, int scsi_ptype,
}
if ((0x8 != scsi_ptype) && (inq_byte6 & 0x8)) {
/* check for attached medium changer device */
- pcdp = mode_page_cs_table(0x8, &num);
+ pcdp = get_mpage_tbl_size(0x8, &num);
if (pcdp) {
for (k = 0; k < num; ++k, ++pcdp) {
if ((page_num == pcdp->page_code) &&
@@ -751,7 +756,7 @@ find_page_code_desc(int page_num, int subpage_num, int scsi_ptype,
}
}
}
- pcdp = mode_page_cs_table(-1, &num);
+ pcdp = get_mpage_tbl_size(-1, &num);
for (k = 0; k < num; ++k, ++pcdp) {
if ((page_num == pcdp->page_code) &&
(subpage_num == pcdp->subpage_code))
@@ -765,16 +770,17 @@ find_page_code_desc(int page_num, int subpage_num, int scsi_ptype,
static void
list_page_codes(int scsi_ptype, int inq_byte6, int t_proto)
{
- int num, num_ptype, pg, spg, c, d, valid_transport;
+ int num, num_ptype, pg, spg, c, d;
+ bool valid_transport;
const struct page_code_desc * dp;
const struct page_code_desc * pe_dp;
char b[64];
- valid_transport = ((t_proto >= 0) && (t_proto <= 0xf)) ? 1 : 0;
+ valid_transport = ((t_proto >= 0) && (t_proto <= 0xf));
printf("Page[,subpage] Name\n");
printf("=====================\n");
- dp = mode_page_cs_table(-1, &num);
- pe_dp = mode_page_cs_table(scsi_ptype, &num_ptype);
+ dp = get_mpage_tbl_size(-1, &num);
+ pe_dp = get_mpage_tbl_size(scsi_ptype, &num_ptype);
while (1) {
pg = dp ? dp->page_code : PG_CODE_ALL + 1;
spg = dp ? dp->subpage_code : SPG_CODE_ALL;
@@ -786,30 +792,37 @@ list_page_codes(int scsi_ptype, int inq_byte6, int t_proto)
((PROTO_SPECIFIC_1 == c) || (PROTO_SPECIFIC_2 == c)))
dp = (--num <= 0) ? NULL : (dp + 1); /* skip protocol specific */
else if (c == d) {
- if (pe_dp->subpage_code)
- printf(" 0x%02x,0x%02x * %s\n", pe_dp->page_code,
- pe_dp->subpage_code, pe_dp->desc);
- else
- printf(" 0x%02x * %s\n", pe_dp->page_code,
- pe_dp->desc);
- dp = (--num <= 0) ? NULL : (dp + 1);
- pe_dp = (--num_ptype <= 0) ? NULL : (pe_dp + 1);
+ if (pe_dp) {
+ if (pe_dp->subpage_code)
+ printf(" 0x%02x,0x%02x * %s\n", pe_dp->page_code,
+ pe_dp->subpage_code, pe_dp->desc);
+ else
+ printf(" 0x%02x * %s\n", pe_dp->page_code,
+ pe_dp->desc);
+ pe_dp = (--num_ptype <= 0) ? NULL : (pe_dp + 1);
+ }
+ if (dp)
+ dp = (--num <= 0) ? NULL : (dp + 1);
} else if (c < d) {
- if (dp->subpage_code)
- printf(" 0x%02x,0x%02x %s\n", dp->page_code,
- dp->subpage_code, dp->desc);
- else
- printf(" 0x%02x %s\n", dp->page_code,
- dp->desc);
- dp = (--num <= 0) ? NULL : (dp + 1);
+ if (dp) {
+ if (dp->subpage_code)
+ printf(" 0x%02x,0x%02x %s\n", dp->page_code,
+ dp->subpage_code, dp->desc);
+ else
+ printf(" 0x%02x %s\n", dp->page_code,
+ dp->desc);
+ dp = (--num <= 0) ? NULL : (dp + 1);
+ }
} else {
- if (pe_dp->subpage_code)
- printf(" 0x%02x,0x%02x %s\n", pe_dp->page_code,
- pe_dp->subpage_code, pe_dp->desc);
- else
- printf(" 0x%02x %s\n", pe_dp->page_code,
- pe_dp->desc);
- pe_dp = (--num_ptype <= 0) ? NULL : (pe_dp + 1);
+ if (pe_dp) {
+ if (pe_dp->subpage_code)
+ printf(" 0x%02x,0x%02x %s\n", pe_dp->page_code,
+ pe_dp->subpage_code, pe_dp->desc);
+ else
+ printf(" 0x%02x %s\n", pe_dp->page_code,
+ pe_dp->desc);
+ pe_dp = (--num_ptype <= 0) ? NULL : (pe_dp + 1);
+ }
}
if ((NULL == dp) && (NULL == pe_dp))
break;
@@ -817,7 +830,7 @@ list_page_codes(int scsi_ptype, int inq_byte6, int t_proto)
if ((0xd != scsi_ptype) && (inq_byte6 & 0x40)) {
/* check for attached enclosure services processor */
printf("\n Attached enclosure services processor\n");
- dp = mode_page_cs_table(0xd, &num);
+ dp = get_mpage_tbl_size(0xd, &num);
while (dp) {
if (dp->subpage_code)
printf(" 0x%02x,0x%02x %s\n", dp->page_code,
@@ -831,7 +844,7 @@ list_page_codes(int scsi_ptype, int inq_byte6, int t_proto)
if ((0x8 != scsi_ptype) && (inq_byte6 & 0x8)) {
/* check for attached medium changer device */
printf("\n Attached medium changer device\n");
- dp = mode_page_cs_table(0x8, &num);
+ dp = get_mpage_tbl_size(0x8, &num);
while (dp) {
if (dp->subpage_code)
printf(" 0x%02x,0x%02x %s\n", dp->page_code,
@@ -845,7 +858,7 @@ list_page_codes(int scsi_ptype, int inq_byte6, int t_proto)
if (valid_transport) {
printf("\n Transport protocol: %s\n",
sg_get_trans_proto_str(t_proto, sizeof(b), b));
- dp = mode_page_transp_table(t_proto, &num);
+ dp = get_mpage_trans_tbl_size(t_proto, &num);
while (dp) {
if (dp->subpage_code)
printf(" 0x%02x,0x%02x %s\n", dp->page_code,
@@ -859,8 +872,7 @@ list_page_codes(int scsi_ptype, int inq_byte6, int t_proto)
}
static int
-examine_pages(int sg_fd, int inq_pdt, int inq_byte6,
- const struct opts_t * op)
+examine_pages(int sg_fd, int inq_pdt, int inq_byte6, const struct opts_t * op)
{
int k, res, header, mresp_len, len;
unsigned char rbuf[256];
@@ -947,7 +959,7 @@ main(int argc, char * argv[])
int ret = 0;
int density_code_off, t_proto, inq_pdt, inq_byte6, resp_mode6;
int num_ua_pages;
- unsigned char * ucp;
+ unsigned char * bp;
unsigned char uc;
struct sg_simple_inquiry_resp inq_out;
char pdt_name[64];
@@ -979,7 +991,7 @@ main(int argc, char * argv[])
printf(" peripheral device type: %s\n",
sg_get_pdt_str(op->pg_code, sizeof(pdt_name),
pdt_name));
- if (op->subpg_code_set)
+ if (op->subpg_code_given)
list_page_codes(op->pg_code, 0, op->subpg_code);
else
list_page_codes(op->pg_code, 0, -1);
@@ -1051,7 +1063,7 @@ main(int argc, char * argv[])
inq_out.vendor, inq_out.product, inq_out.revision,
sg_get_pdt_str(inq_pdt, sizeof(pdt_name), pdt_name), inq_pdt);
if (op->do_list) {
- if (op->subpg_code_set)
+ if (op->subpg_code_given)
list_page_codes(inq_pdt, inq_byte6, op->subpg_code);
else
list_page_codes(inq_pdt, inq_byte6, -1);
@@ -1167,14 +1179,14 @@ main(int argc, char * argv[])
if (1 == op->do_raw)
dStrRaw((const char *)rsp_buff, md_len);
else if (op->do_raw > 1) {
- ucp = rsp_buff + bd_len + headerlen;
+ bp = rsp_buff + bd_len + headerlen;
md_len -= bd_len + headerlen;
- spf = ((ucp[0] & 0x40) ? 1 : 0);
- len = (spf ? (sg_get_unaligned_be16(ucp + 2) + 4) :
- (ucp[1] + 2));
+ spf = ((bp[0] & 0x40) ? 1 : 0);
+ len = (spf ? (sg_get_unaligned_be16(bp + 2) + 4) :
+ (bp[1] + 2));
len = (len < md_len) ? len : md_len;
for (k = 0; k < len; ++k)
- printf("%02x\n", ucp[k]);
+ printf("%02x\n", bp[k]);
} else
dStrHex((const char *)rsp_buff, md_len, -1);
goto finish;
@@ -1218,18 +1230,18 @@ main(int argc, char * argv[])
else
printf("> General mode parameter block descriptors:\n");
- ucp = rsp_buff + headerlen;
+ bp = rsp_buff + headerlen;
while (num > 0) {
printf(" Density code=0x%x\n",
- *(ucp + density_code_off));
- dStrHex((const char *)ucp, len, 1);
- ucp += len;
+ *(bp + density_code_off));
+ dStrHex((const char *)bp, len, 1);
+ bp += len;
num -= len;
}
printf("\n");
}
}
- ucp = rsp_buff + bd_len + headerlen; /* start of mode page(s) */
+ bp = rsp_buff + bd_len + headerlen; /* start of mode page(s) */
md_len -= bd_len + headerlen; /* length of mode page(s) */
num_ua_pages = 0;
for (k = 0; md_len > 0; ++k) { /* got mode page(s) */
@@ -1239,10 +1251,10 @@ main(int argc, char * argv[])
"ignore\n");
break;
}
- uc = *ucp;
+ uc = *bp;
spf = ((uc & 0x40) ? 1 : 0);
- len = (spf ? (sg_get_unaligned_be16(ucp + 2) + 4) : (ucp[1] + 2));
- page_num = ucp[0] & PG_CODE_MASK;
+ len = (spf ? (sg_get_unaligned_be16(bp + 2) + 4) : (bp[1] + 2));
+ page_num = bp[0] & PG_CODE_MASK;
if (0x0 == page_num) {
++num_ua_pages;
if((num_ua_pages > 3) && (md_len > 0xa00)) {
@@ -1255,23 +1267,23 @@ main(int argc, char * argv[])
if (op->do_hex) {
if (spf)
printf(">> page_code=0x%x, subpage_code=0x%x, page_cont"
- "rol=%d\n", page_num, ucp[1], op->page_control);
+ "rol=%d\n", page_num, bp[1], op->page_control);
else
printf(">> page_code=0x%x, page_control=%d\n", page_num,
op->page_control);
} else {
descp = NULL;
if ((0x18 == page_num) || (0x19 == page_num)) {
- t_proto = (spf ? ucp[5] : ucp[2]) & 0xf;
- descp = find_page_code_desc(page_num, (spf ? ucp[1] : 0),
+ t_proto = (spf ? bp[5] : bp[2]) & 0xf;
+ descp = find_page_code_desc(page_num, (spf ? bp[1] : 0),
inq_pdt, inq_byte6, t_proto);
} else
- descp = find_page_code_desc(page_num, (spf ? ucp[1] : 0),
+ descp = find_page_code_desc(page_num, (spf ? bp[1] : 0),
inq_pdt, inq_byte6, -1);
if (NULL == descp) {
if (spf)
snprintf(ebuff, EBUFF_SZ, "0x%x, subpage_code: 0x%x",
- page_num, ucp[1]);
+ page_num, bp[1]);
else
snprintf(ebuff, EBUFF_SZ, "0x%x", page_num);
}
@@ -1288,8 +1300,8 @@ main(int argc, char * argv[])
pr2serr(">>> page length (%d) > 256 bytes, unlikely trim\n"
" Try '-f' option\n", len);
}
- dStrHex((const char *)ucp, num , 1);
- ucp += len;
+ dStrHex((const char *)bp, num , 1);
+ bp += len;
md_len -= len;
}
}