X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fscsi-linux.c;fp=changer-src%2Fscsi-linux.c;h=9885349fb52161ad4b355974bcbd19b92cf9d584;hb=12179dea039515c06168c0037d048566a3f623de;hp=750bd626cae3acee7fa1190903ac20afab224ccb;hpb=94c03cae686e4196a345d72452fda2a5203768ce;p=debian%2Famanda diff --git a/changer-src/scsi-linux.c b/changer-src/scsi-linux.c index 750bd62..9885349 100644 --- a/changer-src/scsi-linux.c +++ b/changer-src/scsi-linux.c @@ -24,7 +24,7 @@ * file named AUTHORS, in the root directory of this distribution. */ /* - * $Id: scsi-linux.c,v 1.28 2006/03/09 20:06:10 johnfranks Exp $ + * $Id: scsi-linux.c,v 1.30 2006/07/06 11:57:28 martinea Exp $ * * Interface to execute SCSI commands on Linux * @@ -78,18 +78,18 @@ #include +extern OpenFiles_T *pDev; -void SCSI_OS_Version() +void SCSI_OS_Version(void) { #ifndef lint - static char rcsid[] = "$Id: scsi-linux.c,v 1.28 2006/03/09 20:06:10 johnfranks Exp $"; + static char rcsid[] = "$Id: scsi-linux.c,v 1.30 2006/07/06 11:57:28 martinea Exp $"; DebugPrint(DEBUG_ERROR, SECTION_INFO, "scsi-os-layer: %s\n",rcsid); #endif } int SCSI_CloseDevice(int DeviceFD) { - extern OpenFiles_T *pDev; int ret = 0; if (pDev[DeviceFD].devopen == 1) @@ -114,7 +114,6 @@ int SCSI_CloseDevice(int DeviceFD) #ifdef LINUX_SG int SCSI_OpenDevice(int ip) { - extern OpenFiles_T *pDev; int DeviceFD; int i; int timeout; @@ -134,12 +133,12 @@ int SCSI_OpenDevice(int ip) if (S_ISLNK(pstat.st_mode) == 1) { DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_OpenDevice : is a link, checking destination\n"); - if ((buffer = (char *)malloc(512)) == NULL) + if ((buffer = (char *)malloc(513)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_SCSI,"SCSI_OpenDevice : malloc failed\n"); return(0); } - memset(buffer, 0, 512); + memset(buffer, 0, 513); if (( i = readlink(pDev[ip].dev, buffer, 512)) == -1) { if (errno == ENAMETOOLONG ) @@ -206,7 +205,7 @@ int SCSI_OpenDevice(int ip) } } pDev[ip].inquiry = (SCSIInquiry_T *)malloc(INQUIRY_SIZE); - if (SCSI_Inquiry(ip, pDev[ip].inquiry, INQUIRY_SIZE) == 0) + if (SCSI_Inquiry(ip, pDev[ip].inquiry, (u_char)INQUIRY_SIZE) == 0) { if (pDev[ip].inquiry->type == TYPE_TAPE || pDev[ip].inquiry->type == TYPE_CHANGER) { @@ -288,21 +287,27 @@ int SCSI_OpenDevice(int ip) return(0); } -#define SCSI_OFF sizeof(struct sg_header) +#define SCSI_OFF SIZEOF(struct sg_header) 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; struct sg_header *psg_header; char *buffer; - int osize = 0; - int status; + size_t osize = 0; + ssize_t status; + + /* 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) { @@ -337,7 +342,7 @@ int SCSI_ExecuteCommand(int DeviceFD, psg_header->twelve_byte = 0; } psg_header->result = 0; - psg_header->reply_len = SCSI_OFF + DataBufferLength; + psg_header->reply_len = (int)(SCSI_OFF + DataBufferLength); switch (Direction) { @@ -352,8 +357,9 @@ int SCSI_ExecuteCommand(int DeviceFD, DecodeSCSI(CDB, "SCSI_ExecuteCommand : "); status = write(pDev[DeviceFD].fd, buffer, SCSI_OFF + CDB_Length + osize); - if ( status < 0 || status != SCSI_OFF + CDB_Length + osize || - psg_header->result ) + if ( (status < (ssize_t)0) || + (status != (ssize_t)(SCSI_OFF + CDB_Length + osize)) || + (psg_header->result != 0)) { dbprintf(("SCSI_ExecuteCommand error send \n")); SCSI_CloseDevice(DeviceFD); @@ -366,8 +372,9 @@ int SCSI_ExecuteCommand(int DeviceFD, memset(pRequestSense, 0, RequestSenseLength); memcpy(pRequestSense, psg_header->sense_buffer, 16); - if ( status < 0 || status != SCSI_OFF + DataBufferLength || - psg_header->result ) + if ( (status < 0) || + (status != (ssize_t)(SCSI_OFF + DataBufferLength)) || + (psg_header->result != 0)) { dbprintf(("SCSI_ExecuteCommand error read \n")); dbprintf(("Status %d (%d) %2X\n", status, SCSI_OFF + DataBufferLength,psg_header->result )); @@ -401,7 +408,6 @@ static inline int max(int x, int y) int SCSI_OpenDevice(int ip) { - extern OpenFiles_T *pDev; int DeviceFD; int i; @@ -415,7 +421,7 @@ int SCSI_OpenDevice(int ip) pDev[ip].SCSI = 0; pDev[ip].inquiry = (SCSIInquiry_T *)malloc(INQUIRY_SIZE); dbprintf(("SCSI_OpenDevice : use ioctl interface\n")); - if (SCSI_Inquiry(ip, pDev[ip].inquiry, INQUIRY_SIZE) == 0) + if (SCSI_Inquiry(ip, pDev[ip].inquiry, (u_char)INQUIRY_SIZE) == 0) { if (pDev[ip].inquiry->type == TYPE_TAPE || pDev[ip].inquiry->type == TYPE_CHANGER) { @@ -457,10 +463,9 @@ int SCSI_ExecuteCommand(int DeviceFD, int CDB_Length, void *DataBuffer, int DataBufferLength, - char *pRequestSense, + RequestSense_T *pRequestSense, int RequestSenseLength) { - extern OpenFiles_T *pDev; unsigned char *Command; int Zero = 0, Result; @@ -523,7 +528,6 @@ int SCSI_ExecuteCommand(int DeviceFD, */ int Tape_Ioctl( int DeviceFD, int command) { - extern OpenFiles_T *pDev; struct mtop mtop; int ret = 0; @@ -545,7 +549,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); } @@ -556,10 +560,10 @@ int Tape_Ioctl( int DeviceFD, int command) int Tape_Status( int DeviceFD) { - extern OpenFiles_T *pDev; struct mtget mtget; int ret = 0; + memset(&mtget, 0, SIZEOF(mtget)); if (pDev[DeviceFD].devopen == 0) { if (SCSI_OpenDevice(DeviceFD) == 0) @@ -568,7 +572,8 @@ int Tape_Status( int DeviceFD) if (ioctl(pDev[DeviceFD].fd , MTIOCGET, &mtget) != 0) { - DebugPrint(DEBUG_ERROR, SECTION_TAPE,"Tape_Status error ioctl %d\n",errno); + DebugPrint(DEBUG_ERROR, SECTION_TAPE,"Tape_Status error ioctl %s\n", + strerror(errno)); SCSI_CloseDevice(DeviceFD); return(-1); } @@ -612,8 +617,6 @@ int ScanBus(int print) { DIR *dir; struct dirent *dirent; - extern OpenFiles_T *pDev; - extern int errno; int count = 0; if ((dir = opendir("/dev/")) == NULL) @@ -628,7 +631,8 @@ int ScanBus(int print) { pDev[count].dev = malloc(10); pDev[count].inqdone = 0; - sprintf(pDev[count].dev,"/dev/%s", dirent->d_name); + snprintf(pDev[count].dev, SIZEOF(pDev[count].dev), + "/dev/%s", dirent->d_name); if (OpenDevice(count,pDev[count].dev, "Scan", NULL )) { SCSI_CloseDevice(count);