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