aboutsummaryrefslogtreecommitdiff
path: root/sg_readcap.c
diff options
context:
space:
mode:
Diffstat (limited to 'sg_readcap.c')
-rw-r--r--sg_readcap.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/sg_readcap.c b/sg_readcap.c
index 88de00cf..b5d7edb2 100644
--- a/sg_readcap.c
+++ b/sg_readcap.c
@@ -24,7 +24,7 @@
*/
-static char * version_str = "3.75 20060106";
+static char * version_str = "3.76 20060623";
#define ME "sg_readcap: "
@@ -63,6 +63,7 @@ int main(int argc, char * argv[])
int pmi = 0;
int do16 = 0;
int verbose = 0;
+ int ret = 0;
unsigned int last_blk_addr, block_size;
const char * file_name = 0;
const char * cp;
@@ -105,7 +106,7 @@ int main(int argc, char * argv[])
case '?':
case 'h':
usage();
- return 1;
+ return 0;
default:
jmp_out = 1;
break;
@@ -120,7 +121,7 @@ int main(int argc, char * argv[])
if (1 != num) {
printf("Bad value after 'lba=' option\n");
usage();
- return 1;
+ return SG_LIB_SYNTAX_ERROR;
}
llba = u;
if (llba > 0xfffffffeULL)
@@ -129,7 +130,7 @@ int main(int argc, char * argv[])
} else if (jmp_out) {
fprintf(stderr, "Unrecognized option: %s\n", cp);
usage();
- return 1;
+ return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == file_name)
file_name = cp;
@@ -137,30 +138,31 @@ int main(int argc, char * argv[])
fprintf(stderr, "too many arguments, got: %s, not expecting: "
"%s\n", file_name, cp);
usage();
- return 1;
+ return SG_LIB_SYNTAX_ERROR;
}
}
if (0 == file_name) {
fprintf(stderr, "No <device> argument given\n");
usage();
- return 1;
+ return SG_LIB_SYNTAX_ERROR;
}
if ((0 == pmi) && (lba > 0)) {
fprintf(stderr, ME "lba can only be non-zero when pmi is set\n");
usage();
- return 1;
+ return SG_LIB_SYNTAX_ERROR;
}
if ((sg_fd = sg_cmds_open_device(file_name,
(do16 ? 0 /* rw */ : 1), verbose)) < 0) {
fprintf(stderr, ME "error opening file: %s: %s\n", file_name,
safe_strerror(-sg_fd));
- return 1;
+ return SG_LIB_FILE_ERROR;
}
if (! do16) {
res = sg_ll_readcap_10(sg_fd, pmi, lba, resp_buff, RCAP_REPLY_LEN,
0, verbose);
+ ret = res;
if (0 == res) {
last_blk_addr = ((resp_buff[0] << 24) | (resp_buff[1] << 16) |
(resp_buff[2] << 8) | resp_buff[3]);
@@ -206,13 +208,15 @@ int main(int argc, char * argv[])
< 0) {
fprintf(stderr, ME "error re-opening file: %s (rw): %s\n",
file_name, safe_strerror(-sg_fd));
- return 1;
+ return SG_LIB_FILE_ERROR;
}
if (verbose)
fprintf(stderr, "READ CAPACITY (10) not supported, trying "
"READ CAPACITY (16)\n");
} else if (SG_LIB_CAT_ILLEGAL_REQ == res)
fprintf(stderr, "bad field in READ CAPACITY (10) cdb\n");
+ else if (SG_LIB_CAT_NOT_READY == res)
+ fprintf(stderr, "READ CAPACITY (10) failed, device not ready\n");
else if (! verbose)
fprintf(stderr, "READ CAPACITY (10) failed [res=%d], try "
"with '-v'\n", res);
@@ -220,6 +224,7 @@ int main(int argc, char * argv[])
if (do16) {
res = sg_ll_readcap_16(sg_fd, pmi, llba, resp_buff, RCAP16_REPLY_LEN,
0, verbose);
+ ret = res;
if (0 == res) {
for (k = 0, llast_blk_addr = 0; k < 8; ++k) {
llast_blk_addr <<= 8;
@@ -259,6 +264,8 @@ int main(int argc, char * argv[])
}
else if (SG_LIB_CAT_INVALID_OP == res)
fprintf(stderr, "READ CAPACITY (16) not supported\n");
+ else if (SG_LIB_CAT_NOT_READY == res)
+ fprintf(stderr, "READ CAPACITY (16) failed, device not ready\n");
else if (SG_LIB_CAT_ILLEGAL_REQ == res)
fprintf(stderr, "bad field in READ CAPACITY (10) cdb\n");
else if (! verbose)
@@ -267,10 +274,13 @@ int main(int argc, char * argv[])
}
if (brief)
printf("0x0 0x0\n");
- sg_cmds_close_device(sg_fd);
- return 1;
good:
- sg_cmds_close_device(sg_fd);
- return 0;
+ res = sg_cmds_close_device(sg_fd);
+ if (res < 0) {
+ fprintf(stderr, "close error: %s\n", safe_strerror(-res));
+ if (0 == ret)
+ return SG_LIB_FILE_ERROR;
+ }
+ return (ret >= 0) ? ret : SG_LIB_CAT_OTHER;
}