X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fscsi-aix.c;h=5e0dba86f44fa1aa1c4979d0d13e15c6292c8ef0;hb=12179dea039515c06168c0037d048566a3f623de;hp=7e00fda1cf1df01a06ec3529e9933c74e70d684b;hpb=3ab887b9bc819a846c75dd7f2ee5d41fac22b19f;p=debian%2Famanda diff --git a/changer-src/scsi-aix.c b/changer-src/scsi-aix.c index 7e00fda..5e0dba8 100644 --- a/changer-src/scsi-aix.c +++ b/changer-src/scsi-aix.c @@ -24,7 +24,7 @@ * file named AUTHORS, in the root directory of this distribution. */ /* - * $Id: scsi-aix.c,v 1.1.2.14.4.3.2.3 2003/01/26 19:20:56 martinea Exp $ + * $Id: scsi-aix.c,v 1.23 2006/05/25 01:47:07 johnfranks Exp $ * * Interface to execute SCSI commands on an AIX System * @@ -36,6 +36,8 @@ #ifdef HAVE_AIX_LIKE_SCSI +#include + #ifdef HAVE_SYS_TYPES_H #include #endif @@ -61,10 +63,10 @@ #include #include -void SCSI_OS_Version() +void SCSI_OS_Version(void) { #ifndef lint - static char rcsid[] = "$Id: scsi-aix.c,v 1.1.2.14.4.3.2.3 2003/01/26 19:20:56 martinea Exp $"; + static char rcsid[] = "$Id: scsi-aix.c,v 1.23 2006/05/25 01:47:07 johnfranks Exp $"; DebugPrint(DEBUG_INFO, SECTION_INFO, "scsi-os-layer: %s\n",rcsid); #endif } @@ -89,7 +91,7 @@ int SCSI_OpenDevice(int ip) } else { DeviceFD = openx(pDev[ip].dev, O_RDWR, 0, SC_DIAGNOSTIC); } - if (DeviceFD > 0) + if (DeviceFD >= 0) { pDev[ip].avail = 1; pDev[ip].fd = DeviceFD; @@ -126,18 +128,16 @@ int SCSI_OpenDevice(int ip) free(pDev[ip].inquiry); return(0); } - } else { - free(pDev[ip].inquiry); - pDev[ip].inquiry = NULL; - return(1); } - return(1); + free(pDev[ip].inquiry); + pDev[ip].inquiry = NULL; + return(1); } else { dbprintf(("SCSI_OpenDevice %s failed\n", pDev[ip].dev)); return(0); } } else { - if ((DeviceFD = openx(pDev[ip].dev, O_RDWR, 0, SC_DIAGNOSTIC)) > 0) + if ((DeviceFD = openx(pDev[ip].dev, O_RDWR, 0, SC_DIAGNOSTIC)) >= 0) { pDev[ip].fd = DeviceFD; pDev[ip].devopen = 1; @@ -161,11 +161,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 *RequestSenseBuf, - int RequestSenseLength) + size_t DataBufferLength, + RequestSense_T *RequestSenseBuf, + size_t RequestSenseLength) { extern OpenFiles_T *pDev; extern FILE * debug_file; @@ -179,6 +179,12 @@ int SCSI_ExecuteCommand(int DeviceFD, int isbusy = 0; int target = 3; + /* Basic sanity checks */ + assert(CDB_Length <= UCHAR_MAX); + assert(RequestSenseLength <= UCHAR_MAX); + + /* Clear buffer for cases where sense is not returned */ + memset(RequestSenseBuf, 0, RequestSenseLength); if (pDev[DeviceFD].avail == 0) { @@ -192,7 +198,7 @@ int SCSI_ExecuteCommand(int DeviceFD, scmd.cdblen = CDB_Length; scmd.data_buf = DataBuffer; scmd.datalen = DataBufferLength; - scmd.sense_buf = RequestSenseBuf; + scmd.sense_buf = (unsigned char *)RequestSenseBuf; scmd.senselen = RequestSenseLength; scmd.statusp = &sbyte; scmd.timeval = 60; @@ -212,9 +218,9 @@ int SCSI_ExecuteCommand(int DeviceFD, return(SCSI_OK); } else { - bzero(&ds, sizeof(struct sc_iocmd)); + bzero(&ds, SIZEOF(struct sc_iocmd)); bzero(RequestSenseBuf, RequestSenseLength); - bzero(&ExtendedRequestSense, sizeof(ExtendedRequestSense_T)); + bzero(&ExtendedRequestSense, SIZEOF(ExtendedRequestSense_T)); ds.flags = SC_ASYNC; /* Timeout */ @@ -235,7 +241,7 @@ int SCSI_ExecuteCommand(int DeviceFD, /* Sense Buffer is not available on AIX ?*/ /* ds.req_sense_length = 255; - ds.request_sense_ptr = (char *)RequestSense; + ds.request_sense_ptr = (unsigned char *)RequestSense; */ switch (Direction) { @@ -249,7 +255,8 @@ int SCSI_ExecuteCommand(int DeviceFD, DecodeSCSI(CDB, "SCSI_ExecuteCommand : "); if (pDev[DeviceFD].devopen == 0) - SCSI_OpenDevice(DeviceFD); + if (SCSI_OpenDevice(DeviceFD) == 0) + return(SCSI_ERROR); Result = ioctl(pDev[DeviceFD].fd, STIOCMD, &ds); SCSI_CloseDevice(DeviceFD); @@ -266,18 +273,19 @@ int SCSI_ExecuteCommand(int DeviceFD, SINQ[5] = 0x80; bcopy(SINQ, ds.scsi_cdb, 6); ds.command_length = 6; - ds.buffer = RequestSenseBuf; + ds.buffer = (unsigned char *)RequestSenseBuf; ds.data_length = RequestSenseLength; if (pDev[DeviceFD].devopen == 0) - SCSI_OpenDevice(DeviceFD); + if (SCSI_OpenDevice(DeviceFD) == 0) + return(SCSI_ERROR); Result = ioctl(pDev[DeviceFD].fd, STIOCMD, &ds); SCSI_CloseDevice(DeviceFD); return(SCSI_OK); - break; + case SC_BUSY_STATUS: return(SCSI_BUSY); - break; + case SC_CHECK_CONDITION: SINQ[0] = SC_COM_REQUEST_SENSE; SINQ[1] = 0; @@ -287,15 +295,16 @@ int SCSI_ExecuteCommand(int DeviceFD, SINQ[5] = 0x80; bcopy(SINQ, ds.scsi_cdb, 6); ds.command_length = 6; - ds.buffer = RequestSenseBuf; - ds.data_length = RequestSenseLength; + ds.buffer = (unsigned char *)RequestSenseBuf; + ds.data_length = (unsigned char)RequestSenseLength; if (pDev[DeviceFD].devopen == 0) - SCSI_OpenDevice(DeviceFD); + if (SCSI_OpenDevice(DeviceFD) == 0) + return(SCSI_ERROR); Result = ioctl(pDev[DeviceFD].fd, STIOCMD, &ds); SCSI_CloseDevice(DeviceFD); return(SCSI_CHECK); - break; + default: /* * Makes no sense yet, may result in an endless loop @@ -322,10 +331,9 @@ int SCSI_ExecuteCommand(int DeviceFD, } } -int SCSI_Scan() +int SCSI_Scan(void) { int fd; - extern int errno; struct sc_inquiry si; u_char buf[255]; int target; @@ -353,7 +361,7 @@ int SCSI_Scan() isbusy = 0; } - bzero(&si, sizeof(si)); + bzero(&si, SIZEOF(si)); si.scsi_id = target; si.lun_id = lun; si.inquiry_len = 255; @@ -363,9 +371,9 @@ int SCSI_Scan() printf("SCIOINQU: %s\n", strerror(errno)); } else { dump_hex(&buf, 255, DEBUG_INFO, SECTION_SCSI); - type = buf[0] & 0x1f; + type = buf[0] & 0x1lf; buf[8+28] = 0; - printf(stdout,"%-28s|Device Type %d\n",buf[8], type); + printf("%-28s|Device Type %d\n",buf[8], type); } if (!isbusy && ioctl(fd, SCIOSTOP, IDLUN(target, lun)) == -1) return(1);