Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | /* * DINetBootHook.c * DiskImages * * Created by Byron Han on Sat Apr 13 2002. * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. * * Revision History * * $Log: DINetBootHook.cpp,v $ * Revision 1.3 2002/06/16 20:36:02 lindak * Merged PR-2957314 into Jaguar (siegmund: netboot kernel code needs to set * com.apple.AppleDiskImageController.load to boolean Yes) * * Revision 1.2.40.2 2002/06/15 03:50:38 dieter * - corrected com.apple.AppleDiskImageController.load string * * Revision 1.2.40.1 2002/06/15 03:01:08 dieter * Bug #: 2957314 * - add call to force IOHDIXController to get loaded/matched * * Revision 1.2 2002/05/03 18:08:39 lindak * Merged PR-2909558 into Jaguar (siegmund POST WWDC: add support for NetBoot * over IOHDIXController) * * Revision 1.1.2.1 2002/04/24 22:29:12 dieter * Bug #: 2909558 * - added IOHDIXController netboot stubs * * Revision 1.3 2002/04/16 00:41:37 han * migrated code out of here to IOHDIXController's setProperty method * * Revision 1.2 2002/04/14 23:53:53 han * eliminate qDEBUG=1, use emums instead of hard coded string constants * * Revision 1.1 2002/04/14 22:54:42 han * Renamed from DINetBookHook.c. * First stab at implementing this code. * * Revision 1.1 2002/04/13 19:22:28 han * added stub file DINetBookHook.c * * */ #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" { /* Name: di_root_image Function: mount the disk image returning the dev node Parameters: path -> path/url to disk image devname <- dev node used to set the rootdevice global variable dev_p <- device number generated from major/minor numbers Comments: */ 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; // sanity check arguments please 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(); // first find IOHDIXController matchDictionary = IOService::serviceMatching(kIOHDIXControllerClassName); if (!matchDictionary) { res = kIOReturnNoMemory; goto serviceMatching_FAILED; } controllerIterator = IOService::getMatchingServices(matchDictionary); if (!controllerIterator) { res = kIOReturnNoMemory; goto getMatchingServices_FAILED; } // use the "setProperty" method of IOHDIXController to trigger the desired behaviour controller = OSDynamicCast(IOService, controllerIterator->getNextObject()); if (!controller) { res = kIOReturnNotFound; goto NoIOHDIXController; } // okay create path object pathString = OSString::withCString(path); if (!pathString) { res = kIOReturnNoMemory; goto CannotCreatePathOSString; } // do it 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; } // success - grab 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: // clean up memory allocations if (pathString) pathString->release(); if (matchDictionary) matchDictionary->release(); if (controllerIterator) controllerIterator->release(); return res; } }; |