/* * This is an example of using mrd_request_sense(3mrd) * to see what state a medium changer is in. The MRD * implementation of Request Sense only collects the * Sense Key, Additional Sense Code and Additional Sense * Code Qualifier. * * Usage: * * mrd_request_sense robot [ more-robots... ] */ #ifndef lint static char SccsId[] = "@(#)mrd_request_sense.c 1.1 4/16/97" ; #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <mrd_common.h> #include <mrd_message.h> char *device_sense = "Sense data for %s: %s (%d,0x%x,0x%x).\n" ; char *sense_failed = "Request Sense failed on %s: %s.\n" ; main(int argc, char *argv[]) { int rc ; /* counter */ int status ; /* return status */ char *robot ; /* Robot to open */ robot_info_t robot_info ; /* Robot data */ dev_status_t dev_status ; /* Device status */ char log_info[MRD_MAX_LOG_STRING+1] ; /* * Check that there are enough arguments. */ if( argc < 2 ) { printf("usage: %s robot [ robot... ]\n", argv[0]) ; exit(1) ; } /* * Initialize the channel field of the robot_info, so * mrd_startup(3mrd) will actually open the robot. */ robot_info.channel = BAD_CHANNEL ; for(rc = 1; rc < argc; rc++) { /* * The robot for this command. */ robot = argv[rc] ; status = mrd_startup(robot, &robot_info, log_info) ; if( status != MRD_STATUS_SUCCESS ) { printf("Startup failed on %s: %s.\n", robot, mrd_strstatus(status)) ; continue ; } memset((void *)&dev_status, 0, sizeof(dev_status)) ; /* * mrd_request_sense(3mrd) will never return * MRD_STATUS_SUCCESS. If no Request Sense data * is available, it will return MRD_STATUS_NO_SENSE. */ status = mrd_request_sense(&robot_info, &dev_status, MRD_CHECK_SENSE) ; /* * Print the Key/ASC/ASCQ data for device errors. */ if( dev_status.valid ) printf(device_sense, robot, mrd_strstatus(status), dev_status.key, dev_status.asc, dev_status.ascq) ; /* * Just print the MRD error. */ else printf(sense_failed, robot, mrd_strstatus(status)) ; (void)mrd_shutdown(&robot_info) ; } return 0 ; }