From d1d5ca539d3247f036d66a087e2c3cf756dc6115 Mon Sep 17 00:00:00 2001 From: Yorick Hardy Date: Tue, 20 May 2003 19:17:04 +0000 Subject: [PATCH] Implement CDROM_ScsiPassThrough and CDROM_ScsiPassThroughDirect on NetBSD. --- dlls/ntdll/cdrom.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c index a542aa5dc20..f8838b066ae 100644 --- a/dlls/ntdll/cdrom.c +++ b/dlls/ntdll/cdrom.c @@ -1410,6 +1410,67 @@ static DWORD CDROM_ScsiPassThroughDirect(int dev, PSCSI_PASS_THROUGH_DIRECT pPac pPacket->ScsiStatus = cmd.stat; ret = CDROM_GetStatusCode(io); + +#elif defined(__NetBSD__) + scsireq_t cmd; + int io; + + if (pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT)) + return STATUS_BUFFER_TOO_SMALL; + + if (pPacket->CdbLength > 12) + return STATUS_INVALID_PARAMETER; + + if (pPacket->SenseInfoLength > SENSEBUFLEN) + return STATUS_INVALID_PARAMETER; + + memset(&cmd, 0, sizeof(cmd)); + memcpy(&(cmd.cmd), &(pPacket->Cdb), pPacket->CdbLength); + + cmd.cmdlen = pPacket->CdbLength; + cmd.databuf = pPacket->DataBuffer; + cmd.datalen = pPacket->DataTransferLength; + cmd.senselen = pPacket->SenseInfoLength; + cmd.timeout = pPacket->TimeOutValue*1000; /* in milliseconds */ + + switch (pPacket->DataIn) + { + case SCSI_IOCTL_DATA_OUT: + cmd.flags |= SCCMD_WRITE; + break; + case SCSI_IOCTL_DATA_IN: + cmd.flags |= SCCMD_READ; + break; + case SCSI_IOCTL_DATA_UNSPECIFIED: + cmd.flags = 0; + break; + default: + return STATUS_INVALID_PARAMETER; + } + + io = ioctl(cdrom_cache[dev].fd, SCIOCCOMMAND, &cmd); + + switch (cmd.retsts) + { + case SCCMD_OK: break; + case SCCMD_TIMEOUT: return STATUS_TIMEOUT; + break; + case SCCMD_BUSY: return STATUS_DEVICE_BUSY; + break; + case SCCMD_SENSE: break; + case SCCMD_UNKNOWN: return STATUS_UNSUCCESSFUL; + break; + } + + if (pPacket->SenseInfoLength != 0) + { + memcpy((char*)pPacket + pPacket->SenseInfoOffset, + cmd.sense, pPacket->SenseInfoLength); + } + + pPacket->ScsiStatus = cmd.status; + + ret = CDROM_GetStatusCode(io); #endif return ret; } @@ -1480,6 +1541,75 @@ static DWORD CDROM_ScsiPassThrough(int dev, PSCSI_PASS_THROUGH pPacket) pPacket->ScsiStatus = cmd.stat; ret = CDROM_GetStatusCode(io); + +#elif defined(__NetBSD__) + scsireq_t cmd; + int io; + + if (pPacket->Length < sizeof(SCSI_PASS_THROUGH)) + return STATUS_BUFFER_TOO_SMALL; + + if (pPacket->CdbLength > 12) + return STATUS_INVALID_PARAMETER; + + if (pPacket->SenseInfoLength > SENSEBUFLEN) + return STATUS_INVALID_PARAMETER; + + memset(&cmd, 0, sizeof(cmd)); + memcpy(&(cmd.cmd), &(pPacket->Cdb), pPacket->CdbLength); + + if ( pPacket->DataBufferOffset > 0x1000 ) + { + cmd.databuf = (void*)pPacket->DataBufferOffset; + } + else + { + cmd.databuf = (char*)pPacket + pPacket->DataBufferOffset; + } + + cmd.cmdlen = pPacket->CdbLength; + cmd.datalen = pPacket->DataTransferLength; + cmd.senselen = pPacket->SenseInfoLength; + cmd.timeout = pPacket->TimeOutValue*1000; /* in milliseconds */ + + switch (pPacket->DataIn) + { + case SCSI_IOCTL_DATA_OUT: + cmd.flags |= SCCMD_WRITE; + break; + case SCSI_IOCTL_DATA_IN: + cmd.flags |= SCCMD_READ; + break; + case SCSI_IOCTL_DATA_UNSPECIFIED: + cmd.flags = 0; + break; + default: + return STATUS_INVALID_PARAMETER; + } + + io = ioctl(cdrom_cache[dev].fd, SCIOCCOMMAND, &cmd); + + switch (cmd.retsts) + { + case SCCMD_OK: break; + case SCCMD_TIMEOUT: return STATUS_TIMEOUT; + break; + case SCCMD_BUSY: return STATUS_DEVICE_BUSY; + break; + case SCCMD_SENSE: break; + case SCCMD_UNKNOWN: return STATUS_UNSUCCESSFUL; + break; + } + + if (pPacket->SenseInfoLength != 0) + { + memcpy((char*)pPacket + pPacket->SenseInfoOffset, + cmd.sense, pPacket->SenseInfoLength); + } + + pPacket->ScsiStatus = cmd.status; + + ret = CDROM_GetStatusCode(io); #endif return ret; } -- 2.11.4.GIT