VMS Help  —  MRD Library, mrd_test_unit_ready, Example
    /*
     *   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 ;
    }
Close Help