* 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
*
#include <amanda.h>
-#ifdef HAVE_AIX_LIKE_SCSI
+#include <scsi-defs.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#include <scsi-defs.h>
#include <gscdds.h>
-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
}
} 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;
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));
+ 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;
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;
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)
{
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;
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 */
/* 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)
{
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);
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;
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
DecodeExtSense(&ExtendedRequestSense, "SCSI_ExecuteCommand:", debug_file);
bcopy(&ExtendedRequestSense, RequestSenseBuf, RequestSenseLength);
*/
- dbprintf(("ioctl on %d return %d\n", pDev[DeviceFD].fd, Result));
- dbprintf(("ret: %d errno: %d (%s)\n", Result, errno, ""));
- dbprintf(("data_length: %d\n", ds.data_length));
- dbprintf(("buffer: 0x%X\n", ds.buffer));
- dbprintf(("timeout_value: %d\n", ds.timeout_value));
- dbprintf(("status_validity: %d\n", ds.status_validity));
- dbprintf(("scsi_bus_status: 0x%X\n", ds.scsi_bus_status));
- dbprintf(("adapter_status: 0x%X\n", ds.adapter_status));
- dbprintf(("adap_q_status: 0x%X\n", ds.adap_q_status));
- dbprintf(("q_tag_msg: 0x%X\n", ds.q_tag_msg));
- dbprintf(("flags: 0X%X\n", ds.flags));
+ dbprintf(_("ioctl on %d return %d\n"), pDev[DeviceFD].fd, Result);
+ dbprintf(_("ret: %d errno: %d (%s)\n"), Result, errno, "");
+ dbprintf(_("data_length: %d\n"), ds.data_length);
+ dbprintf(_("buffer: 0x%X\n"), ds.buffer);
+ dbprintf(_("timeout_value: %d\n"), ds.timeout_value);
+ dbprintf(_("status_validity: %d\n"), ds.status_validity);
+ dbprintf(_("scsi_bus_status: 0x%X\n"), ds.scsi_bus_status);
+ dbprintf(_("adapter_status: 0x%X\n"), ds.adapter_status);
+ dbprintf(_("adap_q_status: 0x%X\n"), ds.adap_q_status);
+ dbprintf(_("q_tag_msg: 0x%X\n"), ds.q_tag_msg);
+ dbprintf(_("flags: 0X%X\n"), ds.flags);
return(SCSI_ERROR);
}
}
}
}
-int SCSI_Scan()
+int SCSI_Scan(void)
{
int fd;
- extern int errno;
struct sc_inquiry si;
u_char buf[255];
int target;
{
for (lun = 0; lun < 7; lun++)
{
- printf("Target:Lun %d:%d\n", target,lun);
+ g_printf(_("Target:Lun %d:%d\n"), target,lun);
if (ioctl(fd, SCIOSTART, IDLUN(target, lun)) == -1) {
if (errno == EINVAL) {
- printf("is in use\n");
+ g_printf(_("is in use\n"));
isbusy = 1;
} else {
return(1);
isbusy = 0;
}
- bzero(&si, sizeof(si));
+ bzero(&si, SIZEOF(si));
si.scsi_id = target;
si.lun_id = lun;
si.inquiry_len = 255;
si.inquiry_ptr = (char *)&buf;
if (ioctl(fd, SCIOINQU, &si) == -1)
{
- printf("SCIOINQU: %s\n", strerror(errno));
+ g_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);
+ g_printf(_("%-28s|Device Type %d\n"),buf[8], type);
}
if (!isbusy && ioctl(fd, SCIOSTOP, IDLUN(target, lun)) == -1)
return(1);
return(-1);
}
-#endif
/*
* Local variables:
* indent-tabs-mode: nil