Imported Upstream version 2.6.0
[debian/amanda] / changer-src / scsi-bsd.c
index a152b2411f344ba15e82d3794ea80d0658090996..bff9495212da01eb1d4c9fc35e5a77c854532c8c 100644 (file)
@@ -24,7 +24,7 @@
  * file named AUTHORS, in the root directory of this distribution.
  */
 /*
- * $Id: scsi-bsd.c,v 1.1.2.10.4.2.2.4 2003/06/05 20:44:23 martinea Exp $
+ * $Id: scsi-bsd.c,v 1.18 2006/05/25 01:47:07 johnfranks Exp $
  *
  * Interface to execute SCSI commands on an BSD System (FreeBSD)
  *
  */
 
 
-#include <amanda.h>
-
-#ifdef HAVE_BSD_LIKE_SCSI
-
-/*
-#ifdef HAVE_STDIO_H
-*/
-#include <stdio.h>
-/*
-#endif
-*/
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
+#include "amanda.h"
 
 #include <sys/scsiio.h>
 #include <sys/mtio.h>
@@ -61,7 +42,7 @@
 void SCSI_OS_Version()
 {
 #ifndef lint
-   static char rcsid[] = "$Id: scsi-bsd.c,v 1.1.2.10.4.2.2.4 2003/06/05 20:44:23 martinea Exp $";
+   static char rcsid[] = "$Id: scsi-bsd.c,v 1.18 2006/05/25 01:47:07 johnfranks Exp $";
    DebugPrint(DEBUG_INFO, SECTION_INFO, "scsi-os-layer: %s\n",rcsid);
 #endif
 }
@@ -75,7 +56,6 @@ void SCSI_OS_Version()
  * Return:
  * 0  -> device not opened
  * 1  -> sucess , device open
- * -1 -> fatal error
  */
 int SCSI_OpenDevice(int ip)
 {
@@ -93,7 +73,7 @@ int SCSI_OpenDevice(int ip)
     pDev[ip].SCSI = 0;                                                        /* This will only be set if the inquiry works */
     pDev[ip].inquiry = (SCSIInquiry_T *)malloc(INQUIRY_SIZE);
     
-    if (( pDev[ip].fd = open(pDev[ip].dev, O_RDWR)) > 0)                      /* We need the device in read/write mode */
+    if (( pDev[ip].fd = open(pDev[ip].dev, O_RDWR)) >= 0)                      /* We need the device in read/write mode */
       {
         pDev[ip].devopen = 1;                                                 /* The device is open for use */
         pDev[ip].avail = 1;                                                   /* And it is available, it could be opened */
@@ -137,7 +117,7 @@ int SCSI_OpenDevice(int ip)
       }  /* open() */
     return(0);                                                                /* Open failed .... */
   } else { /* pDev[ip].inqdone */                                             /* OK this is the way we go if the device */
-    if (( pDev[ip].fd = open(pDev[ip].dev, O_RDWR)) > 0)                      /* was opened successfull before */
+    if (( pDev[ip].fd = open(pDev[ip].dev, O_RDWR)) >= 0)                      /* was opened successfull before */
       {
         pDev[ip].devopen = 1;
         return(1);
@@ -164,11 +144,11 @@ int SCSI_CloseDevice(int DeviceFD)
 int SCSI_ExecuteCommand(int DeviceFD,
                         Direction_T Direction,
                         CDB_T CDB,
-                        int CDB_Length,
+                        size_t CDB_Length,
                         void *DataBuffer,
-                        int DataBufferLength,
-                        char *pRequestSense,
-                        int RequestSenseLength)
+                        size_t DataBufferLength,
+                        RequestSense_T *pRequestSense,
+                        size_t RequestSenseLength)
 {
   extern OpenFiles_T *pDev;
   ExtendedRequestSense_T ExtendedRequestSense;
@@ -177,14 +157,21 @@ int SCSI_ExecuteCommand(int DeviceFD,
   int retries = 5;
   extern int errno;
   
+  /* Basic sanity checks */
+  assert(CDB_Length <= UCHAR_MAX);
+  assert(RequestSenseLength <= UCHAR_MAX);
+
+  /* Clear buffer for cases where sense is not returned */
+  memset(pRequestSense, 0, RequestSenseLength);
+
   if (pDev[DeviceFD].avail == 0)
     {
       return(SCSI_ERROR);
     }
 
-  memset(&ds, 0, sizeof(scsireq_t));
+  memset(&ds, 0, SIZEOF(scsireq_t));
   memset(pRequestSense, 0, RequestSenseLength);
-  memset(&ExtendedRequestSense, 0 , sizeof(ExtendedRequestSense_T)); 
+  memset(&ExtendedRequestSense, 0 , SIZEOF(ExtendedRequestSense_T)); 
   
   ds.flags = SCCMD_ESCAPE; 
   /* Timeout */
@@ -217,29 +204,29 @@ int SCSI_ExecuteCommand(int DeviceFD,
   while (--retries > 0) {
     
     if (pDev[DeviceFD].devopen == 0)
-      {
-        SCSI_OpenDevice(DeviceFD);
-      }
+        if (SCSI_OpenDevice(DeviceFD) == 0)
+            return(SCSI_ERROR);
     Result = ioctl(pDev[DeviceFD].fd, SCIOCCOMMAND, &ds);
     SCSI_CloseDevice(DeviceFD);
    
     memcpy(pRequestSense, ds.sense, RequestSenseLength);
     if (Result < 0)
       {
-        dbprintf(("errno : %d\n",errno));
+        dbprintf("errno : %s\n",strerror(errno));
         return (SCSI_ERROR);
       }
-    dbprintf(("SCSI_ExecuteCommand(BSD) %02X STATUS(%02X) \n", CDB[0], ds.retsts));
+    dbprintf("SCSI_ExecuteCommand(BSD) %02X STATUS(%02X) \n", CDB[0], ds.retsts);
     switch (ds.retsts)
       {
       case SCCMD_BUSY:                /*  BUSY */
         break;
+
       case SCCMD_OK:                /*  GOOD */
         return(SCSI_OK);
-        break;
+
       case SCCMD_SENSE:               /*  CHECK CONDITION */
         return(SCSI_SENSE);
-        break;
+
       default:
         continue;
       }
@@ -258,9 +245,8 @@ int Tape_Ioctl( int DeviceFD, int command)
   int ret = 0;
 
   if (pDev[DeviceFD].devopen == 0)
-    {
-      SCSI_OpenDevice(DeviceFD);
-    }
+      if (SCSI_OpenDevice(DeviceFD) == 0)
+          return(-1);
 
   switch (command)
     {
@@ -274,7 +260,7 @@ int Tape_Ioctl( int DeviceFD, int command)
 
   if (ioctl(pDev[DeviceFD].fd , MTIOCTOP, &mtop) != 0)
     {
-      dbprintf(("Tape_Ioctl error ioctl %d\n",errno));
+      dbprintf(_("Tape_Ioctl error ioctl %s\n"),strerror(errno));
       SCSI_CloseDevice(DeviceFD);
       return(-1);
     }
@@ -299,7 +285,6 @@ int ScanBus(int print)
   return(-1);
 }
 
-#endif
 /*
  * Local variables:
  * indent-tabs-mode: nil