Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Jan 1996 09:35:24 +0200 (EET)
From:      Seppo Kallio <kallio@beeblebrox.pccc.jyu.fi>
To:        questions@freebsd.org, hardware@freebsd.org
Cc:        Seppo Kallio <kallio@beeblebrox.pccc.jyu.fi>
Subject:   HP C1553A Autoloading DDS-2 DAT tape drive control?
Message-ID:  <Pine.BSF.3.91.960126091900.207C-100000@beeblebrox.pccc.jyu.fi>

next in thread | raw e-mail | index | archive | help

Hi, we have HP C1553A Autoloading DDS2 DAT tape drives attached to 
a FreeBSD node. Is there a program available  that would allow me to 
fully manipulate the drive?

I have code for HPUX and Solaris, but it is so OS dependend I cannot 
compile it in FreeBSD.

Seppo




/*************************************************************
*
* dds_changer.c
*
* Utility to control a DDS autochanger (eg. C1553A, C156XA)
* HP S700  and SOLARIS only.
*
* Kevin Jones                   kev@hpcpbla.bri.hp.com
*
* eg. dds_changer [123456ne] /dev/rmt/3hcn
*
* 1..6 = Select cartridge
* n = next cartridge
* e = eject magazine
*
*******************************************************************
*
* To make: cc -o dds_changer dds_changer.c
*
* For HPUX
* You must use with major number 121, eg.
*     crw-rw-rw-   1 bin      bin      121 0x20130f Feb 26  1993 3hcn
*
***************************************************************/

#define SOLARIS

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#ifdef HPUX
#include <sys/scsi.h>
#else
#ifdef SOLARIS
#include <sys/scsi/impl/uscsi.h>
#include <errno.h>
#endif
#endif

int fd;
int temp = 1;

main(argc, argv)

int  argc;
char *argv[];

{
int stat;

#ifdef HPUX
struct sctl_io sctl_io;
#else
#ifdef SOLARIS
struct uscsi_cmd  scsi_cmd, *cmd = &scsi_cmd;
#endif
#endif

  if (argc < 3)
   { fprintf (stderr, "Usage: dds_changer [123456ne] device-filename\n");
     exit(1);
   }

#ifdef HPUX
  if ((fd = open (argv[2], O_RDWR | O_NDELAY)) < 0)
#else
#ifdef SOLARIS
  if ((fd = open(argv[2], O_RDWR | O_NONBLOCK)) < 0)
#endif
#endif
   { fprintf(stderr,"errno on %d\n",errno);
        perror("open:");
        fprintf (stderr, "Couldn't open device: %s\n", argv[2]);
   /*  exit(1); */
   }

#ifdef HPUX
  sctl_io.cdb_length = 6;
  sctl_io.data_length = 0;
  sctl_io.max_msecs = 100000;    /* Allow 100 seconds */
  sctl_io.flags  = 0;          /* Wrt, No WDTR, No ADTR, Use ATN */
  sctl_io.cdb[0]  = 0x1B;
  sctl_io.cdb[1]  = 0x00;
  sctl_io.cdb[2]  = 0x00;
  sctl_io.cdb[3]  = 0x00;
  sctl_io.cdb[4]  = 0x00;
  sctl_io.cdb[5]  = 0x00;
#else
#ifdef SOLARIS
  cmd->uscsi_cdb = malloc( (size_t) 6);
  cmd->uscsi_cdblen    = 0x06;
  cmd->uscsi_timeout   = 30000;
  cmd->uscsi_flags     = USCSI_WRITE;
  cmd->uscsi_bufaddr   = 0;
  cmd->uscsi_buflen    = 0;
  cmd->uscsi_cdb[0]    = 0x1B;
  cmd->uscsi_cdb[1]    = 0x00;
  cmd->uscsi_cdb[2]    = 0x00;
  cmd->uscsi_cdb[3]    = 0x00;
  cmd->uscsi_cdb[4]    = 0x00;
  cmd->uscsi_cdb[5]    = 0x00;
#endif
#endif

  switch (*argv[1])
   { case 'e' :
#ifdef HPUX
                sctl_io.cdb[5]  = 0x80;
#else
#ifdef SOLARIS
                cmd->uscsi_cdb[5] = 0x80;
#endif
#endif
                break;
     case 'n' : break;
     default  : if ((*argv[1] >= '1') && (*argv[1] <= '6'))
                 {
#ifdef HPUX
                   sctl_io.cdb[3]  = *argv[1] - '0';
                   sctl_io.cdb[4]  = 0x01;
#else
#ifdef SOLARIS
                   cmd->uscsi_cdb[3] = *argv[1] - '0';
                   cmd->uscsi_cdb[4] = 0x01;
#endif
#endif
                   break;
                 }
                fprintf (stderr, "Unrecognized option\n");
                close (fd);
                exit (1);
   }

  for (temp = 0; temp < 2; ++temp)              /* 2 tries in case we hit 
unit a
ttention */
   {
#ifdef HPUX
     if (ioctl(fd, SIOC_IO, sctl_io) < 0)
#else
#ifdef SOLARIS
     if ((stat = ioctl (fd, USCSICMD ,cmd)) < 0)
#endif
#endif
      { fprintf(stderr,"errno on %d stat on %d\n",errno,stat);
        perror("write:");
        fprintf (stderr, "Failed to exec IOCTL command !\n");
        close (fd);
        exit (1);
      } else {
        close(fd);
        exit( 0);
        }

#ifdef HPUX
     if (sctl_io.cdb_status == S_GOOD)
      { close (fd);
        exit (0);
      }
     else
        if (    (sctl_io.cdb_status != S_CHECK_CONDITION)
             || (sctl_io.sense_status != S_GOOD)
             || ((sctl_io.sense[2] & 0xF) != S_UNIT_ATTENTION)
           )
           break;
#endif
   }

  fprintf (stderr, "Device Reported Error !\n");
  close (fd);
  exit (1);
}




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.91.960126091900.207C-100000>