]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/bsddev/DINetBootHook.cpp
xnu-344.tar.gz
[apple/xnu.git] / iokit / bsddev / DINetBootHook.cpp
diff --git a/iokit/bsddev/DINetBootHook.cpp b/iokit/bsddev/DINetBootHook.cpp
new file mode 100644 (file)
index 0000000..f80e35b
--- /dev/null
@@ -0,0 +1,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;
+}
+
+};