X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fscsi-irix.c;h=412a648ec2dccb72935858d429e118562933a6a3;hb=d97071000e65ce0c52c9043046acdc1c125397b0;hp=1e635c9e46811a7053969a896b19c0a4e45ad6a9;hpb=3ab887b9bc819a846c75dd7f2ee5d41fac22b19f;p=debian%2Famanda diff --git a/changer-src/scsi-irix.c b/changer-src/scsi-irix.c index 1e635c9..412a648 100644 --- a/changer-src/scsi-irix.c +++ b/changer-src/scsi-irix.c @@ -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 * @@ -32,26 +32,7 @@ */ -#include - -#ifdef HAVE_IRIX_LIKE_SCSI - -/* -#ifdef HAVE_STDIO_H -*/ -#include -/* -#endif -*/ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif +#include "amanda.h" #include #include @@ -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