Go over for coding and code style.

This commit is contained in:
R. Bernstein
2010-02-11 05:04:39 -05:00
parent f362f43593
commit fe85ad4ca9
2 changed files with 580 additions and 589 deletions

View File

@@ -16,9 +16,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* /**
Regression test for MMC commands which don't involve read/write access. Regression test for MMC commands which don't involve read/write access.
*/ */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include "config.h" # include "config.h"
#endif #endif
@@ -39,45 +39,43 @@
#define SKIP_TEST 77 #define SKIP_TEST 77
/* The compiler warns if no prototypes are given before function definition */ /* gcc may warn if no prototypes are given before function definition */
static driver_return_code_t test_get_disc_erasable(const CdIo_t *p_cdio, static int handle_outcome(CdIo_t *p_cdio, driver_return_code_t i_status,
const char *psz_source, int *pi_sense_avail,
bool verbose); cdio_mmc_request_sense_t * p_sense_reply,
unsigned int i_flag);
static int test_get_disctype(CdIo_t *p_cdio, bool b_verbose); static int get_disctype(CdIo_t *p_cdio, bool b_verbose);
static driver_return_code_t get_disc_erasable(const CdIo_t *p_cdio,
const char *psz_source,
bool verbose);
static int test_handle_outcome(CdIo_t *p_cdio, driver_return_code_t i_status, static int mode_sense(CdIo_t *p_cdio, int *pi_sense_avail,
int *pi_sense_avail, cdio_mmc_request_sense_t *p_sense_reply,
cdio_mmc_request_sense_t * p_sense_reply, unsigned int page_code, unsigned int subpage_code,
int i_alloc_len,
unsigned char *p_buf, int *pi_size,
unsigned int i_flag);
static void print_status_sense(int i_status, int i_sense_valid,
cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag); unsigned int i_flag);
static void test_print_status_sense(int i_status, int i_sense_valid, static int test_read(char *psz_drive_path, unsigned int i_flag);
cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag);
static int test_mode_sense(CdIo_t *p_cdio, int *pi_sense_avail, static int test_unit_ready(CdIo_t *p_cdio, int *pi_sense_avail,
cdio_mmc_request_sense_t *p_sense_reply, cdio_mmc_request_sense_t *p_sense_reply,
unsigned int page_code, unsigned int subpage_code,
int i_alloc_len,
unsigned char *p_buf, int *pi_size,
unsigned int i_flag); unsigned int i_flag);
static int test_test_unit_ready(CdIo_t *p_cdio, int *pi_sense_avail,
cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag);
static int wait_for_drive(CdIo_t *p_cdio, unsigned int max_tries, bool b_verbose); static int wait_for_drive(CdIo_t *p_cdio, unsigned int max_tries, bool b_verbose);
static int test_read(char *drive_path, unsigned int i_flag);
/* ------------------------- Helper functions ---------------------------- */ /* ------------------------- Helper functions ---------------------------- */
static driver_return_code_t static driver_return_code_t
test_get_disc_erasable(const CdIo_t *p_cdio, const char *psz_source, get_disc_erasable(const CdIo_t *p_cdio, const char *psz_source,
bool verbose) bool verbose)
{ {
driver_return_code_t i_status; driver_return_code_t i_status;
@@ -89,31 +87,8 @@ test_get_disc_erasable(const CdIo_t *p_cdio, const char *psz_source,
return i_status; return i_status;
} }
/* @param flag bit0= verbose
*/
static void
test_print_status_sense(int i_status, int i_sense_valid,
cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag)
{
if (!(i_flag & 1))
return;
fprintf(stderr, "return= %d , sense(%d)", i_status, i_sense_valid);
if (i_sense_valid >= 14)
fprintf(stderr, ": KEY=%s (%1.1X), ASC= %2.2X , ASCQ= %2.2X",
mmc_sense_key2str[p_sense_reply->sense_key],
p_sense_reply->sense_key,
p_sense_reply->asc,
p_sense_reply->ascq);
fprintf(stderr, "\n");
}
/* @param flag bit0= verbose
*/
static int static int
test_get_disctype(CdIo_t *p_cdio, bool b_verbose) get_disctype(CdIo_t *p_cdio, bool b_verbose)
{ {
cdio_mmc_feature_profile_t disctype; cdio_mmc_feature_profile_t disctype;
driver_return_code_t i_status = mmc_get_disctype(p_cdio, 0, &disctype); driver_return_code_t i_status = mmc_get_disctype(p_cdio, 0, &disctype);
@@ -127,17 +102,18 @@ test_get_disctype(CdIo_t *p_cdio, bool b_verbose)
} }
/* @param flag bit0= verbose /**
@param flag bit0= verbose
*/ */
static int static int
test_handle_outcome(CdIo_t *p_cdio, driver_return_code_t i_status, handle_outcome(CdIo_t *p_cdio, driver_return_code_t i_status,
int *pi_sense_avail, int *pi_sense_avail,
cdio_mmc_request_sense_t * p_sense_reply, cdio_mmc_request_sense_t * p_sense_reply,
unsigned int i_flag) unsigned int i_flag)
{ {
cdio_mmc_request_sense_t *p_temp_sense_reply = NULL; cdio_mmc_request_sense_t *p_temp_sense_reply = NULL;
*pi_sense_avail = mmc_last_cmd_sense(p_cdio, &p_temp_sense_reply); *pi_sense_avail = mmc_last_cmd_sense(p_cdio, &p_temp_sense_reply);
test_print_status_sense(i_status, *pi_sense_avail, p_temp_sense_reply, i_flag & 1); print_status_sense(i_status, *pi_sense_avail, p_temp_sense_reply, i_flag & 1);
if (18 <= *pi_sense_avail) if (18 <= *pi_sense_avail)
memcpy(p_sense_reply, p_temp_sense_reply, sizeof(cdio_mmc_request_sense_t)); memcpy(p_sense_reply, p_temp_sense_reply, sizeof(cdio_mmc_request_sense_t));
else else
@@ -146,20 +122,42 @@ test_handle_outcome(CdIo_t *p_cdio, driver_return_code_t i_status,
} }
/**
@param i_flag bit0= verbose
*/
static void
print_status_sense(int i_status, int i_sense_valid,
cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag)
{
if (!(i_flag & 1))
return;
printf("return= %d , sense(%d)", i_status, i_sense_valid);
if (i_sense_valid >= 14)
printf(": KEY=%s (%1.1X), ASC= %2.2X , ASCQ= %2.2X",
mmc_sense_key2str[p_sense_reply->sense_key],
p_sense_reply->sense_key,
p_sense_reply->asc,
p_sense_reply->ascq);
printf("\n");
}
/* --------------------------- MMC commands ------------------------------ */ /* --------------------------- MMC commands ------------------------------ */
/* @param flag bit0= verbose /**
@param flag bit0= verbose
@param sense_avail Number of available sense bytes @param sense_avail Number of available sense bytes
(18 get copied if all 18 exist) (18 get copied if all 18 exist)
@param sense_reply eventual sense bytes @param sense_reply eventual sense bytes
@return return value of mmc_run_cmd() @return return value of mmc_run_cmd()
*/ */
static int static int
test_test_unit_ready(CdIo_t *p_cdio, test_unit_ready(CdIo_t *p_cdio,
int *pi_sense_avail, int *pi_sense_avail,
cdio_mmc_request_sense_t *p_sense_reply, cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag) unsigned int i_flag)
{ {
int i_status; int i_status;
int old_log_level = cdio_loglevel_default; int old_log_level = cdio_loglevel_default;
@@ -167,39 +165,39 @@ test_test_unit_ready(CdIo_t *p_cdio,
cdio_loglevel_default = CDIO_LOG_WARN; cdio_loglevel_default = CDIO_LOG_WARN;
if (i_flag & 1) if (i_flag & 1)
fprintf(stderr, "test_test_unit_ready ... "); printf("test_unit_ready ... ");
i_status = mmc_test_unit_ready(p_cdio, 0); i_status = mmc_test_unit_ready(p_cdio, 0);
cdio_loglevel_default = old_log_level; cdio_loglevel_default = old_log_level;
return test_handle_outcome(p_cdio, i_status, pi_sense_avail, p_sense_reply, return handle_outcome(p_cdio, i_status, pi_sense_avail, p_sense_reply,
i_flag & 1); i_flag & 1);
} }
/* BARELY OBTRUSIVE: MIGHT SPOIL BURN RUNS */ /* BARELY OBTRUSIVE: MIGHT RUIN A SIMULTANEOUS BURNING OPERATION ON THE DRIVE */
/* Fetch a mode page or a part of it from the drive. /**
@param alloc_len The number of bytes to be requested from the drive and to Fetch a mode page or a part of it from the drive.
be copied into parameter buf. @param i_alloc_len The number of bytes to be requested from the drive and to
This has to include the 8 bytes of header and may not be copied into parameter buf.
be less than 10. This has to include the 8 bytes of header and may not
@param buf Will contain at most alloc_len many bytes. The first 8 are be less than 10.
a Mode Parameter Header as of SPC-3 7.4.3, table 240. @param p_buf Will contain at most alloc_len many bytes. The first 8 are
The further bytes are the mode page, typically as of a Mode Parameter Header as of SPC-3 7.4.3, table 240.
MMC-5 7.2. There are meanwhile deprecated mode pages which The further bytes are the mode page, typically as of
appear only in older versions of MMC. MMC-5 7.2. There are meanwhile deprecated mode pages which
@param i_size Will return the number of actually read bytes resp. the appear only in older versions of MMC.
number of available bytes. See flag bit1. @param i_size Will return the number of actually read bytes resp. the
@param flag bit0= verbose number of available bytes. See flag bit1.
bit1= Peek mode: @param i_flag bit0= verbose
bit1= Peek mode:
Reply number of available bytes in *i_size and not Reply number of available bytes in *i_size and not
the number of actually read bytes. the number of actually read bytes.
@return return value of mmc_run_cmd(), @return return value of mmc_run_cmd(),
or other driver_return_code_t or other driver_return_code_t
*/ */
static driver_return_code_t static driver_return_code_t
test_mode_sense(CdIo_t *p_cdio, int *pi_sense_avail, mode_sense(CdIo_t *p_cdio, int *pi_sense_avail,
cdio_mmc_request_sense_t *p_sense_reply, cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_page_code, unsigned int subpage_code, int i_alloc_len, unsigned int i_page_code, unsigned int subpage_code, int i_alloc_len,
unsigned char *p_buf, int *pi_size, unsigned int i_flag) unsigned char *p_buf, int *pi_size, unsigned int i_flag)
@@ -210,11 +208,11 @@ test_mode_sense(CdIo_t *p_cdio, int *pi_sense_avail,
return DRIVER_OP_BAD_PARAMETER; return DRIVER_OP_BAD_PARAMETER;
if (i_flag & 1) if (i_flag & 1)
fprintf(stderr, "test_mode_sense(0x%X, %X, %d) ... ", printf("mode_sense(0x%X, %X, %d) ... ",
i_page_code, subpage_code, i_alloc_len); i_page_code, subpage_code, i_alloc_len);
i_status = mmc_mode_sense_10(p_cdio, p_buf, i_alloc_len, i_page_code); i_status = mmc_mode_sense_10(p_cdio, p_buf, i_alloc_len, i_page_code);
test_handle_outcome(p_cdio, i_status, pi_sense_avail, p_sense_reply, i_flag & 1); handle_outcome(p_cdio, i_status, pi_sense_avail, p_sense_reply, i_flag & 1);
if (DRIVER_OP_SUCCESS != i_status) if (DRIVER_OP_SUCCESS != i_status)
return i_status; return i_status;
if (i_flag & 2) if (i_flag & 2)
@@ -224,7 +222,8 @@ test_mode_sense(CdIo_t *p_cdio, int *pi_sense_avail,
return i_status; return i_status;
} }
/* Watch drive by test unit ready loop until ready, no media or timeout. /**
Watch drive by test unit ready loop until ready, no media or timeout.
@param b_verbose verbose @param b_verbose verbose
@return 1= unit ready , 0= error , -1= severe failure, 2 = no media @return 1= unit ready , 0= error , -1= severe failure, 2 = no media
*/ */
@@ -236,7 +235,7 @@ wait_for_drive(CdIo_t *p_cdio, unsigned int i_max_tries, bool b_verbose)
memset(&sense_reply, 0, sizeof(sense_reply)); memset(&sense_reply, 0, sizeof(sense_reply));
for (i = 0; i < i_max_tries; i++) { for (i = 0; i < i_max_tries; i++) {
i_ret = test_test_unit_ready(p_cdio, &i_sense_avail, &sense_reply, b_verbose); i_ret = test_unit_ready(p_cdio, &i_sense_avail, &sense_reply, b_verbose);
if (i_ret == 0) /* Unit is ready */ if (i_ret == 0) /* Unit is ready */
return 1; return 1;
if (i_sense_avail < 18) if (i_sense_avail < 18)
@@ -272,7 +271,7 @@ wait_for_drive(CdIo_t *p_cdio, unsigned int i_max_tries, bool b_verbose)
return -1; return -1;
} }
/* /**
This function bundles tests for the read capability to perform MMC This function bundles tests for the read capability to perform MMC
commands and detecting the sense reply of MMC commands, which commands and detecting the sense reply of MMC commands, which
indicates error causes or important drive events. indicates error causes or important drive events.
@@ -283,107 +282,103 @@ wait_for_drive(CdIo_t *p_cdio, unsigned int i_max_tries, bool b_verbose)
else an proposal for an exit() value is returned else an proposal for an exit() value is returned
*/ */
static int static int
test_read(char *drive_path, unsigned int i_flag) test_read(char *psz_drive_path, unsigned int i_flag)
{ {
int sense_avail = 0, i_ret, i_sense_valid, i_size, alloc_len = 10, verbose; int sense_avail = 0, i_ret, i_sense_valid, i_size, alloc_len = 10;
int old_log_level; bool b_verbose = !!(i_flag & 1);
cdio_mmc_request_sense_t sense_reply; int old_log_level = cdio_loglevel_default;
unsigned char buf[10]; cdio_mmc_request_sense_t sense_reply;
CdIo_t *p_cdio; unsigned char buf[10];
const char *scsi_tuple; CdIo_t *p_cdio;
const char *scsi_tuple;
old_log_level = cdio_loglevel_default;
verbose = i_flag & 1;
p_cdio = cdio_open(drive_path, DRIVER_DEVICE); p_cdio = cdio_open(psz_drive_path, DRIVER_DEVICE);
if (!p_cdio) if (!p_cdio)
i_ret = SKIP_TEST - 16; i_ret = SKIP_TEST - 16;
/* The further code produces some intentional failures which should not be /* The further code produces some intentional failures which should not be
reported by mmc_run_cmd() as INFO messages. reported by mmc_run_cmd() as INFO messages.
*/ */
cdio_loglevel_default = CDIO_LOG_WARN; cdio_loglevel_default = CDIO_LOG_WARN;
/* Test availability of info for cdrecord style adresses . /* Test availability of info for cdrecord style adresses .
*/ */
scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple"); scsi_tuple = cdio_get_arg(p_cdio, "scsi-tuple");
if (scsi_tuple == NULL) { if (scsi_tuple == NULL) {
fprintf(stderr, "Error: cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); fprintf(stderr, "Error: cdio_get_arg(\"scsi-tuple\") returns NULL.\n");
i_ret = 6; goto ex; i_ret = 6; goto ex;
} else if (i_flag & 1) } else if (i_flag & 1)
fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n");
else if (i_flag & 1) else if (i_flag & 1)
printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n", printf("Drive '%s' has cdio_get_arg(\"scsi-tuple\") = '%s'\n",
drive_path, scsi_tuple); psz_drive_path, scsi_tuple);
/* Test availability of sense reply in case of unready drive. /* Test availability of sense reply in case of unready drive.
E.g. if the tray is already ejected. E.g. if the tray is already ejected.
*/ */
i_ret = test_test_unit_ready(p_cdio, &sense_avail, &sense_reply, !!verbose); i_ret = test_unit_ready(p_cdio, &sense_avail, &sense_reply, b_verbose);
if (i_ret != 0 && sense_avail < 18) { if (i_ret != 0 && sense_avail < 18) {
fprintf(stderr, fprintf(stderr,
"Error: Drive not ready. Only %d sense bytes. Expected >= 18.\n", "Error: Drive not ready. Only %d sense bytes. Expected >= 18.\n",
sense_avail); sense_avail);
i_ret = 2; goto ex; i_ret = 2; goto ex;
} }
/* Cause sense reply failure by requesting inappropriate mode page 3Eh */ /* Cause sense reply failure by requesting inappropriate mode page 3Eh */
i_ret = test_mode_sense(p_cdio, &sense_avail, &sense_reply, i_ret = mode_sense(p_cdio, &sense_avail, &sense_reply,
0x3e, 0, alloc_len, buf, &i_size, !!verbose); 0x3e, 0, alloc_len, buf, &i_size, b_verbose);
if (i_ret != 0 && sense_avail < 18) { if (i_ret != 0 && sense_avail < 18) {
fprintf(stderr, fprintf(stderr,
"Error: Deliberately illegal command yields only %d sense bytes. Expected >= 18.\n", "Error: Deliberately illegal command yields only %d sense bytes. Expected >= 18.\n",
sense_avail); sense_avail);
i_ret = 3; goto ex; i_ret = 3; goto ex;
} else { } else {
if (sense_reply.sense_key != 5) { if (sense_reply.sense_key != 5) {
fprintf(stderr, fprintf(stderr,
"Error: Sense key should be 5, got %d\n", "Error: Sense key should be 5, got %d\n",
sense_reply.sense_key); sense_reply.sense_key);
i_ret = 3; goto ex; i_ret = 3; goto ex;
} else if (sense_reply.asc != 0x24) { } else if (sense_reply.asc != 0x24) {
fprintf(stderr, fprintf(stderr,
"Error: Sense code should be 24, got %d\n", "Error: Sense code should be 24, got %d\n",
sense_reply.asc); sense_reply.asc);
i_ret = 4; goto ex; i_ret = 4; goto ex;
} else if (sense_reply.ascq != 0) { } else if (sense_reply.ascq != 0) {
fprintf(stderr, fprintf(stderr,
"Error: Sense code should be 24, got %d\n", "Error: Sense code should be 24, got %d\n",
sense_reply.ascq); sense_reply.ascq);
i_ret = 4; goto ex; i_ret = 4; goto ex;
} }
} }
/* How are we, finally ? */
i_ret = test_unit_ready(p_cdio, &i_sense_valid, &sense_reply, b_verbose);
if ((i_flag & 1) && 0 != i_ret && 2 == sense_reply.sense_key &&
0x3a == sense_reply.asc)
fprintf(stderr, "test_unit_ready: Note: No loaded media detected.\n");
i_ret = 0;
/* How are we, finally ? */
i_ret = test_test_unit_ready(p_cdio, &i_sense_valid, &sense_reply, !!verbose);
if ((i_flag & 1) && 0 != i_ret && 2 == sense_reply.sense_key &&
0x3a == sense_reply.asc)
fprintf(stderr, "test_unit_ready: Note: No loaded media detected.\n");
i_ret = 0;
ex:; ex:;
cdio_loglevel_default = old_log_level; cdio_loglevel_default = old_log_level;
cdio_destroy(p_cdio); cdio_destroy(p_cdio);
return i_ret; return i_ret;
} }
/* --------------------------- main ----------------------------- */ /* --------------------------- main ----------------------------- */
int int
main(int argc, const char *argv[]) main(int argc, const char *argv[])
{ {
CdIo_t *p_cdio; CdIo_t *p_cdio;
char **ppsz_drives=NULL; char **ppsz_drives = NULL;
const char *psz_source = NULL; const char *psz_source = NULL;
int i_ret; int i_ret;
int exitrc = 0; int exitrc = 0;
bool b_verbose = (argc > 1); bool b_verbose = (argc > 1);
driver_return_code_t i_status; driver_return_code_t i_status;
cdio_loglevel_default = b_verbose ? CDIO_LOG_DEBUG : CDIO_LOG_INFO; cdio_loglevel_default = b_verbose ? CDIO_LOG_DEBUG : CDIO_LOG_INFO;
ppsz_drives = cdio_get_devices(DRIVER_DEVICE); ppsz_drives = cdio_get_devices(DRIVER_DEVICE);
@@ -411,12 +406,12 @@ main(int argc, const char *argv[])
exit(2); exit(2);
} else { } else {
if (1 == i_ret) { if (1 == i_ret) {
i_status = test_get_disc_erasable(p_cdio, psz_source, b_verbose); i_status = get_disc_erasable(p_cdio, psz_source, b_verbose);
if (DRIVER_OP_SUCCESS != i_status) { if (DRIVER_OP_SUCCESS != i_status) {
printf("Got status %d back from get_disc_erasable(%s)\n", printf("Got status %d back from get_disc_erasable(%s)\n",
i_status, psz_source); i_status, psz_source);
} }
i_status = test_get_disctype(p_cdio, b_verbose); i_status = get_disctype(p_cdio, b_verbose);
if ( psz_have_mmc if ( psz_have_mmc
&& 0 == strncmp("true", psz_have_mmc, sizeof("true")) ) { && 0 == strncmp("true", psz_have_mmc, sizeof("true")) ) {

File diff suppressed because it is too large Load Diff