/* * This is an example of using mrd_test_unit_ready(3mrd) * to see if a media changer will accept commands. On * Digital UNIX this particular example will always * succeed whether the robot is ready or not. See the * Restrictions section of the manual page for more * information. * * Usage: * * mrd_test_unit_ready robot [ more-robots... ] */ #ifndef lint static char SccsId[] = "@(#)mrd_test_unit_ready.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> /* * Message string. */ char *tur_failed_dev = "Test unit ready failed on %s: %s (%d,0x%x,0x%x).\n "; char *tur_failed_os = "Test unit ready failed on %s: %s (%d).\n" ; char *tur_failed = "Test unit ready failed on %s: %s.\n" ; /* * The MRD can report three types of errors: * * o Device errors - When the "valid" field is set, at least one * of the key, asc and ascq field should have values set from * a SCSI Request Sense data or equivalent. * * o Operating System errors - When the valid field is zero, but * the os_status field is set. Where possible an MRD error * will be set if one corresponds to the error. If not, the * MRD status will be MRD_STATUS_OS_ERROR. The os_status * is the error specific to the operating system. On Digital * UNIX it is an errno value. On OpenVMS it is a system * service return value. * * o MRD Errors - The MRD error code is set explicitly. */ print_error(char *robot, int mrd_status, dev_status_t *dp) { /* * Print the Key/ASC/ASCQ data for device errors. */ if( dp->valid ) printf(tur_failed_dev, robot, mrd_strstatus(mrd_status), dp->key, dp->asc, dp->ascq) ; /* * Try to decode the os_status according to the operating * system type. */ else if( dp->os_status == MRD_STATUS_OS_ERROR ) printf(tur_failed_os, robot, mrd_strstatus(mrd_status), #ifdef unix strerror(dp->os_status)) ; #endif #ifdef vms strerror(EVMSERR, dp->os_status)) ; #endif /* * Just print the message on others. */ else printf(tur_failed, robot, mrd_strstatus(mrd_status)) ; } 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)) ; status = mrd_test_unit_ready(&robot_info, &dev_status) ; /* * Do some fancy error printing. */ if( status != MRD_STATUS_SUCCESS ) print_error(robot, status, &dev_status) ; else printf("%s is ready.\n", robot) ; (void)mrd_shutdown(&robot_info) ; } return 0 ; }