#ifndef qDEBUG
#define qDEBUG 0
#endif
#if qDEBUG
#warning qDEBUG is 1!
#endif
#include <sys/types.h>
#include <IOKit/IOService.h>
#include <IOKit/IOLib.h>
#define kIOHDIXControllerClassName "IOHDIXController"
#define kDIRootImageKey "di-root-image"
#define kDIRootImageResultKey "di-root-image-result"
#define kDIRootImageDevNameKey "di-root-image-devname"
#define kDIRootImageDevTKey "di-root-image-devt"
extern "C" {
int di_root_image(const char *path, char devname[], dev_t *dev_p)
{
IOReturn res = 0;
OSIterator * controllerIterator = 0;
OSDictionary * matchDictionary = 0;
IOService * controller = 0;
OSString * pathString = 0;
OSNumber * myResult = 0;
OSString * myDevName = 0;
OSNumber * myDevT = 0;
if (devname) *devname = 0;
if (dev_p) *dev_p = 0;
if (!path) return kIOReturnBadArgument;
if (!devname) return kIOReturnBadArgument;
if (!dev_p) return kIOReturnBadArgument;
(void)IOService::getResourceService()->publishResource("com.apple.AppleDiskImageController.load", kOSBooleanTrue);
IOService::getResourceService()->waitQuiet();
matchDictionary = IOService::serviceMatching(kIOHDIXControllerClassName);
if (!matchDictionary) {
res = kIOReturnNoMemory;
goto serviceMatching_FAILED;
}
controllerIterator = IOService::getMatchingServices(matchDictionary);
if (!controllerIterator) {
res = kIOReturnNoMemory;
goto getMatchingServices_FAILED;
}
controller = OSDynamicCast(IOService, controllerIterator->getNextObject());
if (!controller) {
res = kIOReturnNotFound;
goto NoIOHDIXController;
}
pathString = OSString::withCString(path);
if (!pathString) {
res = kIOReturnNoMemory;
goto CannotCreatePathOSString;
}
if (!controller->setProperty(kDIRootImageKey, pathString))
IOLog("IOHDIXController::setProperty(%s, %s) failed.\n", kDIRootImageKey, pathString->getCStringNoCopy());
myResult = OSDynamicCast(OSNumber, controller->getProperty(kDIRootImageResultKey));
res = kIOReturnError;
if (myResult)
res = myResult->unsigned32BitValue();
if (res) {
IOLog("%s is 0x%08X/%d\n", kDIRootImageResultKey, res, res);
goto di_root_image_FAILED;
}
myDevT = OSDynamicCast(OSNumber, controller->getProperty(kDIRootImageDevTKey));
if (myDevT)
*dev_p = myDevT->unsigned32BitValue();
else {
IOLog("could not get %s\n", kDIRootImageDevTKey);
res = kIOReturnError;
goto di_root_image_FAILED;
}
myDevName = OSDynamicCast(OSString, controller->getProperty(kDIRootImageDevNameKey));
if (myDevName)
strcpy(devname, myDevName->getCStringNoCopy());
else {
IOLog("could not get %s\n", kDIRootImageDevNameKey);
res = kIOReturnError;
goto di_root_image_FAILED;
}
di_root_image_FAILED:
CannotCreatePathOSString:
serviceMatching_FAILED:
NoIOHDIXController:
getMatchingServices_FAILED:
if (pathString) pathString->release();
if (matchDictionary) matchDictionary->release();
if (controllerIterator) controllerIterator->release();
return res;
}
};