Copyright Digital Equipment Corp. All rights reserved.

Example

   /*
    *   This is an example of using mrd_position_to_element(3mrd)
    *   to perform multiple Position To Element commands.  For
    *   each pair of arguments after the robot and transport
    *   address, it will position the transport to that location.
    *
    *      mrd_position_to_element robot transport type address
    *
    *   Type can be one of:
    *
    *      slot, port, drive or transport
    *
    *   The optional transport argument can be a transport address
    *   number, the word "default" or an empty string.  To keep the
    *   example as simple as possible, it doesn't try to invert the
    *   transport.
    */
   #ifndef   lint
   static char SccsId[] = "@(#)mrd_position_to_element.c 1.2 3/5/97" ;
   #endif

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>

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

   /*
    *   Given a string, resembling one of the element types,
    *   return the SCSI type code for it.
    */
   struct {
      int   code ;
      char   *string ;
   } etypes[] = {
      TRANSPORT,   "transport",
      SLOT,      "slot",
      DRIVE,      "drive",
      PORT,      "port",
   } ;

   convert_type(char *etype)
   {
      register i ;

      /*
       *   For each entry in the array.
       */
      for(i = 0; i < sizeof(etypes)/sizeof(etypes[0]); i++)
         /*
          *   Do a case insensitive comparison, allowing
          *   abbreviations.  Return as soon as a match is
          *   found.  Return -1 if one isn't found.
          */
   #ifdef   vms
         if( strncmp(etypes[i].string, etype, strlen(etype)) == 0 )
   #else
         if( strncasecmp(etypes[i].string, etype, strlen(etype)) == 0 )
   #endif
            return etypes[i].code ;

      return -1 ;
   }

   main(int argc, char *argv[])
   {
      int      el ;         /* Counter */
      int      status ;      /* Status from MRD calls */
      int      invert = 0 ;      /* Don't invert */
      char      *robot ;      /* Robot name */
      int      type ;         /* Element type */
      int      element ;      /* Relative element addr */
      int      address ;      /* Absolute element addr */
      int      transport ;      /* Transport address */
      char      *transport_name ;   /* Tranport name */
      robot_info_t   robot_info ;
      dev_status_t   dev_status ;
      char      log_info[MRD_MAX_LOG_STRING+1] ;

      if( argc < 5 ) {
         printf("usage: %s robot transport type address ...\n", argv[0]);
         exit(1) ;
      }

      /*
       *   Get the medium changer name.
       */
      robot = argv[1] ;

      /*
       *   Get the transport number.  We'll keep it as a name
       *   so we can detect the default transport.  Once we
       *   know the element addresses, we can add the base
       *   base address if appropriate.
        */
      if( strcmp(argv[2], "default") == 0 )
         transport_name = NULL ;
      else
         transport_name = argv[2] ;

      /*
       *   Make sure there are pairs of arguments left.  There
       *   should be an odd number.
       */
      if((argc % 2) == 0 ) {
         printf("Pairs of arguments are required.\n") ;
         exit(1) ;
      }

      /*
       *   Open the robot.
       */
      robot_info.channel = BAD_CHANNEL ;

      status = mrd_startup(robot, &robot_info, log_info) ;

      if( status != MRD_STATUS_SUCCESS ) {
         fprintf(stderr, "Can't start %s: %s\n", robot,
            mrd_strstatus(status)) ;

         exit(1) ;
      }

      if( transport_name == NULL )
         transport = 0 ;
      else
         transport = atoi(transport_name) + robot_info.transport_start;

      /*
       *   Look at the element addresses in pairs.
       */
      for(el = 3; el < argc; el += 2) {
         type    = convert_type(argv[el]) ;
         element = atoi(argv[el + 1]) ;

         switch( type ) {
         case SLOT:
            address = element + robot_info.slot_start ;
            break ;
         case DRIVE:
            address = element + robot_info.device_start ;
            break ;
         case TRANSPORT:
            address = element + robot_info.transport_start ;
            break ;
         case PORT:
            address = element + robot_info.port_start ;
            break ;
         default:
            printf("Unknown element type: %s %s\n", argv[el],
               argv[el + 1]) ;

            continue ;
         }

         /*
          *   Audit the command.
          */
         printf("Position transport to %s #%d.\n", mrd_strelement(type),
            element) ;

         /*
          *   Do the command.
          */
         status = mrd_position_to_element(&robot_info, transport,
                   address, invert, &dev_status) ;

         if( status != MRD_STATUS_SUCCESS )
            printf("Position to Element failed: %s: %s.\n", robot,
               mrd_strstatus(status)) ;
      }

      (void)mrd_shutdown(&robot_info) ;

      return 0 ;
   }