Copyright Digital Equipment Corp. All rights reserved.

Example

   /*
    *   This is an example of using mrd_move_medium(3mrd) directly to
    *   move a cartridge from one slot to another.  To simplify the
    *   example, it only supports slot to slot moves, but it shows
    *   how the absolute element addresses are calcuated.  For each
    *   additional destination address given, the previous (successful)
    *   destination address is used as the source.
    *
    *   Usage:
    *
    *      mrd_move_medium robot source dest [ dest... ]
    */
   #ifndef   lint
   static   char   SccsId[] = "@(#)mrd_move_medium.c   1.4 3/5/97" ;
   #endif

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

   main(int argc, char *argv[])
   {
      int      i ;      /* counter */
      int      source ;   /* Source address */
      int      dest ;      /* Destination address */
      int      invert = 0 ;   /* Assume it can't invert */
      int      transport ;   /* Transport address */
      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 < 4 ) {
         printf("usage: %s robot source dest [ dest... ]\n", argv[0]) ;
         exit(1) ;
      }
      else {
         robot  = argv[1] ;
         source = atoi(argv[2]) ;
      }

      /*
       *   Initialize the channel field of the robot_info, so
       *   mrd_startup(3mrd) will actually open the robot.
       */
      robot_info.channel = BAD_CHANNEL ;

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

      if( status != MRD_STATUS_SUCCESS ) {
         printf("Startup failed: %s: %s.\n", mrd_strstatus(status),
            log_info[0] ? log_info : "none") ;

         exit(1) ;
      }

      /*
       *   Set the transport address.  If there is only one
       *   transport use the correct address.  If there is
       *   more than one assume that the medium changer
       *   supports zero as the default.
       */
      if( robot_info.transport_count == 1 )
         transport = robot_info.transport_start ;
      else
         transport = 0 ;

      /*
       *   Turn the relative slot address into an absolute slot
       *   address by adding the slot start address.
       */
      source += robot_info.slot_start ;

      /*
       *   For each destination address on the command line,
       *   move the the cartridge in the source to the
       *   destination.  After each (successful) move, replace
       *   the previous source with this destination.
       */
      for(i = 3; i < argc; i++) {
         /*
          *   Calculate the absolute address.
          */
         dest = atoi(argv[i]) + robot_info.slot_start ;

         /*
          *   Print an audit as we go.  Since we know these
          *   are slots, convert back to relative addresses
          *   for the audit.
          */
         printf("Move the medium in slot %d to slot %d\n",
            source - robot_info.slot_start,
            dest   - robot_info.slot_start) ;

         status = mrd_move_medium(&robot_info, transport, source,
               dest, invert, &dev_status) ;

         if( status != MRD_STATUS_SUCCESS ) {
            printf("Move failed on %s: %s\n", robot,
               mrd_strstatus(status)) ;

            /*
             *   Since the cartridge didn't move, don't
             *   reset the source, by skipping the remainder
             *   of the loop.
             */
            continue ;
         }

         /*
          *   Make the next source, this destination.
          */
         source = dest ;
      }

      (void)mrd_shutdown(&robot_info) ;

      return 0 ;
   }