Copyright Digital Equipment Corp. All rights reserved.

Example

   /*
    *   This shows how the utility routines are used.  For
    *   mrd_scsi_decode(3mrd), a selected SCSI-2 error will
    *   be filled into the key, asc and ascq fields of a
    *   dev_status_t structure and the resulting MRD status
    *   message printed.  For mrd_map_os_error(3mrd) the
    *   will be done for a selected operating system error.
    *
    *   Usage:
    *
    *      mrd_utility
    */
   #ifndef   lint
   static   char   SccsId[] = "@(#)mrd_utility.c   1.2 3/5/97" ;
   #endif

   #include <stdlib.h>
   #include <errno.h>
   #include <stdio.h>
   #include <math.h>
   #include <time.h>

   #include <mrd_common.h>
   #include <mrd_message.h>

   #ifdef   vms
   #   include   <ssdef.h>
   #endif

   main(int argc, char *argv[])
   {
      dev_status_t   dev_status ;   /* Device status */
      int      status ;
      char      log_info[MRD_MAX_LOG_STRING+1] ;

      /*
       *   Clear this for later.
       */
      log_info[0] = '\0' ;

      /*
       *   First, try mrd_scsi_decode(3mrd).  SCSI-2 happens to
       *   have ASC/ASCQ codes for a cleaning cartridge being
       *   installed somewhere, presumably a drive.  We'll
       *   see what MRD does with it.
       */
      dev_status.valid = SCSI_REQ_SENSE_VALID ;
      dev_status.key   = 1 ;         /* Recovered Error */
      dev_status.asc   = 0x30 ;
      dev_status.ascq  = 3 ;

      status = mrd_scsi_decode(&dev_status) ;

      /*
       *   Now print the result.  As it happens we map this
       *   code to MRD_STATUS_AUTOCLEAN, which is nearly
       *   right.
       */
      printf("Cleaning Cartridge Installed: (%d,%x,%x): %s\n",
         dev_status.key, dev_status.asc,
         dev_status.ascq, mrd_strstatus(status)) ;

      /*
       *   Now do one of completely random values.  Seed the
       *   random number generator just so most get a different
       *   answer.  Most of these are likely to end up as
       *   Vendor Unique errors.
       */
      srand(time(NULL)) ;

      dev_status.key   = rand() % 16 ;   /* 0 - 15 */
      dev_status.asc   = rand() % 256 ;   /* 0 - 255 */
      dev_status.ascq  = rand() % 256 ;   /* 0 - 255 */

      status = mrd_scsi_decode(&dev_status) ;

      /*
       *   Now print the result.
       */
      printf("Random SCSI Decode: (%d,%x,%x): %s\n",
         dev_status.key, dev_status.asc,
         dev_status.ascq, mrd_strstatus(status)) ;

      /*
       *   Now an OS error.  If #ifdef is handle the two example
       *   operating systems.
       */
      dev_status.valid     = 0 ;

   #if   defined(VMS)
      dev_status.os_status = SS$_UNASEFC ;
   #elif   defined(unix)
      dev_status.os_status = EINTR ;
   #else
      dev_status.os_status = rand() % 100 ;
   #endif

      status = mrd_map_os_error(dev_status.os_status, log_info) ;

      if( log_info[0] )
         printf("Map OS Error: %d: %s: %s\n", dev_status.os_status,
            mrd_strstatus(status), log_info) ;
      else
         printf("Map OS Error: %d: %s\n", dev_status.os_status,
            mrd_strstatus(status)) ;

      return 0 ;
   }