IODVDMediaBSDClient.cpp [plain text]
#include <sys/errno.h>
#include <IOKit/storage/IODVDMediaBSDClient.h>
#define super IOMediaBSDClient
OSDefineMetaClassAndStructors(IODVDMediaBSDClient, IOMediaBSDClient)
IODVDMedia * IODVDMediaBSDClient::getProvider() const
{
return (IODVDMedia *) IOService::getProvider();
}
int IODVDMediaBSDClient::ioctl( dev_t dev,
u_long cmd,
caddr_t data,
int flags,
struct proc * proc )
{
int error = 0;
switch ( cmd )
{
case DKIOCDVDREADSTRUCTURE: {
IOMemoryDescriptor * buffer = 0;
dk_dvd_read_structure_t * request = (dk_dvd_read_structure_t *)data;
IOReturn status = kIOReturnSuccess;
if ( request->reserved0008[0] ||
request->reserved0008[1] ||
request->reserved0008[2] )
{
error = EINVAL;
break;
}
if ( request->buffer && request->bufferLength )
{
buffer = IOMemoryDescriptor::withAddress(
(vm_address_t) request->buffer,
request->bufferLength,
kIODirectionIn,
current_task() );
if ( buffer == 0 ) {
error = ENOMEM;
break;
}
if ( buffer->prepare() != kIOReturnSuccess ) {
buffer->release();
error = EFAULT; break;
}
}
status = getProvider()->readStructure(
buffer,
(DVDStructureFormat) request->format,
request->address,
request->layer,
request->grantID );
error = getProvider()->errnoFromReturn(status);
if ( buffer )
{
buffer->complete(); buffer->release(); }
} break;
case DKIOCDVDREPORTKEY: {
IOMemoryDescriptor * buffer = 0;
dk_dvd_report_key_t * request = (dk_dvd_report_key_t *)data;
IOReturn status = kIOReturnSuccess;
if ( request->reserved0016[0] ||
request->reserved0016[1] ||
request->reserved0072[0] )
{
error = EINVAL;
break;
}
if ( request->buffer && request->bufferLength )
{
buffer = IOMemoryDescriptor::withAddress(
(vm_address_t) request->buffer,
request->bufferLength,
kIODirectionIn,
current_task() );
if ( buffer == 0 ) {
error = ENOMEM;
break;
}
if ( buffer->prepare() != kIOReturnSuccess ) {
buffer->release();
error = EFAULT; break;
}
}
status = getProvider()->reportKey(
buffer,
(DVDKeyClass) request->keyClass,
request->address,
request->grantID,
(DVDKeyFormat) request->format );
error = getProvider()->errnoFromReturn(status);
if ( buffer )
{
buffer->complete(); buffer->release(); }
} break;
case DKIOCDVDSENDKEY: {
IOMemoryDescriptor * buffer = 0;
dk_dvd_send_key_t * request = (dk_dvd_send_key_t *)data;
IOReturn status = kIOReturnSuccess;
if ( request->reserved0016[0] ||
request->reserved0016[1] ||
request->reserved0016[2] ||
request->reserved0016[3] ||
request->reserved0016[4] ||
request->reserved0016[5] ||
request->reserved0072[0] )
{
error = EINVAL;
break;
}
if ( request->buffer && request->bufferLength )
{
buffer = IOMemoryDescriptor::withAddress(
(vm_address_t) request->buffer,
request->bufferLength,
kIODirectionOut,
current_task() );
if ( buffer == 0 ) {
error = ENOMEM;
break;
}
if ( buffer->prepare() != kIOReturnSuccess ) {
buffer->release();
error = EFAULT; break;
}
}
status = getProvider()->sendKey(
buffer,
(DVDKeyClass) request->keyClass,
request->grantID,
(DVDKeyFormat) request->format );
error = getProvider()->errnoFromReturn(status);
if ( buffer )
{
buffer->complete(); buffer->release(); }
} break;
case DKIOCDVDGETSPEED: {
IOReturn status;
status = getProvider()->getSpeed((u_int16_t *)data);
error = getProvider()->errnoFromReturn(status);
} break;
case DKIOCDVDSETSPEED: {
IOReturn status;
status = getProvider()->setSpeed(*(u_int16_t *)data);
error = getProvider()->errnoFromReturn(status);
} break;
default:
{
error = super::ioctl(dev, cmd, data, flags, proc);
} break;
}
return error; }
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 0);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 1);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 2);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 3);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 4);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 5);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 6);
OSMetaClassDefineReservedUnused(IODVDMediaBSDClient, 7);