VMS Help  —  MRD Library, mrd_move_medium, 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 ;
    }
Close Help