AppleCDDAFileSystemUtilities.cpp [plain text]
#ifndef __APPLE_CDDA_FS_UTILS_H__
#include "AppleCDDAFileSystemUtils.h"
#endif
#ifndef __APPLE_CDDA_FS_DEBUG_H__
#include "AppleCDDAFileSystemDebug.h"
#endif
#include <libkern/c++/OSData.h>
#include <libkern/c++/OSObject.h>
#include <libkern/c++/OSIterator.h>
#include <libkern/c++/OSDictionary.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/storage/IOCDMedia.h>
#include <IOKit/IORegistryEntry.h>
static QTOCDataFormat10Ptr CreateBufferFromData ( OSData * theData );
static IOCDMedia * GetCDMediaObjectFromName ( const char * ioBSDNamePtr );
QTOCDataFormat10Ptr
CreateBufferFromIORegistry ( struct mount * mountPtr )
{
QTOCDataFormat10Ptr TOCDataPtr = NULL;
OSObject * objectPtr = NULL;
OSData * dataPtr = NULL;
IOCDMedia * cdMediaPtr = NULL;
char * ioBSDNamePtr = NULL;
DebugLog ( ( "CreateBufferFromIORegistry: Entering...\n" ) );
DebugAssert ( ( mountPtr != NULL ) );
ioBSDNamePtr = mountPtr->mnt_stat.f_mntfromname;
DebugAssert ( ( ioBSDNamePtr != NULL ) );
cdMediaPtr = GetCDMediaObjectFromName ( ioBSDNamePtr );
DebugAssert ( ( cdMediaPtr != NULL ) );
if ( cdMediaPtr != NULL )
{
objectPtr = cdMediaPtr->getProperty ( kIOCDMediaTOC );
if ( objectPtr == NULL )
{
DebugLog ( ( "CreateBufferFromIORegistry: objectPtr is NULL.\n" ) );
return NULL;
}
dataPtr = OSDynamicCast ( OSData, objectPtr );
if ( dataPtr == NULL )
{
DebugLog ( ( "CreateBufferFromIORegistry: dataPtr is NULL.\n" ) );
return NULL;
}
TOCDataPtr = CreateBufferFromData ( dataPtr );
DebugLog ( ( "Releasing refcsount on IOCDMedia.\n" ) );
cdMediaPtr->release ( );
}
DebugLog ( ( "CreateBufferFromIORegistry: exiting...\n" ) );
return TOCDataPtr;
}
void
DisposeBufferFromIORegistry ( QTOCDataFormat10Ptr TOCDataPtr )
{
DebugLog ( ( "DisposeBufferFromIORegistry: Entering...\n" ) );
DebugAssert ( ( TOCDataPtr != NULL ) );
IOFree ( TOCDataPtr,
( TOCDataPtr->TOCDataLength + sizeof ( TOCDataPtr->TOCDataLength ) ) );
DebugLog ( ( "DisposeBufferFromIORegistry: Exiting...\n" ) );
}
#if 0
#pragma mark -
#endif
QTOCDataFormat10Ptr
CreateBufferFromData ( OSData * theData )
{
vm_size_t bufferLength = 0;
QTOCDataFormat10Ptr buffer = NULL;
DebugLog ( ( "CreateBufferFromData: Entering...\n" ) );
DebugAssert ( ( theData != NULL ) );
if ( theData == NULL )
{
DebugLog ( ( "CreateBufferFromData: theData is NULL.\n" ) );
return NULL;
}
bufferLength = theData->getLength ( );
buffer = ( QTOCDataFormat10Ptr ) IOMalloc ( bufferLength );
if ( buffer != NULL )
{
bcopy ( theData->getBytesNoCopy ( ), buffer, bufferLength );
}
DebugLog ( ( "CreateBufferFromData: exiting.\n" ) );
return buffer;
}
IOCDMedia *
GetCDMediaObjectFromName ( const char * ioBSDNamePtr )
{
OSIterator * iteratorPtr = NULL;
IORegistryEntry * registryEntryPtr = NULL;
IOCDMedia * objectPtr = NULL;
OSDictionary * matchingDictPtr = NULL;
DebugLog ( ( "GetCDMediaObjectFromName: Entering...\n" ) );
DebugAssert ( ( ioBSDNamePtr != NULL ) );
DebugLog ( ( "GetCDMediaObjectFromName: On enter ioBSDNamePtr = %s.\n", ioBSDNamePtr ) );
if ( !strncmp ( ioBSDNamePtr, "/dev/r", 6 ) )
{
ioBSDNamePtr = &ioBSDNamePtr[6];
}
else if ( !strncmp ( ioBSDNamePtr, "/dev/", 5 ) )
{
ioBSDNamePtr = &ioBSDNamePtr[5];
}
if ( strncmp ( ioBSDNamePtr, "disk", 4 ) )
{
DebugLog ( ( "GetCDMediaObjectFromName: not in correct format, ioBSDNamePtr = %s.\n", ioBSDNamePtr ) );
return NULL;
}
DebugLog ( ( "GetCDMediaObjectFromName: ioBSDNamePtr = %s.\n", ioBSDNamePtr ) );
matchingDictPtr = IOBSDNameMatching ( ioBSDNamePtr );
iteratorPtr = IOService::getMatchingServices ( matchingDictPtr );
if ( iteratorPtr == NULL )
{
DebugLog ( ( "GetCDMediaObjectFromName: iteratorPtr is NULL.\n" ) );
return NULL;
}
matchingDictPtr->release ( );
DebugLog ( ( "Acquired refcount on iterator and media.\n" ) );
registryEntryPtr = ( IORegistryEntry * ) iteratorPtr->getNextObject ( );
if ( registryEntryPtr == NULL )
{
DebugLog ( ( "GetCDMediaObjectFromName: registryEntryPtr is NULL.\n" ) );
return NULL;
}
objectPtr = OSDynamicCast ( IOCDMedia, registryEntryPtr );
if ( objectPtr == NULL )
{
DebugLog ( ( "GetCDMediaObjectFromName: objectPtr is NULL, Dynamic Cast failed.\n" ) );
}
DebugLog ( ( "GetCDMediaObjectFromName: exiting...\n" ) );
if ( objectPtr != NULL )
{
objectPtr->retain ( );
}
iteratorPtr->release ( );
return ( objectPtr );
}