X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5c19dc3ae3bd8e40a9c028b0deddd50ff337692c..7e6b461318c8a779d91381531435a68ee4e8b6ed:/OSX/libsecurity_utilities/lib/powerwatch.cpp diff --git a/OSX/libsecurity_utilities/lib/powerwatch.cpp b/OSX/libsecurity_utilities/lib/powerwatch.cpp index 1e3037b9..f23735db 100644 --- a/OSX/libsecurity_utilities/lib/powerwatch.cpp +++ b/OSX/libsecurity_utilities/lib/powerwatch.cpp @@ -28,6 +28,7 @@ #include "powerwatch.h" #include +#if TARGET_OS_OSX namespace Security { namespace MachPlusPlus { @@ -61,112 +62,19 @@ void PowerWatcher::systemWillPowerOn() // IOPowerWatchers // -void -IOPowerWatcher::iopmcallback(void * param, - IOPMConnection connection, - IOPMConnectionMessageToken token, - IOPMSystemPowerStateCapabilities capabilities) -{ - IOPowerWatcher *me = (IOPowerWatcher *)param; - - if (SECURITY_DEBUG_LOG_ENABLED()) { - secdebug("powerwatch", "powerstates"); - if (capabilities & kIOPMSystemPowerStateCapabilityDisk) - secdebug("powerwatch", "disk"); - if (capabilities & kIOPMSystemPowerStateCapabilityNetwork) - secdebug("powerwatch", "net"); - if (capabilities & kIOPMSystemPowerStateCapabilityAudio) - secdebug("powerwatch", "audio"); - if (capabilities & kIOPMSystemPowerStateCapabilityVideo) - secdebug("powerwatch", "video"); - } - - /* if cpu and no display -> in DarkWake */ - if ((capabilities & (kIOPMSystemPowerStateCapabilityCPU|kIOPMSystemPowerStateCapabilityVideo)) == kIOPMSystemPowerStateCapabilityCPU) { - secdebug("powerwatch", "enter DarkWake"); - me->mInDarkWake = true; - } else if (me->mInDarkWake) { - secdebug("powerwatch", "exit DarkWake"); - me->mInDarkWake = false; - } - - (void)IOPMConnectionAcknowledgeEvent(connection, token); - - return; -} - - -void -IOPowerWatcher::setupDarkWake() -{ - IOReturn ret; - - mInDarkWake = false; - - ret = ::IOPMConnectionCreate(CFSTR("IOPowerWatcher"), - kIOPMSystemPowerStateCapabilityDisk - | kIOPMSystemPowerStateCapabilityNetwork - | kIOPMSystemPowerStateCapabilityAudio - | kIOPMSystemPowerStateCapabilityVideo, - &mIOPMconn); - if (ret == kIOReturnSuccess) { - ret = ::IOPMConnectionSetNotification(mIOPMconn, this, - (IOPMEventHandlerType)iopmcallback); - if (ret == kIOReturnSuccess) { - ::IOPMConnectionSetDispatchQueue(mIOPMconn, mIOPMqueue); - } - } - - mUserActiveHandle = IOPMScheduleUserActiveChangedNotification(mIOPMqueue, ^(bool active) { - if (active) { - mInDarkWake = false; - } - }); - - dispatch_group_leave(mDarkWakeGroup); -} - IOPowerWatcher::IOPowerWatcher() : - mKernelPort(0), mIOPMconn(NULL), mIOPMqueue(NULL), mDarkWakeGroup(NULL), mUserActiveHandle(NULL) + mKernelPort(0) { if (!(mKernelPort = ::IORegisterForSystemPower(this, &mPortRef, ioCallback, &mHandle))) UnixError::throwMe(EINVAL); // no clue - - mIOPMqueue = dispatch_queue_create("com.apple.security.IOPowerWatcher", NULL); - if (mIOPMqueue == NULL) - return; - - // Running in background since this will wait for the power - // management in configd and we are not willing to block on - // that, power events will come in when they do. - mDarkWakeGroup = dispatch_group_create(); - dispatch_group_enter(mDarkWakeGroup); - dispatch_async(mIOPMqueue, ^ { setupDarkWake(); }); } IOPowerWatcher::~IOPowerWatcher() { - // Make sure to wait until the asynchronous method - // finishes, to avoid - if (mDarkWakeGroup) { - ::dispatch_group_wait(mDarkWakeGroup, DISPATCH_TIME_FOREVER); - ::dispatch_release(mDarkWakeGroup); - } if (mKernelPort) ::IODeregisterForSystemPower(&mHandle); - - if (mIOPMconn) { - ::IOPMConnectionSetDispatchQueue(mIOPMconn, NULL); - ::IOPMConnectionRelease(mIOPMconn); - } - if (mUserActiveHandle) - ::IOPMUnregisterNotification(mUserActiveHandle); - if (mIOPMqueue) - ::dispatch_release(mIOPMqueue); - } - // // The callback dispatcher // @@ -177,43 +85,43 @@ void IOPowerWatcher::ioCallback(void *refCon, io_service_t service, enum { allow, refuse, ignore } reaction; switch (messageType) { case kIOMessageSystemWillSleep: - secdebug("powerwatch", "system will sleep"); + secnotice("powerwatch", "system will sleep"); me->systemWillSleep(); reaction = allow; break; case kIOMessageSystemHasPoweredOn: - secdebug("powerwatch", "system has powered on"); + secnotice("powerwatch", "system has powered on"); me->systemIsWaking(); reaction = ignore; break; case kIOMessageSystemWillPowerOff: - secdebug("powerwatch", "system will power off"); + secnotice("powerwatch", "system will power off"); me->systemWillPowerDown(); reaction = allow; break; case kIOMessageSystemWillNotPowerOff: - secdebug("powerwatch", "system will not power off"); + secnotice("powerwatch", "system will not power off"); reaction = ignore; break; case kIOMessageCanSystemSleep: - secdebug("powerwatch", "can system sleep"); + secnotice("powerwatch", "can system sleep"); reaction = allow; break; case kIOMessageSystemWillNotSleep: - secdebug("powerwatch", "system will not sleep"); + secnotice("powerwatch", "system will not sleep"); reaction = ignore; break; case kIOMessageCanSystemPowerOff: - secdebug("powerwatch", "can system power off"); + secnotice("powerwatch", "can system power off"); reaction = allow; break; case kIOMessageSystemWillPowerOn: - secdebug("powerwatch", "system will power on"); + secnotice("powerwatch", "system will power on"); me->systemWillPowerOn(); reaction = ignore; break; default: - secdebug("powerwatch", + secnotice("powerwatch", "type 0x%x message received (ignored)", messageType); reaction = ignore; break; @@ -222,15 +130,15 @@ void IOPowerWatcher::ioCallback(void *refCon, io_service_t service, // handle acknowledgments switch (reaction) { case allow: - secdebug("powerwatch", "calling IOAllowPowerChange"); + secnotice("powerwatch", "calling IOAllowPowerChange"); IOAllowPowerChange(me->mKernelPort, long(argument)); break; case refuse: - secdebug("powerwatch", "calling IOCancelPowerChange"); + secnotice("powerwatch", "calling IOCancelPowerChange"); IOCancelPowerChange(me->mKernelPort, long(argument)); break; case ignore: - secdebug("powerwatch", "sending no response"); + secnotice("powerwatch", "sending no response"); break; } } @@ -254,3 +162,5 @@ boolean_t PortPowerWatcher::handle(mach_msg_header_t *in) } // end namespace MachPlusPlus } // end namespace Security + +#endif //TARGET_OS_OSX