* 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
*
#include <scsi-defs.h>
+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)
#ifdef LINUX_SG
int SCSI_OpenDevice(int ip)
{
- extern OpenFiles_T *pDev;
int DeviceFD;
int i;
int timeout;
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 )
}
}
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)
{
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)
{
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)
{
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);
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 ));
+ dbprintf(("Status " SSIZE_T_FMT " (" SSIZE_T_FMT ") %2X\n", status, SCSI_OFF + DataBufferLength,psg_header->result ));
SCSI_CloseDevice(DeviceFD);
amfree(buffer);
return(SCSI_ERROR);
int SCSI_OpenDevice(int ip)
{
- extern OpenFiles_T *pDev;
int DeviceFD;
int i;
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)
{
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;
*/
int Tape_Ioctl( int DeviceFD, int command)
{
- extern OpenFiles_T *pDev;
struct mtop mtop;
int ret = 0;
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);
}
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)
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);
}
{
DIR *dir;
struct dirent *dirent;
- extern OpenFiles_T *pDev;
- extern int errno;
int count = 0;
if ((dir = opendir("/dev/")) == NULL)
{
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);