revert to upstream
[debian/amanda] / changer-src / scsi-irix.c
index 1e635c9e46811a7053969a896b19c0a4e45ad6a9..412a648ec2dccb72935858d429e118562933a6a3 100644 (file)
@@ -24,7 +24,7 @@
  * file named AUTHORS, in the root directory of this distribution.
  */
 /*
- * $Id: scsi-irix.c,v 1.1.2.13.4.1.2.5 2003/01/26 19:20:57 martinea Exp $
+ * $Id: scsi-irix.c,v 1.23 2006/05/25 01:47:08 johnfranks Exp $
  *
  * Interface to execute SCSI commands on an SGI Workstation
  *
  */
 
 
-#include <amanda.h>
-
-#ifdef HAVE_IRIX_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/scsi.h>
 #include <sys/dsreq.h>
@@ -62,7 +43,7 @@
 void SCSI_OS_Version()
 {
 #ifndef lint
-   static char rcsid[] = "$Id: scsi-irix.c,v 1.1.2.13.4.1.2.5 2003/01/26 19:20:57 martinea Exp $";
+   static char rcsid[] = "$Id: scsi-irix.c,v 1.23 2006/05/25 01:47:08 johnfranks Exp $";
    DebugPrint(DEBUG_INFO, SECTION_INFO, "scsi-os-layer: %s\n",rcsid);
 #endif
 }
@@ -78,7 +59,7 @@ int SCSI_OpenDevice(int ip)
   
   if (pDev[ip].inqdone == 0)
     {
-      if ((DeviceFD = open(pDev[ip].dev, O_RDWR | O_EXCL)) > 0)
+      if ((DeviceFD = open(pDev[ip].dev, O_RDWR | O_EXCL)) >= 0)
         {
           pDev[ip].inqdone = 1;          pDev[ip].SCSI = 0;
           pDev[ip].avail = 1;
@@ -116,26 +97,16 @@ int SCSI_OpenDevice(int ip)
                   pDev[ip].avail = 0;
                   return(0);
                 }
-            } else { /* inquiry failed */
-              close(DeviceFD);
-              free(pDev[ip].inquiry);
-              pDev[ip].inquiry = NULL;
-              pDev[ip].avail = 0;
-              return(0);
             }
-
-          /*
-           * Open ok, but no SCSI communication available 
-           */
-
-          free(pDev[ip].inquiry);
-          pDev[ip].inquiry = NULL;
-          close(DeviceFD);
-          pDev[ip].avail = 0;
-          return(0);
+           /* inquiry failed or no SCSI communication available */
+            close(DeviceFD);
+            free(pDev[ip].inquiry);
+            pDev[ip].inquiry = NULL;
+            pDev[ip].avail = 0;
+            return(0);
         }
     } else {
-      if ((DeviceFD = open(pDev[ip].dev, O_RDWR | O_EXCL)) > 0)
+      if ((DeviceFD = open(pDev[ip].dev, O_RDWR | O_EXCL)) >= 0)
         {
           pDev[ip].fd = DeviceFD;
           pDev[ip].devopen = 1;
@@ -165,11 +136,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 +148,21 @@ int SCSI_ExecuteCommand(int DeviceFD,
   int Result;
   int retries = 5;
   
+  /* 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(struct dsreq));
+  memset(&ds, 0, SIZEOF(struct dsreq));
   memset(pRequestSense, 0, RequestSenseLength);
-  memset(&ExtendedRequestSense, 0 , sizeof(ExtendedRequestSense_T)); 
+  memset(&ExtendedRequestSense, 0 , SIZEOF(ExtendedRequestSense_T)); 
   
   ds.ds_flags = DSRQ_SENSE|DSRQ_TRACE|DSRQ_PRINT; 
   /* Timeout */
@@ -212,7 +190,14 @@ int SCSI_ExecuteCommand(int DeviceFD,
   while (--retries > 0) {
     if (pDev[DeviceFD].devopen == 0)
       {
-        SCSI_OpenDevice(DeviceFD);
+        if (SCSI_OpenDevice(DeviceFD) == 0)
+          {
+            dbprintf(_("SCSI_ExecuteCommand could not open %s: %s\n"),
+                      pDev[DeviceFD].dev,
+                     strerror(errno));
+            sleep(1); /* Give device a little time befor retry */
+            continue;
+          }
       }
     Result = ioctl(pDev[DeviceFD].fd, DS_ENTER, &ds);
     SCSI_CloseDevice(DeviceFD);
@@ -224,40 +209,33 @@ int SCSI_ExecuteCommand(int DeviceFD,
         return (SCSI_ERROR);
       }
     DecodeSCSI(CDB, "SCSI_ExecuteCommand : ");
-    dbprintf(("\t\t\tSTATUS(%02X) RET(%02X)\n", STATUS(&ds), RET(&ds)));
+    dbprintf(_("\t\t\tSTATUS(%02X) RET(%02X)\n"), STATUS(&ds), RET(&ds));
     switch (STATUS(&ds))
       {
       case ST_BUSY:                /*  BUSY */
         break;
+
       case STA_RESERV:             /*  RESERV CONFLICT */
         if (retries > 0)
           sleep(2);
         continue;
+
       case ST_GOOD:                /*  GOOD 0x00 */
         switch (RET(&ds))
           {
           case DSRT_SENSE:
             return(SCSI_SENSE);
-            break;
-          case DSRT_SHORT:
-            return(SCSI_OK);
-            break;
-          case DSRT_OK:
-          default:
-            return(SCSI_OK);
           }
+          return(SCSI_OK);
+
       case ST_CHECK:               /*  CHECK CONDITION 0x02 */ 
         switch (RET(&ds))
           {
           case DSRT_SENSE:
             return(SCSI_SENSE);
-            break;
-          default:
-            return(SCSI_CHECK);
-            break;
           }
         return(SCSI_CHECK);
-        break;
+
       case ST_COND_MET:            /*  INTERM/GOOD 0x10 */
       default:
         continue;
@@ -273,7 +251,8 @@ int Tape_Ioctl ( int DeviceFD, int command)
   
   if (pDev[DeviceFD].devopen == 0)
     {
-      SCSI_OpenDevice(DeviceFD);
+      if (SCSI_OpenDevice(DeviceFD) == 0)
+          return(-1);
     }
   
   switch (command)
@@ -299,12 +278,13 @@ int Tape_Status( int DeviceFD)
 
   if (pDev[DeviceFD].devopen == 0)
     {
-      SCSI_OpenDevice(DeviceFD);
+      if (SCSI_OpenDevice(DeviceFD) == 0)
+          return(-1);
     }
 
   if (ioctl(pDev[DeviceFD].fd , MTIOCGET, &mtget) != 0)
     {
-      dbprintf(("Tape_Status error ioctl %d\n",errno));
+      dbprintf(_("Tape_Status error ioctl %s\n"),strerror(errno));
       SCSI_CloseDevice(DeviceFD);
       return(-1);
     }
@@ -343,7 +323,11 @@ int ScanBus(int print)
   extern int errno;
   int count = 0;
 
-  dir = opendir("/dev/scsi");
+  if ((dir = opendir("/dev/scsi")) == NULL)
+    {
+      dbprintf(_("Can not read /dev/scsi: %s"), strerror(errno));
+      return 0;
+    }
 
   while ((dirent = readdir(dir)) != NULL)
     {
@@ -351,7 +335,7 @@ int ScanBus(int print)
       {
         pDev[count].dev = malloc(10);
         pDev[count].inqdone = 0;
-        sprintf(pDev[count].dev,"/dev/scsi/%s", dirent->d_name);
+        g_sprintf(pDev[count].dev,"/dev/scsi/%s", dirent->d_name);
         if (OpenDevice(count,pDev[count].dev, "Scan", NULL ))
           {
             SCSI_CloseDevice(count);
@@ -359,48 +343,48 @@ int ScanBus(int print)
             
             if (print)
               {
-                printf("name /dev/scsi/%s ", dirent->d_name);
+                g_printf(_("name /dev/scsi/%s "), dirent->d_name);
                 
                 switch (pDev[count].inquiry->type)
                   {
                   case TYPE_DISK:
-                    printf("Disk");
+                    g_printf(_("Disk"));
                     break;
                   case TYPE_TAPE:
-                    printf("Tape");
+                    g_printf(_("Tape"));
                     break;
                   case TYPE_PRINTER:
-                    printf("Printer");
+                    g_printf(_("Printer"));
                     break;
                   case TYPE_PROCESSOR:
-                    printf("Processor");
+                    g_printf(_("Processor"));
                     break;
                   case TYPE_WORM:
-                    printf("Worm");
+                    g_printf(_("Worm"));
                     break;
                   case TYPE_CDROM:
-                    printf("Cdrom");
+                    g_printf(_("Cdrom"));
                     break;
                   case TYPE_SCANNER:
-                    printf("Scanner");
+                    g_printf(_("Scanner"));
                     break;
                   case TYPE_OPTICAL:
-                    printf("Optical");
+                    g_printf(_("Optical"));
                     break;
                   case TYPE_CHANGER:
-                    printf("Changer");
+                    g_printf(_("Changer"));
                     break;
                   case TYPE_COMM:
-                    printf("Comm");
+                    g_printf(_("Comm"));
                     break;
                   default:
-                    printf("unknown %d",pDev[count].inquiry->type);
+                    g_printf(_("unknown %d"),pDev[count].inquiry->type);
                     break;
                   }
-                printf("\n");
+                g_printf("\n");
               }
             count++;
-           printf("Count %d\n",count);
+           g_printf(_("Count %d\n"),count);
           } else {
             free(pDev[count].dev);
             pDev[count].dev=NULL;
@@ -410,7 +394,6 @@ int ScanBus(int print)
   return 0;
 }
 
-#endif
 /*
  * Local variables:
  * indent-tabs-mode: nil